1 #ifndef _FOFRSOLVER_HEADER 2 #define _FOFRSOLVER_HEADER 3 #include "../src/multigrid_solver.h" 16 template<
unsigned int NDIM,
typename T>
42 void set_parameters(
double boxsize,
double omegam,
double aexp,
double nfofr,
double fofr0){
43 std::cout <<
"==> FofrSolver::set_parameters | Boxsize: " << boxsize <<
" Omegam: " << omegam;
44 std::cout <<
" aexp: " << aexp <<
" nfofr: " << nfofr <<
" fofr0: " << fofr0 << std::endl;
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;
59 inline double bfunc(
double x){
return std::exp(x); }
62 T l_operator(
unsigned int level, std::vector<unsigned int>& index_list,
bool addsource){
63 unsigned int i = index_list[0];
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];
81 T bminus = 0.5 * (
bfunc(fminus) + boff );
82 T bplus = 0.5 * (
bfunc(fplus) + boff );
83 kinetic += bplus * (fplus - f) - bminus * (f - fminus);
87 T source = _prefac * ( drho[ i ] + _fac1 - _fac2 * std::exp(-phi[ i ]/(_nfofr+1.0)) );
88 if( level > 0 && addsource ){
93 return kinetic/(h*
h) - source;
97 T dl_operator(
unsigned int level, std::vector<unsigned int>& index_list){
98 unsigned int i = index_list[0];
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 );
120 dkinetic += 0.5 * dboff * (fplus + fminus - 2.0 * f) - (bplus + bminus);
124 T dsource = _prefac * ( _fac2 * std::exp(-phi[ i ] / (_nfofr+1.0) ) ) / (1.0+_nfofr);
126 return dkinetic/(h*
h) - dsource;
T dl_operator(unsigned int level, std::vector< unsigned int > &index_list)
T * get_y(size_t level=0)
T * get_external_field(size_t level, size_t field)
FofrSolver(MultiGrid< NDIM, T > &source, bool verbose=true)
size_t get_N(size_t level=0) const
FofrSolver(unsigned int N, bool verbose=true)
T l_operator(unsigned int level, std::vector< unsigned int > &index_list, bool addsource)
static CCL_BEGIN_DECLS double x[111][8]
void set_parameters(double boxsize, double omegam, double aexp, double nfofr, double fofr0)
T get_multigrid_source(size_t level, size_t i) const
float pow(float base, unsigned long int exp)
FofrSolver(unsigned int N, int Nmin, bool verbose=true)