Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
integration.cpp
Go to the documentation of this file.
1 
9 #include "core_mesh.h"
10 #include "core_power.h"
11 #include "integration.hpp"
12 #include "params.hpp"
13 
14 void stream_step(const FTYPE_t da, std::vector<Particle_v<FTYPE_t>>& particles)
15 {
16  const size_t Np = particles.size();
17  #pragma omp parallel for
18  for (size_t i = 0; i < Np; i++)
19  {
20  particles[i].position += particles[i].velocity*da;
21  }
22 }
23 
24 void stream_kick_stream(const FTYPE_t da, std::vector<Particle_v<FTYPE_t>>& particles, std::function<void()> kick_step, size_t per)
25 {// general Leapfrog method: Stream-Kick-Stream & ensure periodicity
26  stream_step(da/2, particles);
27  kick_step();
28  stream_step(da/2, particles);
29  get_per(particles, per);
30 }
31 
32 void kick_step_no_momentum(const Cosmo_Param &cosmo, const FTYPE_t a, std::vector<Particle_v<FTYPE_t>>& particles, const std::vector< Mesh> &vel_field)
33 {
34  // no memory of previus velocity, 1st order ODE
35  const size_t Np = particles.size();
36  Vec_3D<FTYPE_t> vel;
37  const FTYPE_t dDda = growth_change(a, cosmo); // dD / da
38 
39  #pragma omp parallel for private(vel)
40  for (size_t i = 0; i < Np; i++)
41  {
42  vel.fill(0.);
43  assign_from(vel_field, particles[i].position, vel);
44  particles[i].velocity = vel*dDda;
45  }
46 }
47 
48 void kick_step_w_momentum(const Cosmo_Param &cosmo, const FTYPE_t a, const FTYPE_t da, std::vector<Particle_v<FTYPE_t>>& particles, const std::vector< Mesh> &force_field)
49 {
50  // classical 2nd order ODE
51  const size_t Np = particles.size();
52  Vec_3D<FTYPE_t> force;
53  const FTYPE_t D = growth_factor(a, cosmo);
54  const FTYPE_t OL = cosmo.Omega_L()*pow(a,3);
55  const FTYPE_t Om = cosmo.Omega_m;
56  // -3/2a represents usual EOM, the rest are LCDM corrections
57  const FTYPE_t f1 = 3/(2*a)*(Om+2*OL)/(Om+OL);
58  const FTYPE_t f2 = 3/(2*a)*Om/(Om+OL)*D/a;
59 
60  #pragma omp parallel for private(force)
61  for (size_t i = 0; i < Np; i++)
62  {
63  force.fill(0.);
64  assign_from(force_field, particles[i].position, force);
65  force = force*f2 - particles[i].velocity*f1;
66  particles[i].velocity += force*da;
67  }
68 }
69 
70 void kick_step_w_momentum_pm(const Cosmo_Param &cosmo, const FTYPE_t a, const FTYPE_t da, std::vector<Particle_v<FTYPE_t>>& particles, const std::vector< Mesh> &force_field)
71 {
72  // classical 2nd order ODE
73  const size_t Np = particles.size();
74  Vec_3D<FTYPE_t> force;
75  const FTYPE_t D = growth_factor(a, cosmo);
76  const FTYPE_t OL = cosmo.Omega_L()*pow(a,3);
77  const FTYPE_t Om = cosmo.Omega_m;
78  // -3/2a represents usual EOM, the rest are LCDM corrections
79  const FTYPE_t f1 = 3/(2*a)*(Om+2*OL)/(Om+OL);
80  const FTYPE_t f2 = 3/(2*a)*Om/(Om+OL)/a;
81 
82  #pragma omp parallel for private(force)
83  for (size_t i = 0; i < Np; i++)
84  {
85  force.fill(0.);
86  assign_from(force_field, particles[i].position, force);
87  force = force*f2 - particles[i].velocity*f1;
88  particles[i].velocity += force*da;
89  }
90 }
class handling particles (position only)
handle cosmological functions like power spectrum, growth, etc.
void stream_step(const double da, std::vector< Particle_v< double >> &particles)
Definition: integration.cpp:14
functions for integration of particle trajectories
void kick_step_w_momentum(const Cosmo_Param &cosmo, const double a, const double da, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &force_field)
Definition: integration.cpp:48
double Omega_L() const
Definition: params.hpp:38
cosmological & CCL parameters
Definition: params.hpp:22
void stream_kick_stream(const double da, std::vector< Particle_v< double >> &particles, std::function< void()> kick_step, size_t per)
Definition: integration.cpp:24
various simulation parameters
static std::enable_if< std::is_integral< T >::value, T >::type get_per(T vec, size_t per)
Definition: core_mesh.cpp:48
basic functions to work with mesh
void kick_step_w_momentum_pm(const Cosmo_Param &cosmo, const double a, const double da, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &force_field)
Definition: integration.cpp:70
double Omega_m
Definition: params.hpp:36
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
void kick_step_no_momentum(const Cosmo_Param &cosmo, const double a, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &vel_field)
Definition: integration.cpp:32
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