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

#include <fofr_solver.h>

Inheritance diagram for FofrSolver< NDIM, T >:
Collaboration diagram for FofrSolver< NDIM, T >:

Public Member Functions

 FofrSolver ()
 
 FofrSolver (unsigned int N, bool verbose=true)
 
 FofrSolver (unsigned int N, int Nmin, bool verbose=true)
 
 FofrSolver (MultiGrid< NDIM, T > &source, bool verbose=true)
 
void set_parameters (double boxsize, double omegam, double aexp, double nfofr, double fofr0)
 
double bfunc (double x)
 
l_operator (unsigned int level, std::vector< unsigned int > &index_list, bool addsource)
 
dl_operator (unsigned int level, std::vector< unsigned int > &index_list)
 
- Public Member Functions inherited from MultiGridSolver< NDIM, T >
 MultiGridSolver ()
 
 MultiGridSolver (size_t N)
 
 MultiGridSolver (size_t N, bool verbose)
 
 MultiGridSolver (size_t N, size_t Nmin, bool verbose)
 
size_t get_istep () const
 
T * get_y (size_t level=0)
 
T const * get_y (size_t level=0) const
 
Grid< NDIM, T > & get_grid (size_t level=0)
 
const Grid< NDIM, T > & get_grid (size_t level=0) const
 
MultiGrid< NDIM, T > & get_mlt_grid (size_t level=0)
 
const MultiGrid< NDIM, T > & get_mlt_grid (size_t level=0) const
 
T * get_external_field (size_t level, size_t field)
 
T const * get_external_field (size_t level, size_t field) const
 
Grid< NDIM, T > & get_external_grid (size_t level, size_t field)
 
const Grid< NDIM, T > & get_external_grid (size_t level, size_t field) const
 
size_t get_external_field_size () const
 
get_multigrid_source (size_t level, size_t i) const
 
void set_epsilon (double eps_converge)
 
void set_maxsteps (size_t maxsteps)
 
void set_ngs_sweeps (size_t ngs_fine, size_t ngs_coarse)
 
void set_convergence_criterion_residual (bool use_residual)
 
void set_Nlevel (size_t N)
 
size_t get_N (size_t level=0) const
 
size_t get_Ntot (size_t level=0) const
 
size_t get_Nlevel () const
 
void add_external_grid (MultiGrid< NDIM, T > *field)
 
void set_initial_guess (T guess)
 
void set_initial_guess (T *guess)
 
void set_initial_guess (Grid< NDIM, T > &guess)
 
Exit_Status solve ()
 
void clear ()
 
virtual T upd_operator (const T f, const size_t level, const std::vector< size_t > &index_list, const T h) const
 
virtual T l_operator (const size_t level, const std::vector< size_t > &index_list, bool addsource, const T h) const
 
virtual T dl_operator (const size_t level, const std::vector< size_t > &index_list, const T h) const
 
virtual void correct_sol (Grid< NDIM, T > &f, const Grid< NDIM, T > &corr, const size_t level)
 
virtual Exit_Status check_convergence ()
 
virtual void check_solution (size_t level, Grid< NDIM, T > &sol)
 
void check_solution (size_t level)
 

Private Attributes

double _boxsize = 100.0
 
double _omegam = 0.3
 
double _aexp = 1.0
 
double _nfofr = 1.0
 
double _fofr0 = 1.0e-5
 
double _fac1 = 10.33333333
 
double _fac2 = 0.032676900
 
double _prefac = 0.000333778
 

Additional Inherited Members

- Public Types inherited from MultiGridSolver< NDIM, T >
enum  Exit_Status {
  Exit_Status::SUCCESS, Exit_Status::FAILURE, Exit_Status::SLOW, Exit_Status::ITERATE,
  Exit_Status::MAX_STEPS
}
 
- Public Attributes inherited from MultiGridSolver< NDIM, T >
bool _store_all_residual = false
 
std::vector< double_res_domain_array
 
- Protected Member Functions inherited from MultiGridSolver< NDIM, T >
void get_neighbor_gridindex (std::vector< size_t > &index_list, size_t i, size_t ngrid)
 
- Protected Attributes inherited from MultiGridSolver< NDIM, T >
bool _verbose
 
bool _conv_criterion_residual = true
 
double _eps_converge = 1e-5
 
size_t _maxsteps = 1000
 
size_t _istep_vcycle = 0
 
double _rms_res
 
double _rms_res_i
 
double _rms_res_old
 

Detailed Description

template<unsigned int NDIM, typename T>
class FofrSolver< NDIM, T >

Definition at line 17 of file fofr_solver.h.

Constructor & Destructor Documentation

template<unsigned int NDIM, typename T >
FofrSolver< NDIM, T >::FofrSolver ( )
inline

Definition at line 35 of file fofr_solver.h.

35 {}
template<unsigned int NDIM, typename T >
FofrSolver< NDIM, T >::FofrSolver ( unsigned int  N,
bool  verbose = true 
)
inline

Definition at line 36 of file fofr_solver.h.

template<unsigned int NDIM, typename T >
FofrSolver< NDIM, T >::FofrSolver ( unsigned int  N,
int  Nmin,
bool  verbose = true 
)
inline

Definition at line 37 of file fofr_solver.h.

37 : MultiGridSolver<NDIM,T>(N, Nmin, verbose) {} ;
template<unsigned int NDIM, typename T >
FofrSolver< NDIM, T >::FofrSolver ( MultiGrid< NDIM, T > &  source,
bool  verbose = true 
)
inline

Definition at line 38 of file fofr_solver.h.

38  : MultiGridSolver<NDIM,T>(source.get_N(), source.get_Nmin(), verbose) {
40  }
size_t get_Nmin() const
Definition: multigrid.cpp:116
size_t get_N(size_t level=0) const
Definition: multigrid.cpp:90

Member Function Documentation

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::bfunc ( double  x)
inline

Definition at line 59 of file fofr_solver.h.

Referenced by FofrSolver< NDIM, T >::dl_operator(), and FofrSolver< NDIM, T >::l_operator().

59 { return std::exp(x); }
static CCL_BEGIN_DECLS double x[111][8]
template<unsigned int NDIM, typename T >
T FofrSolver< NDIM, T >::dl_operator ( unsigned int  level,
std::vector< unsigned int > &  index_list 
)
inline

Definition at line 97 of file fofr_solver.h.

References FofrSolver< NDIM, T >::bfunc(), MultiGridSolver< NDIM, T >::get_y(), ccl_test_distances::h, and growth_allz::T.

97  {
98  unsigned int i = index_list[0];
99 
100  // Gridspacing
101  T h = 1.0/T( MultiGridSolver<NDIM,T>::get_N(level) );
102 
103  // Solution and pde-source grid at current level
104  T *phi = MultiGridSolver<NDIM,T>::get_y(level);
105 
106  // The derivative of the kinetic term D[ b[f] Df ]
107  T dkinetic = 0.0;
108  T f = phi[i];
109  T boff = bfunc(f);
110  T dboff = boff;
111  for(unsigned int j = 0; j < NDIM; j++){
112  unsigned int iminus = index_list[2*j+1];
113  unsigned int iplus = index_list[2*j+2];
114  T fminus = phi[iminus];
115  T fplus = phi[iplus];
116  T bminus = 0.5 * ( bfunc(fminus) + boff );
117  T bplus = 0.5 * ( bfunc(fplus) + boff );
118 
119  // Add up kinetic term
120  dkinetic += 0.5 * dboff * (fplus + fminus - 2.0 * f) - (bplus + bminus);
121  }
122 
123  // The derivative of the right hand side
124  T dsource = _prefac * ( _fac2 * std::exp(-phi[ i ] / (_nfofr+1.0) ) ) / (1.0+_nfofr);
125 
126  return dkinetic/(h*h) - dsource;
127  }
double _fac2
Definition: fofr_solver.h:29
T * get_y(size_t level=0)
double _nfofr
Definition: fofr_solver.h:24
double bfunc(double x)
Definition: fofr_solver.h:59
double _prefac
Definition: fofr_solver.h:30
template<unsigned int NDIM, typename T >
T FofrSolver< NDIM, T >::l_operator ( unsigned int  level,
std::vector< unsigned int > &  index_list,
bool  addsource 
)
inline

Definition at line 62 of file fofr_solver.h.

References FofrSolver< NDIM, T >::bfunc(), MultiGridSolver< NDIM, T >::get_external_field(), MultiGridSolver< NDIM, T >::get_multigrid_source(), MultiGridSolver< NDIM, T >::get_y(), ccl_test_distances::h, and growth_allz::T.

62  {
63  unsigned int i = index_list[0];
64 
65  // Gridspacing
66  T h = 1.0/T( MultiGridSolver<NDIM,T>::get_N(level) );
67 
68  // Solution and pde-source grid at current level
69  T *phi = MultiGridSolver<NDIM,T>::get_y(level);
71 
72  // The kinetic term is D[ b[f] Df ] with b = exp(x)
73  T kinetic = 0.0;
74  T f = phi[i];
75  T boff = bfunc(f);
76  for(unsigned int j = 0; j < NDIM; j++){
77  unsigned int iminus = index_list[2*j+1];
78  unsigned int iplus = index_list[2*j+2];
79  T fminus = phi[iminus];
80  T fplus = phi[iplus];
81  T bminus = 0.5 * ( bfunc(fminus) + boff );
82  T bplus = 0.5 * ( bfunc(fplus) + boff );
83  kinetic += bplus * (fplus - f) - bminus * (f - fminus);
84  }
85 
86  // The right hand side of the PDE
87  T source = _prefac * ( drho[ i ] + _fac1 - _fac2 * std::exp(-phi[ i ]/(_nfofr+1.0)) );
88  if( level > 0 && addsource ){
90  }
91 
92  // The discretized equation of motion L_{ijk...}(phi) = 0
93  return kinetic/(h*h) - source;
94  }
double _fac2
Definition: fofr_solver.h:29
T * get_y(size_t level=0)
T * get_external_field(size_t level, size_t field)
double _nfofr
Definition: fofr_solver.h:24
double bfunc(double x)
Definition: fofr_solver.h:59
T get_multigrid_source(size_t level, size_t i) const
double _prefac
Definition: fofr_solver.h:30
double _fac1
Definition: fofr_solver.h:28
template<unsigned int NDIM, typename T >
void FofrSolver< NDIM, T >::set_parameters ( double  boxsize,
double  omegam,
double  aexp,
double  nfofr,
double  fofr0 
)
inline

Definition at line 42 of file fofr_solver.h.

References FofrSolver< NDIM, T >::_aexp, FofrSolver< NDIM, T >::_omegam, Catch::cout(), and pow().

42  {
43  std::cout << "==> FofrSolver::set_parameters | Boxsize: " << boxsize << " Omegam: " << omegam;
44  std::cout << " aexp: " << aexp << " nfofr: " << nfofr << " fofr0: " << fofr0 << std::endl;
45 
46  // Set parameters
47  _boxsize = boxsize;
48  _omegam = omegam;
49  _aexp = aexp;
50  _nfofr = nfofr;
51  _fofr0 = fofr0;
52 
53  // Derived parameters
54  _fac1 = 1.0 + 4.0 * _aexp * _aexp * _aexp * (1.0 - _omegam) / _omegam;
55  _fac2 = (1.0 + 4.0 * (1.0 - _omegam) / _omegam ) * _aexp * _aexp * _aexp * std::pow( _fofr0 * _aexp, 1.0 / (_nfofr+1.0) );
56  _prefac = pow( _boxsize / 2998.0 , 2) * _omegam * _aexp;
57  }
double _fac2
Definition: fofr_solver.h:29
double _omegam
Definition: fofr_solver.h:22
double _aexp
Definition: fofr_solver.h:23
double _boxsize
Definition: fofr_solver.h:21
std::ostream & cout()
double _nfofr
Definition: fofr_solver.h:24
double _fofr0
Definition: fofr_solver.h:25
double _prefac
Definition: fofr_solver.h:30
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
double _fac1
Definition: fofr_solver.h:28

Member Data Documentation

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_aexp = 1.0
private

Definition at line 23 of file fofr_solver.h.

Referenced by FofrSolver< NDIM, T >::set_parameters().

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_boxsize = 100.0
private

Definition at line 21 of file fofr_solver.h.

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_fac1 = 10.33333333
private

Definition at line 28 of file fofr_solver.h.

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_fac2 = 0.032676900
private

Definition at line 29 of file fofr_solver.h.

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_fofr0 = 1.0e-5
private

Definition at line 25 of file fofr_solver.h.

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_nfofr = 1.0
private

Definition at line 24 of file fofr_solver.h.

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_omegam = 0.3
private

Definition at line 22 of file fofr_solver.h.

Referenced by FofrSolver< NDIM, T >::set_parameters().

template<unsigned int NDIM, typename T >
double FofrSolver< NDIM, T >::_prefac = 0.000333778
private

Definition at line 30 of file fofr_solver.h.


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