5 inline size_t power(
size_t a,
size_t b){
7 for(
size_t i = 0; i < b; i++) {
11 assert( (
pow(1.0*a,1.0*b) -
double(res)) < 0.5);
16 template<
size_t NDIM,
typename T>
19 assert(level < _Nlevel);
24 template<
size_t NDIM,
typename T>
27 assert(level < _Nlevel);
32 template<
size_t NDIM,
typename T>
35 assert(level < _Nlevel);
37 return _y[level].get_y();
40 template<
size_t NDIM,
typename T>
43 assert(level < _Nlevel);
45 return _y[level].get_y();
48 template<
size_t NDIM,
typename T>
51 assert(level < _Nlevel);
53 return _y[level].get_y();
56 template<
size_t NDIM,
typename T>
59 assert(level < _Nlevel);
61 return _y[level].get_y();
64 template<
size_t NDIM,
typename T>
67 assert(level < _Nlevel);
69 return _y[level].get_y(i);
72 template<
size_t NDIM,
typename T>
74 size_t ind = gridindex_from_coord(level, coord_list);
76 assert(level < _Nlevel);
78 return _y[level].get_y(ind);
81 template<
size_t NDIM,
typename T>
84 assert(level < _Nlevel);
86 _y[level].set_y(i, value);
89 template<
size_t NDIM,
typename T>
92 assert(level < _Nlevel);
94 return _NinLevel[level];
97 template<
size_t NDIM,
typename T>
100 assert(level < _Nlevel);
102 return _NtotinLevel[level];
105 template<
size_t NDIM,
typename T>
110 template<
size_t NDIM,
typename T>
115 template<
size_t NDIM,
typename T>
117 return _NinLevel[_Nlevel-1];
120 template<
size_t NDIM,
typename T>
126 template<
size_t NDIM,
typename T>
131 template<
size_t NDIM,
typename T>
141 assert( log2(INT_MAX) / log2(
_N) > NDIM );
144 _y = std::vector<Grid<NDIM, T> >(
_Nlevel);
146 for(
size_t level = 1; level <
_Nlevel; level++){
154 template<
size_t NDIM,
typename T>
158 if(from_level + 1 >=
_Nlevel)
return;
161 assert( to_grid.
get_N() ==
_y[from_level + 1].get_N() );
164 T oneovernumcells = 1.0/
T(1 << NDIM);
167 T *Top =
_y[from_level].get_y();
168 T *Bottom = to_grid.
get_y();
173 size_t NBottom =
_NinLevel[from_level+1];
177 std::fill_n(Bottom, NtotBottom, 0.0);
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;
188 for (
size_t i = 0; i < NtotTop; i++) {
192 for(
size_t j = 0; j < NDIM; j++){
193 size_t ii = i / NpowTop[j] % NTop;
194 i_bottom += (ii/2) * NpowBottom[j];
198 Bottom[i_bottom] += Top[i] * oneovernumcells;
203 template<
size_t NDIM,
typename T>
208 template<
size_t NDIM,
typename T>
210 for(
size_t i = 0; i <
_Nlevel-1; i++)
214 template<
size_t NDIM,
typename T>
219 std::vector<size_t> index(NDIM, 0);
221 for(
size_t idim = 0, n = 1; idim < NDIM; idim++, n *= N){
222 index[idim] = i / n % N;
227 template<
size_t NDIM,
typename T>
230 for(
size_t j = 0, N = 1; j < NDIM; j++, N *=
_NinLevel[level])
231 index += coord_list[j] * N;
235 template<
size_t NDIM,
typename T>
std::vector< size_t > _NinLevel
void restrict_down(size_t from_level)
std::vector< size_t > coord_from_gridindex(size_t level, size_t i)
size_t get_Ntot(size_t level=0) const
size_t power(size_t a, size_t b)
std::vector< size_t > _NtotinLevel
size_t get_N(size_t level=0) const
size_t get_Nlevel() const
std::vector< Grid< NDIM, T > > _y
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)
T * get_y(size_t level=0)
float pow(float base, unsigned long int exp)
T * operator[](size_t level)
Grid< NDIM, T > & get_grid(size_t level=0)
auto value(T const &val) -> Generator< T >