Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
grid.cpp
Go to the documentation of this file.
1 #include "grid.h"
2 #include <iostream>
3 
4 #define BOOST_LOG_DYN_LINK 1
5 #include <boost/log/trivial.hpp>
6 
7 // Simple int-int a^b power-function
8 inline size_t power(size_t a, size_t b){
9  size_t res = 1;
10  for(size_t i = 0; i < b; i++) {
11  res *= a;
12  }
13 #ifdef _BOUNDSCHECK
14  assert( (pow(1.0*a,1.0*b) - double(res)) < 0.5);
15 #endif
16  return res;
17 }
18 
19 template<size_t NDIM, typename T>
20 void Grid<NDIM,T>::check_for_nan(bool exitifnan){
21  bool nanfound = false;
22  for(size_t i = 0; i < _Ntot; i++){
23  if(_y[i] != _y[i]){
24  nanfound = true;
25  break;
26  }
27  }
28 
29  if(nanfound){
30  BOOST_LOG_TRIVIAL(error) << "Warning: NaN found in grid" << (exitifnan ? " ...aborting!" : "" ) << std::endl;
31  if(exitifnan) exit(1);
32  }
33 }
34 
35 // Constructor with intial value
36 template<size_t NDIM, typename T>
37 Grid<NDIM,T>::Grid(size_t N, T yini) : _N(N), _Ntot(power(_N, NDIM)), _y(std::vector<T>(_Ntot, yini)) {}
38 
39 // Fetch pointer to grid
40 template<size_t NDIM, typename T>
42  return &_y[0];
43 }
44 
45 template<size_t NDIM, typename T>
46 T const * Grid<NDIM,T>::get_y() const {
47  return &_y[0];
48 }
49 
50 template<size_t NDIM, typename T>
51 const std::vector<T>& Grid<NDIM,T>::get_vec() const
52 {
53  return _y;
54 }
55 
56 // Allow to fetch value using f[i] syntax
57 template<size_t NDIM, typename T>
59 #ifdef _BOUNDSCHECK
60  assert(i < _Ntot);
61 #endif
62  return _y[i];
63 }
64 
65 template<size_t NDIM, typename T>
66 const T& Grid<NDIM,T>::operator[](size_t i) const {
67 #ifdef _BOUNDSCHECK
68  assert(i < _Ntot);
69 #endif
70  return _y[i];
71 }
72 
73 // Fetch value of grid-cell [i]
74 template<size_t NDIM, typename T>
75 T Grid<NDIM,T>::get_y(size_t i) {
76 #ifdef _BOUNDSCHECK
77  assert(i < _Ntot);
78 #endif
79  return _y[i];
80 }
81 
82 // Assign whole grid from vector
83 template<size_t NDIM, typename T>
84 void Grid<NDIM,T>::set_y(std::vector<T> &y){
85 #ifdef _BOUNDSCHECK
86  assert(y.size() == _Ntot);
87 #endif
88  _y = y;
89 }
90 
91 // Assign the gridcell [i] with [value]
92 template<size_t NDIM, typename T>
93 void Grid<NDIM,T>::set_y(size_t i, T &value){
94 #ifdef _BOUNDSCHECK
95  assert(i < _Ntot);
96 #endif
97  _y[i] = value;
98 }
99 
100 // Compute coordinates given a gridindex
101 template<size_t NDIM, typename T>
102 std::vector<size_t> Grid<NDIM,T>::index_list(size_t i){
103  std::vector<size_t> ii(NDIM, 0);
104  for(size_t j = 0, n = 1; j < NDIM; j++, n *= _N){
105  ii[j] = i / n % _N;
106  }
107  return ii;
108 }
109 
110 // Coordinates -> grid-index (index in the 1D _y vector)
111 template<size_t NDIM, typename T>
112 size_t Grid<NDIM,T>::grid_index(std::vector<size_t> &index_list){
113  size_t index = 0;
114  for(size_t j = 0, n = 1; j < NDIM; j++, n *= _N)
115  index += index_list[j] * n;
116 #ifdef _BOUNDSCHECK
117  assert(index < _Ntot);
118 #endif
119  return index;
120 }
121 
122 // Coordinate -> gridindex for 3D grid
123 template<size_t NDIM, typename T>
124 size_t Grid<NDIM,T>::grid_index_3d(size_t ix, size_t iy, size_t iz){
125  return ix + _N*(iy + _N*iz);
126 }
127 
128 // Coordinate -> gridindex for 2D grid
129 template<size_t NDIM, typename T>
130 size_t Grid<NDIM,T>::grid_index_2d(size_t ix, size_t iy){
131  return ix + _N*iy;
132 }
133 // Returns number of cells per dim
134 template<size_t NDIM, typename T>
135 size_t Grid<NDIM,T>::get_N() const{
136  return _N;
137 }
138 
139 // Return total number of cells
140 template<size_t NDIM, typename T>
141 size_t Grid<NDIM,T>::get_Ntot() const{
142  return _Ntot;
143 }
144 
145 // Write a grid to file
146 template<size_t NDIM, typename T>
147 void Grid<NDIM,T>::dump_to_file(std::string filename){
148  size_t ndim = NDIM;
149 
150  // Verbose
151  BOOST_LOG_TRIVIAL(debug) << "==> Dumping grid to file [" << filename << "]" << std::endl;
152  BOOST_LOG_TRIVIAL(debug) << " Ndim: " << NDIM << " N: " << _N << " Ntot: " << _Ntot << std::endl;
153 
154  // Write header
155  std::ofstream fout(filename.c_str(), std::ios::out | std::ios::binary);
156  fout.write((char*)&_N, sizeof(size_t));
157  fout.write((char*)&ndim, sizeof(size_t));
158 
159  // Write the grid-data
160  fout.write((char*)&_y[0], _y.size() * sizeof(T));
161 }
162 
163 // Read a grid from file (assumes specific format)
164 template<size_t NDIM, typename T>
165 void Grid<NDIM,T>::read_from_file(std::string filename){
166  size_t ninfile = 0, ntot = 0, ndim = 0, size = 0;
167 
168  // Read header: N and NDIM
169  std::ifstream input(filename.c_str(), std::ios::in | std::ifstream::binary);
170 
171  input.read((char *) &ninfile, sizeof(size_t));
172  input.read((char *) &ndim, sizeof(size_t));
173 
174  ntot = power(ninfile, NDIM);
175  size = sizeof(T) * ntot;
176 
177  // Checks
178  assert(ndim == NDIM);
179  assert(ninfile > 0 && ntot < INT_MAX);
180 
181  // Verbose
182  BOOST_LOG_TRIVIAL(debug) << "==> Reading file into grid [" << filename << "]" << std::endl;
183  BOOST_LOG_TRIVIAL(debug) << " Ndim: " << ndim << " Nfile: " << ninfile << " Ntot: " << ntot << std::endl;
184 
185  // Read the data
186  std::vector<char> tempvec(size, 0);
187  input.read(&tempvec[0], tempvec.size());
188 
189  // Copy the grid-data and set parameters
190  _N = ninfile;
191  _Ntot = ntot;
192  _y = std::vector<T>(ntot, 0.0);
193  std::memcpy(&_y[0], &tempvec[0], size);
194 }
195 
196 template<size_t NDIM, typename T>
198  _N = _Ntot = 0;
199  _y.clear();
200 }
201 
202 // Explicit template specialisation
203 template class Grid<3,long double>;
204 
205 template class Grid<3,double>;
206 template class Grid<2,double>;
207 template class Grid<1,double>;
208 template class Grid<3,float>;
209 template class Grid<2,float>;
210 template class Grid<1,float>;
211 template class Grid<1,std::complex<double> >;
212 
size_t _Ntot
Definition: grid.h:26
size_t power(size_t a, size_t b)
Definition: grid.cpp:8
size_t grid_index_2d(size_t ix, size_t iy)
Definition: grid.cpp:130
std::vector< size_t > index_list(size_t i)
Definition: grid.cpp:102
Definition: json.hpp:20160
std::vector< T > _y
Definition: grid.h:27
void dump_to_file(std::string filename)
Definition: grid.cpp:147
T & operator[](size_t i)
Definition: grid.cpp:58
Definition: grid.h:21
void set_y(std::vector< T > &y)
Definition: grid.cpp:84
size_t grid_index_3d(size_t ix, size_t iy, size_t iz)
Definition: grid.cpp:124
int iz
Definition: mfunc_bm.py:17
size_t get_N() const
Definition: grid.cpp:135
T * get_y()
Definition: grid.cpp:41
size_t get_Ntot() const
Definition: grid.cpp:141
const std::vector< T > & get_vec() const
Definition: grid.cpp:51
size_t grid_index(std::vector< size_t > &index_list)
Definition: grid.cpp:112
size_t _N
Definition: grid.h:25
void clear()
Definition: grid.cpp:197
void read_from_file(std::string filename)
Definition: grid.cpp:165
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
void check_for_nan(bool exitifnan)
Definition: grid.cpp:20
auto value(T const &val) -> Generator< T >
Definition: catch.hpp:3177
Grid()
Definition: grid.h:32