additions from PNG-project

This commit is contained in:
AAndrews 2019-07-11 14:27:22 +02:00
parent ec4e895fd8
commit 685cc10cf4
2 changed files with 84 additions and 38 deletions

View File

@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...) data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
This software is governed by the CeCILL license under French law and This software is governed by the CeCILL license under French law and
abiding by the rules of distribution of free software. You can use, abiding by the rules of distribution of free software. You can use,
modify and/ or redistribute the software under the terms of the CeCILL modify and/ or redistribute the software under the terms of the CeCILL
license as circulated by CEA, CNRS and INRIA at the following URL license as circulated by CEA, CNRS and INRIA at the following URL
"http://www.cecill.info". "http://www.cecill.info".
As a counterpart to the access to the source code and rights to copy, As a counterpart to the access to the source code and rights to copy,
modify and redistribute granted by the license, users are provided only modify and redistribute granted by the license, users are provided only
with a limited warranty and the software's author, the holder of the with a limited warranty and the software's author, the holder of the
economic rights, and the successive licensors have only limited economic rights, and the successive licensors have only limited
liability. liability.
In this respect, the user's attention is drawn to the risks associated In this respect, the user's attention is drawn to the risks associated
with loading, using, modifying and/or developing or reproducing the with loading, using, modifying and/or developing or reproducing the
@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also
therefore means that it is reserved for developers and experienced therefore means that it is reserved for developers and experienced
professionals having in-depth computer knowledge. Users are therefore professionals having in-depth computer knowledge. Users are therefore
encouraged to load and test the software's suitability as regards their encouraged to load and test the software's suitability as regards their
requirements in conditions enabling the security of their systems and/or requirements in conditions enabling the security of their systems and/or
data to be ensured and, more generally, to use and operate it in the data to be ensured and, more generally, to use and operate it in the
same conditions as regards security. same conditions as regards security.
The fact that you are presently reading this means that you have had The fact that you are presently reading this means that you have had
knowledge of the CeCILL license and that you accept its terms. knowledge of the CeCILL license and that you accept its terms.
@ -54,7 +54,7 @@ using namespace CosmoTool;
CosmoPower::CosmoPower() CosmoPower::CosmoPower()
{ {
eval = &CosmoPower::powerEfstathiou; eval = &CosmoPower::powerEfstathiou;
n = 1.0; n = 1.0;
K0 = 1; K0 = 1;
V_LG_CMB = 627; V_LG_CMB = 627;
@ -71,7 +71,7 @@ CosmoPower::CosmoPower()
Theta_27 = 2.728/2.7; Theta_27 = 2.728/2.7;
ehu_params = 0; ehu_params = 0;
updateCosmology(); updateCosmology();
} }
@ -86,7 +86,7 @@ CosmoPower::~CosmoPower()
*/ */
static double tophatFilter(double u) static double tophatFilter(double u)
{ {
if (u != 0) if (u != 0)
return 3 / (u*u*u) * (sin(u) - u * cos(u)); return 3 / (u*u*u) * (sin(u) - u * cos(u));
else else
return 1; return 1;
@ -117,14 +117,14 @@ static double powG(double y)
return y * (-6 * a + (2 + 3 * y) *log((a + 1)/(a - 1))); return y * (-6 * a + (2 + 3 * y) *log((a + 1)/(a - 1)));
} }
double CosmoPower::powerEfstathiou(double k) double CosmoPower::powerEfstathiou(double k)
{ {
double a = 6.4/Gamma0; double a = 6.4/Gamma0;
double b = 3/Gamma0; double b = 3/Gamma0;
double c = 1.7/Gamma0; double c = 1.7/Gamma0;
double nu = 1.13; double nu = 1.13;
double f = (a*k) + pow(b*k,1.5) + pow(c*k,2); double f = (a*k) + pow(b*k,1.5) + pow(c*k,2);
// EFSTATHIOU ET AL. (1992) // EFSTATHIOU ET AL. (1992)
@ -135,7 +135,7 @@ void CosmoPower::updateHuWigglesOriginal()
{ {
if (ehu_params == 0) if (ehu_params == 0)
ehu_params = new TF_Transfer(); ehu_params = new TF_Transfer();
ehu_params->TFset_parameters( (OMEGA_C+OMEGA_B)*h*h, ehu_params->TFset_parameters( (OMEGA_C+OMEGA_B)*h*h,
OMEGA_B/(OMEGA_C+OMEGA_B), Theta_27*2.7); OMEGA_B/(OMEGA_C+OMEGA_B), Theta_27*2.7);
} }
@ -161,7 +161,7 @@ void CosmoPower::updateHuWigglesConsts()
double a1 = pow(46.9 * OmegaEff, 0.670) * (1 + pow(32.1 * OmegaEff, -0.532)); double a1 = pow(46.9 * OmegaEff, 0.670) * (1 + pow(32.1 * OmegaEff, -0.532));
double a2 = pow(12.0 * OmegaEff, 0.424) * (1 + pow(45.0 * OmegaEff, -0.582)); double a2 = pow(12.0 * OmegaEff, 0.424) * (1 + pow(45.0 * OmegaEff, -0.582));
double alpha_c = pow(a1, -f_b) * pow(a2, -pow(f_b, 3)); double alpha_c = pow(a1, -f_b) * pow(a2, -pow(f_b, 3));
double b1_betac = 0.944 * 1/(1 + pow(458 * OmegaEff, -0.708)); double b1_betac = 0.944 * 1/(1 + pow(458 * OmegaEff, -0.708));
double b2_betac = pow(0.395 * OmegaEff, -0.0266); double b2_betac = pow(0.395 * OmegaEff, -0.0266);
@ -170,13 +170,13 @@ void CosmoPower::updateHuWigglesConsts()
double alpha_b = 2.07 * k_eq * s * pow(1 + R_d, -0.75) * powG((1 + z_eq)/(1 + z_d)); double alpha_b = 2.07 * k_eq * s * pow(1 + R_d, -0.75) * powG((1 + z_eq)/(1 + z_d));
double beta_b = 0.5 + f_b + (3 - 2 * f_b) * sqrt(pow(17.2 * OmegaEff, 2) + 1); double beta_b = 0.5 + f_b + (3 - 2 * f_b) * sqrt(pow(17.2 * OmegaEff, 2) + 1);
double beta_node = 8.41 * pow(OmegaEff, 0.435); double beta_node = 8.41 * pow(OmegaEff, 0.435);
ehu.k_silk = k_silk; ehu.k_silk = k_silk;
ehu.s = s; ehu.s = s;
ehu.k_eq = k_eq; ehu.k_eq = k_eq;
ehu.alpha_c = alpha_c; ehu.alpha_c = alpha_c;
ehu.beta_c = beta_c; ehu.beta_c = beta_c;
ehu.alpha_b = alpha_b; ehu.alpha_b = alpha_b;
ehu.beta_b = beta_b; ehu.beta_b = beta_b;
ehu.beta_node = beta_node; ehu.beta_node = beta_node;
@ -194,24 +194,61 @@ double CosmoPower::powerHuWiggles(double k)
double beta_c = ehu.beta_c; double beta_c = ehu.beta_c;
double alpha_b = ehu.alpha_b; double alpha_b = ehu.alpha_b;
double beta_b = ehu.beta_b; double beta_b = ehu.beta_b;
double xx = k * s; double xx = k * s;
double s_tilde = s * pow(1 + pow(ehu.beta_node / (xx), 3), -1./3); double s_tilde = s * pow(1 + pow(ehu.beta_node / (xx), 3), -1./3);
double f = 1 / (1 + pow(xx / 5.4, 4)); double f = 1 / (1 + pow(xx / 5.4, 4));
double q = k / (13.41 * k_eq); double q = k / (13.41 * k_eq);
double T_c = f * T_tilde_0(q, 1, beta_c) + (1 - f) * T_tilde_0(q, alpha_c, beta_c); double T_c = f * T_tilde_0(q, 1, beta_c) + (1 - f) * T_tilde_0(q, alpha_c, beta_c);
double T_b = ( double T_b = (
T_tilde_0(q, 1, 1) / (1 + pow(xx / 5.2, 2)) + T_tilde_0(q, 1, 1) / (1 + pow(xx / 5.2, 2)) +
alpha_b / (1 + pow(beta_b / xx, 3)) * exp(-pow(k/k_silk, 1.4)) alpha_b / (1 + pow(beta_b / xx, 3)) * exp(-pow(k/k_silk, 1.4))
) * j_0(k * s_tilde); ) * j_0(k * s_tilde);
double T_k = OMEGA_B/OMEGA_0 * T_b + OMEGA_C/OMEGA_0 * T_c; double T_k = OMEGA_B/OMEGA_0 * T_b + OMEGA_C/OMEGA_0 * T_c;
return normPower * pow(k,n) * T_k * T_k; return normPower * pow(k,n) * T_k * T_k;
} }
double CosmoPower::primordialPowerSpectrum(double k)
{
//Primordial power spectrum, needed for PNG
return normPower * pow(k,n);
}
double CosmoPower::matterTransferFunctionHu(double k)
{
// EISENSTEIN ET HU (1998)
// FULL POWER SPECTRUM WITH BARYONS AND WIGGLES
double k_silk = ehu.k_silk;
double s = ehu.s;
double k_eq = ehu.k_eq;
double alpha_c = ehu.alpha_c;
double beta_c = ehu.beta_c;
double alpha_b = ehu.alpha_b;
double beta_b = ehu.beta_b;
double xx = k * s;
double s_tilde = s * pow(1 + pow(ehu.beta_node / (xx), 3), -1./3);
double f = 1 / (1 + pow(xx / 5.4, 4));
double q = k / (13.41 * k_eq);
double T_c = f * T_tilde_0(q, 1, beta_c) + (1 - f) * T_tilde_0(q, alpha_c, beta_c);
double T_b = (
T_tilde_0(q, 1, 1) / (1 + pow(xx / 5.2, 2)) +
alpha_b / (1 + pow(beta_b / xx, 3)) * exp(-pow(k/k_silk, 1.4))
) * j_0(k * s_tilde);
double T_k = OMEGA_B/OMEGA_0 * T_b + OMEGA_C/OMEGA_0 * T_c;
return T_k;
}
double CosmoPower::powerHuBaryons(double k) double CosmoPower::powerHuBaryons(double k)
{ {
double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75))); double s = 44.5 * log(9.83 / OmegaEff) / (sqrt(1 + 10 * pow(OMEGA_B * h * h, 0.75)));
@ -221,7 +258,7 @@ double CosmoPower::powerHuBaryons(double k)
double L_0 = log(2 * M_E + 1.8 * q); double L_0 = log(2 * M_E + 1.8 * q);
double C_0 = 14.2 + 731 / (1 + 62.5 * q); double C_0 = 14.2 + 731 / (1 + 62.5 * q);
double T0 = L_0 / (L_0 + C_0 * q * q); double T0 = L_0 / (L_0 + C_0 * q * q);
return normPower * pow(k,n) * T0 * T0; return normPower * pow(k,n) * T0 * T0;
} }
@ -350,7 +387,7 @@ double CosmoPower::eval_theta_theta(double k)
return 0; return 0;
double r =(alpha0*sqrt(P_deltadelta) + alpha1*P_deltadelta*P_deltadelta)/(alpha2 + alpha3*P_deltadelta); double r =(alpha0*sqrt(P_deltadelta) + alpha1*P_deltadelta*P_deltadelta)/(alpha2 + alpha3*P_deltadelta);
assert(P_deltadelta > 0); assert(P_deltadelta > 0);
if (r < 0) if (r < 0)
return 0; return 0;
return r; return r;
@ -364,10 +401,10 @@ double CosmoPower::power(double k)
double CosmoPower::powerHuWigglesOriginal(double k) double CosmoPower::powerHuWigglesOriginal(double k)
{ {
float tfb, tfc; float tfb, tfc;
ehu_params->TFfit_onek(k, &tfb, &tfc); ehu_params->TFfit_onek(k, &tfb, &tfc);
double T_k = OMEGA_B/OMEGA_0 * tfb + OMEGA_C/OMEGA_0 * tfc; double T_k = OMEGA_B/OMEGA_0 * tfb + OMEGA_C/OMEGA_0 * tfc;
return normPower * pow(k,n) * T_k * T_k; return normPower * pow(k,n) * T_k * T_k;
} }
@ -383,6 +420,12 @@ void CosmoPower::setFunction(CosmoFunction f)
updateHuWigglesConsts(); updateHuWigglesConsts();
eval = &CosmoPower::powerHuWiggles; eval = &CosmoPower::powerHuWiggles;
break; break;
case PRIMORDIAL_PS:
eval = &CosmoPower::primordialPowerSpectrum;
break;
case MATTER_TK:
eval = &CosmoPower::matterTransferFunctionHu;
break;
case HU_WIGGLES_ORIGINAL: case HU_WIGGLES_ORIGINAL:
updateHuWigglesOriginal(); updateHuWigglesOriginal();
eval = &CosmoPower::powerHuWigglesOriginal; eval = &CosmoPower::powerHuWigglesOriginal;
@ -414,4 +457,3 @@ void CosmoPower::setNormalization(double A_K)
{ {
normPower = A_K;///power(0.002); normPower = A_K;///power(0.002);
} }

View File

@ -7,16 +7,16 @@ This software is a computer program whose purpose is to provide a toolbox for co
data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...) data analysis (e.g. filters, generalized Fourier transforms, power spectra, ...)
This software is governed by the CeCILL license under French law and This software is governed by the CeCILL license under French law and
abiding by the rules of distribution of free software. You can use, abiding by the rules of distribution of free software. You can use,
modify and/ or redistribute the software under the terms of the CeCILL modify and/ or redistribute the software under the terms of the CeCILL
license as circulated by CEA, CNRS and INRIA at the following URL license as circulated by CEA, CNRS and INRIA at the following URL
"http://www.cecill.info". "http://www.cecill.info".
As a counterpart to the access to the source code and rights to copy, As a counterpart to the access to the source code and rights to copy,
modify and redistribute granted by the license, users are provided only modify and redistribute granted by the license, users are provided only
with a limited warranty and the software's author, the holder of the with a limited warranty and the software's author, the holder of the
economic rights, and the successive licensors have only limited economic rights, and the successive licensors have only limited
liability. liability.
In this respect, the user's attention is drawn to the risks associated In this respect, the user's attention is drawn to the risks associated
with loading, using, modifying and/or developing or reproducing the with loading, using, modifying and/or developing or reproducing the
@ -25,9 +25,9 @@ that may mean that it is complicated to manipulate, and that also
therefore means that it is reserved for developers and experienced therefore means that it is reserved for developers and experienced
professionals having in-depth computer knowledge. Users are therefore professionals having in-depth computer knowledge. Users are therefore
encouraged to load and test the software's suitability as regards their encouraged to load and test the software's suitability as regards their
requirements in conditions enabling the security of their systems and/or requirements in conditions enabling the security of their systems and/or
data to be ensured and, more generally, to use and operate it in the data to be ensured and, more generally, to use and operate it in the
same conditions as regards security. same conditions as regards security.
The fact that you are presently reading this means that you have had The fact that you are presently reading this means that you have had
knowledge of the CeCILL license and that you accept its terms. knowledge of the CeCILL license and that you accept its terms.
@ -39,7 +39,7 @@ knowledge of the CeCILL license and that you accept its terms.
namespace CosmoTool { namespace CosmoTool {
struct TF_Transfer; struct TF_Transfer;
class CosmoPower class CosmoPower
{ {
public: public:
@ -57,15 +57,15 @@ namespace CosmoTool {
double omega_B; double omega_B;
double omega_C; double omega_C;
double Theta_27; double Theta_27;
// DERIVED VARIABLES // DERIVED VARIABLES
double OMEGA_0; double OMEGA_0;
double Omega; double Omega;
double beta; double beta;
double OmegaEff; double OmegaEff;
double Gamma0; double Gamma0;
double normPower; double normPower;
struct EHuParams { struct EHuParams {
double k_silk; double k_silk;
double s; double s;
@ -74,13 +74,15 @@ namespace CosmoTool {
double alpha_c, beta_c; double alpha_c, beta_c;
double beta_node; double beta_node;
}; };
EHuParams ehu; EHuParams ehu;
TF_Transfer *ehu_params; TF_Transfer *ehu_params;
enum CosmoFunction { enum CosmoFunction {
POWER_EFSTATHIOU, POWER_EFSTATHIOU,
HU_WIGGLES, HU_WIGGLES,
PRIMORDIAL_PS,
MATTER_TK,
HU_BARYON, HU_BARYON,
OLD_POWERSPECTRUM, OLD_POWERSPECTRUM,
POWER_BARDEEN, POWER_BARDEEN,
@ -101,7 +103,7 @@ namespace CosmoTool {
void setNormalization(double A_K); void setNormalization(double A_K);
void updateHuWigglesConsts(); void updateHuWigglesConsts();
void updateHuWigglesOriginal(); void updateHuWigglesOriginal();
double eval_theta_theta(double k); double eval_theta_theta(double k);
double power(double k); double power(double k);
@ -111,6 +113,8 @@ namespace CosmoTool {
double powerEfstathiou(double k); double powerEfstathiou(double k);
double powerHuWiggles(double k); double powerHuWiggles(double k);
double primordialPowerSpectrum(double k);
double matterTransferFunctionHu(double k);
double powerHuBaryons(double k); double powerHuBaryons(double k);
double powerOld(double k); double powerOld(double k);
double powerBardeen(double k); double powerBardeen(double k);