Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
anonymous_namespace{mod_frozen_potential.cpp} Namespace Reference

Classes

class  LinkedList
 class handling linked lists More...
 

Functions

double force_ref (const double r, const double a)
 
double force_tot (const double r, const double e2)
 
void force_short (const Sim_Param &sim, const double D, const LinkedList &linked_list, const std::vector< Particle_v< double >> &particles, const Vec_3D< double > &position, Vec_3D< double > &force, Interp_obj &fs_interp)
 
void kick_step_w_pp (const Sim_Param &sim, const double a, const double da, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &force_field, LinkedList &linked_list, Interp_obj &fs_interp)
 

Function Documentation

double anonymous_namespace{mod_frozen_potential.cpp}::force_ref ( const double  r,
const double  a 
)

Definition at line 46 of file mod_frozen_potential.cpp.

References pow(), and z.

Referenced by force_short(), and App_Var_FP_mod::FP_ppImpl::FP_ppImpl().

46  {
47  // Reference force for an S_2-shaped particle
48  FTYPE_t z = 2 * r / a;
49  if (z > 2) return 1 / (r*r);
50  else if (z > 1) return (12 / (z*z) - 224 + 896 * z - 840 * z*z + 224 * pow(z, 3) +
51  70 * pow(z, 4) - 48 * pow(z, 5) + 7 * pow(z, 6)) / (35 * a*a);
52  else return (224 * z - 224 * pow(z, 3) + 70 * pow(z, 4) + 48 * pow(z, 5) - 21 * pow(z, 7)) / (35 * a*a);
53 }
static double z[8]
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
void anonymous_namespace{mod_frozen_potential.cpp}::force_short ( const Sim_Param sim,
const double  D,
const LinkedList linked_list,
const std::vector< Particle_v< double >> &  particles,
const Vec_3D< double > &  position,
Vec_3D< double > &  force,
Interp_obj fs_interp 
)

Definition at line 59 of file mod_frozen_potential.cpp.

References App_Opt::a, Sim_Param::app_opt, Sim_Param::box_opt, force_ref(), force_tot(), get_sgn_distance(), App_Opt::Hc, anonymous_namespace{mod_frozen_potential.cpp}::LinkedList::HOC, IT< points >::iter(), anonymous_namespace{mod_frozen_potential.cpp}::LinkedList::LL, m, Box_Opt::mesh_num, Box_Opt::Ng, p, PI, pow(), pow2(), App_Opt::rs, sqrt(), and IT< points >::vec.

Referenced by kick_step_w_pp().

61 { // Calculate short range force in position, force is added
62  #define FORCE_SHORT_NO_INTER
63  size_t p;
64  Vec_3D<FTYPE_t> dr_vec;
65  FTYPE_t dr2;
66  FTYPE_t dr; // <-- #ifdef FORCE_SHORT_NO_INTER
67  const FTYPE_t m = pow((FTYPE_t)sim.box_opt.Ng, 3) / D;
68  const size_t Nm = sim.box_opt.mesh_num;
69  const FTYPE_t rs2 = pow2(sim.app_opt.rs);
70  const FTYPE_t e2 = pow2(sim.box_opt.Ng*0.1); // <-- #ifdef FORCE_SHORT_NO_INTER
71 
72  IT<3> it(position, sim.app_opt.Hc);
73  do{
74  p = linked_list.HOC(it.vec);
75  while (p != -1){
76  dr_vec = get_sgn_distance(particles[p].position, position, Nm);
77  dr2 = dr_vec.norm2();
78  if ((dr2 < rs2) && (dr2 != 0)) // Short range force is set 0 for separation larger than cutoff radius
79  {
80  #ifdef FORCE_SHORT_NO_INTER
81  dr = sqrt(dr2);
82  force += dr_vec*(force_tot(dr, e2) - force_ref(dr, sim.app_opt.a))*m/(dr*4*PI);
83  #else
84  force += dr_vec*(m/sqrt(dr2)*fs_interp.eval(dr2));
85  #endif
86  }
87  p = linked_list.LL[p];
88  }
89  } while( it.iter() );
90 }
Box_Opt box_opt
Definition: params.hpp:202
Vec_3D< double > get_sgn_distance(const Vec_3D< double > &x_from, const Vec_3D< double > &x_to, size_t per)
Definition: core_mesh.cpp:122
: class for effective iteration of cube of mesh cells
Definition: core_mesh.h:66
double Hc
Definition: params.hpp:118
double a
Definition: params.hpp:118
T pow2(T base)
Definition: precision.hpp:52
size_t Ng
Definition: params.hpp:61
double force_tot(const double r, const double e2)
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
Definition: grid.h:231
constexpr double PI
Definition: precision.hpp:37
static int p
Definition: ccl_emu17.c:25
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
static int m[2]
Definition: ccl_emu17.c:25
double force_ref(const double r, const double a)
size_t mesh_num
Definition: params.hpp:58
App_Opt app_opt
Definition: params.hpp:207
double rs
Definition: params.hpp:116
double anonymous_namespace{mod_frozen_potential.cpp}::force_tot ( const double  r,
const double  e2 
)

Definition at line 55 of file mod_frozen_potential.cpp.

Referenced by force_short(), and App_Var_FP_mod::FP_ppImpl::FP_ppImpl().

55  {
56  return 1 / (r*r+e2);
57 }
void anonymous_namespace{mod_frozen_potential.cpp}::kick_step_w_pp ( const Sim_Param sim,
const double  a,
const double  da,
std::vector< Particle_v< double >> &  particles,
const std::vector< Mesh > &  force_field,
LinkedList linked_list,
Interp_obj fs_interp 
)

Definition at line 92 of file mod_frozen_potential.cpp.

References assign_from(), Sim_Param::cosmo, force_short(), anonymous_namespace{mod_frozen_potential.cpp}::LinkedList::get_linked_list(), growth_allz::growth_factor, Cosmo_Param::Omega_L(), Cosmo_Param::Omega_m, and pow().

Referenced by App_Var_FP_mod::upd_pos().

94 { // 2nd order ODE with long & short range potential
95  const size_t Np = particles.size();
96  Vec_3D<FTYPE_t> force;
97  const FTYPE_t D = growth_factor(a, sim.cosmo);
98  const FTYPE_t OL = sim.cosmo.Omega_L()*pow(a,3);
99  const FTYPE_t Om = sim.cosmo.Omega_m;
100  // -3/2a represents usual EOM, the rest are LCDM corrections
101  const FTYPE_t f1 = 3/(2*a)*(Om+2*OL)/(Om+OL);
102  const FTYPE_t f2 = 3/(2*a)*Om/(Om+OL)*D/a;
103 
104  BOOST_LOG_TRIVIAL(debug) << "Creating linked list...";
105  linked_list.get_linked_list(particles);
106 
107  BOOST_LOG_TRIVIAL(debug) << "Computing short and long range parts of the potential...";
108  #pragma omp parallel for private(force)
109  for (size_t i = 0; i < Np; i++)
110  {
111  force.fill(0.);
112  assign_from(force_field, particles[i].position, force); // long-range force
113  force_short(sim, D, linked_list, particles, particles[i].position, force, fs_interp); // short range force
114 
115  force = force*f2 - particles[i].velocity*f1;
116  particles[i].velocity += force*da;
117  }
118 }
double Omega_L() const
Definition: params.hpp:38
Cosmo_Param cosmo
Definition: params.hpp:206
void force_short(const Sim_Param &sim, const double D, const LinkedList &linked_list, const std::vector< Particle_v< double >> &particles, const Vec_3D< double > &position, Vec_3D< double > &force, Interp_obj &fs_interp)
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