Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
Grid< NDIM, T > Class Template Reference

#include <grid.h>

Public Member Functions

 Grid ()
 
 Grid (size_t N)
 
 Grid (size_t N, T yini)
 
T * get_y ()
 
T const * get_y () const
 
const std::vector< T > & get_vec () const
 
T & operator[] (size_t i)
 
const T & operator[] (size_t i) const
 
get_y (size_t i)
 
void set_y (std::vector< T > &y)
 
void set_y (size_t i, T &value)
 
std::vector< size_t > index_list (size_t i)
 
size_t get_N () const
 
size_t get_Ntot () const
 
size_t grid_index (std::vector< size_t > &index_list)
 
size_t grid_index_3d (size_t ix, size_t iy, size_t iz)
 
size_t grid_index_2d (size_t ix, size_t iy)
 
void dump_to_file (std::string filename)
 
void read_from_file (std::string filename)
 
double max ()
 
double min ()
 
void clear ()
 
template<size_t NNDIM, typename TT >
Grid< NNDIM, TT > & operator+= (const Grid< NNDIM, TT > &rhs)
 
template<size_t NNDIM, typename TT >
Grid< NNDIM, TT > & operator-= (const Grid< NNDIM, TT > &rhs)
 
template<size_t NNDIM, typename TT >
Grid< NNDIM, TT > & operator*= (const Grid< NNDIM, TT > &rhs)
 
template<size_t NNDIM, typename TT >
Grid< NNDIM, TT > & operator/= (const Grid< NNDIM, TT > &rhs)
 
Grid< NDIM, T > & operator*= (const T &rhs)
 
Grid< NDIM, T > & operator/= (const T &rhs)
 
double rms_norm ()
 
void check_for_nan (bool exitifnan)
 

Private Attributes

size_t _N
 
size_t _Ntot
 
std::vector< T > _y
 

Detailed Description

template<size_t NDIM, typename T>
class Grid< NDIM, T >

Definition at line 21 of file grid.h.

Constructor & Destructor Documentation

template<size_t NDIM, typename T>
Grid< NDIM, T >::Grid ( )
inline

Definition at line 32 of file grid.h.

Referenced by Grid< NDIM, T >::Grid().

32 : Grid(0, 0.0) {}
Grid()
Definition: grid.h:32
template<size_t NDIM, typename T >
Grid< NDIM, T >::Grid ( size_t  N,
yini 
)

Definition at line 37 of file grid.cpp.

37 : _N(N), _Ntot(power(_N, NDIM)), _y(std::vector<T>(_Ntot, yini)) {}
size_t _Ntot
Definition: grid.h:26
size_t power(size_t a, size_t b)
Definition: grid.cpp:8
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25

Member Function Documentation

template<size_t NDIM, typename T >
void Grid< NDIM, T >::check_for_nan ( bool  exitifnan)

Definition at line 20 of file grid.cpp.

Referenced by Grid< NDIM, T >::operator/=().

20  {
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 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
void Grid< NDIM, T >::clear ( )

Definition at line 197 of file grid.cpp.

References Grid< NDIM, T >::_N, Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

Referenced by Grid< NDIM, T >::min().

197  {
198  _N = _Ntot = 0;
199  _y.clear();
200 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T >
void Grid< NDIM, T >::dump_to_file ( std::string  filename)

Definition at line 147 of file grid.cpp.

References Grid< NDIM, T >::_N, Grid< NDIM, T >::_Ntot, Grid< NDIM, T >::_y, and growth_allz::T.

Referenced by assign_to_grid(), and Grid< NDIM, T >::Grid().

147  {
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 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T >
const std::vector< T > & Grid< NDIM, T >::get_vec ( ) const

Definition at line 51 of file grid.cpp.

References Grid< NDIM, T >::_y.

Referenced by Grid< NDIM, T >::Grid(), and anonymous_namespace{chameleon.cpp}::min().

52 {
53  return _y;
54 }
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
T * Grid< NDIM, T >::get_y ( )

Definition at line 41 of file grid.cpp.

References Grid< NDIM, T >::_y.

Referenced by assign_to_grid(), Grid< NDIM, T >::Grid(), MultiGrid< NDIM, T >::restrict_down(), MultiGridSolver< NDIM, T >::set_initial_guess(), and set_rho().

41  {
42  return &_y[0];
43 }
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
T const * Grid< NDIM, T >::get_y ( ) const

Definition at line 46 of file grid.cpp.

References Grid< NDIM, T >::_y.

46  {
47  return &_y[0];
48 }
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
T Grid< NDIM, T >::get_y ( size_t  i)

Definition at line 75 of file grid.cpp.

References Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

75  {
76 #ifdef _BOUNDSCHECK
77  assert(i < _Ntot);
78 #endif
79  return _y[i];
80 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
size_t Grid< NDIM, T >::grid_index ( std::vector< size_t > &  index_list)

Definition at line 112 of file grid.cpp.

References Grid< NDIM, T >::_N, and Grid< NDIM, T >::_Ntot.

Referenced by Grid< NDIM, T >::Grid().

112  {
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 }
size_t _Ntot
Definition: grid.h:26
std::vector< size_t > index_list(size_t i)
Definition: grid.cpp:102
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T >
size_t Grid< NDIM, T >::grid_index_2d ( size_t  ix,
size_t  iy 
)

Definition at line 130 of file grid.cpp.

References Grid< NDIM, T >::_N.

Referenced by Grid< NDIM, T >::Grid().

130  {
131  return ix + _N*iy;
132 }
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T >
size_t Grid< NDIM, T >::grid_index_3d ( size_t  ix,
size_t  iy,
size_t  iz 
)

Definition at line 124 of file grid.cpp.

References Grid< NDIM, T >::_N, and mfunc_bm::iz.

Referenced by compute_v(), and Grid< NDIM, T >::Grid().

124  {
125  return ix + _N*(iy + _N*iz);
126 }
int iz
Definition: mfunc_bm.py:17
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T >
std::vector< size_t > Grid< NDIM, T >::index_list ( size_t  i)

Definition at line 102 of file grid.cpp.

References Grid< NDIM, T >::_N.

Referenced by compute_v(), and Grid< NDIM, T >::Grid().

102  {
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 }
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T>
double Grid< NDIM, T >::max ( )
inline

Definition at line 71 of file grid.h.

References Grid< NDIM, T >::_Ntot, and sqrt().

Referenced by main().

71  {
72  double maxval = std::norm(_y[0]);
73 #ifdef OPENMP
74 #pragma omp parallel for reduction(max: maxval)
75 #endif
76  for(size_t i = 0; i < _Ntot; i++){
77  double curval = std::norm(_y[i]);
78  if(curval > maxval) maxval = curval;
79  }
80  return std::sqrt( maxval );
81  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
Definition: grid.h:231
template<size_t NDIM, typename T>
double Grid< NDIM, T >::min ( )
inline

Definition at line 84 of file grid.h.

References Grid< NDIM, T >::_Ntot, Grid< NDIM, T >::clear(), and sqrt().

Referenced by main().

84  {
85  double minval = std::norm(_y[0]);
86 #ifdef OPENMP
87 #pragma omp parallel for reduction(min: minval)
88 #endif
89  for(size_t i = 0; i < _Ntot; i++){
90  double curval = std::norm(_y[i]);
91  if(curval < minval) minval = curval;
92  }
93  return std::sqrt( minval );
94  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
Definition: grid.h:231
template<size_t NDIM, typename T>
template<size_t NNDIM, typename TT >
Grid<NNDIM,TT>& Grid< NDIM, T >::operator*= ( const Grid< NNDIM, TT > &  rhs)
inline

Definition at line 129 of file grid.h.

References Grid< NDIM, T >::_N, Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

129  {
130 #ifdef _BOUNDSCHECK
131  assert(this->_N == rhs._N);
132 #endif
133 #ifdef OPENMP
134 #pragma omp parallel for
135 #endif
136  for(size_t i = 0; i < _Ntot; i++)
137  this->_y[i] *= rhs._y[i];
138  return *this;
139  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T>
Grid<NDIM,T>& Grid< NDIM, T >::operator*= ( const T &  rhs)
inline

Definition at line 156 of file grid.h.

References Grid< NDIM, T >::_Ntot.

156  {
157 #ifdef OPENMP
158 #pragma omp parallel for
159 #endif
160  for(size_t i = 0; i < _Ntot; i++)
161  this->_y[i] *= rhs;
162  return *this;
163  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T>
template<size_t NNDIM, typename TT >
Grid<NNDIM,TT>& Grid< NDIM, T >::operator+= ( const Grid< NNDIM, TT > &  rhs)
inline

Definition at line 101 of file grid.h.

References Grid< NDIM, T >::_N, Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

101  {
102 #ifdef _BOUNDSCHECK
103  assert(this->_N == rhs._N);
104 #endif
105 #ifdef OPENMP
106 #pragma omp parallel for
107 #endif
108  for(size_t i = 0; i < _Ntot; i++)
109  this->_y[i] += rhs._y[i];
110  return *this;
111  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T>
template<size_t NNDIM, typename TT >
Grid<NNDIM,TT>& Grid< NDIM, T >::operator-= ( const Grid< NNDIM, TT > &  rhs)
inline

Definition at line 115 of file grid.h.

References Grid< NDIM, T >::_N, Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

115  {
116 #ifdef _BOUNDSCHECK
117  assert(this->_N == rhs._N);
118 #endif
119 #ifdef OPENMP
120 #pragma omp parallel for
121 #endif
122  for(size_t i = 0; i < _Ntot; i++)
123  this->_y[i] -= rhs._y[i];
124  return *this;
125  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T>
template<size_t NNDIM, typename TT >
Grid<NNDIM,TT>& Grid< NDIM, T >::operator/= ( const Grid< NNDIM, TT > &  rhs)
inline

Definition at line 143 of file grid.h.

References Grid< NDIM, T >::_N, Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

143  {
144 #ifdef _BOUNDSCHECK
145  assert(this->_N == rhs._N);
146 #endif
147 #ifdef OPENMP
148 #pragma omp parallel for
149 #endif
150  for(size_t i = 0; i < _Ntot; i++)
151  this->_y[i] /= rhs._y[i];
152  return *this;
153  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T>
Grid<NDIM,T>& Grid< NDIM, T >::operator/= ( const T &  rhs)
inline

Definition at line 166 of file grid.h.

References Grid< NDIM, T >::_Ntot, Grid< NDIM, T >::check_for_nan(), and Grid< NDIM, T >::rms_norm().

166  {
167 #ifdef OPENMP
168 #pragma omp parallel for
169 #endif
170  for(size_t i = 0; i < _Ntot; i++)
171  this->_y[i] /= rhs;
172  return *this;
173  }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
T & Grid< NDIM, T >::operator[] ( size_t  i)

Definition at line 58 of file grid.cpp.

References Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

Referenced by Grid< NDIM, T >::Grid().

58  {
59 #ifdef _BOUNDSCHECK
60  assert(i < _Ntot);
61 #endif
62  return _y[i];
63 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
const T & Grid< NDIM, T >::operator[] ( size_t  i) const

Definition at line 66 of file grid.cpp.

References Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

66  {
67 #ifdef _BOUNDSCHECK
68  assert(i < _Ntot);
69 #endif
70  return _y[i];
71 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
void Grid< NDIM, T >::read_from_file ( std::string  filename)

Definition at line 165 of file grid.cpp.

References Grid< NDIM, T >::_N, Grid< NDIM, T >::_Ntot, Grid< NDIM, T >::_y, power(), and growth_allz::T.

Referenced by Grid< NDIM, T >::Grid(), and main().

165  {
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 }
size_t _Ntot
Definition: grid.h:26
size_t power(size_t a, size_t b)
Definition: grid.cpp:8
std::vector< T > _y
Definition: grid.h:27
size_t _N
Definition: grid.h:25
template<size_t NDIM, typename T >
double Grid< NDIM, T >::rms_norm ( )

Definition at line 238 of file grid.h.

References Grid< NDIM, T >::_Ntot, Grid< NDIM, T >::_y, and sqrt().

Referenced by MultiGridSolver< NDIM, T >::calculate_residual(), main(), and Grid< NDIM, T >::operator/=().

238  {
239  double rms = 0.0;
240 #ifdef OPENMP
241 #pragma omp parallel for reduction(+:rms)
242 #endif
243  for(size_t i = 0; i < _Ntot; i++){
244  rms += std::norm(_y[i]);
245  }
246  rms = std::sqrt(rms / double(_Ntot));
247  return rms;
248 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
Definition: grid.h:231
template<size_t NDIM, typename T >
void Grid< NDIM, T >::set_y ( std::vector< T > &  y)

Definition at line 84 of file grid.cpp.

References Grid< NDIM, T >::_Ntot, and Grid< NDIM, T >::_y.

Referenced by Grid< NDIM, T >::Grid().

84  {
85 #ifdef _BOUNDSCHECK
86  assert(y.size() == _Ntot);
87 #endif
88  _y = y;
89 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
template<size_t NDIM, typename T >
void Grid< NDIM, T >::set_y ( size_t  i,
T &  value 
)

Definition at line 93 of file grid.cpp.

References Grid< NDIM, T >::_Ntot, Grid< NDIM, T >::_y, and Catch::Generators::value().

93  {
94 #ifdef _BOUNDSCHECK
95  assert(i < _Ntot);
96 #endif
97  _y[i] = value;
98 }
size_t _Ntot
Definition: grid.h:26
std::vector< T > _y
Definition: grid.h:27
auto value(T const &val) -> Generator< T >
Definition: catch.hpp:3177

Member Data Documentation


The documentation for this class was generated from the following files: