Fast Methods for Cosmological Simulations
FastSim serves as a tool for quick N-body simulations in modified gravity.
spectra.c
Go to the documentation of this file.
1 #include "common.h"
2 
3 typedef struct {
4  int l;
6  char *tr1;
7  char *tr2;
8 } IntClPar;
9 
10 static double cl_integrand(double lk,void *params)
11 {
12  double d1,d2;
13  IntClPar *p=(IntClPar *)params;
14  double k=pow(10.,lk);
15  double pk=csm_Pk_linear_0(p->par->cpar,k);
16  d1=transfer_wrap(p->l,k,p->par,p->tr1,0);
17  d2=transfer_wrap(p->l,k,p->par,p->tr2,1);
18 
19  return k*d1*d2*pk;
20 }
21 
22 static double spectra(char *tr1,char *tr2,int l,RunParams *par)
23 {
24  IntClPar ipar;
25  double result=0,eresult;
26  gsl_function F;
27  gsl_integration_workspace *w=gsl_integration_workspace_alloc(1000);
28  ipar.l=l;
29  ipar.par=par;
30  ipar.tr1=tr1;
31  ipar.tr2=tr2;
32  F.function=&cl_integrand;
33  F.params=&ipar;
34  gsl_integration_qag(&F,D_LKMIN,D_LKMAX,0,1E-4,1000,GSL_INTEG_GAUSS41,w,&result,&eresult);
35  gsl_integration_workspace_free(w);
36 
37  return M_LN10*2*result/(2*l+1.);
38 }
39 
41 {
42  printf("Computing power spectra\n");
43 #ifdef _HAS_OMP
44 #pragma omp parallel default(none) shared(par)
45  {
46 #endif //_HAS_OMP
47  int l;
48 #ifdef _HAS_OMP
49 #pragma omp for
50 #endif //_HAS_OMP
51  for(l=0;l<=par->lmax;l++) {
52 #ifdef _DEBUG
53  printf("%d \n",l);
54 #endif //_DEBUG
55  if(par->do_nc) {
56  par->cl_dd[l]=spectra("nc","nc",l,par);
57  if(par->do_shear) {
58  par->cl_d1l2[l]=spectra("nc","shear",l,par);
59  par->cl_d2l1[l]=spectra("shear","nc",l,par);
60  }
61  if(par->do_cmblens)
62  par->cl_dc[l]=spectra("nc","cmblens",l,par);
63  if(par->do_isw)
64  par->cl_di[l]=spectra("nc","isw",l,par);
65  }
66  if(par->do_shear) {
67  par->cl_ll[l]=spectra("shear","shear",l,par);
68  if(par->do_cmblens)
69  par->cl_lc[l]=spectra("shear","cmblens",l,par);
70  if(par->do_isw)
71  par->cl_li[l]=spectra("shear","isw",l,par);
72  }
73  if(par->do_cmblens) {
74  par->cl_cc[l]=spectra("cmblens","cmblens",l,par);
75  if(par->do_isw)
76  par->cl_ci[l]=spectra("cmblens","isw",l,par);
77  }
78  if(par->do_isw)
79  par->cl_ii[l]=spectra("isw","isw",l,par);
80  } //end omp for
81 #ifdef _HAS_OMP
82  } //end omp parallel
83 #endif //_HAS_OMP
84 }
85 
86 typedef struct {
87  int i_bessel;
89  double th;
91  double *cl;
92 } IntWtPar;
93 
94 static double wt_integrand(double l,void *params)
95 {
96  IntWtPar *p=(IntWtPar *)params;
97  double x=l*p->th;
98  // double cl=spline_eval(l,p->clsp);
99  double cl=p->cl[(int)l];
100  double jbes;
101 
102  if(p->i_bessel)
103  jbes=gsl_sf_bessel_Jn(p->i_bessel,x);
104  else
105  jbes=gsl_sf_bessel_J0(x);
106 
107  return l*jbes*cl;
108 }
109 
110 static void compute_wt_single(RunParams *par,double *cl,double *wt,double *llist,int bessel_order)
111 {
112 #ifdef _HAS_OMP
113 #pragma omp parallel default(none) \
114  shared(par,cl,wt,llist,bessel_order)
115  {
116 #endif //_HAS_OMP
117  int ith;
118  double result,eresult;
119  gsl_function F;
120  gsl_integration_workspace *w=gsl_integration_workspace_alloc(1000);
121  SplPar *clsp=spline_init((par->lmax+1),llist,cl,0,0);
122  IntWtPar ipar;
123 
124  ipar.i_bessel=bessel_order;
125  ipar.par=par;
126  ipar.clsp=clsp;
127  ipar.cl=cl;
128 
129 #ifdef _HAS_OMP
130 #pragma omp for
131 #endif //_HAS_OMP
132  for(ith=0;ith<par->n_th;ith++) {
133  if(par->do_w_theta_logbin)
134  ipar.th=DTOR*par->th_max*pow(10.,(ith+0.5-par->n_th)/par->n_th_logint);
135  else
136  ipar.th=DTOR*(par->th_min+(par->th_max-par->th_min)*(ith+0.5)/par->n_th);
137  F.function=&wt_integrand;
138  F.params=&ipar;
139  gsl_integration_qag(&F,llist[0],llist[par->lmax],0,1E-4,1000,GSL_INTEG_GAUSS41,w,&result,&eresult);
140  wt[ith]=result/(2*M_PI);
141  }//end omp for
142  gsl_integration_workspace_free(w);
143  spline_free(clsp);
144 #ifdef _HAS_OMP
145  } //end omp parallel
146 #endif //_HAS_OMP
147 }
148 
150 {
151  if(par->do_w_theta) {
152  int l;
153  double *llist;
154 
155  printf("Computing correlation functions\n");
156 
157  llist=dam_malloc((par->lmax+1)*sizeof(double));
158  for(l=0;l<=par->lmax;l++)
159  llist[l]=(float)l;
160 
161  if(par->do_nc) {
162  compute_wt_single(par,par->cl_dd,par->wt_dd,llist,0);
163  if(par->do_shear) {
164  compute_wt_single(par,par->cl_d1l2,par->wt_d1l2,llist,0);
165  compute_wt_single(par,par->cl_d2l1,par->wt_d2l1,llist,0);
166  }
167  if(par->do_cmblens)
168  compute_wt_single(par,par->cl_dc,par->wt_dc,llist,0);
169  if(par->do_isw)
170  compute_wt_single(par,par->cl_di,par->wt_di,llist,0);
171  }
172  if(par->do_shear) {
173  compute_wt_single(par,par->cl_ll,par->wt_ll_pp,llist,0);
174  compute_wt_single(par,par->cl_ll,par->wt_ll_mm,llist,4);
175  if(par->do_cmblens)
176  compute_wt_single(par,par->cl_lc,par->wt_lc,llist,0);
177  if(par->do_isw)
178  compute_wt_single(par,par->cl_li,par->wt_li,llist,0);
179  }
180  if(par->do_cmblens) {
181  compute_wt_single(par,par->cl_cc,par->wt_cc,llist,0);
182  if(par->do_isw)
183  compute_wt_single(par,par->cl_ci,par->wt_ci,llist,0);
184  }
185  if(par->do_isw)
186  compute_wt_single(par,par->cl_ii,par->wt_ii,llist,0);
187  free(llist);
188  }
189  else {
190  printf("Skipping correlation functions\n");
191  }
192 }
double * cl_ci
Definition: common.h:65
double * wt_d1l2
Definition: common.h:74
int i_bessel
Definition: spectra.c:87
double * wt_di
Definition: common.h:77
double * wt_li
Definition: common.h:81
double * cl_d1l2
Definition: common.h:57
int do_isw
Definition: common.h:41
SplPar * clsp
Definition: spectra.c:90
double * wt_dc
Definition: common.h:76
Csm_params * cpar
Definition: common.h:33
static void compute_wt_single(RunParams *par, double *cl, double *wt, double *llist, int bessel_order)
Definition: spectra.c:110
double * cl
Definition: spectra.c:91
int lmax
Definition: common.h:32
double * wt_lc
Definition: common.h:80
int l
Definition: spectra.c:4
static double cl_integrand(double lk, void *params)
Definition: spectra.c:10
RunParams * par
Definition: spectra.c:88
double * wt_ll_pp
Definition: common.h:78
SplPar * spline_init(int n, double *x, double *y, double y0, double yf)
Definition: common.c:57
int do_cmblens
Definition: common.h:40
double th_max
Definition: common.h:70
#define M_PI
Definition: ccl_constants.h:22
static double spectra(char *tr1, char *tr2, int l, RunParams *par)
Definition: spectra.c:22
#define D_LKMIN
Definition: params.h:7
double * cl_cc
Definition: common.h:64
int n_th
Definition: common.h:71
double * cl_di
Definition: common.h:60
int n_th_logint
Definition: common.h:72
static CCL_BEGIN_DECLS double x[111][8]
void compute_spectra(RunParams *par)
Definition: spectra.c:40
char * tr2
Definition: spectra.c:7
double * cl_d2l1
Definition: common.h:58
double * cl_ll
Definition: common.h:61
double th
Definition: spectra.c:89
dictionary params
Definition: halomod_bm.py:27
void * dam_malloc(size_t size)
Definition: common.c:3
int do_shear
Definition: common.h:39
int do_nc
Definition: common.h:38
double * cl_dd
Definition: common.h:56
static double wt_integrand(double l, void *params)
Definition: spectra.c:94
void spline_free(SplPar *spl)
Definition: common.c:81
double * wt_cc
Definition: common.h:82
RunParams * par
Definition: spectra.c:5
static int p
Definition: ccl_emu17.c:25
double th_min
Definition: common.h:69
double * cl_li
Definition: common.h:63
double * wt_d2l1
Definition: common.h:75
float pow(float base, unsigned long int exp)
Definition: precision.hpp:39
char * tr1
Definition: spectra.c:6
double * cl_ii
Definition: common.h:66
double * wt_ii
Definition: common.h:84
double * wt_ll_mm
Definition: common.h:79
double * cl_dc
Definition: common.h:59
static double transfer_wrap(int il, double lk, ccl_cosmology *cosmo, CCL_ClWorkspace *w, CCL_ClTracer *clt, int *status)
Definition: ccl_cls.c:795
double * wt_dd
Definition: common.h:73
#define D_LKMAX
Definition: params.h:8
static double w[2][28][111]
Definition: ccl_emu17.c:33
int do_w_theta
Definition: common.h:67
void compute_w_theta(RunParams *par)
Definition: spectra.c:149
int do_w_theta_logbin
Definition: common.h:68
#define DTOR
Definition: common.h:14
double * wt_ci
Definition: common.h:83
double * cl_lc
Definition: common.h:62