8 T mean(
const std::vector<T>& data)
12 #pragma omp parallel for reduction(+:tmp) 13 for (
auto it = data.begin(); it < data.end(); ++it) tmp += *it;
15 return tmp / data.size();
22 index_list = std::vector<size_t>(7);
24 for(
size_t j = 0, n = 1; j < 3; j++, n *= N){
26 size_t iminus = ii >= 1 ? ii - 1 : N - 1;
27 size_t iplus = ii <= N-2 ? ii + 1 : 0;
28 index_list[2*j+1] = i + (iminus - ii) * n;
29 index_list[2*j+2] = i + (iplus - ii) * n;
38 const size_t N_tot = rho.
length;
42 const FTYPE_t R2 = R*R;
43 size_t ix0 = N/2, iy0 = N/2, iz0 = N/2;
45 #pragma omp parallel for private(R2_) 46 for (
size_t ix = 0; ix < N; ++ix)
48 for (
size_t iy = 0; iy < N; ++iy)
50 for (
size_t iz = 0;
iz < N; ++
iz)
53 rho(ix, iy,
iz) = R2_ <= R2 ? rho_0 : 0;
59 if (mean_rho > 1)
throw std::out_of_range(
"invalid values of sphere parameters (overdensity: " + std::to_string(-mean_rho) +
" < -1)");
78 rho *=
pow(box_size / rho.
N, 2)
82 template <
typename T>
static int sgn(
T val)
84 return (
T(0) < val) - (val <
T(0));
91 int ix0 = N/2, iy0 = N/2, iz0 = N/2;
93 auto print_r_chi = [&File, ix0, iy0, iz0,&pot, mod]
98 File << r <<
"\t" << pot(pos) + mod <<
"\n";
101 for (
size_t i = 0; i < N; ++i)
103 print_r_chi(i, i, i);
104 print_r_chi(i, i, i + 1);
105 print_r_chi(i, i + 1, i + 1);
111 TEST_CASE(
"UNIT TEST: create Multigrid and copy data to/from Mesh",
"[multigrid]" )
113 print_unit_msg(
"create Multigrid and copy data to/from Mesh");
115 constexpr
size_t N = 32;
121 const std::vector<size_t> some_indices =
124 N*(N+2)*4+8*(N+2)+5};
125 for(
size_t i : some_indices) mesh_from[i] = 2.0*rand()/RAND_MAX - 1;
131 for(
size_t i : some_indices)
CHECK( mesh_from[i] == mesh_to[i] );
136 TEST_CASE(
"UNIT TEST: create and initialize ChiSolver, check bulk field",
"[chameleon]" )
138 print_unit_msg(
"create and initialize ChiSolver, check bulk field");
140 constexpr
size_t N = 32;
141 constexpr FTYPE_t a = 0.5;
142 constexpr FTYPE_t rho_0 = 0.3;
143 const std::vector<size_t> some_indices =
146 N*(N+2)*4+8*(N+2)+5};
150 const char*
const argv[1] = {
"test"};
154 auto constructor = [&sim](){ ChiSolver<FTYPE_t> _sol(N, sim,
false); };
163 ChiSolver<FTYPE_t> sol(N, sim,
false);
177 for(
size_t i : some_indices)
CHECK( rho_grid[0][i] == rho_0 );
180 sol.set_time(a, sim.
cosmo);
181 sol.add_external_grid(&rho_grid);
182 sol.set_bulk_field();
186 const FTYPE_t chi_bulk = sol.chi_min(rho_0);
187 FTYPE_t
const*
const chi = sol.get_y();
188 for(
size_t i : some_indices)
REQUIRE( chi[i] ==
Approx(chi_bulk));
192 std::vector<size_t> index_list;
194 const FTYPE_t
h = 1.0/FTYPE_t( sol.get_N(level) );
195 for(
size_t i : some_indices)
198 CHECK( sol.l_operator(level, index_list,
true, h) ==
Approx(0.));
202 TEST_CASE(
"UNIT TEST: create and initialize ChiSolver, solve sphere",
"[chameleon]" )
204 print_unit_msg(
"create and initialize ChiSolver, solve sphere");
207 const char*
const argv[1] = {
"test"};
214 ChiSolver<CHI_PREC_t> sol(N, N_min, sim, verbose);
223 throw std::runtime_error(
"Errors during multi-thread initialization");
230 sol.set_time(1, sim.
cosmo);
231 sol.set_def_convergence();
232 sol.add_external_grid(&rho_grid);
240 sol.set_linear(rho, p_F, p_B);
253 print_mesh(out_dir +
"grav_pot.dat", phi_pot, 0);
256 BOOST_LOG_TRIVIAL(info) <<
"Starting V-cycles with intermediate output...\n";
263 istep += sol.get_istep();
268 print_mesh(out_dir +
"chi_istep_" + std::to_string(istep) +
".dat", chi_full);
271 if ((max_step <= 0) || ((istep != 0) && (sol.get_istep() < step_per_iter)))
break;
274 sol.set_maxsteps(max_step);
void print_mesh(const std::string &file_name, const Mesh &pot, const double mod=-1-CHI_MIN)
constexpr CHI_PREC_t CHI_MIN
minimum value of chameleon field, in chi_a units it is '0', in phi units it is '-1' ...
FFTW_COMPLEX_TYPE * complex()
get fftw_complex pointer to data
#define CHECK_THROWS_AS(expr, exceptionType)
void transform_MultiGridSolver_to_Mesh(Mesh &mesh, const MultiGridSolver< 3, T > &sol)
void transform_MultiGrid_to_Mesh(Mesh &mesh, const MultiGrid< 3, T > &mltgrid)
void init_overdensity(Sim_Param &sim, Mesh &rho, MultiGrid< 3, CHI_PREC_t > &rho_grid)
void remove_all_files(const std::string &out_dir)
: class storing simulation parameters
void fftw_execute_dft_r2c(const FFTW_PLAN_TYPE &p_F, Mesh &rho)
compute forward (real to complex) FFT on mesh (inplace)
: creates a mesh of N*N*(N+2) cells
void fftw_execute_dft_c2r(const FFTW_PLAN_TYPE &p_B, Mesh &rho)
compute backward (complex to real) FFT on mesh (inplace)
void gen_pot_k(const Mesh &rho_k, Mesh &pot_k)
void transform_Mesh_to_MultiGrid(const Mesh &mesh, MultiGrid< 3, T > &mltgrid)
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
#define FFTW_PLAN_OMP_CLEAN
void create_dir(const std::string &out_dir)
void get_neighbor_gridindex(std::vector< size_t > &index_list, size_t i, size_t N)
TEST_CASE("UNIT TEST: create Multigrid and copy data to/from Mesh","[multigrid]")
T min(const std::vector< T > &data)
float pow(float base, unsigned long int exp)
void get_grav_pot(Mesh &rho, const FFTW_PLAN_TYPE &p_F, const FFTW_PLAN_TYPE &p_B, double box_size, double phi_prefactor)
#define FFTW_PLAN_OMP_INIT
void print_info(std::string out, std::string app) const
double mean(const Mesh &data)
chameleon model of gravity implementation