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

#include <multigrid.h>

Public Member Functions

 MultiGrid ()
 
 MultiGrid (size_t N)
 
 MultiGrid (size_t N, size_t Nlevel)
 
 MultiGrid (Grid< NDIM, T > &y, size_t Nlevel)
 
 MultiGrid (Grid< NDIM, T > &y)
 
Grid< NDIM, T > & get_grid (size_t level=0)
 
const Grid< NDIM, T > & get_grid (size_t level=0) const
 
T * operator[] (size_t level)
 
const T * operator[] (size_t level) const
 
T * get_y (size_t level=0)
 
T const *const get_y (size_t level=0) const
 
get_y (size_t level, size_t i)
 
get_y (size_t level, std::vector< size_t > &coord_list)
 
size_t get_N (size_t level=0) const
 
size_t get_Ntot (size_t level=0) const
 
size_t get_Ndim () const
 
size_t get_Nlevel () const
 
size_t get_Nmin () const
 
void set_y (size_t level, size_t i, T value)
 
size_t gridindex_from_coord (size_t level, std::vector< size_t > &coord_list)
 
std::vector< size_t > coord_from_gridindex (size_t level, size_t i)
 
void clear ()
 
void restrict_down (size_t from_level)
 
void restrict_down (size_t from_level, Grid< NDIM, T > &to_grid)
 
void restrict_down_all ()
 

Private Attributes

size_t _N
 
size_t _Ntot
 
size_t _Nlevel
 
std::vector< size_t > _NinLevel
 
std::vector< size_t > _NtotinLevel
 
std::vector< Grid< NDIM, T > > _y
 

Detailed Description

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

Definition at line 21 of file multigrid.h.

Constructor & Destructor Documentation

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

Definition at line 34 of file multigrid.h.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

34 {}
template<size_t NDIM, typename T>
MultiGrid< NDIM, T >::MultiGrid ( size_t  N)
inline

Definition at line 35 of file multigrid.h.

35 : MultiGrid(N, int(log2(N)+1)) {}
MultiGrid()
Definition: multigrid.h:34
template<size_t NDIM, typename T >
MultiGrid< NDIM, T >::MultiGrid ( size_t  N,
size_t  Nlevel 
)

Definition at line 132 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_N, MultiGrid< NDIM, T >::_NinLevel, MultiGrid< NDIM, T >::_Nlevel, MultiGrid< NDIM, T >::_NtotinLevel, MultiGrid< NDIM, T >::_y, and power().

132  : _N(N), _Ntot(power(_N, NDIM)), _Nlevel(Nlevel), _NinLevel(std::vector<size_t>(_Nlevel, _N)), _NtotinLevel(std::vector<size_t>(_Nlevel, _Ntot)) {
133 
134  // Check that N is positive and divisible by 2^{Nlevel - 1}
135  assert( ( _N / power(2, _Nlevel - 1) ) * power(2, _Nlevel - 1) == _N && _N > 0);
136 
137  // We need atleast 1 level
138  assert( _Nlevel > 0 );
139 
140  // Total number of cells in finest level should not be too large (otherwise we cannot use [int])
141  assert( log2(INT_MAX) / log2(_N) > NDIM );
142 
143  // Allocate memory
144  _y = std::vector<Grid<NDIM, T> >(_Nlevel);
145  _y[0] = Grid<NDIM, T> (_N, 0.0);
146  for(size_t level = 1; level < _Nlevel; level++){
147  _NinLevel[level] = _NinLevel[level-1] / 2;
148  _NtotinLevel[level] = power(_NinLevel[level], NDIM);
149  assert(_NinLevel[level] > 0);
150  _y[level] = Grid<NDIM, T>(_NinLevel[level], 0.0);
151  }
152 }
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
size_t _N
Definition: multigrid.h:24
size_t power(size_t a, size_t b)
Definition: multigrid.cpp:5
Definition: grid.h:21
std::vector< size_t > _NtotinLevel
Definition: multigrid.h:28
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
size_t _Ntot
Definition: multigrid.h:25
template<size_t NDIM, typename T>
MultiGrid< NDIM, T >::MultiGrid ( Grid< NDIM, T > &  y,
size_t  Nlevel 
)

Definition at line 127 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_y.

127  : MultiGrid(y.get_N(), Nlevel) {
128  _y[0] = y;
129 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t get_N() const
Definition: grid.cpp:135
MultiGrid()
Definition: multigrid.h:34
template<size_t NDIM, typename T>
MultiGrid< NDIM, T >::MultiGrid ( Grid< NDIM, T > &  y)

Definition at line 121 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_Nlevel, MultiGrid< NDIM, T >::_y, Grid< NDIM, T >::get_N(), and power().

121  : MultiGrid(y.get_N(), int(log2(y.get_N())+1)){
122  assert( power(2, _Nlevel - 1 ) == y.get_N() );
123  _y[0] = y;
124 }
size_t power(size_t a, size_t b)
Definition: multigrid.cpp:5
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t get_N() const
Definition: grid.cpp:135
size_t _Nlevel
Definition: multigrid.h:26
MultiGrid()
Definition: multigrid.h:34

Member Function Documentation

template<size_t NDIM, typename T >
void MultiGrid< NDIM, T >::clear ( )

Definition at line 236 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_N, MultiGrid< NDIM, T >::_NinLevel, MultiGrid< NDIM, T >::_Nlevel, MultiGrid< NDIM, T >::_Ntot, MultiGrid< NDIM, T >::_NtotinLevel, and MultiGrid< NDIM, T >::_y.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

236  {
237  _N = _Ntot = _Nlevel = 0;
238  _NinLevel.clear();
239  _NtotinLevel.clear();
240  _y.clear();
241 }
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
size_t _N
Definition: multigrid.h:24
std::vector< size_t > _NtotinLevel
Definition: multigrid.h:28
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
size_t _Ntot
Definition: multigrid.h:25
template<size_t NDIM, typename T >
std::vector< size_t > MultiGrid< NDIM, T >::coord_from_gridindex ( size_t  level,
size_t  i 
)

Definition at line 215 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_NinLevel, and MultiGrid< NDIM, T >::_NtotinLevel.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

215  {
216 #ifdef _BOUNDSCHECK
217  assert(i < _NtotinLevel[level]);
218 #endif
219  std::vector<size_t> index(NDIM, 0);
220  size_t N = _NinLevel[level];
221  for(size_t idim = 0, n = 1; idim < NDIM; idim++, n *= N){
222  index[idim] = i / n % N;
223  }
224  return index;
225 }
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
std::vector< size_t > _NtotinLevel
Definition: multigrid.h:28
template<size_t NDIM, typename T >
Grid< NDIM, T > & MultiGrid< NDIM, T >::get_grid ( size_t  level = 0)
template<size_t NDIM, typename T >
const Grid< NDIM, T > & MultiGrid< NDIM, T >::get_grid ( size_t  level = 0) const

Definition at line 25 of file multigrid.cpp.

25  {
26 #ifdef _BOUNDSCHECK
27  assert(level < _Nlevel);
28 #endif
29  return _y[level];
30 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
size_t MultiGrid< NDIM, T >::get_N ( size_t  level = 0) const

Definition at line 90 of file multigrid.cpp.

Referenced by assign_to_grid(), main(), MultiGrid< 3, CHI_PREC_t >::MultiGrid(), and set_rho().

90  {
91 #ifdef _BOUNDSCHECK
92  assert(level < _Nlevel);
93 #endif
94  return _NinLevel[level];
95 }
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
size_t MultiGrid< NDIM, T >::get_Ndim ( ) const

Definition at line 106 of file multigrid.cpp.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

106  {
107  return NDIM;
108 }
template<size_t NDIM, typename T >
size_t MultiGrid< NDIM, T >::get_Nlevel ( ) const

Definition at line 111 of file multigrid.cpp.

Referenced by MultiGridSolver< NDIM, T >::add_external_grid(), main(), and MultiGrid< 3, CHI_PREC_t >::MultiGrid().

111  {
112  return _Nlevel;
113 }
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
size_t MultiGrid< NDIM, T >::get_Nmin ( ) const

Definition at line 116 of file multigrid.cpp.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

116  {
117  return _NinLevel[_Nlevel-1];
118 }
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
size_t MultiGrid< NDIM, T >::get_Ntot ( size_t  level = 0) const

Definition at line 98 of file multigrid.cpp.

Referenced by assign_to_grid(), MultiGrid< 3, CHI_PREC_t >::MultiGrid(), and set_rho().

98  {
99 #ifdef _BOUNDSCHECK
100  assert(level < _Nlevel);
101 #endif
102  return _NtotinLevel[level];
103 }
std::vector< size_t > _NtotinLevel
Definition: multigrid.h:28
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
T * MultiGrid< NDIM, T >::get_y ( size_t  level = 0)

Definition at line 49 of file multigrid.cpp.

Referenced by assign_to_grid(), MultiGrid< 3, CHI_PREC_t >::MultiGrid(), and set_rho().

49  {
50 #ifdef _BOUNDSCHECK
51  assert(level < _Nlevel);
52 #endif
53  return _y[level].get_y();
54 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
T const *const MultiGrid< NDIM, T >::get_y ( size_t  level = 0) const

Definition at line 57 of file multigrid.cpp.

57  {
58 #ifdef _BOUNDSCHECK
59  assert(level < _Nlevel);
60 #endif
61  return _y[level].get_y();
62 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
T MultiGrid< NDIM, T >::get_y ( size_t  level,
size_t  i 
)

Definition at line 65 of file multigrid.cpp.

65  {
66 #ifdef _BOUNDSCHECK
67  assert(level < _Nlevel);
68 #endif
69  return _y[level].get_y(i);
70 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
T MultiGrid< NDIM, T >::get_y ( size_t  level,
std::vector< size_t > &  coord_list 
)

Definition at line 73 of file multigrid.cpp.

73  {
74  size_t ind = gridindex_from_coord(level, coord_list);
75 #ifdef _BOUNDSCHECK
76  assert(level < _Nlevel);
77 #endif
78  return _y[level].get_y(ind);
79 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
size_t gridindex_from_coord(size_t level, std::vector< size_t > &coord_list)
Definition: multigrid.cpp:228
template<size_t NDIM, typename T >
size_t MultiGrid< NDIM, T >::gridindex_from_coord ( size_t  level,
std::vector< size_t > &  coord_list 
)

Definition at line 228 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_NinLevel.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

228  {
229  size_t index = 0;
230  for(size_t j = 0, N = 1; j < NDIM; j++, N *= _NinLevel[level])
231  index += coord_list[j] * N;
232  return index;
233 }
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
template<size_t NDIM, typename T >
T * MultiGrid< NDIM, T >::operator[] ( size_t  level)

Definition at line 33 of file multigrid.cpp.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

33  {
34 #ifdef _BOUNDSCHECK
35  assert(level < _Nlevel);
36 #endif
37  return _y[level].get_y();
38 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
const T * MultiGrid< NDIM, T >::operator[] ( size_t  level) const

Definition at line 41 of file multigrid.cpp.

41  {
42 #ifdef _BOUNDSCHECK
43  assert(level < _Nlevel);
44 #endif
45  return _y[level].get_y();
46 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
void MultiGrid< NDIM, T >::restrict_down ( size_t  from_level)

Definition at line 204 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_y.

Referenced by main(), MultiGrid< 3, CHI_PREC_t >::MultiGrid(), and MultiGrid< NDIM, T >::restrict_down_all().

204  {
205  restrict_down(from_level, _y[from_level+1]);
206 }
void restrict_down(size_t from_level)
Definition: multigrid.cpp:204
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
template<size_t NDIM, typename T>
void MultiGrid< NDIM, T >::restrict_down ( size_t  from_level,
Grid< NDIM, T > &  to_grid 
)

Definition at line 155 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_NinLevel, MultiGrid< NDIM, T >::_Nlevel, MultiGrid< NDIM, T >::_NtotinLevel, MultiGrid< NDIM, T >::_y, Grid< NDIM, T >::get_N(), Grid< NDIM, T >::get_y(), and growth_allz::T.

155  {
156 
157  // Cannot restict down if we are at the bottom
158  if(from_level + 1 >= _Nlevel) return;
159 
160  // Sanity check
161  assert( to_grid.get_N() == _y[from_level + 1].get_N() );
162 
163  // One over number of cells averaged over [ = 1 / 2^Ndim ]
164  T oneovernumcells = 1.0/T(1 << NDIM);
165 
166  // Pointers to Top and Bottom grid
167  T *Top = _y[from_level].get_y();
168  T *Bottom = to_grid.get_y();//_y[from_level+1].get_y();
169 
170  // Nodes on top and bottom level
171  size_t NTop = _NinLevel[from_level];
172  size_t NtotTop = _NtotinLevel[from_level];
173  size_t NBottom = _NinLevel[from_level+1];
174  size_t NtotBottom = _NtotinLevel[from_level+1];
175 
176  // Clear bottom array
177  std::fill_n(Bottom, NtotBottom, 0.0);
178 
179  // Compute N^j
180  std::vector<size_t> NpowTop(NDIM, 1);
181  std::vector<size_t> NpowBottom(NDIM, 1);
182  for(size_t j = 1; j < NDIM; j++){
183  NpowTop[j] = NpowTop[j-1] * NTop;
184  NpowBottom[j] = NpowBottom[j-1] * NBottom;
185  }
186 
187  // Loop over top grid
188  for (size_t i = 0; i < NtotTop; i++) {
189 
190  // Compute bottom array index the top cell 'belongs to'
191  size_t i_bottom = 0;
192  for(size_t j = 0; j < NDIM; j++){
193  size_t ii = i / NpowTop[j] % NTop;
194  i_bottom += (ii/2) * NpowBottom[j];
195  }
196 
197  // Add up to restricted grid
198  Bottom[i_bottom] += Top[i] * oneovernumcells;
199  }
200 
201 }
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
std::vector< size_t > _NtotinLevel
Definition: multigrid.h:28
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t get_N() const
Definition: grid.cpp:135
T * get_y()
Definition: grid.cpp:41
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T >
void MultiGrid< NDIM, T >::restrict_down_all ( )

Definition at line 209 of file multigrid.cpp.

References MultiGrid< NDIM, T >::_Nlevel, and MultiGrid< NDIM, T >::restrict_down().

Referenced by main(), MultiGrid< 3, CHI_PREC_t >::MultiGrid(), set_rho(), and anonymous_namespace{chameleon.cpp}::transform_Mesh_to_MultiGrid().

209  {
210  for(size_t i = 0; i < _Nlevel-1; i++)
211  restrict_down(i);
212 }
void restrict_down(size_t from_level)
Definition: multigrid.cpp:204
size_t _Nlevel
Definition: multigrid.h:26
template<size_t NDIM, typename T>
void MultiGrid< NDIM, T >::set_y ( size_t  level,
size_t  i,
value 
)

Definition at line 82 of file multigrid.cpp.

Referenced by MultiGrid< 3, CHI_PREC_t >::MultiGrid().

82  {
83 #ifdef _BOUNDSCHECK
84  assert(level < _Nlevel);
85 #endif
86  _y[level].set_y(i, value);
87 }
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
size_t _Nlevel
Definition: multigrid.h:26
auto value(T const &val) -> Generator< T >
Definition: catch.hpp:3177

Member Data Documentation

template<size_t NDIM, typename T>
size_t MultiGrid< NDIM, T >::_N
private

Definition at line 24 of file multigrid.h.

Referenced by MultiGrid< NDIM, T >::clear(), and MultiGrid< NDIM, T >::MultiGrid().

template<size_t NDIM, typename T>
std::vector<size_t> MultiGrid< NDIM, T >::_NinLevel
private
template<size_t NDIM, typename T>
size_t MultiGrid< NDIM, T >::_Nlevel
private
template<size_t NDIM, typename T>
size_t MultiGrid< NDIM, T >::_Ntot
private

Definition at line 25 of file multigrid.h.

Referenced by MultiGrid< NDIM, T >::clear().

template<size_t NDIM, typename T>
std::vector<size_t> MultiGrid< NDIM, T >::_NtotinLevel
private
template<size_t NDIM, typename T>
std::vector<Grid<NDIM,T> > MultiGrid< NDIM, T >::_y
private

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