43 using namespace cosmology;
51 return pow(sigma8/1.79e4*pow(m_Omega_baryon*m_hh*m_hh/0.024, 1./3.)*pow(m_Omega_matter*m_hh*m_hh/0.14, -0.563)*pow(7.808*m_hh, 0.5*(1.-m_n_spec))*pow(m_hh/0.72, -0.693)*0.76/gg(0.), 2);
60 const double wm = m_Omega_matter*m_hh*m_hh;
61 const double wb = m_Omega_baryon*m_hh*m_hh;
62 const double sigma8 = 0.1058*pow(m_scalar_amp/2.196e-9, 0.5)*pow(wm/0.1426, 0.520)*pow(wb/0.02205, -0.294)*pow(m_hh/0.673, 0.683)*pow((m_massless_neutrinos+m_massive_neutrinos)/3.046, -0.24)*exp(0.3727*(m_n_spec-0.96))*pow(1-m_Omega_k, 0.175)*DN(redshift, 9.);
64 return ((m_Omega_neutrinos>0) ? 0.995*sigma8 : sigma8);
71 std::string
cbl::cosmology::Cosmology::Pk_output_file (
const string code,
const bool NL,
const double redshift,
const bool run,
const bool store_output,
const string output_root,
const double k_max,
const string file_par)
78 if (NL==0) dir_grid =
"output_linear/";
79 else if (NL==1) dir_grid =
"output_nonlinear/";
80 else ErrorCBL(
"",
"Pk_output_file",
"PkXi.cpp");
82 dir_grid +=
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6)+
"/";
86 string dir = dir_cosmo+
"/External/"+code+
"/";
87 string dirC = dir_cosmo+
"/External/CAMB/";
88 if (chdir(dirC.c_str())) {}
90 string dir_output = dir+dir_grid+
"pk.dat";
93 vector<double> lgkk, lgPk;
94 Table_PkCodes(code, NL, lgkk, lgPk, redshift, store_output, output_root, k_max, file_par);
97 if (chdir(dir_loc.c_str())) {}
106 void cbl::cosmology::Cosmology::run_CAMB (
const bool NL,
const double redshift,
const std::string output_root,
const std::string output_dir,
const double k_max,
const std::string file_par)
const
109 string dir_CAMB = path.
DirCosmo()+
"/External/CAMB/fortran/";
111 string File_par = file_par;
117 string OutputRoot = (output_dir==
par::defaultString) ? dir_CAMB+
"../inifiles/"+output_root : path.
DirLoc()+output_dir+
"/"+output_root;
119 OutputRoot = (omp_get_max_threads()>1) ? OutputRoot+
"_t"+
conv(omp_get_thread_num(),
par::fINT) : OutputRoot;
127 string file_par_default = dir_CAMB+
"../inifiles/params_cut.ini";
128 File_par = OutputRoot+
"_params.ini";
130 if (system((
"cp "+file_par_default+
" "+File_par).c_str())) {}
131 ofstream fout(File_par.c_str(), std::ios_base::app | std::ios_base::out);
132 double HH0 = m_hh*100.;
134 fout <<
"output_root = " << OutputRoot << endl;
137 fout <<
"ombh2 =" <<
conv(m_Omega_baryon*m_hh*m_hh,
par::fDP6) << endl;
138 fout <<
"omch2 = " <<
conv(m_Omega_CDM*m_hh*m_hh,
par::fDP6) << endl;
140 fout <<
"omnuh2 = " <<
conv(m_Omega_neutrinos*m_hh*m_hh,
par::fDP6) << endl;
141 fout <<
"transfer_redshift(1) = " <<
conv(redshift,
par::fDP6) << endl;
142 fout <<
"massless_neutrinos = " <<
conv(m_massless_neutrinos,
par::fDP6) << endl;
143 fout <<
"massive_neutrinos = " <<
conv(m_massive_neutrinos,
par::fINT) << endl;
144 fout <<
"scalar_spectral_index(1) = " <<
conv(m_n_spec,
par::fDP6) << endl;
147 if (m_scalar_amp>0) {
148 fout <<
"scalar_amp(1) = " <<
conv(m_scalar_amp,
par::ee3) << endl;
149 fout <<
"pivot_scalar = " <<
conv(m_scalar_pivot,
par::fDP6) << endl;
152 fout <<
"re_optical_depth = "+
conv(m_tau,
par::fDP6) << endl;
153 fout <<
"feedback_level = 1" << endl;
154 fout <<
"print_sigma8 = T" << endl;
157 fout.clear(); fout.close();
163 if (system((dir_CAMB+
"camb "+File_par).c_str())) {}
166 string RM =
"rm -f "+OutputRoot+
"*";
167 if (system(RM.c_str())) {}
176 void cbl::cosmology::Cosmology::run_CAMB (std::vector<double> &kk, std::vector<double> &Pk,
const bool NL,
const double redshift,
const std::string output_root,
const std::string output_dir,
const double k_max,
const std::string file_par)
const
179 string dir_CAMB = path.
DirCosmo()+
"/External/CAMB/fortran/";
180 string File_par = file_par;
185 string OutputRoot = (output_dir==
par::defaultString) ? dir_CAMB+
"../inifiles/"+output_root : path.
DirLoc()+output_dir+
"/"+output_root;
187 OutputRoot = (omp_get_max_threads() > 1) ? OutputRoot+
"_t"+
conv(omp_get_thread_num(),
par::fINT) : OutputRoot;
195 string file_par_default = dir_CAMB+
"../inifiles/params_cut.ini";
196 File_par = OutputRoot+
"_params.ini";
198 if (system((
"cp "+file_par_default+
" "+File_par).c_str())) {}
199 ofstream fout(File_par.c_str(), std::ios_base::app | std::ios_base::out);
200 double HH0 = m_hh*100.;
202 fout <<
"output_root = " << OutputRoot << endl;
205 fout <<
"ombh2 =" <<
conv(m_Omega_baryon*m_hh*m_hh,
par::fDP6) << endl;
206 fout <<
"omch2 = " <<
conv(m_Omega_CDM*m_hh*m_hh,
par::fDP6) << endl;
208 fout <<
"omnuh2 = " <<
conv(m_Omega_neutrinos*m_hh*m_hh,
par::fDP6) << endl;
209 fout <<
"transfer_redshift(1) = " <<
conv(redshift,
par::fDP6) << endl;
210 fout <<
"massless_neutrinos = " <<
conv(m_massless_neutrinos,
par::fDP6) << endl;
211 fout <<
"massive_neutrinos = " <<
conv(m_massive_neutrinos,
par::fINT) << endl;
212 fout <<
"scalar_spectral_index(1) = " <<
conv(m_n_spec,
par::fDP6) << endl;
215 if (m_scalar_amp>0) {
216 fout <<
"scalar_amp(1) = " <<
conv(m_scalar_amp,
par::ee3) << endl;
217 fout <<
"pivot_scalar = " <<
conv(m_scalar_pivot,
par::fDP6) << endl;
220 fout <<
"re_optical_depth = "+
conv(m_tau,
par::fDP6) << endl;
221 fout <<
"feedback_level = -1" << endl;
222 fout <<
"print_sigma8 = F" << endl;
225 fout.clear(); fout.close();
231 if (system((dir_CAMB+
"camb "+File_par).c_str())) {}
234 string file_inCAMB = OutputRoot+
"_matterpower.dat";
235 ifstream fin(file_inCAMB.c_str());
checkIO(fin, file_inCAMB);
237 kk.erase(kk.begin(), kk.end());
238 Pk.erase(Pk.begin(), Pk.end());
244 while (fin >> KK >> PK)
249 fin.clear(); fin.close();
251 if (delete_output)
if (system((
"rm -f "+OutputRoot+
"*").c_str())) {}
258 void cbl::cosmology::Cosmology::Table_PkCodes (
const std::string code,
const bool NL, std::vector<double> &lgkk, std::vector<double> &lgPk,
const double redshift,
const bool store_output,
const std::string output_root,
const double k_max,
const std::string file_par)
const
260 if (code==
"MPTbreeze-v1") {
262 ErrorCBL(
"sigma8<0! The function set_sigma8() can be used to set the value of sigma8!",
"Table_PkCodes",
"PkXi.cpp");
264 WarningMsgCBL(
"NL is ignored by MPTbreeze-v1, that provides in output the non-linear power spectrum",
"Table_PkCodes",
"PkXi.cpp");
269 if (code==
"CAMB" || code==
"MGCAMB" || code==
"MPTbreeze-v1")
270 m_Table_Pk_CAMB_MPTbreeze(code, NL, lgkk, lgPk, redshift, store_output, output_root, k_max);
272 else if (code==
"CLASS")
273 m_Table_Pk_CLASS(NL, lgkk, lgPk, redshift, store_output, output_root, k_max);
276 ErrorCBL(
"the choosen code is not allowed!",
"Table_PkCodes",
"PkXi.cpp");
280 WarningMsgCBL(
"the input k_max parameters will not be used",
"Table_PkCodes",
"PkXi.cpp");
281 m_Table_Pk_parameterFile(code, file_par, NL, lgkk, lgPk, redshift, output_root);
290 void cbl::cosmology::Cosmology::Table_PkCodes (
const std::string code,
const bool NL, std::vector<std::vector<double>> &lgkk, std::vector<std::vector<double>> &lgPk,
const std::vector<double> redshift,
const bool store_output,
const std::string output_root,
const double k_max,
const std::string file_par)
const
292 if (code==
"MPTbreeze-v1") {
294 ErrorCBL(
"sigma8<0! The function set_sigma8() can be used to set the value of sigma8!",
"Table_PkCodes",
"PkXi.cpp");
296 WarningMsgCBL(
"NL is ignored by MPTbreeze-v1, that provides in output the non-linear power spectrum",
"Table_PkCodes",
"PkXi.cpp");
299 lgkk.resize(redshift.size(), vector<double>(1, 0.));
300 lgPk.resize(redshift.size(), vector<double>(1, 0.));
304 if (code==
"CAMB" || code==
"MGCAMB" || code==
"MPTbreeze-v1")
305 m_Table_Pk_CAMB_MPTbreeze(code, NL, lgkk, lgPk, redshift, store_output, output_root, k_max);
307 else if (code==
"CLASS")
308 m_Table_Pk_CLASS(NL, lgkk, lgPk, redshift, store_output, output_root, k_max);
311 ErrorCBL(
"the choosen code is not allowed!",
"Table_PkCodes",
"PkXi.cpp");
316 WarningMsgCBL(
"the input k_max parameters will not be used",
"Table_PkCodes",
"PkXi.cpp");
317 for (
size_t zz=0; redshift.size(); zz++)
318 m_Table_Pk_parameterFile(code, file_par, NL, lgkk[zz], lgPk[zz], redshift[zz], output_root);
329 lgkk.erase(lgkk.begin(), lgkk.end());
330 lgPk.erase(lgPk.begin(), lgPk.end());
333 if (code==
"CAMB" || code==
"MGCAMB")
334 dir_grid = (NL) ?
"output_nonlinear/" :
"output_linear/";
336 dir_grid =
"output/";
338 string filename =
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
340 filename += (output_root==
"test") ?
"/" :
"_"+output_root+
"/";
345 const string dirBZ = path.
DirCosmo()+
"/External/"+code+
"/";
346 const string dirBZ_output = dirBZ+dir_grid+filename;
347 string fileBZ_in = dirBZ_output+
"Pk.dat";
349 fin_BZ.open(fileBZ_in.c_str());
351 const string nn = output_root+
"_t"+
conv(omp_get_thread_num(),
par::fINT);
352 const string tot_output_root = dirBZ+nn;
353 string dir_output_root = dirBZ+nn;
354 dir_output_root = regex_replace(dir_output_root, std::regex(
"/"),
"\\/");
361 if (!fin_BZ && (code==
"CAMB" || code==
"MPTbreeze-v1")) {
363 const string dirCAMB = path.
DirCosmo()+
"/External/CAMB/fortran/";
365 file_par = dirCAMB+
"../inifiles/params_"+nn+
".ini";
366 if (system((
"cp "+dirCAMB+
"../inifiles/params.ini "+file_par).c_str())) {}
370 sed =
"sed '/test/s//"+dir_output_root+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
371 if (system(sed.c_str())) {}
372 sed =
"sed '/do_nonlinear = 0/s//do_nonlinear = "+
conv(NL,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
373 sed =
"sed '/hubble = 70/s//hubble = "+
conv(m_hh*100.,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
374 sed =
"sed '/ombh2 = 0.0226/s//ombh2 = "+
conv(m_Omega_baryon*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
375 sed =
"sed '/omch2 = 0.112/s//omch2 = "+
conv(m_Omega_CDM*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
376 sed =
"sed '/omk = 0/s//omk = "+
conv(m_Omega_k,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
377 sed =
"sed '/omnuh2 = 0.00064/s//omnuh2 = "+
conv(m_Omega_neutrinos*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
378 sed =
"sed '/transfer_redshift(1) = 0/s//transfer_redshift(1) = "+
conv(redshift,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
379 sed =
"sed '/massless_neutrinos = 2.046/s//massless_neutrinos = "+
conv(m_massless_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
380 sed =
"sed '/massive_neutrinos = 1/s//massive_neutrinos = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
381 sed =
"sed '/scalar_spectral_index(1) = 0.96/s//scalar_spectral_index(1) = "+
conv(m_n_spec,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
382 sed =
"sed '/w = -1/s//w = "+
conv(m_w0,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
383 sed =
"sed '/wa = 0/s//wa = "+
conv(m_wa,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
384 if (m_scalar_amp>0) {
385 sed =
"sed '/scalar_amp(1) = 2.1e-9/s//scalar_amp(1) = "+
conv(m_scalar_amp,
par::ee3)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
386 sed =
"sed '/pivot_scalar = 0.05/s//pivot_scalar = "+
conv(m_scalar_pivot,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
388 sed =
"sed '/transfer_kmax = 2/s//transfer_kmax = "+
conv(k_max,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
389 sed =
"sed '/re_optical_depth = 0.09/s//re_optical_depth = "+
conv(m_tau,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
394 if (system((dirCAMB+
"camb "+file_par).c_str())) {}
397 else if (!fin_BZ && code==
"MGCAMB") {
399 coutCBL <<
"Set the parameters for modified gravity in the file External/MGCAMB/params_MG.ini" << endl;
401 file_par = dirBZ+
"params_"+nn+
".ini";
402 if (system((
"cp "+dirBZ+
"/params.ini "+file_par).c_str())) {}
406 sed =
"sed '/test/s//"+dir_output_root+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
407 sed =
"sed '/do_nonlinear = 0/s//do_nonlinear = "+
conv(NL,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
408 sed =
"sed '/hubble = 70/s//hubble = "+
conv(m_hh*100.,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
409 sed =
"sed '/ombh2 = 0.0226/s//ombh2 = "+
conv(m_Omega_baryon*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
410 sed =
"sed '/omch2 = 0.112/s//omch2 = "+
conv(m_Omega_CDM*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
411 sed =
"sed '/omk = 0/s//omk = "+
conv(m_Omega_k,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
412 sed =
"sed '/omnuh2 = 0.00064/s//omnuh2 = "+
conv(m_Omega_neutrinos*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
413 sed =
"sed '/transfer_redshift(1) = 0/s//transfer_redshift(1) = "+
conv(redshift,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
414 sed =
"sed '/massless_neutrinos = 2.046/s//massless_neutrinos = "+
conv(m_massless_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
415 sed =
"sed '/massive_neutrinos = 1/s//massive_neutrinos = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
416 sed =
"sed '/scalar_spectral_index(1) = 0.96/s//scalar_spectral_index(1) = "+
conv(m_n_spec,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
417 sed =
"sed '/w = -1/s//w = "+
conv(m_w0,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
418 sed =
"sed '/wa = 0/s//wa = "+
conv(m_wa,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
419 if (m_scalar_amp>0) {
420 sed =
"sed '/scalar_amp(1) = 2.1e-9/s//scalar_amp(1) = "+
conv(m_scalar_amp,
par::ee3)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
421 sed =
"sed '/pivot_scalar = 0.05/s//pivot_scalar = "+
conv(m_scalar_pivot,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
423 sed =
"sed '/transfer_kmax = 2/s//transfer_kmax = "+
conv(k_max,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
424 sed =
"sed '/re_optical_depth = 0.09/s//re_optical_depth = "+
conv(m_tau,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
429 if (system((dirBZ+
"camb "+file_par).c_str())) {}
437 if (!fin_BZ && code==
"MPTbreeze-v1") {
443 if (system((dirBZ+
"mptbreeze -noverbose -camb "+file_par+
" -fileTF "+tot_output_root+
"_transfer_out.dat -sigma8 "+
conv(m_sigma8,
par::fDP6)+
" -omegam "+
conv(m_Omega_matter,
par::fDP6)+
" -ns "+
conv(m_n_spec,
par::fDP6)+
" -w "+
conv(m_w0,
par::fDP6)+
" -redshift "+
conv(redshift,
par::fDP6)+
" -filePk "+tot_output_root+
"_matterpower.dat").c_str())) {}
451 if (system((
"mkdir -p "+dirBZ_output).c_str())) {}
452 if (system((
"mv "+tot_output_root+
"_matterpower.dat "+dirBZ_output+
"Pk.dat").c_str())) {}
453 if (system((
"mv "+tot_output_root+
"_transfer_out.dat "+dirBZ_output+
"transfer_out.dat").c_str())) {}
456 fileBZ_in = tot_output_root+
"_matterpower.dat";
461 if (system((
"rm -f "+file_par+
" "+tot_output_root+
"_params.ini").c_str())) {}
462 fin_BZ.clear(); fin_BZ.close();
469 ifstream fin(fileBZ_in.c_str());
checkIO(fin, fileBZ_in);
473 while (getline(fin, line)) {
474 if (line.find(
"#")!=0) {
475 stringstream ss(line);
478 while (ss>>aa) num.push_back(aa);
480 if (num[0]>0 && num[1]>0) {
482 lgkk.push_back(log10(num[0]));
483 if (code==
"MPTbreeze-v1")
484 lgPk.push_back(log10(pow(2.*
par::pi, 3)*(num[1]+num[2]+num[3])));
486 lgPk.push_back(log10(num[1]));
492 if (remove)
if (system((
"rm "+fileBZ_in+
" "+tot_output_root+
"_transfer_out.dat").c_str())) {}
493 fin.clear(); fin.close();
495 if (lgkk.size()==0 || lgPk.size()==0)
504 void cbl::cosmology::Cosmology::m_Table_Pk_CAMB_MPTbreeze (
const std::string code,
const bool NL, std::vector<std::vector<double>> &lgkk, std::vector<std::vector<double>> &lgPk,
const std::vector<double> redshift,
const bool store_output,
const std::string output_root,
const double k_max)
const
507 if (code==
"CAMB" || code==
"MGCAMB")
508 dir_grid = (NL) ?
"output_nonlinear/" :
"output_linear/";
510 dir_grid =
"output/";
513 add_string = (output_root==
"test") ?
"/" :
"_"+output_root+
"/";
515 vector<double> zz = redshift;
516 std::sort(zz.begin(), zz.end(), greater<double>());
517 vector<string> filename_z(zz.size());
518 vector<string> filename_z_original(redshift.size());
520 for (
size_t ii=0; ii<zz.size(); ii++) {
521 filename_z[ii] =
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(zz[ii],
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
522 filename_z[ii]+=add_string;
525 for (
size_t ii=0; ii<redshift.size(); ii++) {
526 filename_z_original[ii] =
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift[ii],
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
527 filename_z_original[ii]+=add_string;
533 const string dirBZ = path.
DirCosmo()+
"/External/"+code+
"/";
534 const string dirBZ_output = dirBZ+dir_grid;
537 for (
size_t ii=zz.size(); ii-->0;) {
538 string fileBZ_in = dirBZ+dir_grid+filename_z[ii]+
"Pk.dat";
540 fin_BZ.open(fileBZ_in.c_str());
542 zz.erase(zz.begin()+ii);
543 filename_z.erase(filename_z.begin()+ii);
545 fin_BZ.clear(); fin_BZ.close();
548 const string nn = output_root+
"_t"+
conv(omp_get_thread_num(),
par::fINT);
549 const string tot_output_root = dirBZ+nn;
550 string dir_output_root = dirBZ+nn;
551 dir_output_root = regex_replace(dir_output_root, std::regex(
"/"),
"\\/");
557 if (zz.size()>0 && (code==
"CAMB" || code==
"MPTbreeze-v1")) {
560 const string dirCAMB = path.
DirCosmo()+
"/External/CAMB/fortran/";
562 file_par = dirCAMB+
"../inifiles/params_"+nn+
".ini";
563 if (system((
"cp "+dirCAMB+
"../inifiles/params.ini "+file_par).c_str())) {}
567 sed =
"sed '/test/s//"+dir_output_root+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
568 if (system(sed.c_str())) {}
569 sed =
"sed '/do_nonlinear = 0/s//do_nonlinear = "+
conv(NL,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
570 sed =
"sed '/hubble = 70/s//hubble = "+
conv(m_hh*100.,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
571 sed =
"sed '/ombh2 = 0.0226/s//ombh2 = "+
conv(m_Omega_baryon*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
572 sed =
"sed '/omch2 = 0.112/s//omch2 = "+
conv(m_Omega_CDM*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
573 sed =
"sed '/omk = 0/s//omk = "+
conv(m_Omega_k,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
574 sed =
"sed '/omnuh2 = 0.00064/s//omnuh2 = "+
conv(m_Omega_neutrinos*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
575 sed =
"sed '/massless_neutrinos = 2.046/s//massless_neutrinos = "+
conv(m_massless_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
576 sed =
"sed '/massive_neutrinos = 1/s//massive_neutrinos = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
577 sed =
"sed '/scalar_spectral_index(1) = 0.96/s//scalar_spectral_index(1) = "+
conv(m_n_spec,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
579 string transfer_z =
"//";
580 string transfer_file =
"//";
581 string transfer_matter =
"//";
582 for (
size_t ii=0; ii<zz.size(); ii++) {
583 transfer_z+=
"transfer_redshift("+std::to_string(ii+1)+
") = "+
conv(zz[ii],
par::fDP6)+
" \\\n";
584 transfer_file+=
"transfer_filename("+std::to_string(ii+1)+
") = transfer_out_"+std::to_string(ii+1)+
".dat \\\n";
585 transfer_matter+=
"transfer_matterpower("+std::to_string(ii+1)+
") = matterpower_"+std::to_string(ii+1)+
".dat \\\n";
588 sed =
"sed '/transfer_num_redshifts = 1/s//transfer_num_redshifts = "+
conv(zz.size(),
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
589 sed =
"sed '/transfer_redshift(1) = 0/s"+transfer_z+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
590 sed =
"sed '/transfer_filename(1) = transfer_out.dat/s"+transfer_file+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
591 sed =
"sed '/transfer_matterpower(1) = matterpower.dat/s"+transfer_matter+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
593 sed =
"sed '/w = -1/s//w = "+
conv(m_w0,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
594 sed =
"sed '/wa = 0/s//wa = "+
conv(m_wa,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
595 if (m_scalar_amp>0) {
596 sed =
"sed '/scalar_amp(1) = 2.1e-9/s//scalar_amp(1) = "+
conv(m_scalar_amp,
par::ee3)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
597 sed =
"sed '/pivot_scalar = 0.05/s//pivot_scalar = "+
conv(m_scalar_pivot,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
599 sed =
"sed '/transfer_kmax = 2/s//transfer_kmax = "+
conv(k_max,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
600 sed =
"sed '/re_optical_depth = 0.09/s//re_optical_depth = "+
conv(m_tau,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
606 if (system((dirCAMB+
"camb "+file_par).c_str())) {}
609 else if (zz.size()>0 && code==
"MGCAMB") {
611 coutCBL <<
"Set the parameters for modified gravity in the file External/MGCAMB/params_MG.ini" << endl;
613 file_par = dirBZ+
"params_"+nn+
".ini";
614 if (system((
"cp "+dirBZ+
"/params.ini "+file_par).c_str())) {}
618 sed =
"sed '/test/s//"+dir_output_root+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
619 sed =
"sed '/do_nonlinear = 0/s//do_nonlinear = "+
conv(NL,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
620 sed =
"sed '/hubble = 70/s//hubble = "+
conv(m_hh*100.,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
621 sed =
"sed '/ombh2 = 0.0226/s//ombh2 = "+
conv(m_Omega_baryon*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
622 sed =
"sed '/omch2 = 0.112/s//omch2 = "+
conv(m_Omega_CDM*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
623 sed =
"sed '/omk = 0/s//omk = "+
conv(m_Omega_k,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
624 sed =
"sed '/omnuh2 = 0.00064/s//omnuh2 = "+
conv(m_Omega_neutrinos*m_hh*m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
626 string transfer_z =
"//";
627 string transfer_file =
"//";
628 string transfer_matter =
"//";
629 for (
size_t ii=0; ii<zz.size(); ii++) {
630 transfer_z+=
"transfer_redshift("+std::to_string(ii+1)+
") = "+
conv(zz[ii],
par::fDP6)+
" \\\n";
631 transfer_file+=
"transfer_filename("+std::to_string(ii+1)+
") = transfer_out_"+std::to_string(ii+1)+
".dat \\\n";
632 transfer_matter+=
"transfer_matterpower("+std::to_string(ii+1)+
") = matterpower_"+std::to_string(ii+1)+
".dat \\\n";
634 sed =
"sed '/transfer_num_redshifts = 1/s//transfer_num_redshifts = "+
conv(zz.size(),
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
635 sed =
"sed '/transfer_redshift(1) = 0/s"+transfer_z+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
636 sed =
"sed '/transfer_filename(1) = transfer_out.dat/s"+transfer_file+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
637 sed =
"sed '/transfer_matterpower(1) = matterpower.dat/s"+transfer_matter+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
639 sed =
"sed '/massless_neutrinos = 2.046/s//massless_neutrinos = "+
conv(m_massless_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
640 sed =
"sed '/massive_neutrinos = 1/s//massive_neutrinos = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
641 sed =
"sed '/scalar_spectral_index(1) = 0.96/s//scalar_spectral_index(1) = "+
conv(m_n_spec,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
642 sed =
"sed '/w = -1/s//w = "+
conv(m_w0,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
643 sed =
"sed '/wa = 0/s//wa = "+
conv(m_wa,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
644 if (m_scalar_amp>0) {
645 sed =
"sed '/scalar_amp(1) = 2.1e-9/s//scalar_amp(1) = "+
conv(m_scalar_amp,
par::ee3)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
646 sed =
"sed '/pivot_scalar = 0.05/s//pivot_scalar = "+
conv(m_scalar_pivot,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
648 sed =
"sed '/transfer_kmax = 2/s//transfer_kmax = "+
conv(k_max,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
649 sed =
"sed '/re_optical_depth = 0.09/s//re_optical_depth = "+
conv(m_tau,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
655 if (system((dirBZ+
"camb "+file_par).c_str())) {}
663 if (zz.size()>0 && code==
"MPTbreeze-v1") {
669 for (
size_t ii=0; ii<zz.size(); ii++) {
670 if (system((dirBZ+
"mptbreeze -noverbose -camb "+file_par+
" -fileTF "+tot_output_root+
"_transfer_out_"+std::to_string(ii+1)+
".dat -sigma8 "+
conv(m_sigma8,
par::fDP6)+
" -omegam "+
conv(m_Omega_matter,
par::fDP6)+
" -ns "+
conv(m_n_spec,
par::fDP6)+
" -w "+
conv(m_w0,
par::fDP6)+
" -redshift "+
conv(zz[ii],
par::fDP6)+
" -filePk "+tot_output_root+
"_matterpower_"+std::to_string(ii+1)+
".dat").c_str())) {}
676 for (
size_t ii=0; ii<zz.size(); ii++) {
677 if (system((
"mkdir -p "+dirBZ_output+filename_z[ii]).c_str())) {}
678 if (system((
"mv "+tot_output_root+
"_matterpower_"+std::to_string(ii+1)+
".dat "+dirBZ_output+filename_z[ii]+
"Pk.dat").c_str())) {}
679 if (system((
"mv "+tot_output_root+
"_transfer_out_"+std::to_string(ii+1)+
".dat "+dirBZ_output+filename_z[ii]+
"transfer_out.dat").c_str())) {}
682 if (system((
"rm -f "+file_par+
" "+tot_output_root+
"_params.ini").c_str())) {}
690 for (
size_t ii=redshift.size(); ii-->0;) {
692 lgkk[ii].erase(lgkk[ii].begin(), lgkk[ii].end());
693 lgPk[ii].erase(lgPk[ii].begin(), lgPk[ii].end());
695 string fileBZ_in = dirBZ+dir_grid+filename_z_original[ii]+
"Pk.dat";
696 ifstream fin_check(fileBZ_in.c_str());
698 if (fin_check and !store_output) counter++;
699 if (!fin_check) fileBZ_in = tot_output_root+
"_matterpower_"+std::to_string(redshift.size()-ii-counter)+
".dat";
701 ifstream fin(fileBZ_in.c_str());
704 while (getline(fin, line)) {
706 if (line.find(
"#")!=0) {
707 stringstream ss(line);
710 while (ss>>aa) num.push_back(aa);
712 if (num[0]>0 && num[1]>0) {
714 lgkk[ii].push_back(log10(num[0]));
715 if (code==
"MPTbreeze-v1")
716 lgPk[ii].push_back(log10(pow(2.*
par::pi, 3)*(num[1]+num[2]+num[3])));
718 lgPk[ii].push_back(log10(num[1]));
724 if (!fin_check)
if (system((
"rm "+fileBZ_in+
" "+tot_output_root+
"_transfer_out_"+std::to_string(redshift.size()-ii-counter)+
".dat").c_str())) {}
726 fin_check.clear(); fin_check.close();
727 fin.clear(); fin.close();
729 if (lgkk[ii].size()==0 || lgPk[ii].size()==0)
742 lgkk.erase(lgkk.begin(), lgkk.end());
743 lgPk.erase(lgPk.begin(), lgPk.end());
746 const string dirC = path.
DirCosmo()+
"/External/CLASS/";
748 string dir_grid = (NL) ? dirC+
"output_nonlinear/" : dirC+
"output_linear/";
750 dir_grid +=
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
752 dir_grid += (output_root==
"test") ?
"/" :
"_"+output_root+
"/";
754 const string nn = output_root+
"_t"+
conv(omp_get_thread_num(),
par::fINT);
755 const string dir_output = dirC+nn+
"_00";
757 string file_in = dir_grid+
"Pk.dat";
759 fin.open(file_in.c_str());
769 string dir_output_root = dirC+nn;
770 dir_output_root = regex_replace(dir_output_root, std::regex(
"/"),
"\\/");
772 file_par = dirC+
"params_"+nn+
".ini";
773 if (system((
"cp "+dirC+
"params.ini "+file_par).c_str())) {}
777 sed =
"sed '/output\\/test_/s//"+dir_output_root+
"_/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
780 sed =
"sed '/non linear =/s//non linear = halofit/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
781 if (system(sed.c_str())) {}
784 sed =
"sed '/h = 0.67556/s//h = "+
conv(m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
785 sed =
"sed '/Omega_b = 0.022032/s//Omega_b = "+
conv(m_Omega_baryon,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
786 sed =
"sed '/Omega_cdm = 0.12038/s//Omega_cdm = "+
conv(m_Omega_CDM,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
787 sed =
"sed '/N_ncdm = 0/s//N_ncdm = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
788 sed =
"sed '/Omega_ncdm = 0/s//Omega_ncdm = "+
conv(m_Omega_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
790 if (m_Omega_neutrinos>0) {
791 sed =
"sed '/m_ncdm = 0.04, 0.04, 0.04/s//#m_ncdm/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
792 if (system(sed.c_str())) {}
795 sed =
"sed '/Omega_Lambda = 0.7/s//Omega_Lambda = "+
conv(m_Omega_DE,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
796 sed =
"sed '/Omega_k = 0./s//Omega_k = "+
conv(m_Omega_k,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
797 sed =
"sed '/z_pk = 0/s//z_pk = "+
conv(redshift,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
798 sed =
"sed '/N_ur = 3.046/s//N_ur = "+
conv(m_massless_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
799 sed =
"sed '/N_ncdm = 0/s//N_ncdm = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
800 sed =
"sed '/n_s = 0.9619/s//n_s = "+
conv(m_n_spec,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
802 double w00 = max(-0.999,m_w0);
803 sed =
"sed '/w0_fld = -0.9/s//w0_fld = "+
conv(w00,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
805 sed =
"sed '/wa_fld = 0./s//wa_fld = "+
conv(m_wa,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
806 if (m_scalar_amp>0) {
807 sed =
"sed '/A_s = 2.215e-9/s//A_s = "+
conv(m_scalar_amp,
par::ee3)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
808 sed =
"sed '/k_pivot = 0.05/s//k_pivot = "+
conv(m_scalar_pivot,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
810 sed =
"sed '/P_k_max_h\\/Mpc = 1/s//P_k_max_h\\/Mpc = "+
conv(k_max,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
811 sed =
"sed '/tau_reio = 0.0925/s//tau_reio = "+
conv(m_tau,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
817 if (system((dirC+
"/class "+file_par).c_str())) {}
818 if (system((
"rm -f "+file_par).c_str())) {}
821 fin.clear(); fin.close();
826 if (system((
"mkdir -p "+dir_grid).c_str())) {}
827 if (system((
"mv "+dir_output+
"_pk"+((NL) ?
"_nl.dat" :
".dat")+
" "+dir_grid+
"Pk.dat").c_str())) {}
831 file_in = dir_output+
"_pk"+((NL) ?
"_nl.dat" :
".dat");
839 fin.open(file_in.c_str());
checkIO(fin, file_in);
842 while (getline(fin, line)) {
843 stringstream ss(line);
846 while (ss>>aa) num.push_back(aa);
848 if (num[0]>0 && num[1]>0) {
849 lgkk.push_back(log10(num[0]));
850 lgPk.push_back(log10(num[1]));
854 if (remove)
if (system((
"rm -f "+dir_output+
"_pk*.dat").c_str())) {}
855 fin.clear(); fin.close();
857 if (lgkk.size()==0 || lgPk.size()==0)
866 void cbl::cosmology::Cosmology::m_Table_Pk_CLASS (
const bool NL, std::vector<std::vector<double>> &lgkk, std::vector<std::vector<double>> &lgPk,
const std::vector<double> redshift,
const bool store_output,
const std::string output_root,
const double k_max)
const
869 const string dirC = path.
DirCosmo()+
"/External/CLASS/";
870 string dir_grid = (NL) ? dirC+
"output_nonlinear/" : dirC+
"output_linear/";
872 vector<string> filename_z_original(redshift.size());
873 vector<string> dir_output_z_original(redshift.size());
876 for (
size_t ii=0; ii<redshift.size(); ii++) {
877 filename_z_original[ii] = dir_grid+
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift[ii],
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
878 filename_z_original[ii] += (output_root==
"test") ?
"/" :
"_"+output_root+
"/";
879 dir_output_z_original[ii] = filename_z_original[ii];
882 vector<double> zz = redshift;
884 for (
size_t ii=zz.size(); ii-->0;) {
885 string file_in = dir_output_z_original[ii]+
"Pk.dat";
887 fin.open(file_in.c_str());
888 if (fin) zz.erase(zz.begin()+ii);
889 fin.clear(); fin.close();
892 vector<string> filename_z(zz.size());
893 vector<string> dir_output_z(zz.size());
895 for (
size_t ii=0; ii<zz.size(); ii++) {
896 filename_z[ii] = dir_grid+
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(zz[ii],
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
897 filename_z[ii] += (output_root==
"test") ?
"/" :
"_"+output_root+
"/";
898 dir_output_z[ii] = filename_z[ii];
901 const string nn = output_root+
"_t"+
conv(omp_get_thread_num(),
par::fINT);
909 string dir_output_root = dirC+nn;
910 dir_output_root = regex_replace(dir_output_root, std::regex(
"/"),
"\\/");
912 string file_par = dirC+
"params_"+output_root+
"_t"+
conv(omp_get_thread_num(),
par::fINT)+
".ini";
913 if (system((
"cp "+dirC+
"params.ini "+file_par).c_str())) {}
917 sed =
"sed '/output\\/test_/s//"+dir_output_root+
"_/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
920 sed =
"sed '/non linear =/s//non linear = halofit/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
921 if (system(sed.c_str())) {}
924 sed =
"sed '/h = 0.67556/s//h = "+
conv(m_hh,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
925 sed =
"sed '/Omega_b = 0.022032/s//Omega_b = "+
conv(m_Omega_baryon,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
926 sed =
"sed '/Omega_cdm = 0.12038/s//Omega_cdm = "+
conv(m_Omega_CDM,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
927 sed =
"sed '/N_ncdm = 0/s//N_ncdm = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
928 sed =
"sed '/Omega_ncdm = 0/s//Omega_ncdm = "+
conv(m_Omega_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
930 if (m_Omega_neutrinos>0) {
931 sed =
"sed '/m_ncdm = 0.04, 0.04, 0.04/s//#m_ncdm/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
932 if (system(sed.c_str())) {}
935 sed =
"sed '/Omega_Lambda = 0.7/s//Omega_Lambda = "+
conv(m_Omega_DE,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
936 sed =
"sed '/Omega_k = 0./s//Omega_k = "+
conv(m_Omega_k,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par+
"";
if (system(sed.c_str())) {}
938 string z_pk =
"z_pk = ";
939 for (
size_t ii=0; ii<zz.size(); ii++) {
941 if (ii<zz.size()-1) z_pk +=
",";
944 sed =
"sed '/z_pk = 0/s//"+z_pk+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
946 sed =
"sed '/N_ur = 3.046/s//N_ur = "+
conv(m_massless_neutrinos,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
947 sed =
"sed '/N_ncdm = 0/s//N_ncdm = "+
conv(m_massive_neutrinos,
par::fINT)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
948 sed =
"sed '/n_s = 0.9619/s//n_s = "+
conv(m_n_spec,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
950 double w00 = max(-0.999,m_w0);
951 sed =
"sed '/w0_fld = -0.9/s//w0_fld = "+
conv(w00,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
953 sed =
"sed '/wa_fld = 0./s//wa_fld = "+
conv(m_wa,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
954 if (m_scalar_amp>0) {
955 sed =
"sed '/A_s = 2.215e-9/s//A_s = "+
conv(m_scalar_amp,
par::ee3)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
956 sed =
"sed '/k_pivot = 0.05/s//k_pivot = "+
conv(m_scalar_pivot,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
958 sed =
"sed '/P_k_max_h\\/Mpc = 1/s//P_k_max_h\\/Mpc = "+
conv(k_max,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
959 sed =
"sed '/tau_reio = 0.0925/s//tau_reio = "+
conv(m_tau,
par::fDP6)+
"/g' "+file_par+
" > temp_"+nn+
"; mv temp_"+nn+
" "+file_par;
if (system(sed.c_str())) {}
966 if (system((dirC+
"/class "+file_par).c_str())) {}
967 if (system((
"rm -f "+file_par).c_str())) {}
970 for (
size_t ii=0; ii<zz.size(); ii++) {
971 if (system((
"mkdir -p "+dir_output_z[ii]).c_str())) {}
973 if (zz.size()==1) {
if (system((
"mv "+dirC+nn+
"_00_pk"+((NL) ?
"_00_nl.dat" :
".dat")+
" "+dir_output_z[ii]+
"Pk.dat").c_str())) {}}
974 else {
if (system((
"mv "+dirC+nn+
"_00_z"+std::to_string(ii+1)+((NL) ?
"_pk_nl.dat" :
"_pk.dat")+
" "+dir_output_z[ii]+
"Pk.dat").c_str())) {}}
986 for (
size_t ii=0; ii<redshift.size(); ii++) {
988 lgkk[ii].erase(lgkk[ii].begin(), lgkk[ii].end());
989 lgPk[ii].erase(lgPk[ii].begin(), lgPk[ii].end());
991 string file_in = dir_output_z_original[ii]+
"Pk.dat";
992 ifstream fin_check(file_in.c_str());
994 if (fin_check and !store_output) counter++;
996 if (zz.size()==1) file_in = dirC+nn+
"_00_pk"+((NL) ?
"_00_nl.dat" :
".dat");
997 else file_in = dirC+nn+
"_00_z"+std::to_string(ii+1-counter)+((NL) ?
"_pk_nl.dat" :
"_pk.dat");
1000 ifstream fin(file_in.c_str());
1003 while (getline(fin, line)) {
1004 stringstream ss(line);
1007 while (ss>>aa) num.push_back(aa);
1009 if (num[0]>0 && num[1]>0) {
1010 lgkk[ii].push_back(log10(num[0]));
1011 lgPk[ii].push_back(log10(num[1]));
1015 fin_check.clear(); fin_check.close();
1016 fin.clear(); fin.close();
1018 if (lgkk[ii].size()==0 || lgPk[ii].size()==0)
1022 if (system((
"rm -f "+dirC+nn+
"_00_*.dat").c_str())) {}
1033 if (code==
"CAMB" || code==
"MGCAMB" || code==
"CLASS")
1034 dir_grid = (NL) ?
"output_nonlinear/" :
"output_linear/";
1036 dir_grid =
"output/";
1038 dir_grid +=
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
1040 if (output_root!=
"test") dir_grid +=
"_"+output_root;
1045 if (code==
"CAMB") dir_output = path.
DirCosmo()+
"/External/CAMB/"+dir_grid;
1046 if (code==
"MGCAMB") dir_output = path.
DirCosmo()+
"/External/MGCAMB/"+dir_grid;
1047 else if (code==
"CLASS") dir_output = path.
DirCosmo()+
"/External/CLASS/"+dir_grid;
1048 else dir_output = path.
DirCosmo()+
"/External/MPTbreeze-v1/"+dir_grid;
1050 if (system((
"rm -rf "+dir_output+
" > /dev/null 2>&1").c_str())) {}
1060 WarningMsgCBL(
"Check the consistency between the output_root/root parameter given in input and the one set in the parameter file",
"m_Table_Pk_parameterFile",
"PkXi.cpp");
1062 lgkk.erase(lgkk.begin(), lgkk.end());
1063 lgPk.erase(lgPk.begin(), lgPk.end());
1067 const string dirB = (code==
"CAMB" || code==
"MPTbreeze-v1") ? path.
DirCosmo()+
"/External/CAMB/fortran/"
1068 : path.
DirCosmo()+
"/External/"+code+
"/";
1070 const string dir_output = (code==
"CAMB" || code==
"MPTbreeze-v1") ? dirB+
"../output_ParameterFiles/"+file_par+
"/"
1071 : dirB+
"output_ParameterFiles/"+file_par+
"/";
1073 if (system((
"mkdir -p "+dir_output).c_str())) {}
1075 const string file_out = dir_output+
"Pk.dat";
1077 const string dirPar = (code==
"CAMB" || code==
"MPTbreeze-v1") ?
"../inifiles/" :
"./";
1078 const string File_par = dirB+dirPar+file_par;
1081 check.open(File_par.c_str());
1082 if (!check)
ErrorCBL(
"Parameter file not found! Make sure that this file is located in CosmoBolognaLib/External/CAMB/inifiles/ for CAMB and MPTbreeze-v1, and in CosmoBolognaLib/External/_NameBoltzmannSolver_/ for the remaining cases",
"m_Table_Pk_parameterFile",
"PkXi.cpp");
1083 check.clear(); check.close();
1086 fin.open(file_out.c_str());
1090 if (chdir(dirB.c_str())) {}
1096 if (code==
"CAMB" || code==
"MGCAMB" || code==
"MPTbreeze-v1") {
1097 if (system((
"./camb "+File_par).c_str())) {}
1098 if (system((
"mv "+output_root+
"_matterpower*dat "+dir_output+
"Pk.dat").c_str())) {}
1100 if (code==
"MPTbreeze-v1") {
1101 WarningMsgCBL(
"Check the consistency of the input redshift with the one set in the parameter file",
"m_Table_Pk_parameterFile",
"PkXi.cpp");
1102 if (chdir((path.
DirCosmo()+
"/External/"+code).c_str())) {}
1104 if (system((
"./mptbreeze -noverbose -camb ../../CAMB/"+File_par+
" -fileTF ../../CAMB/"+output_root+
"_transfer_out.dat -sigma8 "+
conv(m_sigma8,
par::fDP6)+
" -omegam "+
conv(m_Omega_matter,
par::fDP6)+
" -ns "+
conv(m_n_spec,
par::fDP6)+
" -w "+
conv(m_w0,
par::fDP6)+
" -redshift "+
conv(redshift,
par::fDP6)+
" -filePk ../../CAMB/"+output_root+
"_matterpower.dat").c_str())) {}
1105 if (system((
"mv ../../CAMB/"+output_root+
"_matterpower*dat "+dir_output+
"Pk.dat").c_str())) {}
1110 else if (code==
"CLASS") {
1111 WarningMsgCBL(
"Check the consistency of the input NL value with the one set in the parameter file",
"m_Table_Pk_parameterFile",
"PkXi.cpp");
1112 if (system((
"./class "+File_par).c_str())) {}
1113 if (system((
"mv "+output_root+
"pk"+((NL) ?
".dat" :
"_nl.dat")+
" "+dir_output+
"Pk.dat").c_str())) {}
1116 else ErrorCBL(
"the chosen code is not allowed!",
"m_Table_parameterFile",
"PkXi.cpp");
1118 if (system((
"rm -f "+output_root+
"*_params.ini "+output_root+
"*_transfer*" ).c_str())) {}
1119 if (chdir(dir_loc.c_str())) {}
1123 fin.clear(); fin.close();
1129 fin.open(file_out.c_str());
checkIO(fin, file_out);
1132 while (getline(fin, line)) {
1133 if (line.find(
"#")!=0) {
1134 stringstream ss(line);
1137 while (ss>>aa) num.push_back(aa);
1139 if (num[0]>0 && num[1]>0) {
1141 lgkk.push_back(log10(num[0]));
1142 if (code==
"MPTbreeze-v1")
1143 lgPk.push_back(log10(pow(2.*
par::pi, 3)*(num[1]+num[2]+num[3])));
1145 lgPk.push_back(log10(num[1]));
1151 fin.clear(); fin.close();
1153 if (lgkk.size()==0 || lgPk.size()==0)
1156 if (chdir(dir_loc.c_str())) {}
1164 void cbl::cosmology::Cosmology::Table_XiCodes (
const std::string code,
const bool NL, std::vector<double> &rr, std::vector<double> &xi,
const double redshift,
const bool store_output,
const std::string output_root,
const double k_max,
const std::string file_par)
const
1166 vector<double> _lgkk, _lgPk;
1167 Table_PkCodes(code, NL, _lgkk, _lgPk, redshift, store_output, output_root, k_max, file_par);
1169 if (_lgkk.size()==0 || _lgPk.size()==0)
1174 vector<double> lgkk, lgPk;
1175 if (_lgkk.size()<1000) {
1177 for (
size_t i=0; i<lgkk.size(); ++i)
1178 lgPk.emplace_back(
interpolated(lgkk[i], _lgkk, _lgPk,
"Linear"));
1185 const string dir_loc = path.
DirLoc();
1186 const string dir_cosmo = path.
DirCosmo();
1189 if (code==
"MPTbreeze-v1") dir_grid =
"output/";
1190 else if (NL==
false) dir_grid =
"output_linear/";
1191 else dir_grid =
"output_nonlinear/";
1193 dir_grid +=
"h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
1195 if (output_root!=
"test") dir_grid +=
"_"+output_root;
1197 string dir = dir_cosmo+
"/External/"+code+
"/";
1198 string dirFFT = dir_cosmo+
"/External/fftlog-f90-master/";
1199 string dir_output = dir+dir_grid+
"/";
1201 string file_in = (code==
"MPTbreeze-v1") ? dir_output+
"Pk2.dat" : dir_output+
"Pk.dat";
1202 string file_out = dir_output+
"Xi.dat";
1204 const string mkdir =
"mkdir -p "+dir_output;
if (system(mkdir.c_str())) {}
1207 fin.open(file_out.c_str());
1210 vector<double> kk = lgkk, Pk = lgPk;
1211 for_each( kk.begin(), kk.end(), [] (
double &vv) { vv = pow(10., vv); } );
1212 for_each( Pk.begin(), Pk.end(), [] (
double &vv) { vv = pow(10., vv); } );
1216 ofstream fout(file_out.c_str());
checkIO(fout, file_out);
1218 for (
size_t i=0; i<rr.size(); ++i)
1219 fout << rr[i] <<
" " << xi[i] << endl;
1221 fout.clear(); fout.close();
1224 if (chdir(dir_loc.c_str())) {}
1226 fin.clear(); fin.close();
1228 rr.erase(rr.begin(), rr.end());
1229 xi.erase(xi.begin(), xi.end());
1231 fin.open(file_out.c_str());
1234 while (fin >> RR >> XI) {
1239 fin.clear(); fin.close();
1241 if (!store_output) {
1242 string RM =
"rm -rf "+dir_grid;
1243 if (system(RM.c_str())) {}
1251 void cbl::cosmology::Cosmology::Pk_0 (
const std::string method_Pk,
const double redshift,
const bool store_output,
const std::string output_root,
const double k_min,
const double k_max,
const double prec,
const std::string file_par)
1253 if (m_sigma8<0)
ErrorCBL(
"sigma8<0!",
"Pk_0",
"PkXi.cpp");
1256 double RHO = rho_m(0.,
true);
1257 double MM =
Mass(RR, RHO);
1263 if (method_Pk==
"EisensteinHu") {
1267 eh.
TFmdm_set_cosm(m_Omega_matter, m_Omega_baryon, m_Omega_neutrinos, m_massive_neutrinos, m_Omega_DE, m_hh, redshift, m_scalar_amp, m_scalar_pivot, m_n_spec);
1269 auto func = [&] (
const double kk)
1277 else if (method_Pk ==
"CAMB" || method_Pk==
"CAMB_wrapper" || method_Pk==
"MGCAMB" || method_Pk==
"MPTbreeze-v1" || method_Pk==
"CLASS") {
1279 vector<double> lgkk, lgPk;
1281 if (method_Pk ==
"CAMB_wrapper") {
1283 const int npoints = 500;
1284 vector<double> Pk =
wrapper::camb::Pk_CAMB (
false, redshift, k_min, k_max, npoints, m_Omega_baryon*m_hh*m_hh, m_Omega_CDM*m_hh*m_hh, m_Omega_neutrinos*m_hh*m_hh, m_massless_neutrinos, m_massive_neutrinos, m_Omega_k, m_hh*100., m_n_spec, m_scalar_amp, m_scalar_pivot, m_w0, m_wa, m_tau);
1287 for (
size_t i=0; i<Pk.size(); i++) {
1288 lgkk.emplace_back(log10(kk[i]/m_hh));
1289 lgPk.emplace_back(log10(Pk[i]));
1295 Table_PkCodes(method_Pk, NL, lgkk, lgPk, redshift, store_output, output_root, k_max, file_par);
1297 int limit_size = 1000;
1298 gsl_integration_workspace *ww = gsl_integration_workspace_alloc(limit_size);
1304 str.n_spec = m_n_spec;
1310 Func.function = &glob::func_SSM_GSL;
1312 gsl_integration_qag(&Func, k_min, k_max, 0., prec, limit_size, 6, ww, &Int, &error);
1313 gsl_integration_workspace_free (ww);
1316 else ErrorCBL(
"method_Pk is wrong!",
"Pk_0",
"PkXi.cpp");
1318 const double D_N = DN(redshift);
1320 if (method_Pk==
"EisensteinHu") m_Pk0_EH = 2.*pow(
par::pi*m_sigma8,2)/Int*D_N*D_N;
1321 if (method_Pk==
"CAMB" || method_Pk==
"CAMB_wrapper" || method_Pk==
"MGCAMB") m_Pk0_CAMB = 2.*pow(
par::pi*m_sigma8,2)/Int*D_N*D_N;
1322 if (method_Pk==
"MPTbreeze-v1") m_Pk0_MPTbreeze = 2.*pow(
par::pi*m_sigma8,2)/Int*D_N*D_N;
1323 if (method_Pk==
"CLASS") m_Pk0_CLASS = 2.*pow(
par::pi*m_sigma8,2)/Int*D_N*D_N;
1331 std::vector<double>
cbl::cosmology::Cosmology::Pk_matter (
const std::vector<double> kk,
const std::string method_Pk,
const bool NL,
const double redshift,
const bool store_output,
const std::string output_root,
const int norm,
const double k_min,
const double k_max,
const double prec,
const std::string file_par,
const bool unit1)
1333 double fact1 = (m_unit || unit1) ? 1. : 1./m_hh;
1334 double fact2 = pow(fact1, 3);
1336 vector<double> newk = kk;
1338 for(
size_t i=0; i<newk.size(); i++)
1343 if (Norm==-1) Norm = (m_sigma8>0) ? 1 : 0;
1345 if (Norm==1) Pk_0(method_Pk, redshift, store_output, output_root, k_min, k_max, prec, file_par);
1346 else { m_Pk0_EH = 1.; m_Pk0_CAMB = 1.; m_Pk0_MPTbreeze = 1.; m_Pk0_CLASS = 1.; }
1348 vector<double> Pk(kk.size());
1350 if (method_Pk==
"EisensteinHu") {
1354 eh.
TFmdm_set_cosm(m_Omega_matter, m_Omega_baryon, m_Omega_neutrinos, m_massive_neutrinos, m_Omega_DE, m_hh, redshift, m_scalar_amp, m_scalar_pivot, m_n_spec);
1356 for (
size_t i=0; i<kk.size(); i++) {
1357 Pk[i] = m_Pk0_EH*eh.
Pk(newk[i])*fact2;
1361 else if (method_Pk==
"CAMB" || method_Pk==
"MGCAMB" || method_Pk==
"MPTbreeze-v1" || method_Pk==
"CLASS" || (method_Pk==
"CAMB_wrapper" && kk.size()==1)) {
1363 vector<double> _kk, _pk;
1364 Table_PkCodes(method_Pk, NL, _kk, _pk, redshift, store_output, output_root, k_max, file_par);
1366 for(
size_t i=0; i<_kk.size(); i++) {
1367 _kk[i] = pow(10., _kk[i]);
1368 _pk[i] = pow(10., _pk[i]);
1376 if (method_Pk==
"CAMB") Pk0 = m_Pk0_CAMB;
1377 else if (method_Pk==
"MGCAMB") Pk0 = m_Pk0_CAMB;
1378 else if (method_Pk==
"MPTbreeze-v1") Pk0 = m_Pk0_MPTbreeze;
1379 else if (method_Pk==
"CLASS") Pk0 = m_Pk0_CLASS;
1381 for (
size_t i=0; i<kk.size(); i++)
1385 else if (method_Pk==
"CAMB_wrapper" && kk.size()>1) {
1387 double fact3 = (m_unit || unit1) ? m_hh : 1.;
1389 Pk =
wrapper::camb::Pk_CAMB (NL, redshift,
Min(kk)*fact3,
Max(kk)*fact3, (
int)(kk.size()), m_Omega_baryon*m_hh*m_hh, m_Omega_CDM*m_hh*m_hh, m_Omega_neutrinos*m_hh*m_hh, m_massless_neutrinos, m_massive_neutrinos, m_Omega_k, m_hh*100., m_n_spec, m_scalar_amp, m_scalar_pivot, m_w0, m_wa, m_tau);
1391 for (
size_t i=0; i<kk.size(); i++)
1392 Pk[i] *= m_Pk0_CAMB*fact2;
1396 else {
ErrorCBL(
"method_Pk is wrong!",
"Pk",
"PkXi.cpp"); vector<double> vv;
return vv; }
1405 std::vector<std::vector<double>>
cbl::cosmology::Cosmology::Pk_matter (
const std::vector<double> kk,
const std::string method_Pk,
const bool NL,
const std::vector<double> redshift,
const bool store_output,
const std::string output_root,
const int norm,
const double k_min,
const double k_max,
const double prec,
const std::string file_par,
const bool unit1)
1408 double fact1 = (m_unit || unit1) ? 1. : 1./m_hh;
1409 double fact2 = pow(fact1, 3);
1411 vector<double> newk = kk;
1413 for(
size_t i=0; i<newk.size(); i++)
1418 if (Norm==-1) Norm = (m_sigma8>0) ? 1 : 0;
1420 vector<vector<double>> Pk(redshift.size(), vector<double>(kk.size()));
1423 if (method_Pk==
"EisensteinHu") {
1425 for (
size_t zz=0; zz<redshift.size(); zz++) {
1427 if (Norm==1) Pk_0(method_Pk, redshift[zz], store_output, output_root, k_min, k_max, prec, file_par);
1428 else { m_Pk0_EH = 1.;}
1432 eh.
TFmdm_set_cosm(m_Omega_matter, m_Omega_baryon, m_Omega_neutrinos, m_massive_neutrinos, m_Omega_DE, m_hh, redshift[zz], m_scalar_amp, m_scalar_pivot, m_n_spec);
1434 for (
size_t i=0; i<kk.size(); i++) {
1435 Pk[zz][i] = m_Pk0_EH*eh.
Pk(newk[i])*fact2;
1440 else if (method_Pk==
"CAMB" || method_Pk==
"MGCAMB" || method_Pk==
"MPTbreeze-v1" || method_Pk==
"CLASS") {
1442 vector<vector<double>> _kk, _pk;
1443 Table_PkCodes(method_Pk, NL, _kk, _pk, redshift, store_output, output_root, k_max, file_par);
1445 for (
size_t zz=0; zz<redshift.size(); zz++) {
1447 for(
size_t i=0; i<_kk[zz].size(); i++) {
1448 _kk[zz][i] = pow(10., _kk[zz][i]);
1449 _pk[zz][i] = pow(10., _pk[zz][i]);
1459 sigma8 = sigma8_Pk(
"CAMB", 0., store_output,
"test",
false, k_min, k_max, prec);
1462 const double RR = 8.;
1463 auto func_sigma = [&] (
double _k){
1464 return pow(
TopHat_WF(_k*RR)*_k, 2)*interp_Pk(_k);
1469 Pk0 = pow(m_sigma8/sigma8,2);
1474 for (
size_t i=0; i<kk.size(); i++)
1475 Pk[zz][i] *= Pk0*fact2;
1480 else {
ErrorCBL(
"method_Pk is wrong!",
"Pk",
"PkXi.cpp"); vector<vector<double>> vv;
return vv; }
1490 double cbl::glob::func_xi_EH_GSL (
double kk,
void *params)
1492 struct glob::STR_xi_EH *pp = (
struct glob::STR_xi_EH *) params;
1496 eh.
TFmdm_set_cosm(pp->Omega_matter, pp->Omega_baryon, pp->Omega_neutrinos, pp->massive_neutrinos, pp->Omega_DE, pp->hh, pp->redshift, pp->scalar_amp, pp->scalar_pivot, pp->n_spec);
1498 double Int = eh.
Pk(kk)*sin(kk*pp->rr)*kk/pp->rr;
1500 return Int*exp(-kk*kk*pp->aa*pp->aa);
1509 double cbl::cosmology::Cosmology::xi_matter (
const double rr,
const std::string method_Pk,
const bool NL,
const double redshift,
const bool store_output,
const std::string output_root,
const int norm,
const double k_min,
const double k_max,
const double aa,
const bool GSL,
const double prec,
const std::string file_par)
1512 if (gsl==
false && method_Pk==
"EisensteinHu") {
1518 if (Norm==-1) Norm = (m_sigma8>0) ? 1 : 0;
1520 if (method_Pk==
"MPTbreeze-v1") Norm = 0;
1523 double fact = (gsl) ? 1./(2.*pow(
par::pi,2)) : 1.;
1526 int limit_size = 1000;
1527 gsl_integration_workspace *ww = gsl_integration_workspace_alloc(limit_size);
1532 if (method_Pk==
"EisensteinHu") {
1534 if (m_sigma8<0)
ErrorCBL(
"sigma8<0!",
"xi_matter",
"PkXi.cpp");
1535 if (NL==1)
WarningMsgCBL(
"the correlation function by Eisenstein&Hu is linear (see xi_matter of PkXi.cpp)!",
"xi_matter",
"PkXi.cpp");
1537 glob::STR_xi_EH str;
1538 str.Omega_matter = m_Omega_matter;
1539 str.Omega_baryon = m_Omega_baryon;
1540 str.Omega_neutrinos = m_Omega_neutrinos;
1541 str.massless_neutrinos = m_massless_neutrinos;
1542 str.massive_neutrinos = m_massive_neutrinos;
1543 str.Omega_DE = m_Omega_DE;
1544 str.Omega_radiation = m_Omega_radiation;
1546 str.scalar_amp = m_scalar_amp;
1547 str.scalar_pivot = m_scalar_pivot;
1548 str.n_spec = m_n_spec;
1552 str.type_NG = m_type_NG;
1554 str.model = m_model;
1558 str.redshift = redshift;
1559 str.method_Pk = method_Pk;
1561 Func.function = &glob::func_xi_EH_GSL;
1563 gsl_integration_qag(&Func, k_min, k_max, 0., prec, limit_size, 6, ww, &Int, &error);
1566 else if (method_Pk==
"CAMB" || method_Pk==
"MGCAMB" || method_Pk==
"MPTbreeze-v1" || method_Pk==
"CLASS") {
1567 vector<double> lgkk, lgPk;
1568 Table_PkCodes(method_Pk, NL, lgkk, lgPk, redshift, store_output, output_root, k_max, file_par);
1576 Func.function = &glob::func_xi_GSL;
1578 gsl_integration_qag(&Func, k_min, k_max, 0., prec, limit_size, 5, ww, &Int, &error);
1581 else ErrorCBL(
"method_Pk is wrong!",
"xi_matter",
"PkXi.cpp");
1583 gsl_integration_workspace_free(ww);
1588 if (method_Pk==
"CAMB" || method_Pk==
"MGCAMB" || method_Pk==
"MPTbreeze-v1" || method_Pk==
"CLASS") {
1589 vector<double> r, xi;
1590 Table_XiCodes(method_Pk, NL, r, xi, redshift, store_output, output_root, k_max, file_par);
1594 else ErrorCBL(
"method_Pk is wrong!",
"xi_matter",
"PkXi.cpp");
1599 if (Norm==1) Pk_0(method_Pk, redshift, store_output, output_root, k_min, k_max, prec, file_par);
1602 if (method_Pk==
"EisensteinHu") PP0 = m_Pk0_EH;
1603 if (method_Pk==
"CAMB" || method_Pk==
"MGCAMB") PP0 = m_Pk0_CAMB;
1604 if (method_Pk==
"MPTbreeze-v1") PP0 = m_Pk0_MPTbreeze;
1605 if (method_Pk==
"CLASS") PP0 = m_Pk0_CLASS;
1607 return PP0*fact*Int;
1614 double cbl::cosmology::Cosmology::wp_DM (
const double rp,
const std::string method_Pk,
const bool NL,
const double redshift,
const double pimax,
const bool store_output,
const std::string output_root,
const int norm,
const double r_min,
const double r_max,
const double k_min,
const double k_max,
const double aa,
const bool GSL,
const double prec,
const std::string file_par)
1617 if (Norm==-1) Norm = (m_sigma8>0) ? 1 : 0;
1619 if (method_Pk==
"MPTbreeze-v1") Norm = 0;
1620 if (method_Pk==
"MPTbreeze-v1" && NL==0)
ErrorCBL(
"MPTbreeze is non-linear!",
"wp_DM",
"PkXi.cpp");
1624 string mDir = (GSL==0) ?
"fftlog" :
"GSL";
1627 string dir_grid = path.
DirCosmo()+
"/Cosmology/Tables/"+mDir+
"/"+method_Pk+
"/h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6)+
"/";
1631 string file_table = (NL) ? dir_grid+
"xiDM_NL.dat" : dir_grid+
"xiDM_Lin.dat";
1633 fin.open(file_table.c_str());
1636 vector<double> rr, Xi;
1639 while (fin >> RR >> XI) {
1645 coutCBL <<
"I'm writing the file: "<<file_table<<endl;
1647 string MK =
"mkdir -p "+dir_grid;
if (system(MK.c_str())) {}
1648 ofstream fout(file_table.c_str());
checkIO(fout, file_table);
1654 while (index<
int(rad.size())) {
1656 XI = xi_matter(rad[index], method_Pk, NL, redshift, store_output, output_root, 0, k_min, k_max, aa, GSL, prec, file_par);
1657 fout << RR <<
" " << XI << endl;
1658 coutCBL <<
"xi(" << RR <<
") = " << XI << endl;
1663 fout.clear(); fout.close();
coutCBL <<
"I wrote the file: "<<file_table<<endl;
1666 fin.clear(); fin.close();
1668 double rmax_integral = sqrt(rp*rp+pimax*pimax);
1669 double Int =
wp(rp, rr, Xi, rmax_integral);
1671 if (Norm==1) Pk_0(method_Pk, redshift, store_output, output_root, k_min, k_max, prec, file_par);
1674 if (method_Pk==
"EisensteinHu") PP0 = m_Pk0_EH;
1675 if (method_Pk==
"CAMB" || method_Pk==
"MGCAMB") PP0 = m_Pk0_CAMB;
1676 if (method_Pk==
"MPTbreeze-v1") PP0 = m_Pk0_MPTbreeze;
1677 if (method_Pk==
"CLASS") PP0 = m_Pk0_CLASS;
1686 double cbl::cosmology::Cosmology::sigmaR_DM (
const double RR,
const int corrType,
const std::string method_Pk,
const double redshift,
const double pimax,
const bool store_output,
const std::string output_root,
const bool NL,
const int norm,
const double r_min,
const double r_max,
const double k_min,
const double k_max,
const double aa,
const bool GSL,
const double prec,
const std::string file_par)
1690 string mDir =
"GSL";
1693 string dir_grid = path.
DirCosmo()+
"/Cosmology/Tables/"+mDir+
"/"+method_Pk+
"/h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6)+
"/";
1697 string file_table = (corrType==1) ? dir_grid+
"xi_matter.dat" : dir_grid+
"wp_DM.dat";
1699 fin.open(file_table.c_str());
1702 vector<double> rr, Xi;
1705 while (fin>>RRR>>XI) {
1712 coutCBL <<
"I'm writing the file: "<<file_table<<endl;
1714 string MK =
"mkdir -p "+dir_grid;
if (system(MK.c_str())) {}
1715 ofstream fout(file_table.c_str());
checkIO(fout, file_table);
1721 while (index<
int(rad.size())) {
1723 XI = (corrType==1) ? xi_matter(rad[index], method_Pk, NL, redshift, store_output, output_root, norm, k_min, k_max, aa, GSL, prec, file_par) : wp_DM(rad[index], method_Pk, NL, redshift, pimax, store_output, output_root, norm, r_min, r_max, k_min, k_max, aa, GSL, prec, file_par);
1724 fout <<RRR<<
" "<<XI<<endl;
1725 coutCBL <<
"xi("<<RRR<<
") = "<<XI<<endl;
1730 fout.clear(); fout.close();
coutCBL <<
"I wrote the file: "<<file_table<<endl;
1733 fin.clear(); fin.close();
1735 return sigmaR(RR, corrType, rr, Xi);
1743 double cbl::glob::func_sigma2M_EH_GSL (
double kk,
void *params)
1745 struct glob::STR_sigma2M_EH *pp = (
struct glob::STR_sigma2M_EH *) params;
1747 Cosmology cosm(pp->Omega_matter, pp->Omega_baryon, pp->Omega_neutrinos, pp->massless_neutrinos, pp->massive_neutrinos, pp->Omega_DE, pp->Omega_radiation, pp->hh, pp->scalar_amp, pp->scalar_pivot, pp->n_spec, pp->w0, pp->wa, pp->fNL, pp->type_NG, pp->tau, pp->model, pp->unit);
1749 double RHO = cosm.rho_m(0.,
true);
1750 double rr =
Radius(pp->mass,RHO);
1754 eh.
TFmdm_set_cosm(pp->Omega_matter, pp->Omega_baryon, pp->Omega_neutrinos, pp->massive_neutrinos, pp->Omega_DE, pp->hh, pp->redshift, pp->scalar_amp, pp->scalar_pivot, pp->n_spec);
1764 double cbl::cosmology::Cosmology::sigma8_Pk (
const std::string method_Pk,
const double redshift,
const bool store_output,
const std::string output_root,
const bool NL,
const double k_min,
const double k_max,
const double prec,
const std::string file_par)
const
1766 if (NL)
WarningMsgCBL(
"sigma8 is defined for the linear P(k)!",
"sigma8_Pk",
"PkXi.cpp");
1768 if (m_sigma8>0)
return m_sigma8*DN(redshift);
1772 const double RR = 8.;
1773 const double RHO = rho_m(0.,
true);
1774 const double MM =
Mass(RR, RHO);
1775 double Int = -1., error = -1.;
1777 const int limit_size = 1000;
1778 gsl_integration_workspace *ww = gsl_integration_workspace_alloc(limit_size);
1781 if (method_Pk==
"EisensteinHu") {
1785 eh.
TFmdm_set_cosm(m_Omega_matter, m_Omega_baryon, m_Omega_neutrinos, m_massive_neutrinos, m_Omega_DE, m_hh, redshift, m_scalar_amp, m_scalar_pivot, m_n_spec);
1787 auto func = [&] (
double kk)
1796 else if (method_Pk==
"CAMB" || method_Pk==
"MPTbreeze-v1" || method_Pk==
"CLASS") {
1797 vector<double> lgkk, lgPk;
1798 Table_PkCodes(method_Pk, NL, lgkk, lgPk, redshift, store_output, output_root, k_max, file_par);
1803 str.n_spec = m_n_spec;
1809 Func.function = &glob::func_SSM_GSL;
1811 gsl_integration_qag(&Func, k_min, k_max, 0., prec, limit_size, 6, ww, &Int, &error);
1814 else ErrorCBL(
"method_Pk is wrong!",
"sigma8_Pk",
"PkXi.cpp");
1816 gsl_integration_workspace_free(ww);
1826 double cbl::cosmology::Cosmology::Sn_PT (
const int nn,
const double RR,
const std::string method_SS,
const bool store_output,
const std::string output_root,
const std::string interpType,
const double k_max,
const std::string input_file,
const bool is_parameter_file)
const
1830 double redshift = 0.;
1832 double gamma1 = 1., gamma2 = -1., gamma3 = -1., d2S = -1., d3S = -1., Sn = 1.;
1834 double RHO = rho_m(0.,
true);
1835 double MASS =
Mass(RR,RHO);
1836 double SSS = sigma2M(MASS, method_SS, redshift, store_output, output_root, interpType, k_max, input_file, is_parameter_file);
1838 gamma1 = RR/SSS*dnsigma2R(1, RR, method_SS, redshift, store_output, output_root, interpType, k_max, input_file, is_parameter_file);
1841 d2S = dnsigma2R(2, RR, method_SS, redshift, store_output, output_root, interpType, k_max, input_file, is_parameter_file);
1842 gamma2 = gamma1+pow(RR, 2)/SSS*d2S;
1846 d3S = dnsigma2R(3, RR, method_SS, redshift, store_output, output_root, interpType, k_max, input_file, is_parameter_file);
1847 gamma3 = gamma2+pow(RR, 2)/SSS*(2.*d2S+RR*d3S);
1850 if (nn==3) Sn = 34./7.+gamma1;
1851 if (nn==4) Sn = 60712./1323.+62./3.*gamma1+7./3.*pow(gamma1, 2)+2./3.*gamma2;
1852 if (nn==5) Sn = 200575880./305613.+1847200./3969.*gamma1+6940./63.*pow(gamma1, 2)+235./27.*pow(gamma1, 3)+1490./63.*gamma2+50./9.*gamma1*gamma2+10./27.*gamma3;
1861 double cbl::cosmology::Cosmology::Sigman_PT (
const int nn,
const double RR,
const std::string method_SS,
const bool store_output,
const std::string output_root,
const std::string interpType,
const double k_max,
const std::string input_file,
const bool is_parameter_file)
const
1865 double redshift = 0.;
1867 double RHO = rho_m(redshift,
true);
1868 double MASS =
Mass(RR, RHO);
1869 double SSS = sigma2M(MASS, method_SS, redshift, store_output, output_root, interpType, k_max, input_file, is_parameter_file);
1871 double gamma1 = RR/SSS*dnsigma2R(1, RR, method_SS, redshift, store_output, output_root, interpType, k_max, input_file, is_parameter_file);
1875 if (nn==3) Sn = 36./7.+3./2.*(gamma1+1.);
1876 if (nn==4) Sn = 2540./49.+33.*(gamma1+1.)+21./4.*pow(gamma1+1.,2);
1877 if (nn==5) Sn = 793.+794.*(gamma1+1.)+265.*pow(gamma1+1.,2)+29.4*pow(gamma1+1.,3);
1886 double cbl::cosmology::Cosmology::k_star (
const std::string method_Pk,
const double redshift,
const bool store_output,
const std::string output_root,
const double k_max,
const std::string file_par)
const
1888 if (method_Pk==
"EisensteinHu")
ErrorCBL(
"",
"k_star",
"PkXi.cpp", glob::ExitCode::_workInProgress_);
1890 vector<double> lgkk, lgPk;
1891 bool do_nonlinear = 0;
1892 Table_PkCodes(method_Pk, do_nonlinear, lgkk, lgPk, redshift, store_output, output_root, k_max, file_par);
1894 classfunc::func_kstar func (m_hh, m_unit, lgkk, lgPk);
1896 function<double(
double)> ff = bind(&classfunc::func_kstar::operator(), func, std::placeholders::_1);
1900 double Int = Int1+Int2;
1909 void cbl::cosmology::Cosmology::get_xi (std::vector<double> &rr, std::vector<double> &Xi,
const std::string method_Pk,
const double redshift,
const bool store_output,
const std::string output_root,
const bool xiType,
const double k_star,
const bool xiNL,
const int norm,
const double r_min,
const double r_max,
const double k_min,
const double k_max,
const double aa,
const bool GSL,
const double prec,
const std::string file_par)
1912 if (Norm==-1) Norm = (m_sigma8>0) ? 1 : 0;
1914 if (method_Pk==
"MPTbreeze-v1") Norm = 0;
1917 if (XiNL && method_Pk==
"EisensteinHu")
1918 {
WarningMsgCBL(
"The P(k) of EisensteinHu is linear! --> XiNL = 0",
"get_xi",
"PkXi.cpp"); XiNL = 0; }
1925 string mDir =
"GSL";
1926 string nDir = (xiType==0) ? method_Pk :
"CWmodel";
1929 string dir_cosmo = path.
DirCosmo();
1931 string dir_grid = dir_cosmo+
"/Cosmology/Tables/"+mDir+
"/"+nDir+
"/h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6)+
"/";
1935 string file_table = (XiNL) ? dir_grid+
"xi_matter.dat": dir_grid+
"xi_matter_lin.dat";
1939 ifstream fin (file_table.c_str());
1944 while (fin >>RR>>XI) {
1948 fin.clear(); fin.close();
1953 string MK =
"mkdir -p "+dir_grid;
if (system(MK.c_str())) {}
1954 ofstream fout(file_table.c_str());
checkIO(fout, file_table);
1960 while (index<
int(rad.size())) {
1962 XI = (xiType==0) ? xi_matter(rad[index], method_Pk, XiNL, redshift, store_output, output_root, Norm, k_min, k_max, aa, GSL, prec, file_par) :
1963 xi_star(rad[index], redshift, store_output, output_root, k_star, k_max, k_max, prec, file_par);
1965 fout <<RR<<
" "<<XI<<endl;
1966 coutCBL <<
"xi("<<RR<<
") = "<<XI<<endl;
1972 fout.clear(); fout.close();
coutCBL <<
"I wrote the file: "<<file_table<<endl;
1981 void cbl::cosmology::Cosmology::get_barred_xi (std::vector<double> rr, std::vector<double> Xi, std::vector<double> &Xi_, std::vector<double> &Xi__,
const std::string method_Pk,
const double redshift,
const bool xiType,
const double k_star,
const bool xiNL,
const int norm,
const double r_min,
const double r_max,
const double k_min,
const double k_max,
const double aa,
const double prec,
const std::string file_par)
const
1983 (void)k_star; (void)k_min; (void)k_max; (void)aa; (void)prec; (void)file_par;
1986 if (Norm==-1) Norm = (m_sigma8>0) ? 1 : 0;
1988 if (method_Pk==
"MPTbreeze-v1") Norm = 0;
1991 if (XiNL && method_Pk==
"EisensteinHu")
1992 {
WarningMsgCBL(
"The P(k) of EisensteinHu is linear! --> XiNL = 0",
"get_barred_xi",
"PkXi.cpp"); XiNL = 0;}
1999 string mDir =
"GSL";
2000 string nDir = (xiType==0) ? method_Pk :
"CWmodel";
2003 string dir_cosmo = path.
DirCosmo();
2005 string dir_grid = dir_cosmo+
"/Cosmology/Tables/"+mDir+
"/"+nDir+
"/h"+
conv(m_hh,
par::fDP6)+
"_OmB"+
conv(m_Omega_baryon,
par::fDP6)+
"_OmCDM"+
conv(m_Omega_CDM,
par::fDP6)+
"_OmL"+
conv(m_Omega_DE,
par::fDP6)+
"_OmN"+
conv(m_Omega_neutrinos,
par::fDP6)+
"_Z"+
conv(redshift,
par::fDP6)+
"_scalar_amp"+
conv(m_scalar_amp,
par::ee3)+
"_scalar_pivot"+
conv(m_scalar_pivot,
par::fDP6)+
"_n"+
conv(m_n_spec,
par::fDP6)+
"_w0"+
conv(m_w0,
par::fDP6)+
"_wa"+
conv(m_wa,
par::fDP6);
2007 string file_table = (XiNL) ? dir_grid+
"xi_matter.dat": dir_grid+
"xi_matter_lin.dat";
2009 ifstream fin(file_table.c_str());
2011 string file_tableb = (XiNL) ? dir_grid+
"xibarred_DM.dat": dir_grid+
"xibarred_DM_lin.dat";
2013 ifstream finb (file_tableb.c_str());
2015 double RR, XI_, XI__;
2017 bool DO = (rr.size()==0) ? 1 : 0;
2020 while (finb >>RR>>XI_>>XI__) {
2021 if (DO) rr.push_back(RR);
2023 Xi__.push_back(XI__);
2025 finb.clear(); finb.close();
2029 coutCBL <<
"I'm writing the file: "<<file_tableb<<endl;
2031 string MK =
"mkdir -p "+dir_grid;
if (system(MK.c_str())) {}
2032 ofstream foutb(file_tableb.c_str());
checkIO(foutb, file_tableb);
2043 while (index<
int(rad.size())) {
2047 foutb <<rad[index]<<
" "<<XI_<<
" "<<XI__<<endl;
2048 coutCBL <<
"r = "<<rad[index]<<
" --> xi_ = "<<XI_<<
", xi__ = "<<XI__<<endl;
2051 Xi__.push_back(XI__);
2055 foutb.clear(); foutb.close();
coutCBL <<
"I wrote the file: "<<file_tableb<<endl;
2065 vector<double> PkNW(kk.size());
2066 vector<double> OF(kk.size());
2068 for (
size_t i=0; i<kk.size(); i++)
2069 OF[i] = PkLin[i]/PkApprox[i];
2075 if (kind==
"gaussian_3d")
2077 double norm = sqrt(2/
par::pi)/lambda*log(10.);
2078 for (
size_t i=0; i<kk.size(); i++)
2080 auto integrand = [&] (
const double log_q) {
2081 double qq = pow(10, log_q);
2082 double x = qq*kk[i]/(lambda*lambda);
2083 double fact = -(qq*qq+kk[i]*kk[i])/(2*lambda*lambda)+gsl_sf_lnsinh(x)-log(kk[i]*qq)+3*log(qq)+log(interp_OF(qq));
2084 return gsl_sf_exp(fact);
2090 else if (kind==
"gaussian_1d")
2092 double norm = 1./(sqrt(2*
par::pi)*lambda);
2093 for (
size_t i=0; i<kk.size(); i++)
2095 double log_k = log10(kk[i]);
2097 double log_qmin = log_k-4*lambda;
2098 double log_qmax = log_k+4*lambda;
2100 auto integrand = [&] (
const double log_q) {
2101 return interp_OF(pow(10., log_q))*exp(-pow(log_k-log_q, 2)/(2*lambda*lambda));
2108 ErrorCBL(
"wrong name for gaussian wiggles smoothing!",
"Pk_matter_NoWiggles_gaussian",
"PkXi.cpp", glob::ExitCode::_error_);
2119 vector<double> log_kk(kk.size());
2120 vector<double> PkNW(kk.size());
2121 vector<double> OF(kk.size());
2123 for (
size_t i=0; i<kk.size(); i++) {
2124 log_kk[i] = log10(kk[i]);
2125 OF[i] = PkLin[i]/PkApprox[i];
2129 glob::FuncGrid_Bspline bspline(log_kk, OF, nknots, order);
2130 vector<double> interp = bspline.eval_func(log_kk);
2131 for (
size_t i=0; i<kk.size(); i++)
2132 PkNW[i] = interp[i]*PkApprox[i];
2141 vector<double>
cbl::cosmology::Cosmology::Pk_matter_NoWiggles (
const string method,
const vector<double> kk,
const double redshift,
const string linear_method,
const int order,
const int nknots,
const double lambda,
const bool store_output,
const std::string output_root,
const bool norm,
const double prec)
2143 vector<double> PkNW;
2144 if (method ==
"EisensteinHu") {
2145 PkNW = Pk_matter(kk,
"EisensteinHu",
false, redshift, store_output, output_root, norm, 1.e-4, 100., prec);
2147 else if (method ==
"bspline" or method==
"gaussian_1d" or method==
"gaussian_3d"){
2148 vector<double> PkLin = Pk_matter(kk, linear_method,
false, redshift, store_output, output_root, norm, 1.e-4, 100., prec);
2149 vector<double> PkApprox = Pk_matter(kk,
"EisensteinHu",
false, redshift, store_output, output_root, norm, 1.e-4, 100., prec);
2151 if (method ==
"bspline") {
2152 PkNW = Pk_matter_NoWiggles_bspline(kk, PkLin, PkApprox, order, nknots);
2154 else if (method ==
"gaussian_3d" or method ==
"gaussian_1d") {
2155 PkNW = Pk_matter_NoWiggles_gaussian(kk, PkLin, PkApprox, lambda, method);
2163 double interp_integral = interp_nw.
integrate_qag(1.e-5, 1.e3);
2165 for (
size_t i=0; i<kk.size(); i++)
2166 PkNW[i] = PkNW[i]*integral/interp_integral;
2169 ErrorCBL(
"wrong name for pk no wiggles!",
"Pk_NoWiggles",
"PkXi.cpp", glob::ExitCode::_error_);
2181 if (method==
"CAMB" or method==
"CLASS")
2182 pk = Pk_matter(kk, method,
false, redshift, store_output, output_root, norm, 1.e-4, 100., prec);
2184 ErrorCBL(
"wrong name for linear!",
"Pk_matter_Linear",
"PkXi.cpp", glob::ExitCode::_error_);
2193 vector<double>
cbl::cosmology::Cosmology::Pk_matter_DeWiggled (
const string linear_method,
const string nowiggles_method,
const vector<double> kk,
const double redshift,
const double sigma_NL,
const int order,
const int nknots,
const double lambda,
const bool store_output,
const std::string output_root,
const bool norm,
const double prec)
2195 vector<double> PkLin = Pk_matter_Linear(linear_method, kk, redshift, store_output, output_root, norm, prec);
2196 vector<double> PkNW = Pk_matter_NoWiggles(nowiggles_method, kk, redshift, linear_method, order, nknots, lambda, store_output, output_root, norm, prec);
2197 vector<double> PkDW(kk.size(), 0);
2199 for (
size_t i=0; i<kk.size(); i++)
2200 PkDW[i] = PkNW[i]+exp(0.5*pow(kk[i]*sigma_NL, 2))*(PkLin[i]-PkNW[i]);
2209 double cbl::cosmology::Cosmology::xi_matter_DeWiggle (
const double rr,
const double redshift,
const double sigma_NL,
const bool store_output,
const std::string output_root,
const bool norm,
const double k_min,
const double k_max,
const double aa,
const double prec)
2213 string author1 =
"CAMB";
2214 string author2 =
"EisensteinHu";
2216 vector<double> kk, PkCamb, PkM, PkEH;
2217 Table_PkCodes(author1, NL, kk, PkCamb, redshift, store_output, output_root, k_max);
2219 for (
size_t i = 0; i<kk.size(); i++)
2220 kk[i] = pow(10,kk[i]);
2222 PkCamb = Pk_matter(kk, author1, NL, redshift, store_output, output_root, norm, k_min, k_max, prec);
2223 PkEH = Pk_matter(kk, author2, NL, redshift, store_output, output_root, norm, k_min, k_max, prec);
2225 for (
size_t i = 0; i<kk.size(); i++)
2226 PkM.push_back(PkEH[i]*(1+(PkCamb[i]/PkEH[i]-1)*exp(-0.5*pow(kk[i]*sigma_NL, 2))));
2228 return xi_from_Pk(rr, kk, PkM, k_min, k_max, aa, prec);
2235 std::vector<std::vector<double> >
cbl::cosmology::Cosmology::XiMonopole_covariance (
const int nbins,
const double rMin,
const double rMax,
const double nn,
const double Volume,
const std::vector<double> kk,
const std::vector<double> Pk0,
const int IntegrationMethod)
2237 int nbins_k = kk.size();
2239 vector<vector<double>> covariance(nbins,vector<double>(nbins,0));
2240 double dr=r[1]-r[0];
2242 vector<vector<double>> sigma2 =
cbl::sigma2_k(nn, Volume,kk,{Pk0},{0});
2243 vector<vector<double>> jr(nbins,vector<double>(nbins_k,0));
2245 for (
size_t j=0; j<r.size(); j++) {
2246 for (
size_t i=0; i<kk.size(); i++) {
2251 if (IntegrationMethod==0)
2253 vector<double> integrand(kk.size(),0);
2255 for (
int i=0; i<nbins; i++) {
2256 for (
int j=i; j<nbins; j++) {
2257 for (
int ii=0; ii<nbins_k; ii++) {
2258 integrand[ii] =kk[ii]*kk[ii]*sigma2[0][ii]*jr[i][ii]*jr[j][ii];
2264 covariance[i][j] = Int;
2265 covariance[j][i] = Int;
2269 else if (IntegrationMethod==1)
2271 glob::STR_covariance_XiMultipoles_integrand params;
2272 int limit_size = 1000;
2276 Func.params = ¶ms;
2279 double k_max = 1.e0;
2280 double prec = 1.e-2;
2285 for (
int i=0; i<nbins; i++) {
2287 for (
int j=i; j<nbins; j++) {
2289 params.jl1r1 = &jl1r1;
2290 params.jl2r2 = &jl2r2;
2294 covariance[i][j] = Int;
2295 covariance[j][i] = Int;
2311 std::vector<std::vector<double> >
cbl::cosmology::Cosmology::XiMultipoles_covariance (
const int nbins,
const double rMin,
const double rMax,
const double nn,
const double Volume,
const std::vector<double> kk,
const std::vector<double> Pk0,
const std::vector<double> Pk2,
const std::vector<double> Pk4,
const int IntegrationMethod)
2314 int nbins_k = kk.size();
2316 vector<vector<double>> covariance(n_leg*nbins, vector<double>(n_leg*nbins, 0));
2318 vector<vector<double>> sigma2 =
sigma2_k(nn, Volume, kk, {Pk0, Pk2, Pk4}, {0,2,4});
2319 double dr = r[1]-r[0];
2321 vector<vector<vector<double> >> jr(n_leg, vector<vector<double>>(nbins, vector<double>(nbins_k, 0)));
2323 for (
int ll=0; ll<n_leg; ll++)
2324 for (
size_t j=0; j<r.size(); j++)
2325 for (
size_t i=0; i<kk.size(); i++)
2328 if (IntegrationMethod==0) {
2330 vector<double> integrand(kk.size(), 0);
2332 for (
int l1=0; l1<n_leg; l1++) {
2333 for (
int l2=l1; l2<n_leg; l2++) {
2334 int index = l2+n_leg*l1;
2335 for (
int i=0; i<nbins; i++) {
2336 for (
int j=i; j<nbins; j++) {
2337 for (
int ii=0; ii<nbins_k; ii++) {
2338 integrand[ii] = kk[ii]*kk[ii]*sigma2[index][ii]*jr[l1][i][ii]*jr[l2][j][ii];
2344 covariance[i+nbins*l1][j+nbins*l2] = Int;
2345 covariance[j+nbins*l1][i+nbins*l2] = Int;
2346 covariance[i+nbins*l2][j+nbins*l1] = Int;
2347 covariance[j+nbins*l2][i+nbins*l1] = Int;
2355 else if (IntegrationMethod==1)
2357 glob::STR_covariance_XiMultipoles_integrand params;
2358 int limit_size = 1000;
2362 Func.params = ¶ms;
2364 double k_min = 1.e-4;
2365 double k_max = 1.e0;
2366 double prec = 1.e-2;
2368 for (
int l1=0; l1<n_leg; l1++) {
2369 for (
int l2=l1; l2<n_leg; l2++) {
2370 int index = l2+n_leg*l1;
2374 for (
int i=0; i<nbins; i++) {
2376 for (
int j=i; j<nbins; j++) {
2378 params.jl1r1 = &jl1r1;
2379 params.jl2r2 = &jl2r2;
2383 covariance[i+nbins*l1][j+nbins*l2] = Int;
2384 covariance[j+nbins*l1][i+nbins*l2] = Int;
2385 covariance[i+nbins*l2][j+nbins*l1] = Int;
2386 covariance[j+nbins*l2][i+nbins*l1] = Int;
2403 std::vector<std::vector<double> >
cbl::cosmology::Cosmology::XiMultipoles (
const int nbins,
const double rMin,
const double rMax,
const std::vector<double> kk,
const std::vector<double> Pk0,
const std::vector<double> Pk2,
const std::vector<double> Pk4,
const int IntegrationMethod)
2405 int nbins_k = kk.size();
2409 vector<double> xi0(nbins,0), xi2(nbins,0), xi4(nbins,0);
2411 vector<vector<double> > j0_vec(nbins,vector<double>(nbins_k,0)), j2_vec(nbins,vector<double>(nbins_k,0)), j4_vec(nbins,vector<double>(nbins_k,0));
2413 for (
size_t i=0; i<r.size(); i++) {
2414 for (
size_t j=0; j<kk.size(); j++) {
2415 double xx = kk[j]*r[i];
2416 j0_vec[i][j] =
j0(xx);
2417 j2_vec[i][j] =
j2(xx);
2418 j4_vec[i][j] =
j4(xx);
2422 if (IntegrationMethod==0) {
2424 for (
int i=0; i<nbins; i++) {
2426 vector<double> i0(kk.size(),0), i2(kk.size(),0), i4(kk.size(),0);
2428 for (
int j=0; j<nbins_k; j++) {
2429 double xx = kk[j]*r[i];
2430 i0[j] =kk[j]*kk[j]*Pk0[j]*
j0(xx);
2431 i2[j] =kk[j]*kk[j]*Pk2[j]*
j2(xx);
2432 i4[j] =kk[j]*kk[j]*Pk4[j]*
j4(xx);
2442 else if (IntegrationMethod==1) {
2444 glob::STR_XiMultipoles_integrand params;
2445 int limit_size = 1000;
2449 Func.params = ¶ms;
2451 double k_min = 1.e-4;
2452 double k_max = 1.e0;
2453 double prec = 1.e-3;
2459 for (
int i=0; i<nbins; i++) {
2462 params.Pkl = &Pk0_interp;
2465 params.cut_pow = 2.;
2469 params.Pkl = &Pk2_interp;
2471 params.k_cut = 0.58;
2472 params.cut_pow = 4.;
2475 params.Pkl = &Pk4_interp;
2478 params.cut_pow = 2.;
2488 return {xi0, xi2, xi4};
2495 double cbl::cosmology::Cosmology::wtheta_DM (
const double theta,
const std::vector<double> zz,
const std::vector<double> phiz,
const std::string interpolationType,
const CoordinateUnits coordUnits,
const bool GSL,
const std::string method_Pk,
const bool NL,
const bool store_output,
const std::string output_root,
const int norm,
const double k_min,
const double k_max,
const double prec,
const std::string file_par)
2498 ErrorCBL(
"non linearities in angular correlation function not yet implemented!",
"wtheta_DM",
"PkXi.cpp", glob::ExitCode::_workInProgress_);
2500 double theta_rad =
converted_angle (theta, coordUnits, CoordinateUnits::_radians_);
2508 for(
size_t i=0; i<_zz.size(); i++)
2509 dc.push_back(this->D_C(_zz[i]));
2512 glob::Distribution phi(glob::DistributionType::_Interpolated_, zz, phiz, 0, interpolationType);
2514 double zmin, zmax, zmean;
2519 Pk = this->Pk_matter(kk, method_Pk, NL, zmean, store_output, output_root, norm, k_min, k_max, prec, file_par);
2521 vector<double> r, xi;
2526 auto integrand = [&] (
double z1)
2528 double r1 = DC_interp(z1);
2530 auto integrand_z2 = [&] (
double z2) {
2531 double r2 = DC_interp(z2);
2532 double ss = sqrt(pow(r1,2)+pow(r2,2)-2*r1*r2*cos(theta_rad));
2533 return xi_interp(ss)*phi(z2);
2541 auto integrand = [&] (vector<double> zz)
2543 double r1 = DC_interp(zz[0]);
2544 double r2 = DC_interp(zz[1]);
2545 double ss = sqrt(pow(r1,2)+pow(r2,2)-2*r1*r2*cos(theta_rad));
2546 return xi_interp(ss)*phi(zz[0])*phi(zz[1]);
2559 double cbl::cosmology::Cosmology::wtheta_DM (
const double theta,
const std::vector<double> kk,
const std::vector<double> Pk,
const std::vector<double> zz,
const std::vector<double> nz,
const std::vector<double> phiz,
const std::string interpolationType,
const CoordinateUnits coordUnits,
const bool GSL,
const double redshift_Pk)
2561 const double theta_rad =
converted_angle (theta, coordUnits, CoordinateUnits::_radians_);
2563 const double zmin =
Min(zz);
2564 const double zmax =
Max(zz);
2569 vector<double> nphi(zz.size(), 0);
2571 for(
size_t i=0; i<nphi.size(); i++)
2572 nphi[i] = (phiz.size()!=0) ? phiz[i]*nz[i] : nz[i];
2574 glob::Distribution phi(glob::DistributionType::_Interpolated_, zz, nphi, 0, interpolationType);
2580 auto normalization_integrand = [&] (
const double redshift)
2582 return phi(redshift)*this->dV_dZdOmega(redshift, 1);
2590 vector<double> r, xi;
2596 auto integrand = [&] (
double z1)
2598 double r1 = this->D_C(z1);
2600 auto integrand_z2 = [&] (
double z2) {
2601 double DD = this->DN((zz[0]+zz[1])*0.5, redshift_Pk);
2602 double r2 = this->D_C(z2);
2603 double ss = sqrt(pow(r1,2)+pow(r2,2)-2*r1*r2*cos(theta_rad));
2604 return DD*DD*xi_interp(ss)*normalization_integrand(z2);
2615 auto integrand = [&] (vector<double> zz)
2617 double DD = this->DN((zz[0]+zz[1])*0.5, redshift_Pk);
2618 double r1 = this->D_C(zz[0]);
2619 double r2 = this->D_C(zz[1]);
2620 double ss = sqrt(pow(r1,2)+pow(r2,2)-2*r1*r2*cos(theta_rad));
2621 return DD*DD*xi_interp(ss)*normalization_integrand(zz[0])*normalization_integrand(zz[1]);
2626 integral = integrator.
IntegrateCuhre( {{zmin, zmax}, {zmin, zmax}});
2629 return integral/normalization;
2636 std::vector<double>
cbl::cosmology::Cosmology::C_l_DM (
const int lmax,
const std::vector<double> zz,
const std::vector<double> phiz,
const std::string interpolationMethod,
const std::string method_Pk,
const bool store_output,
const std::string output_root,
const int norm,
const double k_min,
const double k_max,
const double prec,
const std::string file_par)
2638 const double zmin =
Min(zz);
2639 const double zmax =
Max(zz);
2643 vector<double> Pk = this->Pk_matter(kk, method_Pk,
false, 0., store_output, output_root, norm, k_min, k_max, prec, file_par);
2646 auto integrand_sbao = [&] (
const double kk)
2648 return Pk_interp(kk);
2657 ErrorCBL(
"Check the normalization of D(z)",
"C_l_DM",
"PkXi.cpp", glob::ExitCode::_workInProgress_);
2659 for (
int l=0; l<lmax+1; l++) {
2663 auto integrand = [&] (
const double kk)
2665 auto integrand_z = [&] (
const double zz)
2667 return DN(zz)*
jl(kk*D_C(zz), l);
2671 return kk*kk*Pk_interp(kk)*pow(integral_z, 2)*exp(-kk*kk*sbao*sbao);
2678 auto integrand = [&] (
const double zz)
2680 double dc = D_C(zz);
2681 double kk = (l+0.5)/dc;
2682 return pow(DN(zz)*phi(zz), 2)*Pk_interp(kk)*HH(zz)/(
par::cc*dc*dc);
2687 C_l.push_back(integral);
Class used to handle functions interpolated using a basis spline http://mathworld....
#define coutCBL
CBL print message.
std::string DirCosmo()
get the directory where the CosmoBolognaLbi are stored
std::string fullpath(std::string path, const bool isDir=true)
substitute ~ with the full path
std::string DirLoc()
get the local directory
void Table_PkCodes(const std::string code, const bool NL, std::vector< double > &lgkk, std::vector< double > &lgPk, const double redshift, const bool store_output=true, const std::string output_root="test", const double k_max=100., const std::string file_par=par::defaultString) const
write or read the table where the dark matter power spectrum is stored
std::vector< double > Pk_matter_DeWiggled(const std::string linear_method, const std::string nowiggles_method, const std::vector< double > kk, const double redshift, const double sigma_NL, const int order=4, const int nknots=10, const double lambda=0.25, const bool store_output=true, const std::string output_root="test", const bool norm=1, const double prec=1.e-4)
the dark matter power spectrum, de-wiggled (see e.g. Anderson et al 2014)
std::vector< double > Pk_matter_NoWiggles(const std::string method, const std::vector< double > kk, const double redshift, const std::string linear_method="CAMB", const int order=4, const int nknots=10, const double lambda=0.25, const bool store_output=true, const std::string output_root="test", const bool norm=1, const double prec=1.e-4)
the dark matter power spectrum without BAO wiggles
void get_barred_xi(std::vector< double > rr, std::vector< double > Xi, std::vector< double > &Xi_, std::vector< double > &Xi__, const std::string method_Pk, const double redshift, const bool xiType=0, const double k_star=-1., const bool xiNL=0, const int norm=-1, const double r_min=0.1, const double r_max=150., const double k_min=0.001, const double k_max=100., const double aa=0., const double prec=1.e-2, const std::string file_par=par::defaultString) const
get the barred dark matter correlation functions
double wtheta_DM(const double theta, const std::vector< double > zz, const std::vector< double > phiz, const std::string interpolationMethod, const CoordinateUnits coordUnits=CoordinateUnits::_degrees_, const bool GSL=false, const std::string method_Pk="CAMB", const bool NL=false, const bool store_output=true, const std::string output_root="test", const int norm=-1, const double k_min=1.e-4, const double k_max=100, const double prec=1.e-2, const std::string file_par=par::defaultString)
the dark matter angular two-point correlation function
void get_xi(std::vector< double > &rr, std::vector< double > &Xi, const std::string method_Pk, const double redshift, const bool store_output=true, const std::string output_root="test", const bool xiType=0, const double k_star=-1., const bool xiNL=0, const int norm=-1, const double r_min=0.1, const double r_max=150., const double k_min=0.001, const double k_max=100., const double aa=0., const bool GSL=false, const double prec=1.e-2, const std::string file_par=par::defaultString)
get the dark matter two-point correlation function
std::vector< std::vector< double > > XiMonopole_covariance(const int nbins, const double rMin, const double rMax, const double nn, const double Volume, const std::vector< double > kk, const std::vector< double > Pk0, const int IntegrationMethod=1)
the covariance matrix of the first three non-null multipoles of the two-point correlation function
std::vector< double > C_l_DM(const int lmax, const std::vector< double > zz, const std::vector< double > phiz, const std::string interpolationMethod, const std::string method_Pk="CAMB", const bool store_output=true, const std::string output_root="test", const int norm=-1, const double k_min=1.e-4, const double k_max=100, const double prec=1.e-2, const std::string file_par=par::defaultString)
the dark matter angular linear power spectrum .
double wp_DM(const double rp, const std::string method_Pk, const bool NL, const double redshift, const double pimax, const bool store_output=true, const std::string output_root="test", const int norm=-1, const double r_min=1.e-3, const double r_max=350., const double k_min=0.001, const double k_max=100., const double aa=0., const bool GSL=false, const double prec=1.e-2, const std::string file_par=cbl::par::defaultString)
the dark matter projected correlation function
void remove_output_Pk_tables(const std::string code, const bool NL, const double redshift, const std::string output_root="test") const
remove the output generated by the methods CAMB, MPTbreeze or CLASS
void Table_XiCodes(const std::string code, const bool NL, std::vector< double > &rr, std::vector< double > &xi, const double redshift, const bool store_output, const std::string output_root, const double k_max, std::string file_par) const
write or read the table where the dark matter two-point correlation function is stored
double As(const double sigma8) const
amplitude of the curvature perturbations
std::vector< double > Pk_matter_NoWiggles_gaussian(const std::vector< double > kk, const std::vector< double > PkLin, const std::vector< double > PkApprox, const double lambda, const std::string method)
the dark matter power spectrum without BAO wiggles.
std::vector< double > Pk_matter(const std::vector< double > kk, const std::string method_Pk, const bool NL, const double redshift, const bool store_output=true, const std::string output_root="test", const int norm=-1, const double k_min=0.001, const double k_max=100., const double prec=1.e-2, const std::string file_par=par::defaultString, const bool unit1=false)
the dark matter power spectrum
double xi_matter(const double rr, const std::string method_Pk, const bool NL, const double redshift, const bool store_output=true, const std::string output_root="test", const int norm=-1, const double k_min=0.001, const double k_max=100., const double aa=0., const bool GSL=false, const double prec=1.e-2, const std::string file_par=par::defaultString)
the dark matter two-point correlation function
double xi_matter_DeWiggle(const double rr, const double redshift, const double sigma_NL, const bool store_output=true, const std::string output_root="test", const bool norm=1, const double k_min=0.001, const double k_max=100., const double aa=1., const double prec=1.e-2)
the dark matter two-point correlation function, de-wiggled (see e.g. Anderson et al 2014)
void m_Table_Pk_parameterFile(const std::string code, const std::string file_par, const bool NL, std::vector< double > &lgkk, std::vector< double > &lgPk, const double redshift, const std::string output_root="test") const
write and read the table where the dark matter power spectrum is stored; it is used when a parameter ...
void Pk_0(const std::string method_Pk, const double redshift, const bool store_output=true, const std::string output_root="test", const double k_min=0.001, const double k_max=100., const double prec=1.e-2, const std::string file_par=par::defaultString)
normalisation of the power spectrum
std::vector< std::vector< double > > XiMultipoles(const int nbins, const double rMin, const double rMax, const std::vector< double > kk, const std::vector< double > Pk0, const std::vector< double > Pk2, const std::vector< double > Pk4, const int IntegrationMethod=1)
the first three non-null multipoles of the two-point correlation function
double sigmaR_DM(const double RR, const int corrType, const std::string method_Pk, const double redshift, const double pimax=40, const bool store_output=true, const std::string output_root="test", const bool NL=1, const int norm=-1, const double r_min=1.e-3, const double r_max=350., const double k_min=0.001, const double k_max=100., const double aa=0., const bool GSL=false, const double prec=1.e-2, const std::string file_par=par::defaultString)
the dark matter rms mass fluctuation
std::vector< double > Pk_matter_Linear(const std::string method, const std::vector< double > kk, const double redshift, const bool store_output=true, const std::string output_root="test", const bool norm=1, const double prec=1.e-4)
the dark matter linear power spectrum.
double k_star(const std::string method_Pk, const double redshift, const bool store_output=true, const std::string output_root="test", const double k_max=100., const std::string file_par=par::defaultString) const
the k* parameter
double Sn_PT(const int nn, const double RR, const std::string method_SS, const bool store_output=true, const std::string output_root="test", const std::string interpType="Linear", const double k_max=100., const std::string input_file=par::defaultString, const bool is_parameter_file=true) const
the hierarchical moments Sn
std::string Pk_output_file(const std::string code, const bool NL, const double redshift, const bool run=0, const bool store_output=true, const std::string output_root="test", const double k_max=100., const std::string file_par=par::defaultString)
return the path to the power spectrum output
double Sigman_PT(const int nn, const double RR, const std::string method_SS, const bool store_output=true, const std::string output_root="test", const std::string interpType="Linear", const double k_max=100., const std::string input_file=par::defaultString, const bool is_parameter_file=true) const
the deprojected hierarchical moments Σn
void m_Table_Pk_CLASS(const bool NL, std::vector< double > &lgkk, std::vector< double > &lgPk, const double redshift, const bool store_output=true, const std::string output_root="test", const double k_max=100.) const
write and read the table where the dark matter power spectrum computed with CLASS is stored
void run_CAMB(const bool NL, const double redshift, const std::string output_root=par::defaultString, const std::string output_dir=par::defaultString, const double k_max=100., const std::string file_par=par::defaultString) const
run CAMB [http://camb.info/]
void m_Table_Pk_CAMB_MPTbreeze(const std::string code, const bool NL, std::vector< double > &lgkk, std::vector< double > &lgPk, const double redshift, const bool store_output=true, const std::string output_root="test", const double k_max=100.) const
write and read the table where the dark matter power spectrum, computed with either CAMB or MPTbreeze...
double sigma8_Pk(const std::string method_Pk, const double redshift, const bool store_output=true, const std::string output_root="test", const bool NL=0, const double k_min=0.001, const double k_max=100., const double prec=1.e-2, const std::string file_par=par::defaultString) const
the dark matter rms mass fluctuation within 8 Mpc/h
std::vector< double > Pk_matter_NoWiggles_bspline(const std::vector< double > kk, const std::vector< double > PkLin, const std::vector< double > PkApprox, const int order, const int nknots)
the dark matter power spectrum without BAO wiggles.
std::vector< std::vector< double > > XiMultipoles_covariance(const int nbins, const double rMin, const double rMax, const double nn, const double Volume, const std::vector< double > kk, const std::vector< double > Pk0, const std::vector< double > Pk2, const std::vector< double > Pk4, const int IntegrationMethod=1)
the covariance matrix of the first three non-null multipole moments of the two-point correlation func...
double sigma8_interpolated(const double redshift) const
σ8
double Pk(double kk)
get the power spectrum in unit of h^{-3}Mpc^{-3}
int TFmdm_set_cosm(double omega_matter, double omega_baryon, double omega_hdm, int degen_hdm, double omega_lambda, double hubble, double redshift, double As=2.56e-9, double k_pivot=0.05, double n_spec=0.96)
set the cosmological parameters
The class CombinedDistribution.
double mean()
return the mean value of the distribution
void free()
free the GSL objects
std::vector< double > eval_func(const std::vector< double > xx) const
evaluate the function at the xx points
double integrate_qag(const double a, const double b, const double rel_err=1.e-2, const double abs_err=1.e-6, const int limit_size=1000, const int rule=6)
compute the definite integral with GSL qag method
double IntegrateCuhre(std::vector< std::vector< double >> integration_limits, const bool parallelize=true)
integrate using the Cuhre routine
static const char fDP6[]
conversion symbol for: double -> std::string
static const char ee3[]
conversion symbol for: double -> std::string
static const char fINT[]
conversion symbol for: int -> std::string
static const std::string defaultString
default std::string value
static const double pi
: the ratio of a circle's circumference to its diameter
static const double cc
: the speed of light in vacuum (the value is exact) [km/sec]
std::vector< double > Pk_CAMB(const bool nonlinear, const double redshift, const double kmin, const double kmax, const int npoints, const double ombh2, const double omch2, const double omnuh2, const double massless_nu, const int massive_nu, const double omk, const double H0, const double ns, const double As, const double pivot_scalar=0.05, const double w=-1., const double wa=0., const double tau=2.1e-9, const bool accurate_massive_nu=false, const int neutrino_hierarchy=3, const int dark_energy_model=1, const double cs2_lam=1., const double T_cmb=2.7255, const double helium_fraction=0.24)
Get the matter power spectrum from CAMB.
std::vector< double > transform_FFTlog(const std::vector< double > yy, const int dir, const std::vector< double > xx, const std::vector< double > fx, const double mu=0, const double q=0, const double kr=1, const int kropt=0)
wrapper of the FFTlog to compute the discrete Fourier sine or cosine transform of a logarithmically...
double GSL_integrate_cquad(gsl_function func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int nevals=100)
integral, using the gsl cquad method
double GSL_integrate_qag(gsl_function Func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int limit_size=1000, const int rule=6)
integral, computed using the GSL qag method
The global namespace of the CosmoBolognaLib
double sigmaR(const double RR, const int corrType, const std::vector< double > rr, const std::vector< double > corr)
the rms mass fluctuation within a given radius
T Min(const std::vector< T > vect)
minimum element of a std::vector
std::string conv(const T val, const char *fact)
convert a number to a std::string
double barred_xi_direct(const double RR, const std::vector< double > rr, const std::vector< double > xi, const double rAPP=0., const double r0=-1., const double gamma=1.)
the barred correlation function
T Mass(const T RR, const T Rho)
the mass of a sphere of a given radius and density
double j2(const double xx)
the l=2 spherical Bessel function
T Radius(const T Mass, const T Rho)
the radius of a sphere of a given mass and density
std::vector< T > logarithmic_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with logarithmically spaced values
std::vector< T > linear_bin_vector(const size_t nn, const T min, const T max)
fill a std::vector with linearly spaced values
double converted_angle(const double angle, const CoordinateUnits inputUnits=CoordinateUnits::_radians_, const CoordinateUnits outputUnits=CoordinateUnits::_degrees_)
conversion to angle units
void checkIO(const std::ifstream &fin, const std::string file="NULL")
check if an input file can be opened
double XiMultipoles_integrand(const double kk, void *parameters)
integrand to obtain covariance for the 2PCF multipoles
T TopHat_WF(const T kR)
the top-hat window function
int ErrorCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL, const cbl::glob::ExitCode exitCode=cbl::glob::ExitCode::_error_)
throw an exception: it is used for handling exceptions inside the CosmoBolognaLib
std::vector< std::vector< double > > sigma2_k(const double nObjects, const double Volume, const std::vector< double > kk, const std::vector< std::vector< double >> Pk_multipoles, const std::vector< int > orders)
multipole expansion of the per-mode covariance sigma2_k (see Grieb et al. 2016, eq....
T Max(const std::vector< T > vect)
maximum element of a std::vector
double barred_xi__direct(const double RR, const std::vector< double > rr, const std::vector< double > xi, const double rAPP=0., const double r0=-1., const double gamma=1.)
the double barred correlation function
double j0(const double xx)
the l=0 spherical Bessel function
double trapezoid_integration(const std::vector< double > xx, const std::vector< double > yy)
integral, computed with the trapezoid rule, using ordered data
double xi_from_Pk(const double rr, const std::vector< double > lgkk, const std::vector< double > lgPk, const double k_min=0., const double k_max=100., const double aa=0., const double prec=1.e-2)
the two-point correlation function computed from the Fourier transform of the power spectrum
double interpolated(const double _xx, const std::vector< double > xx, const std::vector< double > yy, const std::string type)
1D interpolation
double j4(const double xx)
the l=4 spherical Bessel function
double jl_distance_average(const double kk, const int order, const double r_down, const double r_up)
the distance average for the order l-th spherical Bessel function
CoordinateUnits
the coordinate units
void WarningMsgCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL)
internal CBL warning message
double covariance_XiMultipoles_integrand(const double kk, void *parameters)
integrand to obtain the 2PCF multipoles
double jl(const double xx, const int order)
the order l spherical Bessel function
double wp(const double rp, const std::vector< double > rr, const std::vector< double > xi, const double r_max=100.)
the projected two-point correlation function