Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
App_Var_Chi::ChiImpl Class Reference
Collaboration diagram for App_Var_Chi::ChiImpl:

Public Member Functions

 ChiImpl (const Sim_Param &sim)
 
void solve (double a, const std::vector< Particle_v< double >> &particles, const Sim_Param &sim, const FFTW_PLAN_TYPE &p_F, const FFTW_PLAN_TYPE &p_B)
 
void gen_pow_spec_binned (const Sim_Param &sim, Data_Vec< double, 2 > &pwr_spec_binned, const FFTW_PLAN_TYPE &p_F)
 
void get_chi_force (const FFTW_PLAN_TYPE &p_F, const FFTW_PLAN_TYPE &p_B)
 
void kick_step_w_chi (const Cosmo_Param &cosmo, const double a, const double da, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &force_field)
 
void kick_step_w_chi_no_momentum (const Cosmo_Param &cosmo, const double a, const double da, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &vel_field)
 

Public Attributes

ChiSolver< CHI_PREC_t > sol
 
MultiGrid< 3, CHI_PREC_t > drho
 
std::vector< Meshchi_force
 
uint64_t memory_alloc
 

Private Member Functions

void solve_multigrid ()
 
void solve_finest ()
 

Private Attributes

const size_t N_level_orig
 
const double x_0
 

Detailed Description

Definition at line 683 of file chameleon.cpp.

Constructor & Destructor Documentation

App_Var_Chi::ChiImpl::ChiImpl ( const Sim_Param sim)
inline

Definition at line 687 of file chameleon.cpp.

References Sim_Param::box_opt, anonymous_namespace{chameleon.cpp}::CONVERGENCE_BI_DCHI, anonymous_namespace{chameleon.cpp}::CONVERGENCE_BI_L, anonymous_namespace{chameleon.cpp}::CONVERGENCE_BI_STEPS_INIT, and Box_Opt::mesh_num.

687  :
688  sol(sim.box_opt.mesh_num, sim, false), drho(sim.box_opt.mesh_num), N_level_orig(sol.get_Nlevel()), x_0(sim.x_0())
689  {
690  // EFFICIENTLY ALLOCATE VECTOR OF MESHES
691  chi_force.reserve(3);
692  for(size_t i = 0; i < 3; i++){
693  chi_force.emplace_back(sim.box_opt.mesh_num);
694  }
695 
696  // ALLOCATED MEMORY
697  memory_alloc = sizeof(FTYPE_t)*chi_force[0].length*chi_force.size();
698  memory_alloc += sizeof(CHI_PREC_t)*8*(sol.get_Ntot()-1)/7 // MultiGrid<3, CHI_PREC_t>
699  *3; // _f, _res, _source
700  memory_alloc += sizeof(CHI_PREC_t)*8*(sol.get_Ntot()-1)/7;// MultiGrid<3, CHI_PREC_t> drho
701 
702  // SET CHI SOLVER
703  sol.add_external_grid(&drho);
705  }
MultiGrid< 3, CHI_PREC_t > drho
Definition: chameleon.cpp:709
constexpr size_t CONVERGENCE_BI_STEPS_INIT
maximal number of steps inside bisection initialization method
Definition: chameleon.cpp:78
double CHI_PREC_t
accuracy of chameleon solver
Definition: chameleon.cpp:31
Box_Opt box_opt
Definition: params.hpp:202
std::vector< Mesh > chi_force
Definition: chameleon.cpp:710
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
constexpr CHI_PREC_t CONVERGENCE_BI_L
stop bisection method when residual below
Definition: chameleon.cpp:80
constexpr CHI_PREC_t CONVERGENCE_BI_DCHI
stop bisection method when chi doesn`t chanege
Definition: chameleon.cpp:79
double x_0() const
Definition: params.hpp:216
size_t mesh_num
Definition: params.hpp:58
const double x_0
Definition: chameleon.cpp:811
const size_t N_level_orig
Definition: chameleon.cpp:810

Member Function Documentation

void App_Var_Chi::ChiImpl::gen_pow_spec_binned ( const Sim_Param sim,
Data_Vec< double, 2 > &  pwr_spec_binned,
const FFTW_PLAN_TYPE p_F 
)
inline

Definition at line 747 of file chameleon.cpp.

References fftw_execute_dft_r2c(), gen_pow_spec_binned(), pwr_spec_k_init(), and anonymous_namespace{chameleon.cpp}::transform_MultiGridSolver_to_Mesh().

748  {
749  transform_MultiGridSolver_to_Mesh(chi_force[0], sol); // - get solution
750  fftw_execute_dft_r2c(p_F, chi_force[0]); // - get chi(k)
751  pwr_spec_k_init(chi_force[0], chi_force[0]); // - get chi(k)^2, NO w_k correction
752  ::gen_pow_spec_binned(sim, chi_force[0], pwr_spec_binned); // - get average Pk
753  }
void transform_MultiGridSolver_to_Mesh(Mesh &mesh, const MultiGridSolver< 3, T > &sol)
Definition: chameleon.cpp:137
void fftw_execute_dft_r2c(const FFTW_PLAN_TYPE &p_F, Mesh &rho)
compute forward (real to complex) FFT on mesh (inplace)
Definition: core_mesh.cpp:247
std::vector< Mesh > chi_force
Definition: chameleon.cpp:710
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
void pwr_spec_k_init(const Mesh &rho_k, Mesh &power_aux)
Definition: core_app.cpp:349
void gen_pow_spec_binned(const Sim_Param &sim, Data_Vec< double, 2 > &pwr_spec_binned, const FFTW_PLAN_TYPE &p_F)
Definition: chameleon.cpp:747
void App_Var_Chi::ChiImpl::get_chi_force ( const FFTW_PLAN_TYPE p_F,
const FFTW_PLAN_TYPE p_B 
)
inline

Definition at line 755 of file chameleon.cpp.

References fftw_execute_dft_c2r_triple(), fftw_execute_dft_r2c(), gen_displ_k_cic(), and anonymous_namespace{chameleon.cpp}::transform_MultiGridSolver_to_Mesh().

756  {
757  transform_MultiGridSolver_to_Mesh(chi_force[0], sol); // - get solution
758  fftw_execute_dft_r2c(p_F, chi_force[0]); // - get chi(k)
759  gen_displ_k_cic(chi_force, chi_force[0]); // - get -k*chi(k)
760  fftw_execute_dft_c2r_triple(p_B, chi_force);// - get chi force
761  }
void transform_MultiGridSolver_to_Mesh(Mesh &mesh, const MultiGridSolver< 3, T > &sol)
Definition: chameleon.cpp:137
void fftw_execute_dft_r2c(const FFTW_PLAN_TYPE &p_F, Mesh &rho)
compute forward (real to complex) FFT on mesh (inplace)
Definition: core_mesh.cpp:247
void fftw_execute_dft_c2r_triple(const FFTW_PLAN_TYPE &p_B, std::vector< Mesh > &rho)
compute three backward (complex to real) FFTs on vector of meshes (inplace)
Definition: core_mesh.cpp:263
std::vector< Mesh > chi_force
Definition: chameleon.cpp:710
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
void gen_displ_k_cic(std::vector< Mesh > &vel_field, const Mesh &pot_k)
Definition: core_app.cpp:625
void App_Var_Chi::ChiImpl::kick_step_w_chi ( const Cosmo_Param cosmo,
const double  a,
const double  da,
std::vector< Particle_v< double >> &  particles,
const std::vector< Mesh > &  force_field 
)
inline
  • -3/2a represents usual EOM, the rest are LCDM corrections
  • chameleon force factor + units

Definition at line 763 of file chameleon.cpp.

References assign_from(), growth_allz::growth_factor, Cosmo_Param::Omega_L(), Cosmo_Param::Omega_m, pow(), and pow2().

764  {
765  const size_t Np = particles.size();
766  Vec_3D<FTYPE_t> force;
767  const FTYPE_t D = growth_factor(a, cosmo);
768  const FTYPE_t OL = cosmo.Omega_L()*pow(a,3);
769  const FTYPE_t Om = cosmo.Omega_m;
770  const FTYPE_t OLa = OL/(Om+OL);
771 
773  const FTYPE_t f1 = 3/(2*a)*(1 + OLa);
774  const FTYPE_t f2 = 3/(2*a)*(1 - OLa)*D/a;
776  const FTYPE_t f3 = a/D*sol.chi_force_units(a)/pow2(x_0);
777 
778  #pragma omp parallel for private(force)
779  for (size_t i = 0; i < Np; i++)
780  {
781  force.fill(0.);
782  assign_from(force_field, particles[i].position, force);
783  assign_from(chi_force, particles[i].position, force, f3);
784  force = force*f2 - particles[i].velocity*f1;
785  particles[i].velocity += force*da;
786  }
787  }
T pow2(T base)
Definition: precision.hpp:52
double Omega_L() const
Definition: params.hpp:38
std::vector< Mesh > chi_force
Definition: chameleon.cpp:710
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
std::vector< Particle_v< double > > particles
Definition: app_var.hpp:65
double Omega_m
Definition: params.hpp:36
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
const double x_0
Definition: chameleon.cpp:811
void assign_from(const Mesh &field, const Vec_3D< double > &position, double &value, double mod)
Definition: core_mesh.cpp:224
void App_Var_Chi::ChiImpl::kick_step_w_chi_no_momentum ( const Cosmo_Param cosmo,
const double  a,
const double  da,
std::vector< Particle_v< double >> &  particles,
const std::vector< Mesh > &  vel_field 
)
inline
  • chameleon force factor + units

Definition at line 789 of file chameleon.cpp.

References assign_from(), growth_change(), growth_allz::growth_factor, and pow2().

790  {
791  const size_t Np = particles.size();
792  Vec_3D<FTYPE_t> vel;
793  const FTYPE_t D = growth_factor(a, cosmo);
794  const FTYPE_t dDda = growth_change(a, cosmo); // dD / da
795 
797  const FTYPE_t f3 = a/D*sol.chi_force_units(a)/pow2(x_0);
798 
799  #pragma omp parallel for private(vel)
800  for (size_t i = 0; i < Np; i++)
801  {
802  vel.fill(0.);
803  assign_from(vel_field, particles[i].position, vel);
804  assign_from(chi_force, particles[i].position, vel, f3);
805  particles[i].velocity = vel*dDda;
806  }
807  }
T pow2(T base)
Definition: precision.hpp:52
std::vector< Mesh > chi_force
Definition: chameleon.cpp:710
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
std::vector< Particle_v< double > > particles
Definition: app_var.hpp:65
const double x_0
Definition: chameleon.cpp:811
void assign_from(const Mesh &field, const Vec_3D< double > &position, double &value, double mod)
Definition: core_mesh.cpp:224
double growth_change(double a, const Cosmo_Param &cosmo)
Definition: core_power.cpp:447
void App_Var_Chi::ChiImpl::solve ( double  a,
const std::vector< Particle_v< double >> &  particles,
const Sim_Param sim,
const FFTW_PLAN_TYPE p_F,
const FFTW_PLAN_TYPE p_B 
)
inline
  • set prefactor
  • set convergence – compensate for units in which we compute laplace operator
  • save (over)density from particles

linear guess and solver

  • set guess from linear theory
  • set guess from linear theory and correct unphysical values
  • get multigrid_solver runnig

< solve using multigrid teqniques

< solve only on the finest mesh using NGS sweeps

Definition at line 714 of file chameleon.cpp.

References Sim_Param::chi_opt, Sim_Param::cosmo, get_rho_from_par(), Chi_Opt::linear, and anonymous_namespace{chameleon.cpp}::transform_Mesh_to_MultiGrid().

715  {
717  sol.set_time(a, sim.cosmo);
718 
720  sol.set_def_convergence();
721 
723  BOOST_LOG_TRIVIAL(debug) << "Storing density distribution...";
726 
728  BOOST_LOG_TRIVIAL(debug) << "Setting linear guess for chameleon field...";
729  if (sim.chi_opt.linear)
730  {
732  sol.set_linear_sol_at_level(chi_force[0], p_F, p_B, 0);
733  }
734  else
735  {
737  sol.set_linear(chi_force[0], p_F, p_B);
738  sol.set_screened();
739 
741  BOOST_LOG_TRIVIAL(debug) << "Solving equations of motion for chameleon field...";
742  solve_multigrid();
743  solve_finest();
744  }
745  }
Chi_Opt chi_opt
Definition: params.hpp:210
MultiGrid< 3, CHI_PREC_t > drho
Definition: chameleon.cpp:709
void get_rho_from_par(const std::vector< T > &particles, Mesh &rho, const Sim_Param &sim)
Definition: core_app.cpp:278
bool linear
Definition: params.hpp:186
void transform_Mesh_to_MultiGrid(const Mesh &mesh, MultiGrid< 3, T > &mltgrid)
Definition: chameleon.cpp:108
Cosmo_Param cosmo
Definition: params.hpp:206
std::vector< Mesh > chi_force
Definition: chameleon.cpp:710
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
std::vector< Particle_v< double > > particles
Definition: app_var.hpp:65
void App_Var_Chi::ChiImpl::solve_finest ( )
inlineprivate

< fine, coarse

Definition at line 820 of file chameleon.cpp.

821  {
822  sol.set_ngs_sweeps(5, 0);
823  sol.set_Nlevel(1);
824  sol.set_maxsteps(30);
825  ES status = sol.solve();
826  sol.set_Nlevel(N_level_orig);
827  }
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
MultiGridSolver< 3, CHI_PREC_t >::Exit_Status ES
acces Exit_Status namespace
Definition: chameleon.cpp:86
const size_t N_level_orig
Definition: chameleon.cpp:810
void App_Var_Chi::ChiImpl::solve_multigrid ( )
inlineprivate

< fine, coarse

Definition at line 813 of file chameleon.cpp.

814  {
815  sol.set_ngs_sweeps(3, 6);
816  sol.set_maxsteps(30);
817  ES status = sol.solve();
818  }
ChiSolver< CHI_PREC_t > sol
Definition: chameleon.cpp:708
MultiGridSolver< 3, CHI_PREC_t >::Exit_Status ES
acces Exit_Status namespace
Definition: chameleon.cpp:86

Member Data Documentation

std::vector<Mesh> App_Var_Chi::ChiImpl::chi_force

Definition at line 710 of file chameleon.cpp.

MultiGrid<3, CHI_PREC_t> App_Var_Chi::ChiImpl::drho

Definition at line 709 of file chameleon.cpp.

uint64_t App_Var_Chi::ChiImpl::memory_alloc

Definition at line 711 of file chameleon.cpp.

const size_t App_Var_Chi::ChiImpl::N_level_orig
private

Definition at line 810 of file chameleon.cpp.

ChiSolver<CHI_PREC_t> App_Var_Chi::ChiImpl::sol

Definition at line 708 of file chameleon.cpp.

const double App_Var_Chi::ChiImpl::x_0
private

Definition at line 811 of file chameleon.cpp.


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