Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
integration.hpp File Reference

functions for integration of particle trajectories More...

#include "stdafx.h"
#include <functional>
#include "precision.hpp"
#include "class_mesh.hpp"
#include "class_particles.hpp"
Include dependency graph for integration.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void stream_step (const double da, std::vector< Particle_v< double >> &particles)
 
void stream_kick_stream (const double da, std::vector< Particle_v< double >> &particles, std::function< void()> kick_step, size_t per)
 
void kick_step_no_momentum (const Cosmo_Param &cosmo, const double a, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &vel_field)
 
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)
 
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)
 

Detailed Description

functions for integration of particle trajectories

Author
Michal Vrastil
Date
2018-07-11

Definition in file integration.hpp.

Function Documentation

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 at line 32 of file integration.cpp.

References assign_from(), and growth_change().

Referenced by App_Var_FF::upd_pos().

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 }
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 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 at line 48 of file integration.cpp.

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

Referenced by App_Var_FP::upd_pos(), and App_Var_AA::upd_pos().

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 }
double Omega_L() const
Definition: params.hpp:38
double Omega_m
Definition: params.hpp:36
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
void assign_from(const Mesh &field, const Vec_3D< double > &position, double &value, double mod)
Definition: core_mesh.cpp:224
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 at line 70 of file integration.cpp.

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

Referenced by App_Var_PM::upd_pos().

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 }
double Omega_L() const
Definition: params.hpp:38
double Omega_m
Definition: params.hpp:36
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
void assign_from(const Mesh &field, const Vec_3D< double > &position, double &value, double mod)
Definition: core_mesh.cpp:224
void stream_kick_stream ( const double  da,
std::vector< Particle_v< double >> &  particles,
std::function< void()>  kick_step,
size_t  per 
)

Definition at line 24 of file integration.cpp.

References get_per(), and stream_step().

Referenced by App_Var_FF::upd_pos(), App_Var_FP::upd_pos(), App_Var_Chi::upd_pos(), App_Var_FP_mod::upd_pos(), App_Var_AA::upd_pos(), App_Var_PM::upd_pos(), and App_Var_Chi_FF::upd_pos().

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 }
void stream_step(const double da, std::vector< Particle_v< double >> &particles)
Definition: integration.cpp:14
static std::enable_if< std::is_integral< T >::value, T >::type get_per(T vec, size_t per)
Definition: core_mesh.cpp:48
void stream_step ( const double  da,
std::vector< Particle_v< double >> &  particles 
)

Definition at line 14 of file integration.cpp.

Referenced by stream_kick_stream().

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 }