11 #include <bigfile-mpi.h>
12 #include <gsl/gsl_integration.h>
13 #include <gsl/gsl_errno.h>
14 #include <gsl/gsl_interp.h>
15 #include <gsl/gsl_sf_bessel.h>
28 #define FLOAT_ACC 1e-6
61 double fslength(
Cosmology *
CP,
const double logai,
const double logaf,
const double light);
67 static inline double get_delta_tot(
const double delta_nu_curr,
const double delta_cdm_curr,
const double OmegaNua3,
const double Omeganonu,
const double Omeganu1,
const double particle_nu_fraction)
69 const double fcdm = 1 - OmegaNua3/(Omeganonu + Omeganu1);
70 return fcdm * (delta_cdm_curr + delta_nu_curr * OmegaNua3/(Omeganonu + Omeganu1*
particle_nu_fraction));
103 gsl_interp_accel *acc = gsl_interp_accel_alloc();
113 for(ik=0;ik<d_tot->
nk;ik++) {
123 d_tot->
wavenum[ik] = wavenum[ik];
125 gsl_interp_accel_free(acc);
126 gsl_interp_free(spline);
148 for(i = 0; i < PowerSpectrum->
nonzero; i++)
149 PowerSpectrum->
logknu[i] = log(PowerSpectrum->
kk[i]);
151 double * Power_in = PowerSpectrum->
Power;
155 double * logPower = (
double *)
mymalloc(
"logpk", PowerSpectrum->
nonzero *
sizeof(
double));
156 for(i = 0; i < PowerSpectrum->
nonzero; i++)
157 logPower[i] = log(PowerSpectrum->
Power[i]);
158 gsl_interp * pkint = gsl_interp_alloc(gsl_interp_linear, PowerSpectrum->
nonzero);
159 gsl_interp_init(pkint, PowerSpectrum->
logknu, logPower, PowerSpectrum->
nonzero);
160 gsl_interp_accel * pkacc = gsl_interp_accel_alloc();
163 if(pkint->xmax <
logk || pkint->xmin >
logk)
166 Power_in[i] = exp(gsl_interp_eval(pkint, PowerSpectrum->
logknu, logPower,
logk, pkacc));
169 gsl_interp_accel_free(pkacc);
170 gsl_interp_free(pkint);
206 gsl_interp_accel * pkacc = gsl_interp_accel_alloc();
222 for(i=0; i < PowerSpectrum->
nonzero; i++) {
227 if(
logk > pkint->xmax)
229 PowerSpectrum->
delta_nu_ratio[i] = gsl_interp_eval(pkint, logwavenum, delta_nu_ratio,
logk, pkacc);
233 gsl_interp_accel_free(pkacc);
234 gsl_interp_free(pkint);
244 MPI_Comm_rank(MPI_COMM_WORLD, &
ThisTask);
250 FILE * fp = fopen(fname,
"w");
251 fprintf(fp,
"# in Mpc/h Units \n");
252 fprintf(fp,
"# k P_nu(k) Nmodes\n");
253 fprintf(fp,
"# a= %g\n", Time);
254 fprintf(fp,
"# nk = %d\n", PowerSpectrum->
nonzero);
255 for(i = 0; i < PowerSpectrum->
nonzero; i++){
261 gsl_interp_free(PowerSpectrum->
nu_spline);
262 gsl_interp_accel_free(PowerSpectrum->
nu_acc);
272 double * delta_tot = (
double *)
mymalloc(
"tmp_delta",nk * ia *
sizeof(
double));
274 for(ik=0;ik< nk;ik++)
279 if(0 != big_file_mpi_create_block(bf, &bn,
"Neutrino", NULL, 0, 0, 0, MPI_COMM_WORLD)) {
280 endrun(0,
"Failed to create block at %s:%s\n",
"Neutrino",
281 big_file_get_error_message());
283 if ( (0 != big_block_set_attr(&bn,
"Nscale", &ia,
"u8", 1)) ||
284 (0 != big_block_set_attr(&bn,
"scalefact", scalefact,
"f8", ia)) ||
285 (0 != big_block_set_attr(&bn,
"Nkval", &nk,
"u8", 1)) ) {
286 endrun(0,
"Failed to write neutrino attributes %s\n",
287 big_file_get_error_message());
289 if(0 != big_block_mpi_close(&bn, MPI_COMM_WORLD)) {
290 endrun(0,
"Failed to close block %s\n",
291 big_file_get_error_message());
293 BigArray deltas = {0};
294 size_t dims[2] = {0 , ia};
300 ptrdiff_t strides[2] = {(ptrdiff_t) (
sizeof(
double) * ia), (ptrdiff_t)
sizeof(double)};
301 big_array_init(&deltas, delta_tot,
"=f8", 2, dims, strides);
305 BigArray delta_nu = {0};
307 strides[0] =
sizeof(double);
311 BigArray kvalue = {0};
325 if(0 == big_file_mpi_open_block(bf, &bn,
"ICTransfers", MPI_COMM_WORLD)) {
327 endrun(0,
"Failed to read attr: %s\n", big_file_get_error_message());
328 if(0 != big_block_mpi_close(&bn, MPI_COMM_WORLD))
329 endrun(0,
"Failed to close block %s\n",big_file_get_error_message());
346 size_t dims[2] = {0, 1};
347 ptrdiff_t strides[2] = {
sizeof(double),
sizeof(
double)};
353 big_array_init(&Tnu,
t_init->
T_nu,
"=f8", 2, dims, strides);
364 big_array_init(&Tcb, T_cb,
"=f8", 2, dims, strides);
380 size_t nk, ia, ik, i;
382 if(0 != big_file_mpi_open_block(bf, &bn,
"Neutrino", MPI_COMM_WORLD)) {
383 endrun(0,
"Failed to open block at %s:%s\n",
"Neutrino",
384 big_file_get_error_message());
387 (0 != big_block_get_attr(&bn,
"Nscale", &ia,
"u8", 1)) ||
388 (0 != big_block_get_attr(&bn,
"Nkval", &nk,
"u8", 1))) {
389 endrun(0,
"Failed to read attr: %s\n",
390 big_file_get_error_message());
392 double *delta_tot = (
double *)
mymalloc(
"tmp_nusave",ia*nk*
sizeof(
double));
395 endrun(0,
"Failed to read attr: %s\n", big_file_get_error_message());
396 if(0 != big_block_mpi_close(&bn, MPI_COMM_WORLD)) {
397 endrun(0,
"Failed to close block %s\n",
398 big_file_get_error_message());
400 BigArray deltas = {0};
401 size_t dims[2] = {0, ia};
402 ptrdiff_t strides[2] = {(ptrdiff_t) (
sizeof(
double)*ia), (ptrdiff_t)
sizeof(double)};
408 big_array_init(&deltas, delta_tot,
"=f8", 2, dims, strides);
421 BigArray delta_nu = {0};
423 strides[0] =
sizeof(double);
428 BigArray kvalue = {0};
462 d_tot->
namax=ceil(100*(TimeMax-TimeTransfer))+2;
464 d_tot->
delta_tot =(
double **)
mymalloc(
"kspace_delta_tot",nk_in*
sizeof(
double *));
475 for(count=1; count< nk_in; count++)
499 memset(delta_nu_curr, 0, d_tot->
nk*
sizeof(
double));
505 double * delta_nu_single = (
double *)
mymalloc(
"delta_nu_single",
sizeof(
double) * d_tot->
nk);
508 for(ik=0; ik<d_tot->
nk; ik++)
509 delta_nu_curr[ik]+=delta_nu_single[ik]*omeganu/Omega_nu_tot;
530 for (ik = 0; ik < d_tot->
nk; ik++){
540 const double a = exp(loga);
558 gsl_integration_workspace * w = gsl_integration_workspace_alloc (
GSL_VAL);
563 gsl_integration_qag (&F, logai, logaf, 0, 1e-6,
GSL_VAL,6,w,&(fslength_val), &abserr);
564 gsl_integration_workspace_free (w);
565 return light*fslength_val;
586 return (1.+ 0.0168 * x2 + 0.0407* x4)/(1. + 2.1734 * x2 + 1.6787 * exp(4.1811*log(x)) + 0.1467 * x8);
590 static inline double II(
const double x,
const double qc,
const int n)
592 return (n*n+n*n*n*qc+n*qc*x*x - x*x)* qc*gsl_sf_bessel_j0(qc*x) + (2*n+n*n*qc+qc*x*x)*cos(qc*x);
607 integ+= -1*pow((-1),n)*exp(-n*qc)/(n*n+x*x)/(n*n+x*x)*
II(x,qc,n);
611 integ /= 1.5 * 1.202056903159594 * (1 -
nufrac_low);
658 double ai = exp(logai);
669 double fsl_A0a,deriv_prefac;
675 const int Na = d_tot->
ia;
678 double relerr = 1e-6;
684 for (ik = 0; ik < d_tot->
nk; ik++) {
693 delta_nu_curr[ik] = specJ*d_tot->
delta_nu_init[ik] *(1.+ deriv_prefac*fsl_A0a);
702 if(1 - partnu < 1e-3)
712 params.
acc = gsl_interp_accel_alloc();
713 gsl_integration_workspace * w = gsl_integration_workspace_alloc (
GSL_VAL);
719 params.
spline=gsl_interp_alloc(gsl_interp_cspline,Na);
723 params.
spline=gsl_interp_alloc(gsl_interp_linear,Na);
734 params.
fs_acc = gsl_interp_accel_alloc();
735 params.
fs_spline=gsl_interp_alloc(gsl_interp_cspline,Nfs);
740 for(ik=0; ik < Nfs; ik++) {
748 endrun(2016,
"Error initialising and allocating memory for gsl interpolator and integrator.\n");
751 for (ik = 0; ik < d_tot->
nk; ik++) {
752 double abserr,d_nu_tmp;
756 gsl_integration_qag (&F, log(d_tot->
TimeTransfer), log(a), 0, relerr,
GSL_VAL,6,w,&d_nu_tmp, &abserr);
759 gsl_integration_workspace_free (w);
760 gsl_interp_free(params.
spline);
761 gsl_interp_accel_free(params.
acc);
double hubble_function(const Cosmology *CP, double a)
void message(int where, const char *fmt,...)
void endrun(int where, const char *fmt,...)
#define mymalloc(name, size)
#define mymalloc2(name, size)
void init_neutrinos_lra(const int nk_in, const double TimeTransfer, const double TimeMax, const double Omega0, const _omega_nu *const omnu, const double UnitTime_in_s, const double UnitLength_in_cm)
static double get_delta_tot(const double delta_nu_curr, const double delta_cdm_curr, const double OmegaNua3, const double Omeganonu, const double Omeganu1, const double particle_nu_fraction)
static double specialJ_fit(const double x)
void petaio_save_neutrinos(BigFile *bf, int ThisTask)
double fslength(Cosmology *CP, const double logai, const double logaf, const double light)
void petaio_read_neutrinos(BigFile *bf, int ThisTask)
static double II(const double x, const double qc, const int n)
static void delta_tot_first_init(_delta_tot_table *const d_tot, const int nk_in, const double wavenum[], const double delta_cdm_curr[], const double TimeIC)
static double Jfrac_high(const double x, const double qc, const double nufrac_low)
static _transfer_init_table * t_init
double get_delta_nu_int(double logai, void *params)
void petaio_read_icnutransfer(BigFile *bf, int ThisTask)
_delta_tot_table delta_tot_table
void get_delta_nu_combined(Cosmology *CP, const _delta_tot_table *const d_tot, const double a, double delta_nu_curr[])
double fslength_int(const double loga, void *params)
void delta_nu_from_power(struct _powerspectrum *PowerSpectrum, Cosmology *CP, const double Time, const double TimeIC)
void get_delta_nu(Cosmology *CP, const _delta_tot_table *const d_tot, const double a, double delta_nu_curr[], const double mnu)
static _transfer_init_table t_init_data
void update_delta_tot(_delta_tot_table *const d_tot, const double a, const double delta_cdm_curr[], const double delta_nu_curr[], const int overwrite)
void powerspectrum_nu_save(struct _powerspectrum *PowerSpectrum, const char *OutputDir, const char *filename, const double Time)
double specialJ(const double x, const double vcmnubylight, const double nufrac_low)
double omega_nu_single(const _omega_nu *const omnu, const double a, int i)
double particle_nu_fraction(const _hybrid_nu *const hybnu, const double a, const int i)
double nufrac_low(const double qc)
double get_omega_nu(const _omega_nu *const omnu, const double a)
double get_omega_nu_nopart(const _omega_nu *const omnu, const double a)
int petaio_read_block(BigFile *bf, const char *blockname, BigArray *array, int required)
void petaio_save_block(BigFile *bf, const char *blockname, BigArray *array, int verbose)
static double UnitLength_in_cm
char * fastpm_strdup_printf(const char *fmt,...)
gsl_interp_accel * fs_acc
double nufrac_low[NUSPECIES]
int nu_degeneracies[NUSPECIES]
_rho_nu_single RhoNuTab[NUSPECIES]
gsl_interp_accel * nu_acc