4 #include <gsl/gsl_integration.h>
5 #include <gsl/gsl_errno.h>
11 #define HBAR 6.582119e-16
12 #define STEFAN_BOLTZMANN 5.670373e-5
16 #define FLOAT_ACC 1e-6
20 void init_omega_nu(
_omega_nu * omnu,
const double MNu[],
const double a0,
const double HubbleParam,
const double tcmb0)
35 for(mmi=0; mmi<mi; mmi++){
75 return omega_nu - part_nu;
82 return omegag/pow(a,4);
93 double amnu = *((
double *)params);
94 double kT = *((
double *)params+1);
95 double epsilon = sqrt(q*q+amnu*amnu);
96 double f0 = 1./(exp(q/kT)+1);
97 return q*q*epsilon*f0;
105 double convert=4*M_PI*2;
109 convert*=(chbar*chbar*chbar);
128 if(a0 * mnu < 1e-6 * kBtnu)
129 a0 = 1e-6 * kBtnu / mnu;
131 const double logA0=log(a0)-log(1.2);
132 const double logaf=log(
NU_SW*kBtnu/mnu)+log(1.2);
136 rho_nu_tab->
mnu = mnu;
138 if(mnu < 1e-6*kBtnu || logaf < logA0)
144 rho_nu_tab->
acc = gsl_interp_accel_alloc();
145 rho_nu_tab->
interp=gsl_interp_alloc(gsl_interp_cspline,
NRHOTAB);
146 if(!rho_nu_tab->
interp || !rho_nu_tab->
acc || !rho_nu_tab->
loga)
147 endrun(2035,
"Could not initialise tables for neutrino matter density\n");
149 gsl_integration_workspace * w = gsl_integration_workspace_alloc (
GSL_VAL);
152 rho_nu_tab->
loga[i]=logA0+i*(logaf-logA0)/(
NRHOTAB-1);
153 param[0]=mnu*exp(rho_nu_tab->
loga[i]);
156 gsl_integration_qag (&F, 0, 500*kBtnu,0 , 1e-9,
GSL_VAL,6,w,&(rho_nu_tab->
rhonu[i]), &abserr);
159 gsl_integration_workspace_free (w);
165 static inline double non_rel_rho_nu(
const double a,
const double kT,
const double amnu,
const double kTamnu2)
168 return amnu*(kT*kT*kT)/(a*a*a*a)*(1.5*1.202056903159594+kTamnu2*45./4.*1.0369277551433704+2835./32.*kTamnu2*kTamnu2*1.0083492773819229+80325/32.*kTamnu2*kTamnu2*kTamnu2*1.0020083928260826)*
get_rho_nu_conversion();
173 static inline double rel_rho_nu(
const double a,
const double kT)
183 double amnu=a*rho_nu_tab->
mnu;
184 const double kTamnu2=(kT*kT/amnu/amnu);
193 else if(amnu < 1e-6*kT){
198 const double loga = log(a);
201 if (!rho_nu_tab->
loga || loga < rho_nu_tab->loga[0])
204 rho_nu_val=gsl_interp_eval(rho_nu_tab->
interp,rho_nu_tab->
loga,rho_nu_tab->
rhonu,loga,rho_nu_tab->
acc);
214 return x * x / (exp(x) + 1);
222 gsl_integration_workspace * w = gsl_integration_workspace_alloc (100);
228 gsl_integration_qag (&F, 0, qc, 0, 1e-6,100,GSL_INTEG_GAUSS61, w,&(total_fd), &abserr);
230 total_fd /= 1.5*1.202056903159594;
231 gsl_integration_workspace_free (w);
235 void init_hybrid_nu(
_hybrid_nu *
const hybnu,
const double mnu[],
const double vcrit,
const double light,
const double nu_crit_time,
const double kBtnu)
240 hybnu->
vcrit = vcrit / light;
242 const double qc = mnu[i] * vcrit / light / kBtnu;
281 omega_nu -= omega_part;
void endrun(int where, const char *fmt,...)
#define mymalloc(name, size)
void init_hybrid_nu(_hybrid_nu *const hybnu, const double mnu[], const double vcrit, const double light, const double nu_crit_time, const double kBtnu)
void init_omega_nu(_omega_nu *omnu, const double MNu[], const double a0, const double HubbleParam, const double tcmb0)
static double non_rel_rho_nu(const double a, const double kT, const double amnu, const double kTamnu2)
double rho_nu(const _rho_nu_single *rho_nu_tab, const double a, const double kT)
void rho_nu_init(_rho_nu_single *const rho_nu_tab, double a0, const double mnu, const double kBtnu)
double omega_nu_single(const _omega_nu *const omnu, const double a, int i)
double get_omegag(const _omega_nu *const omnu, const double a)
double particle_nu_fraction(const _hybrid_nu *const hybnu, const double a, const int i)
static double rel_rho_nu(const double a, const double kT)
double nufrac_low(const double qc)
double get_omega_nu(const _omega_nu *const omnu, const double a)
double fermi_dirac_kernel(double x, void *params)
double get_rho_nu_conversion()
double rho_nu_int(double q, void *params)
double get_omega_nu_nopart(const _omega_nu *const omnu, const double a)
double nufrac_low[NUSPECIES]
int nu_degeneracies[NUSPECIES]
_rho_nu_single RhoNuTab[NUSPECIES]