Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
multigrid.h
Go to the documentation of this file.
1 #ifndef _MULTIGRID_HEADER
2 #define _MULTIGRID_HEADER
3 #include <assert.h>
4 #include <iosfwd>
5 #include <vector>
6 #include <climits>
7 #include <complex>
8 #include "grid.h"
9 
10  //=========================================
11  // //
12  // A stack of _Nlevel grids with //
13  // N^NDIM / 2^Level cells in each level //
14  // //
15  // Bounds-check for array lookups: //
16  // #define _BOUNDSCHECK //
17  // //
18  //=========================================
19 
20 template<size_t NDIM, typename T>
21 class MultiGrid {
22  private:
23 
24  size_t _N; // Number of cells per dim in domain-grid [0]
25  size_t _Ntot; // Total number of cells in domain-grid [0]
26  size_t _Nlevel; // Number of levels
27  std::vector<size_t> _NinLevel; // Number of cells per dim in each level
28  std::vector<size_t> _NtotinLevel; // Total number of cells in each level
29  std::vector<Grid<NDIM,T> > _y; // The grid data
30 
31  public:
32 
33  // Constructors
34  MultiGrid() {}
35  MultiGrid(size_t N): MultiGrid(N, int(log2(N)+1)) {}
36  MultiGrid(size_t N, size_t Nlevel);
37  MultiGrid(Grid<NDIM, T> &y, size_t Nlevel);
39 
40  // Fetch a reference to the solution grid at a given level
41  Grid<NDIM,T>& get_grid(size_t level = 0);
42  const Grid<NDIM,T>& get_grid(size_t level = 0) const;
43 
44  // Fetch a pointer to the underlying array at each level
45  T* operator[](size_t level);
46  const T* operator[](size_t level) const;
47  T* get_y(size_t level = 0);
48  T const* const get_y(size_t level = 0) const;
49 
50  // Fetch the value in the grid at a given level and index
51  T get_y(size_t level, size_t i);
52 
53  // Fetch the value in the grid at a given level and coordinates (ix,iy...)
54  T get_y(size_t level, std::vector<size_t>& coord_list);
55 
56  // Fetch info about the grid
57  size_t get_N(size_t level = 0) const;
58  size_t get_Ntot(size_t level = 0) const;
59  size_t get_Ndim() const;
60  size_t get_Nlevel() const;
61  size_t get_Nmin() const;
62 
63  // Set the value of y at given level and index (save way to define value)
64  void set_y(size_t level, size_t i, T value);
65 
66  // Gridindex from coordinate and vice versa
67  size_t gridindex_from_coord(size_t level, std::vector<size_t>& coord_list);
68  std::vector<size_t> coord_from_gridindex(size_t level, size_t i);
69 
70  // Free up all memory and reset all variables
71  void clear();
72 
73  // Restrict down a grid
74  void restrict_down(size_t from_level);
75  void restrict_down(size_t from_level, Grid<NDIM, T> &to_grid);
76  void restrict_down_all();
77 };
78 
79 #endif
size_t get_Ndim() const
Definition: multigrid.cpp:106
std::vector< size_t > _NinLevel
Definition: multigrid.h:27
size_t get_Nmin() const
Definition: multigrid.cpp:116
void restrict_down(size_t from_level)
Definition: multigrid.cpp:204
std::vector< size_t > coord_from_gridindex(size_t level, size_t i)
Definition: multigrid.cpp:215
size_t _N
Definition: multigrid.h:24
void restrict_down_all()
Definition: multigrid.cpp:209
size_t get_Ntot(size_t level=0) const
Definition: multigrid.cpp:98
Definition: grid.h:21
std::vector< size_t > _NtotinLevel
Definition: multigrid.h:28
size_t get_N(size_t level=0) const
Definition: multigrid.cpp:90
size_t get_Nlevel() const
Definition: multigrid.cpp:111
std::vector< Grid< NDIM, T > > _y
Definition: multigrid.h:29
void set_y(size_t level, size_t i, T value)
Definition: multigrid.cpp:82
size_t _Nlevel
Definition: multigrid.h:26
MultiGrid()
Definition: multigrid.h:34
size_t _Ntot
Definition: multigrid.h:25
size_t gridindex_from_coord(size_t level, std::vector< size_t > &coord_list)
Definition: multigrid.cpp:228
void clear()
Definition: multigrid.cpp:236
MultiGrid(size_t N)
Definition: multigrid.h:35
T * get_y(size_t level=0)
Definition: multigrid.cpp:49
T * operator[](size_t level)
Definition: multigrid.cpp:33
Grid< NDIM, T > & get_grid(size_t level=0)
Definition: multigrid.cpp:17
auto value(T const &val) -> Generator< T >
Definition: catch.hpp:3177