/// Transfer function a'la Eisenstein and Hu, k should be supplied in Mpc^{-1} double cosmology::TF_EH(double kpassed) { //double k = h*kpassed; double k = kpassed; if (!bool_initPS) { if(verbose){ std::cout<<"# "<<" Power spectrum varibles were not initialised. Now initialising. "<<std::endl; } double init = initPS_EH(); if(verbose){ std::cout<<"# "<<init<<std::endl; } } double q=k/(keq*13.41); // Eq. 21 first part double befj0= T0master_EH(q,1.,1.)/(1.+pow(k*sd/5.2,2.)) + alphab/(1.+pow(betab/(k*sd),3.))*exp(-pow(k/ksilk,1.4) ); // Eq. 22 double stilde=sd/pow((1.+pow(betanode/(k*sd),3.)),1./3.); // Eq. 21 remaining part double Tb=befj0*gsl_sf_bessel_j0(k*stilde); // Eq. 18 double f= 1./(1.+pow(k*sd/5.4,4.)); // Eq. 17 double TC=f*T0master_EH(q,1.,1./betacinv)+(1-f)*T0master_EH(q,alphac,1./betacinv); double TF=Omegab/Omega0*Tb + (Omega0-Omegab)/Omega0*TC; return TF; //return Omegab/Omega0*Tb_EH(k) + (Omega0-Omegab)/Omega0*TCold_EH(k); }
static foreign_t pl_gsl_sf_bessel_J0(term_t x_term, term_t out_term) { double x; double y; int rval; if ( PL_get_float(x_term, &x) ) { y = gsl_sf_bessel_j0(x); rval = PL_unify_float(out_term, y); return rval; } PL_fail; }