6 #include <gsl/gsl_errno.h> 7 #include <gsl/gsl_odeiv2.h> 8 #include <gsl/gsl_spline.h> 9 #include <gsl/gsl_integration.h> 10 #include <gsl/gsl_roots.h> 48 Om_mass_nu * a*a*a) / (a*a*a));
78 double hnorm =
h_over_h0(a, cosmo, status);
89 exp(3 * cosmo->
params.
wa * (a-1)) / hnorm / hnorm;
97 return OmNuh2 / (cosmo->
params.
h) / (cosmo->
params.
h) / hnorm / hnorm;
101 cosmo,
"ccl_background.c: ccl_omega_x(): Species %d not supported\n", label);
126 double hnorm =
h_over_h0(a, cosmo, status);
130 (cosmo->
params.
h) * hnorm * hnorm * comfac;
132 return rhocrit *
ccl_omega_x(cosmo, a, label, status);
148 int *status = ((
chipar *)params_void)->status;
162 double hnorm=
h_over_h0(a,cosmo, &status);
165 dydt[0]=y[1]/(a*a*a*hnorm);
166 dydt[1]=1.5*hnorm*a*om*y[0];
180 gsl_spline *df_a_spline=(gsl_spline *)spline_void;
182 return gsl_spline_eval(df_a_spline,a,NULL)/a;
203 gsl_odeiv2_driver *d=
210 gslstatus=gsl_odeiv2_driver_apply(d,&ainit,a,y);
211 gsl_odeiv2_driver_free(d);
213 if(gslstatus != GSL_SUCCESS) {
219 *fg=y[1]/(a*a*
h_over_h0(a,cosmo, stat)*y[0]);
239 gsl_integration_cquad_workspace * workspace = gsl_integration_cquad_workspace_alloc(
ccl_gsl->
N_ITERATION);
244 gslstatus=gsl_integration_cquad(
247 gsl_integration_cquad_workspace_free(workspace);
249 if (gslstatus != GSL_SUCCESS) {
265 double chi,chia,a_use=a;
267 chi=((
Fpar *)params)->chi;
276 int *stat = ((
Fpar *)params)->status;
306 gsl_function_fdf FDF;
307 double a_previous,a_current=*a_old;
316 gsl_root_fdfsolver_set(s,&FDF,a_current);
318 int iter=0, gslstatus;
321 gslstatus=gsl_root_fdfsolver_iterate(s);
323 a_previous=a_current;
324 a_current=gsl_root_fdfsolver_root(s);
326 }
while(gslstatus==GSL_CONTINUE && iter <= ccl_gsl->ROOT_N_ITERATION);
331 if(gslstatus==GSL_SUCCESS) {
365 double *E_a = malloc(
sizeof(
double)*na);
366 double *chi_a = malloc(
sizeof(
double)*na);
373 if (a==NULL || E_a==NULL || chi_a==NULL){
385 ccl_cosmology_set_status_message(cosmo,
"ccl_background.c: ccl_cosmology_compute_distances(): Error creating first logarithmic and then linear spacing in a\n");
391 for (
int i=0; i<na; i++)
396 if (gsl_spline_init(E, a, E_a, na)){
404 for (
int i=0; i<na; i++)
414 if (gsl_spline_init(chi, a, chi_a, na)){
422 gsl_spline_free(chi);
426 double dchi, chi0, chif, a0, af;
445 na = (int)((chif-chi0)/dchi);
446 dchi = (chif-chi0)/na;
449 a = malloc(
sizeof(
double)*na);
451 const gsl_root_fdfsolver_type *
T=gsl_root_fdfsolver_newton;
452 gsl_root_fdfsolver *s=gsl_root_fdfsolver_alloc(T);
458 if (a==NULL || chi_a==NULL){
461 }
else if(fabs(chi_a[0]-chi0)>1e-5 || fabs(chi_a[na-1]-chif)>1e-5) {
470 for(
int i=1;i<na-1;i++) {
473 a_of_chi(chi_a[i],cosmo, status, &a0, s);
484 if(gsl_spline_init(achi, chi_a, a, na)){
492 gsl_root_fdfsolver_free(s);
495 gsl_spline_free(chi);
496 gsl_spline_free(achi);
522 ccl_cosmology_set_status_message(cosmo,
"ccl_background.c: ccl_cosmology_compute_growth(): Support for the growth rate in cosmologies with massive neutrinos is not yet implemented.\n");
543 gsl_integration_cquad_workspace * workspace=NULL;
545 gsl_spline *df_a_spline=NULL;
547 double *df_arr=malloc(na*
sizeof(
double));
562 gsl_spline_free(df_z_spline);
567 for (
int i=0; i<na; i++) {
571 if(z<=cosmo->
params.z_mgrowth[0])
576 chistatus |= gsl_spline_eval_e(df_z_spline,z,NULL,&df_arr[i]);
584 gsl_spline_free(df_z_spline);
589 gsl_spline_free(df_z_spline);
593 chistatus=gsl_spline_init(df_a_spline,a,df_arr,na);
597 gsl_spline_free(df_a_spline);
605 F.params=df_a_spline;
610 int status_mg=0, gslstatus;
611 double growth0,fgrowth0;
612 double *y = malloc(
sizeof(
double)*na);
619 double *y2 = malloc(
sizeof(
double)*na);
629 for(
int i=0; i<na; i++) {
635 gslstatus = gsl_spline_eval_e(df_a_spline,a[i],NULL,&df);
636 if(gslstatus != GSL_SUCCESS) {
638 status_mg |= gslstatus;
643 if(gslstatus != GSL_SUCCESS) {
645 status_mg |= gslstatus;
652 if(chistatus || status_mg || *status) {
656 if(df_a_spline!=NULL)
657 gsl_spline_free(df_a_spline);
659 gsl_integration_cquad_workspace_free(workspace);
672 gsl_spline_free(df_a_spline);
673 gsl_integration_cquad_workspace_free(workspace);
677 chistatus = gsl_spline_init(growth, a, y, na);
682 gsl_spline_free(growth);
689 chistatus = gsl_spline_init(fgrowth, a, y2, na);
694 gsl_spline_free(growth);
695 gsl_spline_free(fgrowth);
729 if(gslstatus != GSL_SUCCESS) {
744 for (
int i=0; i<na; i++) {
754 if((a > (1.0 - 1.e-8)) && (a<=1.0)) {
771 if(gslstatus != GSL_SUCCESS) {
785 for (
int i=0; i<na; i++) {
815 if((a > (1.0 - 1.e-8)) && (a<=1.0)) {
831 int gslstatus = gsl_spline_eval_e(cosmo->
data.
chi, a,
833 if(gslstatus != GSL_SUCCESS) {
835 *status |= gslstatus;
844 double output[],
int* status)
848 for (
int i=0; i < na; i++) {
864 for (
int i=0; i<na; i++) {
873 if((a > (1.0 - 1.e-8)) && (a<=1.0)) {
902 for (
int i=0; i<na; i++) {
912 if((chi < 1.e-8) && (chi>=0.)) {
928 if(gslstatus != GSL_SUCCESS) {
930 *status |= gslstatus;
941 for (
int i=0; i<nchi; i++) {
967 if(gslstatus != GSL_SUCCESS) {
969 *status |= gslstatus;
985 for (
int i=0; i<na; i++) {
1011 for (
int i=0; i<na; i++) {
1033 if(gslstatus != GSL_SUCCESS) {
1035 *status |= gslstatus;
1050 for (
int i=0; i<na; i++) {
static double dfzero(double a, void *params)
void ccl_growth_rates(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
static double chi_integrand(double a, void *params_void)
static double df_integrand(double a, void *spline_void)
void ccl_growth_factors_unnorm(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
double ccl_luminosity_distance(ccl_cosmology *cosmo, double a, int *status)
void ccl_raise_gsl_warning(int gslstatus, const char *msg,...)
void ccl_growth_factors(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
#define CCL_ERROR_NOT_IMPLEMENTED
double ccl_omega_x(ccl_cosmology *cosmo, double a, ccl_species_x_label label, int *status)
void ccl_check_status(ccl_cosmology *cosmo, int *status)
double * ccl_linlog_spacing(double xminlog, double xmin, double xmax, int Nlin, int Nlog)
void ccl_scale_factor_of_chis(ccl_cosmology *cosmo, int nchi, double chi[], double output[], int *status)
ccl_spline_params * ccl_splines
CCL_BEGIN_DECLS double * ccl_linear_spacing(double xmin, double xmax, int N)
void ccl_luminosity_distances(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
void ccl_h_over_h0s(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
void ccl_comoving_angular_distances(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
void ccl_distance_moduli(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
double INTEGRATION_DISTANCE_EPSREL
double ccl_growth_factor(ccl_cosmology *cosmo, double a, int *status)
#define CCL_ERROR_LINSPACE
void ccl_cosmology_compute_distances(ccl_cosmology *cosmo, int *status)
void ccl_cosmology_set_status_message(ccl_cosmology *cosmo, const char *status_message,...)
Grid< NDIM, T > sqrt(Grid< NDIM, T > lhs)
gsl_interp_accel * accelerator_achi
double ccl_rho_x(ccl_cosmology *cosmo, double a, ccl_species_x_label label, int is_comoving, int *status)
static double h_over_h0(double a, ccl_cosmology *cosmo, int *status)
static void a_of_chi(double chi, ccl_cosmology *cosmo, int *stat, double *a_old, gsl_root_fdfsolver *s)
static int growth_ode_system(double a, const double y[], double dydt[], void *params)
double ccl_sinn(ccl_cosmology *cosmo, double chi, int *status)
gsl_interp_accel * accelerator
static void fdfzero(double a, void *params, double *f, double *df)
double ccl_Omeganuh2(double a, int N_nu_mass, double *mnu, double T_CMB, gsl_interp_accel *accel, int *status)
void ccl_comoving_radial_distances(ccl_cosmology *cosmo, int na, double a[], double output[], int *status)
#define CCL_ERROR_COMPUTECHI
double ccl_growth_rate(ccl_cosmology *cosmo, double a, int *status)
double ccl_distance_modulus(ccl_cosmology *cosmo, double a, int *status)
static void compute_chi(double a, ccl_cosmology *cosmo, double *chi, int *stat)
#define CCL_ERROR_PARAMETERS
float pow(float base, unsigned long int exp)
double ccl_comoving_radial_distance(ccl_cosmology *cosmo, double a, int *status)
static double fzero(double a, void *params)
#define EPS_SCALEFAC_GROWTH
void ccl_cosmology_compute_growth(ccl_cosmology *cosmo, int *status)
double ccl_growth_factor_unnorm(ccl_cosmology *cosmo, double a, int *status)
double ccl_h_over_h0(ccl_cosmology *cosmo, double a, int *status)
double ccl_scale_factor_of_chi(ccl_cosmology *cosmo, double chi, int *status)
static int growth_factor_and_growth_rate(double a, double *gf, double *fg, ccl_cosmology *cosmo, int *stat)
double ccl_comoving_angular_distance(ccl_cosmology *cosmo, double a, int *status)