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

interface for common functions for all types of approximations More...

#include "stdafx.h"
#include "app_var.hpp"
#include "core_power.h"
#include "params.hpp"
#include "precision.hpp"
#include "class_particles.hpp"
Include dependency graph for core_app.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void set_unpert_pos (const Sim_Param &sim, std::vector< Particle_x< double >> &particles)
 
void set_unpert_pos_w_vel (const Sim_Param &sim, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &vel_field)
 
void set_pert_pos (const Sim_Param &sim, const double a, std::vector< Particle_x< double >> &particles, const std::vector< Mesh > &vel_field)
 
void set_pert_pos (const Sim_Param &sim, const double a, std::vector< Particle_v< double >> &particles, const std::vector< Mesh > &vel_field)
 
void gen_rho_dist_k (const Sim_Param &sim, Mesh &rho, const FFTW_PLAN_TYPE &p_F)
 Generate density distributions $\rho(k)$ in k-space. More...
 
void gen_pot_k (const Mesh &rho_k, Mesh &pot_k)
 
void gen_pot_k (Mesh &rho_k)
 
void gen_displ_k (std::vector< Mesh > &vel_field, const Mesh &pot_k)
 
void gen_displ_k_cic (std::vector< Mesh > &vel_field, const Mesh &pot_k)
 
void gen_displ_k_S2 (std::vector< Mesh > &vel_field, const Mesh &pot_k, const double a)
 
template<class T >
void get_rho_from_par (const std::vector< T > &particles, Mesh &rho, const Sim_Param &sim)
 
bool get_vel_from_par (const std::vector< Particle_v< double >> &particles, std::vector< Mesh > &vel_field, const Sim_Param &sim)
 
bool get_vel_from_par (const std::vector< Particle_x< double >> &particles, std::vector< Mesh > &vel_field, const Sim_Param &sim)
 
void pwr_spec_k (const Mesh &rho_k, Mesh &power_aux)
 
void pwr_spec_k_init (const Mesh &rho_k, Mesh &power_aux)
 
void vel_pwr_spec_k (const std::vector< Mesh > &vel_field, Mesh &power_aux)
 
void gen_pow_spec_binned (const Sim_Param &sim, const Mesh &power_aux, Data_Vec< double, 2 > &pwr_spec_binned)
 
void gen_pow_spec_binned_init (const Sim_Param &sim, const Mesh &power_aux, const size_t half_length, Data_Vec< double, 2 > &pwr_spec_binned)
 
template<class P , typename T , size_t N>
void gen_pow_spec_binned_from_extrap (const Sim_Param &sim, const P &P_k, Data_Vec< T, N > &pwr_spec_binned)
 
void gen_dens_binned (const Mesh &rho, std::vector< size_t > &dens_binned, const Sim_Param &sim)
 

Detailed Description

interface for common functions for all types of approximations

Author
Michal Vrastil
Date
2018-07-11

Definition in file core_app.h.

Function Documentation

void gen_dens_binned ( const Mesh rho,
std::vector< size_t > &  dens_binned,
const Sim_Param sim 
)

Definition at line 627 of file core_app.cpp.

References Sim_Param::box_opt, gen_pow_spec_binned_from_extrap(), get_rho_from_par(), Mesh::N, Box_Opt::Ng_pwr, and pow().

Referenced by App_Var< T >::Impl< T >::print_density().

628 {
629  BOOST_LOG_TRIVIAL(debug) << "Computing binned density field...";
630  size_t bin;
631  FTYPE_t rho_avg;
632  const size_t Ng_pwr = sim.box_opt.Ng_pwr;
633  const size_t N = rho.N;
634 
635  dens_binned.assign(dens_binned.size(), 0);
636 
637  #pragma omp parallel for private(bin, rho_avg)
638  for (size_t i = 0; i < N; i+=Ng_pwr)
639  {
640  for (size_t j = 0; j < N; j+=Ng_pwr)
641  {
642  for (size_t k = 0; k < N; k+=Ng_pwr)
643  {
644  // Need to go through all mesh cells [i, i+Ng-1]*[j, j+Ng-1], [k, k+Ng, -1]
645  rho_avg = 0;
646  for (size_t ii = i; ii < i+Ng_pwr; ii++)
647  {
648  for (size_t jj = j; jj < j+Ng_pwr; jj++)
649  {
650  for (size_t kk = k; kk < k+Ng_pwr; kk++)
651  {
652  rho_avg+=rho(ii, jj, kk);
653  }
654  }
655  }
656  rho_avg /= pow((FTYPE_t)Ng_pwr, 3);
657  bin = (size_t)((rho_avg+1)/0.1);
658  if (bin >= dens_binned.size()) bin = dens_binned.size() - 1;
659  // if (bin >= dens_binned.capacity()) dens_binned.resize(bin+1);
660  #pragma omp atomic
661  dens_binned[bin]++;
662  //dens_binned[bin] += pow(sim.box_opt.Ng_pwr, 3);
663  }
664  }
665  }
666 }
Box_Opt box_opt
Definition: params.hpp:202
size_t Ng_pwr
Definition: params.hpp:61
size_t N
Definition: class_mesh.hpp:102
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
void gen_displ_k ( std::vector< Mesh > &  vel_field,
const Mesh pot_k 
)

Definition at line 623 of file core_app.cpp.

References gen_displ_k_S2().

Referenced by App_Var_AA::AAImpl::aa_convolution(), and App_Var< T >::Impl< T >::set_init_cond().

623 {gen_displ_k_S2(vel_field, pot_k, -1);}
void gen_displ_k_S2(std::vector< Mesh > &vel_field, const Mesh &pot_k, const double a)
Definition: core_app.cpp:586
void gen_displ_k_cic ( std::vector< Mesh > &  vel_field,
const Mesh pot_k 
)

Definition at line 625 of file core_app.cpp.

References gen_displ_k_S2().

Referenced by App_Var_Chi::ChiImpl::get_chi_force(), and App_Var< T >::pot_corr().

625 {gen_displ_k_S2(vel_field, pot_k, 0.);}
void gen_displ_k_S2(std::vector< Mesh > &vel_field, const Mesh &pot_k, const double a)
Definition: core_app.cpp:586
void gen_displ_k_S2 ( std::vector< Mesh > &  vel_field,
const Mesh pot_k,
const double  a 
)

Definition at line 586 of file core_app.cpp.

References CIC_opt(), get_k_vec(), and PI.

Referenced by gen_displ_k(), gen_displ_k_cic(), and App_Var_FP_mod::pot_corr().

587 { /*
588  pot_k can be Mesh of differen (bigger) size than each vel_field,
589  !!!> ALL physical FACTORS ARE therefore TAKEN FROM vel_field[0] <!!!
590  */
591  if (a == -1) BOOST_LOG_TRIVIAL(debug) << "Computing displacement in k-space...";
592  else if (a == 0) BOOST_LOG_TRIVIAL(debug) << "Computing displacement in k-space with CIC opt...";
593  else BOOST_LOG_TRIVIAL(debug) << "Computing force in k-space for S2 shaped particles with CIC opt...";
594 
595  FTYPE_t opt;
596  Vec_3D<int> k_vec;
597  Vec_3D<FTYPE_t> k_vec_phys;
598  FTYPE_t potential_tmp[2];
599 
600  const size_t N = vel_field[0].N; // for case when pot_k is different mesh than vel_field
601  const FTYPE_t d_k = 2*PI/N; // 2*PI/N comes from derivative WITH RESPECT to the mesh coordinates
602  const size_t l_half = vel_field[0].length/2;
603 
604  #pragma omp parallel for private(opt, k_vec, k_vec_phys, potential_tmp)
605  for(size_t i=0; i < l_half;i++)
606  {
607  potential_tmp[0] = pot_k[2*i]; // prevent overwriting if vel_field[0] == pot_k
608  potential_tmp[1] = pot_k[2*i+1]; // prevent overwriting if vel_field[0] == pot_k
609  get_k_vec(N, i, k_vec);
610  k_vec_phys = d_k*k_vec;
611  // no optimalization
612  if (a == -1) opt = 1.;
613  // optimalization for CIC and S2 shaped particle
614  else opt = CIC_opt(k_vec_phys, a);
615  for(size_t j=0; j<3;j++)
616  {
617  vel_field[j][2*i] = k_vec_phys[j]*potential_tmp[1]*opt;
618  vel_field[j][2*i+1] = -k_vec_phys[j]*potential_tmp[0]*opt;
619  }
620  }
621 }
static double CIC_opt(Vec_3D< double > k_vec, const double a)
Definition: core_app.cpp:531
constexpr double PI
Definition: precision.hpp:37
void get_k_vec(size_t N, size_t index, int *k_vec)
Definition: core_mesh.cpp:20
void gen_pot_k ( const Mesh rho_k,
Mesh pot_k 
)

Definition at line 496 of file core_app.cpp.

References get_k_sq(), Mesh_base< T >::length, Mesh::N, PI, and pow2().

Referenced by gen_pot_k(), anonymous_namespace{test_chameleon.cpp}::get_grav_pot(), App_Var< T >::Impl< T >::set_init_cond(), and App_Var_PM::upd_pos().

497 { /*
498  pot_k can be Mesh of differen (bigger) size rho_k,
499  !!!> ALL physical FACTORS ARE therefore TAKEN FROM rho_k <!!!
500  */
501  BOOST_LOG_TRIVIAL(debug) << "Computing potential in k-space...";
502  FTYPE_t k2;
503  const size_t N = rho_k.N; // for case when pot_k is different mesh than vel_field
504  const FTYPE_t d2_k = pow2(2*PI/N); // factor from second derivative with respect to the mesh coordinates
505  const size_t l_half = rho_k.length/2;
506 
507  #pragma omp parallel for private(k2)
508  for(size_t i=0; i < l_half;i++){
509  k2 = get_k_sq(N, i);
510  if (k2 == 0){
511  pot_k[2*i] = 0;
512  pot_k[2*i+1] = 0;
513  } else{
514  pot_k[2*i] = -rho_k[2*i]/(k2*d2_k);
515  pot_k[2*i+1] = -rho_k[2*i+1]/(k2*d2_k);
516  }
517  }
518 }
double get_k_sq(size_t N, size_t index)
Definition: core_mesh.cpp:38
T pow2(T base)
Definition: precision.hpp:52
size_t N
Definition: class_mesh.hpp:102
constexpr double PI
Definition: precision.hpp:37
size_t length
Definition: class_mesh.hpp:32
void gen_pot_k ( Mesh rho_k)

Definition at line 520 of file core_app.cpp.

References gen_pot_k().

520 { gen_pot_k(rho_k, rho_k); }
void gen_pot_k(const Mesh &rho_k, Mesh &pot_k)
Definition: core_app.cpp:496
void gen_pow_spec_binned ( const Sim_Param sim,
const Mesh power_aux,
Data_Vec< double, 2 > &  pwr_spec_binned 
)

Definition at line 460 of file core_app.cpp.

References Out_Opt::bins_per_decade, Sim_Param::box_opt, Box_Opt::box_size, gen_cqty_binned(), Box_Opt::mesh_num_pwr, Sim_Param::out_opt, PI, and pow().

Referenced by App_Var_Chi::ChiImpl::gen_pow_spec_binned(), App_Var< T >::Impl< T >::get_binned_power_spec(), and App_Var< T >::Impl< T >::print_vel_pwr().

461 {
462  const FTYPE_t mod_pk = pow(sim.box_opt.box_size, 3); // P(k) -> dimensionFULL!
463  const FTYPE_t mod_k = 2*PI/sim.box_opt.box_size;
464  BOOST_LOG_TRIVIAL(debug) << "Computing binned power spectrum...";
465  gen_cqty_binned(1, sim.box_opt.mesh_num_pwr, sim.out_opt.bins_per_decade, power_aux, pwr_spec_binned, mod_pk, mod_k);
466 }
double box_size
Definition: params.hpp:59
Box_Opt box_opt
Definition: params.hpp:202
void gen_cqty_binned(const double x_min, const double x_max, const size_t bins_per_decade, const Mesh &qty_mesh, const size_t half_length, Data_Vec< double, 2 > &qty_binned, const double mod_q, const double mod_x)
Definition: core_app.cpp:401
size_t mesh_num_pwr
Definition: params.hpp:58
Out_Opt out_opt
Definition: params.hpp:204
constexpr double PI
Definition: precision.hpp:37
size_t bins_per_decade
Definition: params.hpp:85
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
template<class P , typename T , size_t N>
void gen_pow_spec_binned_from_extrap ( const Sim_Param sim,
const P &  P_k,
Data_Vec< T, N > &  pwr_spec_binned 
)

Definition at line 478 of file core_app.cpp.

References Out_Opt::bins_per_decade, Other_par::k_print, Range::lower, Sim_Param::other_par, Sim_Param::out_opt, pow(), Data_Vec< T, N >::resize(), Data_Vec< T, N >::size(), growth_allz::T, and Range::upper.

Referenced by gen_dens_binned(), and App_Var< T >::Impl< T >::print_extrap_pwr().

479 {
480  const T k_max = sim.other_par.k_print.upper;
481  const T k_min = sim.other_par.k_print.lower;
482  const T log_bin = T(1) / sim.out_opt.bins_per_decade;
483  T k;
484  size_t req_size = (size_t)ceil( sim.out_opt.bins_per_decade*log10(k_max/k_min));
485  pwr_spec_binned.resize(req_size);
486 
487  #pragma omp parallel for private(k)
488  for (size_t j = 0; j < pwr_spec_binned.size(); j++){
489  k = k_min*pow(T(10), j*log_bin);
490  pwr_spec_binned[0][j] = k;
491  pwr_spec_binned[1][j] = P_k(k);
492  }
493 }
size_t size() const noexcept
void resize(size_t n)
double upper
Definition: params.hpp:163
Range k_print
range in which compute the correlation function
Definition: params.hpp:174
Out_Opt out_opt
Definition: params.hpp:204
double lower
Definition: params.hpp:163
size_t bins_per_decade
Definition: params.hpp:85
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
Other_par other_par
Definition: params.hpp:209
void gen_pow_spec_binned_init ( const Sim_Param sim,
const Mesh power_aux,
const size_t  half_length,
Data_Vec< double, 2 > &  pwr_spec_binned 
)

Definition at line 468 of file core_app.cpp.

References Out_Opt::bins_per_decade, Sim_Param::box_opt, Box_Opt::box_size, gen_cqty_binned(), Box_Opt::mesh_num, Sim_Param::out_opt, PI, and pow().

Referenced by App_Var< T >::Impl< T >::print_input_realisation().

469 {
470  /* same as above but now power_aux is storing only data [0...mesh_num], NOT mesh_num_pwr */
471  const FTYPE_t mod_pk = pow(sim.box_opt.box_size, 3); // P(k) -> dimensionFULL!
472  const FTYPE_t mod_k = 2*PI/sim.box_opt.box_size;
473  BOOST_LOG_TRIVIAL(debug) << "Computing binned initial power spectrum...";
474  gen_cqty_binned(1, sim.box_opt.mesh_num, sim.out_opt.bins_per_decade, power_aux, half_length, pwr_spec_binned, mod_pk, mod_k);
475 }
double box_size
Definition: params.hpp:59
Box_Opt box_opt
Definition: params.hpp:202
void gen_cqty_binned(const double x_min, const double x_max, const size_t bins_per_decade, const Mesh &qty_mesh, const size_t half_length, Data_Vec< double, 2 > &qty_binned, const double mod_q, const double mod_x)
Definition: core_app.cpp:401
Out_Opt out_opt
Definition: params.hpp:204
constexpr double PI
Definition: precision.hpp:37
size_t bins_per_decade
Definition: params.hpp:85
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
size_t mesh_num
Definition: params.hpp:58
void gen_rho_dist_k ( const Sim_Param sim,
Mesh rho,
const FFTW_PLAN_TYPE p_F 
)

Generate density distributions $\rho(k)$ in k-space.

Parameters
sim
rho
p_F

At first, a gaussian white noise (mean = 0, stdDev = 1) is generated, then it is convoluted with given power spectrum.

Definition at line 267 of file core_app.cpp.

References fftw_execute_dft_r2c(), gen_gauss_white_noise(), and gen_rho_w_pow_k().

Referenced by App_Var< T >::Impl< T >::set_init_cond().

268 {
269  BOOST_LOG_TRIVIAL(debug) << "Generating gaussian white noise...";
270  gen_gauss_white_noise(sim, rho);
271  fftw_execute_dft_r2c(p_F, rho);
272 
273  BOOST_LOG_TRIVIAL(debug) << "Generating density distributions with given power spectrum...";
274  gen_rho_w_pow_k(sim, rho);
275 }
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
static void gen_gauss_white_noise(const Sim_Param &sim, Mesh &rho)
Definition: core_app.cpp:165
static void gen_rho_w_pow_k(const Sim_Param &sim, Mesh &rho)
Definition: core_app.cpp:221
template<class T >
void get_rho_from_par ( const std::vector< T > &  particles,
Mesh rho,
const Sim_Param sim 
)

Definition at line 278 of file core_app.cpp.

References Mesh_base< T >::assign(), assign_to(), Sim_Param::box_opt, m, Box_Opt::mesh_num, Mesh::N, Box_Opt::par_num, and pow().

Referenced by gen_dens_binned(), App_Var< T >::Impl< T >::print_output(), App_Var_Chi::ChiImpl::solve(), and App_Var_PM::upd_pos().

279 {
280  BOOST_LOG_TRIVIAL(debug) << "Computing the density field from particle positions...";
281 
282  const size_t Np = sim.box_opt.par_num;
283  if (particles.size() != Np){
284  std::string msg = "Number of particles (" + std::to_string(particles.size()) + ") does not correspond with simulation parameters (" + std::to_string(Np) + ")!";
285  throw std::range_error(msg);
286  }
287  const FTYPE_t m = pow((FTYPE_t)rho.N, 3) / Np;
288  const FTYPE_t mesh_mod = (FTYPE_t)rho.N/sim.box_opt.mesh_num;
289 
290 
291  rho.assign(-1.);
292 
293  #pragma omp parallel for
294  for (size_t i = 0; i < Np; i++)
295  {
296  assign_to(rho, particles[i].position*mesh_mod, m);
297  }
298 }
size_t par_num
Definition: params.hpp:61
Box_Opt box_opt
Definition: params.hpp:202
void assign_to(Mesh &field, const Vec_3D< double > &position, const double value)
Definition: core_mesh.cpp:201
size_t N
Definition: class_mesh.hpp:102
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
static int m[2]
Definition: ccl_emu17.c:25
void assign(T val)
Definition: class_mesh.hpp:38
size_t mesh_num
Definition: params.hpp:58
bool get_vel_from_par ( const std::vector< Particle_v< double >> &  particles,
std::vector< Mesh > &  vel_field,
const Sim_Param sim 
)

Definition at line 300 of file core_app.cpp.

References assign_to(), Sim_Param::box_opt, m, Box_Opt::mesh_num, Box_Opt::mesh_num_pwr, Box_Opt::Ng_pwr, Box_Opt::par_num, and pow().

Referenced by App_Var< T >::Impl< T >::print_output().

301 {
302  BOOST_LOG_TRIVIAL(debug) << "Computing the velocity field from particle positions...";
303  const FTYPE_t mesh_mod = (FTYPE_t)sim.box_opt.mesh_num_pwr/sim.box_opt.mesh_num;
304  const FTYPE_t m = pow((FTYPE_t)sim.box_opt.Ng_pwr, 3);
305  const size_t Np = sim.box_opt.par_num;
306 
307  for(Mesh& field : vel_field){
308  field.assign(0.);
309  }
310  #pragma omp parallel for
311  for (size_t i = 0; i < Np; i++)
312  {
313  assign_to(vel_field, particles[i].position*mesh_mod, particles[i].velocity*(m*mesh_mod));
314  }
315  return true;
316 }
size_t par_num
Definition: params.hpp:61
Box_Opt box_opt
Definition: params.hpp:202
size_t Ng_pwr
Definition: params.hpp:61
size_t mesh_num_pwr
Definition: params.hpp:58
: creates a mesh of N*N*(N+2) cells
Definition: class_mesh.hpp:95
void assign_to(Mesh &field, const Vec_3D< double > &position, const double value)
Definition: core_mesh.cpp:201
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
static int m[2]
Definition: ccl_emu17.c:25
size_t mesh_num
Definition: params.hpp:58
bool get_vel_from_par ( const std::vector< Particle_x< double >> &  particles,
std::vector< Mesh > &  vel_field,
const Sim_Param sim 
)

Definition at line 318 of file core_app.cpp.

319 {
320  BOOST_LOG_TRIVIAL(debug) << "WARNING! Trying to compute velocity divergence with particle positions only! Skipping...";
321  return false;
322 }
void pwr_spec_k ( const Mesh rho_k,
Mesh power_aux 
)

Definition at line 324 of file core_app.cpp.

References get_k_vec(), Mesh_base< T >::length, Mesh::N, halomod_bm::NM, ORDER, PI, and pow().

Referenced by App_Var< T >::Impl< T >::get_binned_power_spec().

325 {
326  /* Computing the power spectrum P(k)/L^3 -- dimensionLESS!
327 
328  > in real part [even] of power_aux is stored pk, in imaginary [odd] dimensionLESS k
329  > preserve values in rho_k
330  > as power_aux can be Mesh of different (bigger) size than rho_k, all sizes / lengths are taken from rho_k
331  */
332 
333  FTYPE_t w_k;
334  Vec_3D<int> k_vec;
335  const size_t NM = rho_k.N;
336  const size_t half_length = rho_k.length / 2;
337 
338  #pragma omp parallel for private(w_k, k_vec)
339  for(size_t i=0; i < half_length;i++)
340  {
341  w_k = 1.;
342  get_k_vec(NM, i, k_vec);
343  for (unsigned int j = 0; j < 3; j++) if (k_vec[j] != 0) w_k *= pow(sin(k_vec[j]*PI/NM)/(k_vec[j]*PI/NM), ORDER + 1);
344  power_aux[2*i] = (rho_k[2*i]*rho_k[2*i] + rho_k[2*i+1]*rho_k[2*i+1])/(w_k*w_k);
345  power_aux[2*i+1] = k_vec.norm();
346  }
347 }
#define ORDER
Definition: core_app.cpp:15
size_t N
Definition: class_mesh.hpp:102
constexpr double PI
Definition: precision.hpp:37
size_t length
Definition: class_mesh.hpp:32
void get_k_vec(size_t N, size_t index, int *k_vec)
Definition: core_mesh.cpp:20
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
void pwr_spec_k_init ( const Mesh rho_k,
Mesh power_aux 
)

Definition at line 349 of file core_app.cpp.

References get_k_vec(), Mesh_base< T >::length, Mesh::N, halomod_bm::NM, and pow2().

Referenced by App_Var_Chi::ChiImpl::gen_pow_spec_binned(), and App_Var< T >::Impl< T >::print_input_realisation().

350 {
351  /* same as above but now there is NO w_k correction */
352 
353  Vec_3D<int> k_vec;
354  const size_t NM = rho_k.N;
355  const size_t half_length = rho_k.length / 2;
356 
357  #pragma omp parallel for private(k_vec)
358  for(size_t i=0; i < half_length;i++)
359  {
360  get_k_vec(NM, i, k_vec);
361  power_aux[2*i] = pow2(rho_k[2*i]) + pow2(rho_k[2*i+1]);
362  power_aux[2*i+1] = k_vec.norm();
363  }
364 }
T pow2(T base)
Definition: precision.hpp:52
size_t N
Definition: class_mesh.hpp:102
size_t length
Definition: class_mesh.hpp:32
void get_k_vec(size_t N, size_t index, int *k_vec)
Definition: core_mesh.cpp:20
void set_pert_pos ( const Sim_Param sim,
const double  a,
std::vector< Particle_x< double >> &  particles,
const std::vector< Mesh > &  vel_field 
)

Definition at line 114 of file core_app.cpp.

References Sim_Param::box_opt, Sim_Param::cosmo, get_per(), growth_allz::growth_factor, Box_Opt::mesh_num, Box_Opt::Ng, Box_Opt::par_num, Box_Opt::par_num_1d, set_unpert_pos_one_par(), and set_velocity_one_par().

Referenced by App_Var< T >::Impl< T >::set_init_pos(), and App_Var_ZA::upd_pos().

115 {
116  BOOST_LOG_TRIVIAL(debug) << "Setting initial positions of particles...";
117  Vec_3D<size_t> unpert_pos;
118  Vec_3D<FTYPE_t> velocity;
119  Vec_3D<FTYPE_t> pert_pos;
120 
121  const size_t par_per_dim = sim.box_opt.par_num_1d;
122  const size_t Ng = sim.box_opt.Ng;
123  const size_t Nm = sim.box_opt.mesh_num;
124  const size_t Np = sim.box_opt.par_num;
125 
126  const FTYPE_t D = growth_factor(a, sim.cosmo); // growth factor
127 
128  #pragma omp parallel for private(unpert_pos, velocity, pert_pos)
129  for(size_t i=0; i< Np; i++)
130  {
131  set_unpert_pos_one_par(unpert_pos, i, par_per_dim, Ng);
132  set_velocity_one_par(unpert_pos, velocity, vel_field);
133  pert_pos = velocity*D + unpert_pos;
134  get_per(pert_pos, Nm);
135  particles[i] = Particle_x<FTYPE_t>(pert_pos);
136  }
137 }
size_t par_num
Definition: params.hpp:61
static void set_velocity_one_par(const Vec_3D< size_t > &unpert_pos, Vec_3D< double > &displ_field, const std::vector< Mesh > &vel_field)
Definition: core_app.cpp:77
Box_Opt box_opt
Definition: params.hpp:202
size_t Ng
Definition: params.hpp:61
static void set_unpert_pos_one_par(Vec_3D< size_t > &unpert_pos, const size_t par_index, const size_t par_per_dim, const size_t Ng)
Definition: core_app.cpp:70
size_t par_num_1d
Definition: params.hpp:58
class handling particles (position only)
Cosmo_Param cosmo
Definition: params.hpp:206
static std::enable_if< std::is_integral< T >::value, T >::type get_per(T vec, size_t per)
Definition: core_mesh.cpp:48
size_t mesh_num
Definition: params.hpp:58
void set_pert_pos ( const Sim_Param sim,
const double  a,
std::vector< Particle_v< double >> &  particles,
const std::vector< Mesh > &  vel_field 
)

Definition at line 139 of file core_app.cpp.

References Sim_Param::box_opt, Sim_Param::cosmo, get_per(), growth_change(), growth_allz::growth_factor, Box_Opt::mesh_num, Box_Opt::Ng, Box_Opt::par_num, Box_Opt::par_num_1d, set_unpert_pos_one_par(), and set_velocity_one_par().

140 {
141  BOOST_LOG_TRIVIAL(debug) << "Setting initial positions and velocitis of particles...";
142  Vec_3D<size_t> unpert_pos;
143  Vec_3D<FTYPE_t> velocity;
144  Vec_3D<FTYPE_t> pert_pos;
145 
146  const size_t par_per_dim = sim.box_opt.par_num_1d;
147  const size_t Ng = sim.box_opt.Ng;
148  const size_t Nm = sim.box_opt.mesh_num;
149  const size_t Np = sim.box_opt.par_num;
150 
151  const FTYPE_t D = growth_factor(a, sim.cosmo); // growth factor
152  const FTYPE_t dDda = growth_change(a, sim.cosmo); // dD / da
153 
154  #pragma omp parallel for private(unpert_pos, velocity, pert_pos)
155  for(size_t i=0; i< Np; i++)
156  {
157  set_unpert_pos_one_par(unpert_pos, i, par_per_dim, Ng);
158  set_velocity_one_par(unpert_pos, velocity, vel_field);
159  pert_pos = velocity*D + unpert_pos;
160  get_per(pert_pos, Nm);
161  particles[i] = Particle_v<FTYPE_t>(pert_pos, velocity*dDda);
162  }
163 }
size_t par_num
Definition: params.hpp:61
static void set_velocity_one_par(const Vec_3D< size_t > &unpert_pos, Vec_3D< double > &displ_field, const std::vector< Mesh > &vel_field)
Definition: core_app.cpp:77
class handling particles (position only)
Box_Opt box_opt
Definition: params.hpp:202
size_t Ng
Definition: params.hpp:61
static void set_unpert_pos_one_par(Vec_3D< size_t > &unpert_pos, const size_t par_index, const size_t par_per_dim, const size_t Ng)
Definition: core_app.cpp:70
size_t par_num_1d
Definition: params.hpp:58
Cosmo_Param cosmo
Definition: params.hpp:206
static std::enable_if< std::is_integral< T >::value, T >::type get_per(T vec, size_t per)
Definition: core_mesh.cpp:48
size_t mesh_num
Definition: params.hpp:58
double growth_change(double a, const Cosmo_Param &cosmo)
Definition: core_power.cpp:447
void set_unpert_pos ( const Sim_Param sim,
std::vector< Particle_x< double >> &  particles 
)

Definition at line 82 of file core_app.cpp.

References Sim_Param::box_opt, Box_Opt::Ng, Box_Opt::par_num, Box_Opt::par_num_1d, and set_unpert_pos_one_par().

83 {
84  Vec_3D<size_t> unpert_pos;
85  const size_t par_per_dim = sim.box_opt.par_num_1d;
86  const size_t Ng = sim.box_opt.Ng;
87  const size_t Np = sim.box_opt.par_num;
88 
89  #pragma omp parallel for private(unpert_pos)
90  for(size_t i=0; i< Np; i++)
91  {
92  set_unpert_pos_one_par(unpert_pos, i, par_per_dim, Ng);
93  particles[i] = Particle_x<FTYPE_t>(unpert_pos);
94  }
95 }
size_t par_num
Definition: params.hpp:61
Box_Opt box_opt
Definition: params.hpp:202
size_t Ng
Definition: params.hpp:61
static void set_unpert_pos_one_par(Vec_3D< size_t > &unpert_pos, const size_t par_index, const size_t par_per_dim, const size_t Ng)
Definition: core_app.cpp:70
size_t par_num_1d
Definition: params.hpp:58
class handling particles (position only)
void set_unpert_pos_w_vel ( const Sim_Param sim,
std::vector< Particle_v< double >> &  particles,
const std::vector< Mesh > &  vel_field 
)

Definition at line 97 of file core_app.cpp.

References Sim_Param::box_opt, Box_Opt::Ng, Box_Opt::par_num, Box_Opt::par_num_1d, set_unpert_pos_one_par(), and set_velocity_one_par().

98 {
99  Vec_3D<size_t> unpert_pos;
100  Vec_3D<FTYPE_t> velocity;
101  const size_t par_per_dim = sim.box_opt.par_num_1d;
102  const size_t Ng = sim.box_opt.Ng;
103 
104  const size_t Np = sim.box_opt.par_num;
105  #pragma omp parallel for private(unpert_pos, velocity)
106  for(size_t i=0; i< Np; i++)
107  {
108  set_unpert_pos_one_par(unpert_pos, i, par_per_dim, Ng);
109  set_velocity_one_par(unpert_pos, velocity, vel_field);
110  particles[i] = Particle_v<FTYPE_t>(unpert_pos, velocity);
111  }
112 }
size_t par_num
Definition: params.hpp:61
static void set_velocity_one_par(const Vec_3D< size_t > &unpert_pos, Vec_3D< double > &displ_field, const std::vector< Mesh > &vel_field)
Definition: core_app.cpp:77
class handling particles (position only)
Box_Opt box_opt
Definition: params.hpp:202
size_t Ng
Definition: params.hpp:61
static void set_unpert_pos_one_par(Vec_3D< size_t > &unpert_pos, const size_t par_index, const size_t par_per_dim, const size_t Ng)
Definition: core_app.cpp:70
size_t par_num_1d
Definition: params.hpp:58
void vel_pwr_spec_k ( const std::vector< Mesh > &  vel_field,
Mesh power_aux 
)

Definition at line 366 of file core_app.cpp.

References get_k_vec(), halomod_bm::NM, ORDER, PI, and pow().

Referenced by App_Var< T >::Impl< T >::print_vel_pwr().

367 {
368  /* Computing the velocity power spectrum divergence P(k)/L^3 -- dimensionLESS!
369 
370  > in real part [even] of power_aux is stored pk, in imaginary [odd] dimensionLESS k
371  > preserve values in rho_k
372  > as power_aux can be Mesh of different (bigger) size than rho_k, all sizes / lengths are taken from rho_k
373  */
374 
375  FTYPE_t w_k;
376  Vec_3D<int> k_vec;
377 
378  const size_t NM = vel_field[0].N;
379  const size_t half_length = vel_field[0].length / 2;
380 
381  FTYPE_t vel_div_re, vel_div_im, k; // temporary store of Pk in case vel_field[0] = power_aux
382 
383  #pragma omp parallel for private(w_k, k_vec, k, vel_div_re, vel_div_im)
384  for(size_t i=0; i < half_length; i++)
385  {
386  w_k = 1.;
387  vel_div_re = vel_div_im = 0;
388  get_k_vec(NM, i, k_vec);
389  for (unsigned int j = 0; j < 3; j++){
390  k = k_vec[j]*2*PI / NM;
391  if (k != 0) w_k *= pow(sin(k/2)/(k/2), ORDER + 1);
392  vel_div_re += vel_field[j][2*i]*k; // do not care about Re <-> Im in 2*PI*i/N, norm only
393  vel_div_im += vel_field[j][2*i+1]*k;
394  }
395 
396  power_aux[2*i] = (vel_div_re*vel_div_re + vel_div_im*vel_div_im)/(w_k*w_k);
397  power_aux[2*i+1] = k_vec.norm();
398  }
399 }
#define ORDER
Definition: core_app.cpp:15
constexpr double PI
Definition: precision.hpp:37
void get_k_vec(size_t N, size_t index, int *k_vec)
Definition: core_mesh.cpp:20
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39