Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
Extrap_Pk< T, N > Class Template Reference

: linear interpolation of data [k, P(k)] within 'useful' range fit to primordial P_i(k) below the 'useful' range fit to Padé approximant R [0/3] above the 'useful' range More...

#include <core_power.h>

Inheritance diagram for Extrap_Pk< T, N >:
Collaboration diagram for Extrap_Pk< T, N >:

Public Member Functions

 Extrap_Pk (const Data_Vec< T, N > &data, const Sim_Param &sim)
 
 Extrap_Pk (const Data_Vec< T, N > &data, const Sim_Param &sim, const size_t m_l, const size_t n_u)
 
 Extrap_Pk (const Data_Vec< T, N > &data, const Sim_Param &sim, const size_t m_l, const size_t n_l, const size_t m_u, const size_t n_u)
 
double operator() (double k) const
 
void fit_lin (const Data_Vec< T, N > &data, const size_t m, const size_t n, double &A)
 
void fit_power_law (const Data_Vec< T, N > &data, const size_t m, const size_t n, double &A, double &n_s)
 
- Public Member Functions inherited from Interp_obj
 Interp_obj ()
 
 ~Interp_obj ()
 
double operator() (double x) const
 
template<typename T , size_t N>
void init (const Data_Vec< T, N > &data)
 

Public Attributes

double A_low
 amplitude of linear power in lower range More...
 
const Cosmo_Paramcosmo
 
double A_up
 
double n_s
 scale-free power spectrum in upper range More...
 
k_min
 
k_max
 interpolation range More...
 
- Public Attributes inherited from Interp_obj
double x_min
 
double x_max
 

Detailed Description

template<typename T, size_t N>
class Extrap_Pk< T, N >

: linear interpolation of data [k, P(k)] within 'useful' range fit to primordial P_i(k) below the 'useful' range fit to Padé approximant R [0/3] above the 'useful' range

Steffen interpolation of data [k, P(k)] within range k_min, k_max fit to primordial P_i(k) below this range, fit A*k^ns above

Definition at line 122 of file core_power.h.

Constructor & Destructor Documentation

template<typename T , size_t N>
Extrap_Pk< T, N >::Extrap_Pk ( const Data_Vec< T, N > &  data,
const Sim_Param sim 
)

Definition at line 548 of file core_power.cpp.

548  :
549  Extrap_Pk(data, sim,
550  // trust simulation up to HALF k_nq
551  0, get_nearest(sim.other_par.nyquist.at("particle")/2, data[0]) + 1
552  ) {}
size_t get_nearest(const T val, const std::vector< T > &vec)
Definition: core_power.cpp:260
std::map< std::string, double > nyquist
Definition: params.hpp:175
Other_par other_par
Definition: params.hpp:209
Extrap_Pk(const Data_Vec< T, N > &data, const Sim_Param &sim)
Definition: core_power.cpp:548
template<typename T , size_t N>
Extrap_Pk< T, N >::Extrap_Pk ( const Data_Vec< T, N > &  data,
const Sim_Param sim,
const size_t  m_l,
const size_t  n_u 
)

Definition at line 540 of file core_power.cpp.

540  :
541  Extrap_Pk(data, sim,
542  // fit over first and last half of a decade
543  m_l, m_l + sim.out_opt.bins_per_decade/2,
544  n_u - sim.out_opt.bins_per_decade/2, n_u
545  ) {}
Out_Opt out_opt
Definition: params.hpp:204
size_t bins_per_decade
Definition: params.hpp:85
Extrap_Pk(const Data_Vec< T, N > &data, const Sim_Param &sim)
Definition: core_power.cpp:548
template<typename T , size_t N>
Extrap_Pk< T, N >::Extrap_Pk ( const Data_Vec< T, N > &  data,
const Sim_Param sim,
const size_t  m_l,
const size_t  n_l,
const size_t  m_u,
const size_t  n_u 
)

Definition at line 523 of file core_power.cpp.

References Extrap_Pk< T, N >::A_low, Extrap_Pk< T, N >::A_up, Extrap_Pk< T, N >::fit_lin(), Extrap_Pk< T, N >::fit_power_law(), Interp_obj::init(), Extrap_Pk< T, N >::k_max, Extrap_Pk< T, N >::k_min, and Extrap_Pk< T, N >::n_s.

524  :
525  cosmo(sim.cosmo)
526 {
527  this->init(data);//< initialize Interp_obj
528  // LOWER RANGE -- fit linear power spectrum to data[m_l:n_l)
529  BOOST_LOG_TRIVIAL(debug) << "Fitting amplitude of P(k) in lower range.";
530  k_min = data[0][m_l]; // first k in data
531  fit_lin(data, m_l, n_l, A_low);
532 
533  // UPPER RANGE -- fit Ak^ns to data[m_u,n_u)
534  BOOST_LOG_TRIVIAL(debug) << "Fitting amplitude of P(k) in upper range.";
535  k_max = data[0][n_u-1]; // last k in data
536  fit_power_law(data, m_u, n_u, A_up, n_s);
537 }
void fit_power_law(const Data_Vec< T, N > &data, const size_t m, const size_t n, double &A, double &n_s)
Definition: core_power.cpp:606
void fit_lin(const Data_Vec< T, N > &data, const size_t m, const size_t n, double &A)
Definition: core_power.cpp:560
void init(const Data_Vec< T, N > &data)
Definition: core_power.cpp:496
double A_low
amplitude of linear power in lower range
Definition: core_power.h:134
Cosmo_Param cosmo
Definition: params.hpp:206
T k_max
interpolation range
Definition: core_power.h:137
const Cosmo_Param & cosmo
Definition: core_power.h:135
double n_s
scale-free power spectrum in upper range
Definition: core_power.h:136
double A_up
Definition: core_power.h:136

Member Function Documentation

template<typename T , size_t N>
void Extrap_Pk< T, N >::fit_lin ( const Data_Vec< T, N > &  data,
const size_t  m,
const size_t  n,
double A 
)

Definition at line 560 of file core_power.cpp.

References Extrap_Pk< T, N >::cosmo, Cosmo_Param::k2_G, lin_pow_spec(), m, pow2(), sqrt(), Cosmo_Param::truncated_pk, truncation_fce(), and w.

Referenced by Extrap_Pk< T, N >::Extrap_Pk().

561 {
562  // FIT linear power spectrum to data[m:n)
563  // fit 'P(k) = A * P_lin(k)' via A
564  // for TZA correct for truncation
565  // for N = 2 perform non-weighted least-square fitting
566  // for N = 3 use data[2] as sigma, w = 1/sigma^2
567  double Pk;
568  std::vector<double> Pk_res, w;
569  Pk_res.reserve(n-m);
570  if (N == 3){
571  w.reserve(n-m);
572  }
573  std::vector<double> A_vec(n-m, 1);
574 
575  if (cosmo.truncated_pk)
576  {
577  const FTYPE_t k2_G = cosmo.k2_G;
578  for(size_t i = m; i < n; i++){
579  FTYPE_t k = data[0][i];
580  Pk = lin_pow_spec(1, k, cosmo) * truncation_fce(k, k2_G);;
581  Pk_res.push_back(data[1][i] / Pk);
582  if (N == 3) w.push_back(pow2(Pk/data[2][i]));
583  }
584  }
585  else
586  {
587  for(size_t i = m; i < n; i++){
588  Pk = lin_pow_spec(1, data[0][i], cosmo);
589  Pk_res.push_back(data[1][i] / Pk);
590  if (N == 3) w.push_back(pow2(Pk/data[2][i]));
591  }
592  }
593 
594 
595  double A_sigma2, sumsq;
596 
597  int gsl_errno;
598  if (N == 3) gsl_errno = gsl_fit_wmul(A_vec.data(), 1, w.data(), 1, Pk_res.data(), 1, n-m, &A, &A_sigma2, &sumsq);
599  else gsl_errno = gsl_fit_mul(A_vec.data(), 1, Pk_res.data(), 1, n-m, &A, &A_sigma2, &sumsq);
600  if (gsl_errno) throw std::runtime_error("GSL integration error: " + std::string(gsl_strerror(gsl_errno)));
601 
602  BOOST_LOG_TRIVIAL(debug) << "\t[" << (N == 3 ? "weighted-" : "") << "fit A = " << A << ", err = " << 100*sqrt(A_sigma2)/A << "%%]";
603 }
double lin_pow_spec(double a, double k, const Cosmo_Param &cosmo)
Definition: core_power.cpp:474
T pow2(T base)
Definition: precision.hpp:52
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
Definition: grid.h:231
double k2_G
Definition: params.hpp:35
const Cosmo_Param & cosmo
Definition: core_power.h:135
bool truncated_pk
Definition: params.hpp:41
static int m[2]
Definition: ccl_emu17.c:25
static double w[2][28][111]
Definition: ccl_emu17.c:33
static double truncation_fce(double k, double k2_G)
Definition: core_power.cpp:554
template<typename T , size_t N>
void Extrap_Pk< T, N >::fit_power_law ( const Data_Vec< T, N > &  data,
const size_t  m,
const size_t  n,
double A,
double n_s 
)

Definition at line 606 of file core_power.cpp.

References m, Extrap_Pk< T, N >::n_s, pow2(), sqrt(), and w.

Referenced by Extrap_Pk< T, N >::Extrap_Pk().

607 {
608  // FIT scale-free power spectrum to data[m,n)
609  // fit 'log P(k) = log A + n_s * log k' via A, n_s
610  // for N = 2 perform non-weighted least-square fitting
611  // for N = 3 use data[2] as sigma, w = 1/sigma^2
612  std::vector<double> k, Pk, w; //< need double for GSL
613  k.reserve(n-m);
614  Pk.reserve(n-m);
615  if (N == 3){
616  w.reserve(n-m);
617  }
618  for(size_t i = m; i < n; i++){
619  k.push_back(log(data[0][i]));
620  Pk.push_back(log(data[1][i]));
621  if (N == 3)w.push_back(pow2(data[1][i]/data[2][i])); // weight = 1/sigma^2, approx log(1+x) = x for x rel. error
622  }
623  double cov00, cov01, cov11, sumsq;
624  int gsl_errno;
625  if (N == 3) gsl_errno = gsl_fit_wlinear(k.data(), 1, w.data(), 1, Pk.data(), 1, n-m, &A, &n_s, &cov00, &cov01, &cov11, &sumsq);
626  else gsl_errno = gsl_fit_linear(k.data(), 1, Pk.data(), 1, n-m, &A, &n_s, &cov00, &cov01, &cov11, &sumsq);
627  if (gsl_errno) throw std::runtime_error("GSL integration error: " + std::string(gsl_strerror(gsl_errno)));
628 
629  A = exp(A); // log A => A
630  BOOST_LOG_TRIVIAL(debug) << "\t[" << (N == 3 ? "weighted-" : "") << "fit A = " << A << ", err = " << 100*sqrt(cov00) << "%%"
631  << "n_s = " << n_s << ", err = " << 100*sqrt(cov11)/std::abs(n_s) << "%%, corr = " << 100*cov01/sqrt(cov00*cov11) << "%%]";
632 }
T pow2(T base)
Definition: precision.hpp:52
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
Definition: grid.h:231
double n_s
scale-free power spectrum in upper range
Definition: core_power.h:136
static int m[2]
Definition: ccl_emu17.c:25
static double w[2][28][111]
Definition: ccl_emu17.c:33
template<typename T , size_t N>
double Extrap_Pk< T, N >::operator() ( double  k) const

Definition at line 635 of file core_power.cpp.

References Extrap_Pk< T, N >::A_low, Extrap_Pk< T, N >::A_up, Extrap_Pk< T, N >::cosmo, Extrap_Pk< T, N >::k_max, Extrap_Pk< T, N >::k_min, lin_pow_spec(), Extrap_Pk< T, N >::n_s, Interp_obj::operator()(), and pow().

Referenced by Extrap_Pk_Nl< T, N >::operator()().

636 {
637  if (k < k_min)
638  {
639  return A_low*lin_pow_spec(1, k, cosmo);
640  }
641  else if (k <= k_max) return Interp_obj::operator()(k);
642  else return A_up*pow(k, n_s);
643 }
double lin_pow_spec(double a, double k, const Cosmo_Param &cosmo)
Definition: core_power.cpp:474
double A_low
amplitude of linear power in lower range
Definition: core_power.h:134
T k_max
interpolation range
Definition: core_power.h:137
const Cosmo_Param & cosmo
Definition: core_power.h:135
double n_s
scale-free power spectrum in upper range
Definition: core_power.h:136
double operator()(double x) const
Definition: core_power.cpp:520
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
double A_up
Definition: core_power.h:136

Member Data Documentation

template<typename T, size_t N>
double Extrap_Pk< T, N >::A_low

amplitude of linear power in lower range

Definition at line 134 of file core_power.h.

Referenced by Extrap_Pk< T, N >::Extrap_Pk(), and Extrap_Pk< T, N >::operator()().

template<typename T, size_t N>
double Extrap_Pk< T, N >::A_up

Definition at line 136 of file core_power.h.

Referenced by Extrap_Pk< T, N >::Extrap_Pk(), and Extrap_Pk< T, N >::operator()().

template<typename T, size_t N>
const Cosmo_Param& Extrap_Pk< T, N >::cosmo
template<typename T, size_t N>
T Extrap_Pk< T, N >::k_max

interpolation range

Definition at line 137 of file core_power.h.

Referenced by Extrap_Pk< T, N >::Extrap_Pk(), and Extrap_Pk< T, N >::operator()().

template<typename T, size_t N>
T Extrap_Pk< T, N >::k_min

Definition at line 137 of file core_power.h.

Referenced by Extrap_Pk< T, N >::Extrap_Pk(), and Extrap_Pk< T, N >::operator()().

template<typename T, size_t N>
double Extrap_Pk< T, N >::n_s

scale-free power spectrum in upper range

Definition at line 136 of file core_power.h.

Referenced by Extrap_Pk< T, N >::Extrap_Pk(), Extrap_Pk< T, N >::fit_power_law(), and Extrap_Pk< T, N >::operator()().


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