CLASS MANUAL
common.h
Go to the documentation of this file.
1 
3 #include "stdio.h"
4 #include "stdlib.h"
5 #include "math.h"
6 #include "string.h"
7 #include "float.h"
8 #include "svnversion.h"
9 #include <stdarg.h>
10 
11 #ifdef _OPENMP
12 #include "omp.h"
13 #endif
14 
15 #ifndef __COMMON__
16 #define __COMMON__
17 
18 #define _VERSION_ "v2.6.0"
19 /* @cond INCLUDE_WITH_DOXYGEN */
20 
21 #define _TRUE_ 1
22 #define _FALSE_ 0
24 #define _SUCCESS_ 0
25 #define _FAILURE_ 1
27 #define _ERRORMSGSIZE_ 2048
28 typedef char ErrorMsg[_ERRORMSGSIZE_];
30 #define _FILENAMESIZE_ 256
31 typedef char FileName[_FILENAMESIZE_];
32 
33 #define _PI_ 3.1415926535897932384626433832795e0
35 #define _PIHALF_ 1.57079632679489661923132169164e0
37 #define _TWOPI_ 6.283185307179586476925286766559e0
39 #define _SQRT2_ 1.41421356237309504880168872421e0
41 #define _SQRT6_ 2.4494897427831780981972840747059e0
43 #define _SQRT_PI_ 1.77245385090551602729816748334e0
45 #define _MAX_IT_ 10000
47 #define _QUADRATURE_MAX_ 250
49 #define _QUADRATURE_MAX_BG_ 800
51 #define _TOLVAR_ 100.
53 #define _HUGE_ 1.e99
54 
55 #define _OUTPUTPRECISION_ 12
57 #define _COLUMNWIDTH_ 24
59 #define _MAXTITLESTRINGLENGTH_ 8000
61 #define _DELIMITER_ "\t"
65 #ifndef __CLASSDIR__
66 #define __CLASSDIR__ "."
67 #endif
68 
69 #define MIN(a,b) (((a)<(b)) ? (a) : (b) )
70 #define MAX(a,b) (((a)<(b)) ? (b) : (a) )
71 #define SIGN(a) (((a)>0) ? 1. : -1. )
72 #define NRSIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))
73 #define index_symmetric_matrix(i1,i2,N) (((i1)<=(i2)) ? (i2+N*i1-(i1*(i1+1))/2) : (i1+N*i2-(i2*(i2+1))/2))
74 /* @endcond */
75 // needed because of weird openmp bug on macosx lion...
76 void class_protect_sprintf(char* dest, char* tpl,...);
77 void class_protect_fprintf(FILE* dest, char* tpl,...);
78 void* class_protect_memcpy(void* dest, void* from, size_t sz);
79 
80 int get_number_of_titles(char * titlestring);
81 
82 #define class_build_error_string(dest,tmpl,...) { \
83  ErrorMsg FMsg; \
84  class_protect_sprintf(FMsg,tmpl,__VA_ARGS__); \
85  class_protect_sprintf(dest,"%s(L:%d) :%s",__func__,__LINE__,FMsg); \
86 }
87 
88 // Error reporting macros
89 
90 // Call
91 #define class_call_message(err_out,extra,err_mess) \
92  class_build_error_string(err_out,"error in %s;\n=>%s",extra,err_mess);
93 
94 /* macro for calling function and returning error if it failed */
95 #define class_call_except(function, error_message_from_function, error_message_output,list_of_commands) { \
96  if (function == _FAILURE_) { \
97  class_call_message(error_message_output,#function,error_message_from_function); \
98  list_of_commands; \
99  return _FAILURE_; \
100  } \
101 }
102 
103 /* macro for trying to call function */
104 #define class_call_try(function, error_message_from_function, error_message_output,list_of_commands) { \
105  if (function == _FAILURE_) { \
106  class_call_message(error_message_output,#function,error_message_from_function); \
107  list_of_commands; \
108  } \
109 }
110 
111 /* macro for calling function and returning error if it failed */
112 #define class_call(function, error_message_from_function, error_message_output) \
113  class_call_except(function, error_message_from_function,error_message_output,)
114 
115 /* same in parallel region */
116 #define class_call_parallel(function, error_message_from_function, error_message_output) { \
117  if (abort == _FALSE_) { \
118  if (function == _FAILURE_) { \
119  class_call_message(error_message_output,#function,error_message_from_function); \
120  abort=_TRUE_; \
121  } \
122  } \
123 }
124 
125 
126 
127 
128 // Alloc
129 #define class_alloc_message(err_out,extra,sz) \
130  class_build_error_string(err_out,"could not allocate %s with size %d",extra,sz);
131 
132 /* macro for allocating memory and returning error if it failed */
133 #define class_alloc(pointer, size, error_message_output) { \
134  pointer=malloc(size); \
135  if (pointer == NULL) { \
136  int size_int; \
137  size_int = size; \
138  class_alloc_message(error_message_output,#pointer, size_int); \
139  return _FAILURE_; \
140  } \
141 }
142 
143 /* same inside parallel structure */
144 #define class_alloc_parallel(pointer, size, error_message_output) { \
145  pointer=NULL; \
146  if (abort == _FALSE_) { \
147  pointer=malloc(size); \
148  if (pointer == NULL) { \
149  int size_int; \
150  size_int = size; \
151  class_alloc_message(error_message_output,#pointer, size_int); \
152  abort=_TRUE_; \
153  } \
154  } \
155 }
156 
157 /* macro for allocating memory, initializing it with zeros/ and returning error if it failed */
158 #define class_calloc(pointer, init,size, error_message_output) { \
159  pointer=calloc(init,size); \
160  if (pointer == NULL) { \
161  int size_int; \
162  size_int = size; \
163  class_alloc_message(error_message_output,#pointer, size_int); \
164  return _FAILURE_; \
165  } \
166 }
167 
168 /* macro for re-allocating memory, returning error if it failed */
169 #define class_realloc(pointer, newname, size, error_message_output) { \
170  pointer=realloc(newname,size); \
171  if (pointer == NULL) { \
172  int size_int; \
173  size_int = size; \
174  class_alloc_message(error_message_output,#pointer, size_int); \
175  return _FAILURE_; \
176  } \
177 }
178 
179 // Testing
180 
181 #define class_test_message(err_out,extra,args...) { \
182  ErrorMsg Optional_arguments; \
183  class_protect_sprintf(Optional_arguments,args); \
184  class_build_error_string(err_out,"condition (%s) is true; %s",extra,Optional_arguments); \
185 }
186 
187 /* macro for testing condition and returning error if condition is true;
188  args is a variable list of optional arguments, e.g.: args="x=%d",x
189  args cannot be empty, if there is nothing to pass use args="" */
190 #define class_test_except(condition, error_message_output,list_of_commands, args...) { \
191  if (condition) { \
192  class_test_message(error_message_output,#condition, args); \
193  list_of_commands; \
194  return _FAILURE_; \
195  } \
196 }
197 
198 #define class_test(condition, error_message_output, args...) { \
199  if (condition) { \
200  class_test_message(error_message_output,#condition, args); \
201  return _FAILURE_; \
202  } \
203 }
204 
205 #define class_test_parallel(condition, error_message_output, args...) { \
206  if (abort == _FALSE_) { \
207  if (condition) { \
208  class_test_message(error_message_output,#condition, args); \
209  abort=_TRUE_; \
210  } \
211  } \
212 }
213 
214 /* macro for returning error message;
215  args is a variable list of optional arguments, e.g.: args="x=%d",x
216  args cannot be empty, if there is nothing to pass use args="" */
217 #define class_stop(error_message_output,args...) { \
218  ErrorMsg Optional_arguments; \
219  class_protect_sprintf(Optional_arguments,args); \
220  class_build_error_string(error_message_output,"error; %s",Optional_arguments); \
221  return _FAILURE_; \
222 }
223 
224 // IO
225 /* macro for opening file and returning error if it failed */
226 #define class_open(pointer, filename, mode, error_output) { \
227  pointer=fopen(filename,mode); \
228  if (pointer == NULL) { \
229  class_build_error_string(error_output,"could not open %s with name %s and mode %s",#pointer,filename,#mode); \
230  return _FAILURE_; \
231  } \
232 }
233 
234 /* macro for defining indices (usually one, sometimes a block) */
235 #define class_define_index(index, \
236  condition, \
237  running_index, \
238  number_of_indices) { \
239  if (condition) { \
240  index = running_index; \
241  running_index += number_of_indices; \
242  } \
243  }
244 
245 /* macros for writing formatted output */
246 #define class_fprintf_double(file, \
247  output, \
248  condition){ \
249  if (condition == _TRUE_) \
250  fprintf(file,"%*.*e ",_COLUMNWIDTH_,_OUTPUTPRECISION_,output); \
251  }
252 
253 #define class_fprintf_double_or_default(file, \
254  output, \
255  condition, \
256  defaultvalue){ \
257  if (condition == _TRUE_) \
258  fprintf(file,"%*.*e ",_COLUMNWIDTH_,_OUTPUTPRECISION_,output); \
259  else \
260  fprintf(file,"%*.*e ",_COLUMNWIDTH_,_OUTPUTPRECISION_,defaultvalue); \
261 }
262 
263 #define class_fprintf_int(file, \
264  output, \
265  condition){ \
266  if (condition == _TRUE_) \
267  fprintf(file,"%*d%*s ", \
268  MAX(0,_COLUMNWIDTH_-_OUTPUTPRECISION_-5), \
269  output, _OUTPUTPRECISION_+5," "); \
270  }
271 
272 #define class_fprintf_columntitle(file, \
273  title, \
274  condition, \
275  colnum){ \
276  if (condition == _TRUE_) \
277  fprintf(file,"%*s%2d:%-*s ", \
278  MAX(0,MIN(_COLUMNWIDTH_-_OUTPUTPRECISION_-6-3,_COLUMNWIDTH_-((int) strlen(title))-3)), \
279  "",colnum++,_OUTPUTPRECISION_+6,title); \
280  }
281 
282 #define class_store_columntitle(titlestring, \
283  title, \
284  condition){ \
285  if (condition == _TRUE_){ \
286  strcat(titlestring,title); \
287  strcat(titlestring,_DELIMITER_); \
288  } \
289  }
290 //,_MAXTITLESTRINGLENGTH_-strlen(titlestring)-1);
291 
292 #define class_store_double(storage, \
293  value, \
294  condition, \
295  dataindex){ \
296  if (condition == _TRUE_) \
297  storage[dataindex++] = value; \
298  }
299 
300 #define class_store_double_or_default(storage, \
301  value, \
302  condition, \
303  dataindex, \
304  defaultvalue){ \
305  if (condition == _TRUE_) \
306  storage[dataindex++] = value; \
307  else \
308  storage[dataindex++] = defaultvalue; \
309 }
310 
317  rk, /* Runge-Kutta integrator */
318  ndf15 /* stiff integrator */
319 };
320 
327 enum pk_def {
332 };
337 enum file_format {class_format,camb_format};
338 
345 struct precision
346 {
347 
350 
356 
362 
367 
368 
374 
379  double tol_M_ncdm;
380 
387 
394 
400  double tol_ncdm;
401 
406  double tol_ncdm_bg;
407 
413 
417  double safe_phi_scf;
418 
420 
424 
425  /* - for bbn */
426 /* @cond INCLUDE_WITH_DOXYGEN */
427  FileName sBBN_file;
428 /* @endcond */
429  /* - for recombination */
430 
431  /* initial and final redshifts in recfast */
432 
435  /* parameters governing precision of integration */
436 
440  /* He fudge parameters from recfast 1.4 */
441 
445  /* H fudge parameters from recfast 1.5 (Gaussian fits for extra H physics by Adam Moss) */
446 
457  /* triggers for switching approximations; ranges for doing it smoothly */
458 
459  double recfast_z_He_1;
462  double recfast_z_He_2;
465  double recfast_z_He_3;
476  double recfast_H_frac;
477 /* @cond INCLUDE_WITH_DOXYGEN */
478  FileName hyrec_Alpha_inf_file;
479  FileName hyrec_R_inf_file;
480  FileName hyrec_two_photon_tables_file;
481 /* @endcond */
482  /* - for reionization */
483 
489  /* - general */
490 
494 
498 
501  double k_min_tau0;
505  double k_step_sub;
506  double k_step_super;
514  double k_bao_center;
516  double k_bao_width;
531 
539 
544  int l_max_g;
546  int l_max_dr;
547  int l_max_ur;
552  double curvature_ini;
553  double entropy_ini;
554  double gw_ini;
560 
565 
570 
577 
582 
590 
598 
606 
614 
620 
622 
626 
647 
651 
652  int l_linstep;
654  double l_logstep;
656  /* parameters relevant for bessel functions */
657  double hyper_x_min;
663  double hyper_x_tol;
666  /* parameters relevant for transfer function */
667 
668  double q_linstep;
678  double q_logstep_open;
717 
720 
723 
726 
729 
732 
735 
738 
740 
744 
747  double halofit_dz;
775 
779 
785 
789 
793 
797 
798  ErrorMsg error_message;
801 
802 };
803 
804 
805 
806 #endif
double k_step_sub
Definition: common.h:505
double reionization_sampling
Definition: common.h:485
double start_large_k_at_tau_h_over_tau_k
Definition: common.h:520
double start_small_k_at_tau_c_over_tau_h
Definition: common.h:518
double recfast_x_H0_trigger2
Definition: common.h:473
double tol_gauss_legendre
Definition: common.h:783
double radiation_streaming_trigger_tau_c_over_tau
Definition: common.h:597
double transfer_neglect_delta_k_V_t2
Definition: common.h:706
double ncdm_fluid_trigger_tau_over_tau_k
Definition: common.h:613
double transfer_neglect_delta_k_S_t2
Definition: common.h:703
double tol_tau_approx
Definition: common.h:576
Definition: common.h:330
double perturb_sampling_stepsize
Definition: common.h:564
double recfast_wGauss2
Definition: common.h:455
int l_max_g
Definition: common.h:544
double hyper_sampling_flat
Definition: common.h:658
double hyper_x_tol
Definition: common.h:663
double recfast_delta_z_He_1
Definition: common.h:460
double tol_thermo_integration
Definition: common.h:438
double neglect_CMB_sources_below_visibility
Definition: common.h:619
double halofit_min_k_max
Definition: common.h:764
double recfast_x_He0_trigger_delta
Definition: common.h:470
double primordial_inflation_attractor_precision_initial
Definition: common.h:636
enum evolver_type evolver
Definition: common.h:499
double tol_perturb_integration
Definition: common.h:569
double recfast_AGauss1
Definition: common.h:450
double recfast_x_H0_trigger_delta
Definition: common.h:474
double q_logstep_spline
Definition: common.h:673
int delta_l_max
Definition: common.h:782
int thermo_rate_smoothing_radius
Definition: common.h:491
double transfer_neglect_delta_k_S_t0
Definition: common.h:701
double gw_ini
Definition: common.h:554
int radiation_streaming_approximation
Definition: common.h:581
double tol_ncdm_initial_w
Definition: common.h:412
double halofit_min_k_nonlinear
Definition: common.h:754
double primordial_inflation_bg_stepsize
Definition: common.h:633
double recfast_x_H0_trigger
Definition: common.h:472
double hyper_nu_sampling_step
Definition: common.h:661
double recfast_delta_z_He_3
Definition: common.h:466
double l_switch_limber_for_nc_local_over_z
Definition: common.h:719
int recfast_Nz0
Definition: common.h:437
double hyper_x_min
Definition: common.h:657
int l_max_dr
Definition: common.h:546
double recfast_H_frac
Definition: common.h:476
double transfer_neglect_delta_k_S_t1
Definition: common.h:702
pk_def
Definition: common.h:327
double recfast_z_initial
Definition: common.h:433
int primordial_inflation_phi_ini_maxit
Definition: common.h:631
double tol_background_integration
Definition: common.h:366
double transfer_neglect_delta_k_V_b
Definition: common.h:708
double hyper_sampling_curved_low_nu
Definition: common.h:659
int recfast_Hswitch
Definition: common.h:447
double recfast_z_He_1
Definition: common.h:459
int ur_fluid_approximation
Definition: common.h:599
int l_max_ncdm
Definition: common.h:548
double k_per_decade_primordial
Definition: common.h:627
double recfast_delta_z_He_2
Definition: common.h:463
double k_per_decade_for_pk
Definition: common.h:510
double perturb_integration_stepsize
Definition: common.h:559
double start_sources_at_tau_c_over_tau_h
Definition: common.h:540
double primordial_inflation_attractor_precision_pivot
Definition: common.h:635
double primordial_inflation_aH_ini_target
Definition: common.h:639
double k_per_decade_for_bao
Definition: common.h:512
double tight_coupling_trigger_tau_c_over_tau_k
Definition: common.h:538
double tol_ncdm
Definition: common.h:400
double l_logstep
Definition: common.h:654
evolver_type
Definition: common.h:316
double transfer_neglect_delta_k_V_e
Definition: common.h:707
double reionization_start_factor
Definition: common.h:487
double recfast_fudge_H
Definition: common.h:448
double primordial_inflation_ratio_max
Definition: common.h:630
double tight_coupling_trigger_tau_c_over_tau_h
Definition: common.h:530
double primordial_inflation_end_dphi
Definition: common.h:640
Definition: common.h:329
double k_bao_center
Definition: common.h:514
double recfast_zGauss2
Definition: common.h:453
int num_mu_minus_lmax
Definition: common.h:781
double halofit_sigma_precision
Definition: common.h:758
double safe_phi_scf
Definition: common.h:417
double a_ini_over_a_today_default
Definition: common.h:355
double transfer_neglect_delta_k_T_e
Definition: common.h:710
double back_integration_stepsize
Definition: common.h:361
double recfast_wGauss1
Definition: common.h:454
double recfast_z_He_3
Definition: common.h:465
int accurate_lensing
Definition: common.h:780
double q_logstep_open
Definition: common.h:678
double q_numstep_transition
Definition: common.h:696
int tight_coupling_approximation
Definition: common.h:542
double recfast_z_He_2
Definition: common.h:462
double q_linstep
Definition: common.h:668
double k_min_tau0
Definition: common.h:501
double primordial_inflation_extra_efolds
Definition: common.h:644
double l_switch_limber
Definition: common.h:716
double reionization_optical_depth_tol
Definition: common.h:486
double selection_tophat_edge
Definition: common.h:737
double selection_sampling
Definition: common.h:728
double l_switch_limber_for_nc_los_over_z
Definition: common.h:722
double transfer_neglect_delta_k_V_t1
Definition: common.h:705
double tol_ncdm_newtonian
Definition: common.h:386
double k_step_super_reduction
Definition: common.h:508
ErrorMsg error_message
Definition: common.h:798
double primordial_inflation_small_epsilon
Definition: common.h:642
double tol_initial_Omega_r
Definition: common.h:373
double primordial_inflation_pt_stepsize
Definition: common.h:632
double hyper_flat_approximation_nu
Definition: common.h:664
double recfast_AGauss2
Definition: common.h:451
double k_bao_width
Definition: common.h:516
double primordial_inflation_small_epsilon_tol
Definition: common.h:643
double transfer_neglect_delta_k_S_e
Definition: common.h:704
file_format
Definition: common.h:337
double primordial_inflation_ratio_min
Definition: common.h:629
double primordial_inflation_tol_curvature
Definition: common.h:638
double transfer_neglect_late_source
Definition: common.h:713
double transfer_neglect_delta_k_T_t2
Definition: common.h:709
double tol_M_ncdm
Definition: common.h:379
double curvature_ini
Definition: common.h:552
Definition: common.h:328
double radiation_streaming_trigger_tau_over_tau_k
Definition: common.h:589
double k_step_transition
Definition: common.h:507
int l_max_g_ten
Definition: common.h:549
double recfast_x_He0_trigger
Definition: common.h:468
double transfer_neglect_delta_k_T_b
Definition: common.h:711
Definition: common.h:331
double tol_ncdm_bg
Definition: common.h:406
int ncdm_fluid_approximation
Definition: common.h:607
double recfast_fudge_He
Definition: common.h:443
double ur_fluid_trigger_tau_over_tau_k
Definition: common.h:605
int l_max_ur
Definition: common.h:547
double smallest_allowed_variation
Definition: common.h:790
double k_step_super
Definition: common.h:506
Definition: common.h:345
double selection_sampling_bessel_los
Definition: common.h:734
double tol_ncdm_synchronous
Definition: common.h:393
double hyper_sampling_curved_high_nu
Definition: common.h:660
double q_logstep_trapzd
Definition: common.h:685
int l_linstep
Definition: common.h:652
double primordial_inflation_end_logstep
Definition: common.h:641
double selection_sampling_bessel
Definition: common.h:731
double hyper_phi_min_abs
Definition: common.h:662
double entropy_ini
Definition: common.h:553
double halofit_dz
Definition: common.h:747
double k_max_tau0_over_l_max
Definition: common.h:503
int l_max_pol_g
Definition: common.h:545
double halofit_k_per_decade
Definition: common.h:769
int primordial_inflation_attractor_maxit
Definition: common.h:637
int l_max_pol_g_ten
Definition: common.h:550
double selection_cut_at_sigma
Definition: common.h:725
double recfast_zGauss1
Definition: common.h:452
double recfast_delta_fudge_H
Definition: common.h:449
double primordial_inflation_tol_integration
Definition: common.h:634
double reionization_z_start_max
Definition: common.h:484
double recfast_x_He0_trigger2
Definition: common.h:469
int recfast_Heswitch
Definition: common.h:442