6 #include <gsl/gsl_integration.h> 7 #include <gsl/gsl_interp.h> 8 #include <gsl/gsl_spline.h> 9 #include <gsl/gsl_errno.h> 24 double dc0 = (3./20.)*
pow(12.*
M_PI,2./3.);
25 double dc = dc0*(1.+0.012299*log10(Om_mz));
42 double Dv = (Dv0+82.*x-39.*
pow(x,2))/Om_mz;
54 double rho_matter =
ccl_rho_x(cosmo, 1., 1, 1, status);
56 return pow(halomass*3.0/(4.0*
M_PI*rho_matter*odelta),1.0/3.0);
70 double delta[9] = {200.0, 300.0, 400.0, 600.0, 800.0, 1200.0, 1600.0, 2400.0, 3200.0};
72 double alpha[9] = {0.368, 0.363, 0.385, 0.389, 0.393, 0.365, 0.379, 0.355, 0.327};
73 double beta[9] = {0.589, 0.585, 0.544, 0.543, 0.564, 0.623, 0.637, 0.673, 0.702};
74 double gamma[9] ={0.864, 0.922, 0.987, 1.09, 1.20, 1.34, 1.50, 1.68, 1.81};
75 double phi[9] = {-0.729, -0.789, -0.910, -1.05, -1.20, -1.26, -1.45, -1.50, -1.49};
76 double eta[9] = {-0.243, -0.261, -0.261, -0.273, -0.278, -0.301, -0.301, -0.319, -0.336};
81 lgdelta[i] = log10(delta[i]);
85 *status = gsl_spline_init(alphahmf, lgdelta, alpha, nd);
87 gsl_spline_free(alphahmf);
94 *status = gsl_spline_init(betahmf, lgdelta, beta, nd);
96 gsl_spline_free(alphahmf);
97 gsl_spline_free(betahmf);
104 *status = gsl_spline_init(gammahmf, lgdelta, gamma, nd);
106 gsl_spline_free(alphahmf);
107 gsl_spline_free(betahmf);
108 gsl_spline_free(gammahmf);
115 *status = gsl_spline_init(phihmf, lgdelta, phi, nd);
117 gsl_spline_free(alphahmf);
118 gsl_spline_free(betahmf);
119 gsl_spline_free(gammahmf);
120 gsl_spline_free(phihmf);
127 *status = gsl_spline_init(etahmf, lgdelta, eta, nd);
129 gsl_spline_free(alphahmf);
130 gsl_spline_free(betahmf);
131 gsl_spline_free(gammahmf);
132 gsl_spline_free(phihmf);
133 gsl_spline_free(etahmf);
150 double delta[9] = {200.0, 300.0, 400.0, 600.0, 800.0, 1200.0, 1600.0, 2400.0, 3200.0};
152 double alpha[9] = {0.186, 0.200, 0.212, 0.218, 0.248, 0.255, 0.260, 0.260, 0.260};
153 double beta[9] = {1.47, 1.52, 1.56, 1.61, 1.87, 2.13, 2.30, 2.53, 2.66};
154 double gamma[9] ={2.57, 2.25, 2.05, 1.87, 1.59, 1.51, 1.46, 1.44, 1.41};
155 double phi[9] = {1.19, 1.27, 1.34, 1.45, 1.58, 1.80, 1.97, 2.24, 2.44};
159 for(i=0; i<nd; i++) {
160 lgdelta[i] = log10(delta[i]);
164 *status = gsl_spline_init(alphahmf, lgdelta, alpha, nd);
166 gsl_spline_free(alphahmf);
173 *status = gsl_spline_init(betahmf, lgdelta, beta, nd);
175 gsl_spline_free(alphahmf);
176 gsl_spline_free(betahmf);
183 *status = gsl_spline_init(gammahmf, lgdelta, gamma, nd);
185 gsl_spline_free(alphahmf);
186 gsl_spline_free(betahmf);
187 gsl_spline_free(gammahmf);
194 *status = gsl_spline_init(phihmf, lgdelta, phi, nd);
196 gsl_spline_free(alphahmf);
197 gsl_spline_free(betahmf);
198 gsl_spline_free(gammahmf);
199 gsl_spline_free(phihmf);
236 double fit_A, fit_a, fit_b, fit_c, fit_d, fit_p, overdensity_delta;
238 double delta_c_Tinker, nu;
240 double sigma=
ccl_sigmaM(cosmo, halomass, a, status);
264 return nu*fit_A*(1.+
pow(fit_a*
pow(nu,2),-fit_p))*exp(-fit_a*
pow(nu,2)/2.);
269 if ((odelta < 200) || (odelta > 3200)) {
285 fit_d =
pow(10, -1.0*
pow(0.75 / log10(odelta / 75.0), 1.2));
287 fit_A = fit_A*
pow(a, 0.14);
288 fit_a = fit_a*
pow(a, 0.06);
289 fit_b = fit_b*
pow(a, fit_d);
290 if(gslstatus != GSL_SUCCESS) {
292 *status |= gslstatus;
296 return fit_A*(
pow(sigma/fit_b,-fit_a)+1.0)*exp(-fit_c/sigma/sigma);
303 if ((odelta < 200) || (odelta > 3200)) {
314 delta_c_Tinker = 1.686;
315 nu = delta_c_Tinker/(sigma);
323 fit_a *=
pow(a, -0.27);
324 fit_b *=
pow(a, -0.20);
325 fit_c *=
pow(a, 0.01);
326 fit_d *=
pow(a, 0.08);
327 if(gslstatus != GSL_SUCCESS) {
329 *status |= gslstatus;
333 return nu*fit_A*(1.+
pow(fit_b*nu,-2.*fit_d))*
pow(nu, 2.*fit_a)*exp(-0.5*fit_c*nu*nu);
344 fit_A = Omega_m_a*(0.990*
pow(a,3.216)+0.074);
345 fit_a = Omega_m_a*(5.907*
pow(a,3.599)+2.344);
346 fit_b = Omega_m_a*(3.136*
pow(a,3.058)+2.349);
349 return fit_A*(
pow(sigma/fit_b,-fit_a)+1.0)*exp(-fit_c/sigma/sigma);
363 return fit_A*
pow( (fit_a/sigma)+1.0, fit_b)*exp(-fit_c/sigma/sigma);
368 "ccl_massfunc.c: ccl_massfunc(): Unknown or non-implemented mass function method: %d \n",
376 double fit_A, fit_B, fit_C, fit_a, fit_b, fit_c, fit_p, overdensity_delta, y;
377 double delta_c_Tinker, nu;
378 double sigma=
ccl_sigmaM(cosmo,halomass,a, status);
399 nu = delta_c/
ccl_sigmaM(cosmo, halomass, a, status);
401 return 1.+(fit_a*
pow(nu,2)-1.+2.*fit_p/(1.+
pow(fit_a*
pow(nu,2),fit_p)))/delta_c;
408 delta_c_Tinker = 1.686;
410 nu = delta_c_Tinker/(sigma);
412 fit_A = 1.0 + 0.24*y*exp(-
pow(4./y,4.));
416 fit_C = 0.019+0.107*y+0.19*exp(-
pow(4./y,4.));
419 return 1.-fit_A*
pow(nu,fit_a)/(
pow(nu,fit_a)+
pow(delta_c_Tinker,fit_a))+fit_B*
pow(nu,fit_b)+fit_C*
pow(nu,fit_c);
425 "ccl_massfunc.c: ccl_halo_b1(): No b(M) fitting function implemented for mass_function_method: %d \n",
441 double * y = malloc(
sizeof(
double)*nm);
442 double smooth_radius;
447 gsl_spline *logsigma;
448 gsl_spline *dlnsigma_dlogm;
461 for (
int i=0; i<nm; i++) {
463 y[i] = log10(
ccl_sigmaR(cosmo, smooth_radius, 1., status));
466 *status = gsl_spline_init(logsigma, m, y, nm);
477 for (
int i=0; i<nm; i++) {
479 gslstatus |= gsl_spline_eval_e(logsigma, m[i], NULL,&na);
481 y[i] = (na-nb)*log(10.);
486 gslstatus |= gsl_spline_eval_e(logsigma, m[i], NULL,&nb);
487 y[i] = (na-nb)*log(10.);
493 y[i] = (na-nb)*log(10.);
499 if(gslstatus != GSL_SUCCESS) {
501 *status |= gslstatus;
508 *status = gsl_spline_init(dlnsigma_dlogm, m, y, nm);
526 gsl_spline_free(logsigma);
527 gsl_spline_free(dlnsigma_dlogm);
546 logmass = log10(halomass);
549 if(gslstatus != GSL_SUCCESS) {
551 *status |= gslstatus;
566 ccl_cosmology_set_status_message(cosmo,
"ccl_background.c: ccl_cosmology_compute_growth(): Support for the halo mass function in cosmologies with massive neutrinos is not yet implemented.\n");
586 ccl_cosmology_set_status_message(cosmo,
"ccl_background.c: ccl_cosmology_compute_growth(): Support for the halo bias in cosmologies with massive neutrinos is not yet implemented.\n");
608 double rho_m, smooth_radius;
614 smooth_radius =
pow((3.0*halomass) / (4*
M_PI*rho_m), (1.0/3.0));
616 return smooth_radius;
628 ccl_cosmology_set_status_message(cosmo,
"ccl_background.c: ccl_cosmology_compute_growth(): Support for the sigma(M) function in cosmologies with massive neutrinos is not yet implemented.\n");
645 if(gslstatus != GSL_SUCCESS) {
647 *status |= gslstatus;
gsl_interp_accel * accelerator_m
static void ccl_cosmology_compute_hmfparams(ccl_cosmology *cosmo, int *status)
void ccl_raise_gsl_warning(int gslstatus, const char *msg,...)
double ccl_omega_x(ccl_cosmology *cosmo, double a, ccl_species_x_label label, int *status)
double ccl_halo_bias(ccl_cosmology *cosmo, double halomass, double a, double odelta, int *status)
double ccl_massfunc_m2r(ccl_cosmology *cosmo, double halomass, int *status)
#define CCL_ERROR_NOT_IMPLEMENTED
double ccl_growth_factor(ccl_cosmology *cosmo, double a, int *status)
double dc_NakamuraSuto(ccl_cosmology *cosmo, double a, int *status)
static double ccl_halo_b1(ccl_cosmology *cosmo, double halomass, double a, double odelta, int *status)
void ccl_check_status(ccl_cosmology *cosmo, int *status)
double r_delta(ccl_cosmology *cosmo, double halomass, double a, double odelta, int *status)
#define CCL_ERROR_HMF_INTERP
ccl_spline_params * ccl_splines
CCL_BEGIN_DECLS double * ccl_linear_spacing(double xmin, double xmax, int N)
double ccl_sigmaM(ccl_cosmology *cosmo, double halomass, double a, int *status)
gsl_interp_accel * accelerator_d
static double massfunc_f(ccl_cosmology *cosmo, double halomass, double a, double odelta, int *status)
#define CCL_ERROR_LINSPACE
void ccl_cosmology_compute_sigma(ccl_cosmology *cosmo, int *status)
void ccl_cosmology_set_status_message(ccl_cosmology *cosmo, const char *status_message,...)
static double beta[2][28][8]
static CCL_BEGIN_DECLS double x[111][8]
double ccl_massfunc(ccl_cosmology *cosmo, double halomass, double a, double odelta, int *status)
double ccl_rho_x(ccl_cosmology *cosmo, double a, ccl_species_x_label label, int is_comoving, int *status)
double Dv_BryanNorman(ccl_cosmology *cosmo, double a, int *status)
mass_function_t mass_function_method
float pow(float base, unsigned long int exp)
gsl_spline * dlnsigma_dlogm
static double ccl_dlninvsig_dlogm(ccl_cosmology *cosmo, double halomass, int *status)
double ccl_sigmaR(ccl_cosmology *cosmo, double R, double a, int *status)