35 function getcambparams ()
RESULT(params) bind(C, NAME='GetCAMBparams')
37 use,
intrinsic :: iso_c_binding, only: c_ptr, c_loc
39 type(CAMBparams),
pointer :: p
46 end function getcambparams
50 function getcambdata ()
RESULT(data) bind(C, NAME='GetCAMBdata')
52 use,
intrinsic :: iso_c_binding, only: c_ptr, c_loc
54 type(CAMBdata),
pointer :: pp
61 end function getcambdata
65 subroutine setcambparams (params, ombh2, omch2, omnuh2, massless_nu, massive_nu, neutrino_hierarchy, omk, H0, dark_energy_model, w, wa, tau, cs2_lam, T_cmb, helium_fraction) bind(C, NAME='SetCAMBparams')
67 use,
intrinsic :: iso_c_binding, only: c_ptr, c_f_pointer, c_double, c_int
68 type(c_ptr),
intent(in),
value :: params
69 real(c_double),
intent(in),
value :: ombh2, omch2, omnuh2, massless_nu, omk, H0, w, wa, tau, T_cmb, helium_fraction, cs2_lam
70 integer(c_int),
intent(in),
value :: massive_nu, neutrino_hierarchy, dark_energy_model
71 real*8 :: omnuh2_sterile
72 type(CAMBparams),
pointer :: p
74 call c_f_pointer(params, p)
76 call camb_setdefparams(p)
83 p%Yhe = helium_fraction
85 select type(reion=>p%Reion)
86 class is (ttanhreionization)
87 reion%Reionization = .false.
88 reion%use_optical_depth = .true.
89 reion%optical_depth = tau
90 reion%delta_redshift = 1.5
92 reion%helium_redshift = 3.5
93 reion%helium_delta_redshift = 0.4
94 reion%helium_redshiftstart = reion%helium_redshift + 5*reion%helium_delta_redshift
97 select type(recomb=>p%Recomb)
99 recomb%RECFAST_fudge_He = 0.86
100 recomb%RECFAST_Heswitch = 6
101 recomb%RECFAST_Hswitch = .true.
102 recomb%RECFAST_fudge = 1.14
103 if (recomb%RECFAST_Hswitch)
then
104 recomb%RECFAST_fudge = recomb%RECFAST_fudge - (1.14_dl - (1.105d0 + 0.02d0))
108 do_bispectrum = .false.
110 p%Scalar_initial_condition = 1
114 p%share_delta_neff = .false.
115 p%MassiveNuMethod = 1
116 call cambparams_setneutrinohierarchy(p, omnuh2, omnuh2_sterile, massless_nu+massive_nu, neutrino_hierarchy, massive_nu)
119 if (
allocated(p%DarkEnergy))
deallocate(p%DarkEnergy)
120 if (dark_energy_model == 0)
then
121 allocate (tdarkenergyfluid::p%DarkEnergy)
122 else if (dark_energy_model == 1)
then
123 allocate (tdarkenergyppf::p%DarkEnergy)
124 else if (dark_energy_model == 2)
then
125 allocate (taxioneffectivefluid::p%DarkEnergy)
126 else if (dark_energy_model == 3)
then
127 allocate (tearlyquintessence::p%DarkEnergy)
129 error stop
'Unknown dark energy model!'
132 select type(darkenergy=>p%DarkEnergy)
133 class is (tdarkenergyeqnofstate)
134 darkenergy%no_perturbations = .false.
135 darkenergy%use_tabulated_w = .false.
138 darkenergy%cs2_lam = cs2_lam
142 p%Accuracy%AccuratePolarization = .false.
143 p%Accuracy%AccurateBB = .false.
144 p%Accuracy%AccurateReionization = .false.
145 p%Accuracy%AccuracyBoost = 1
146 p%Accuracy%lAccuracyBoost = 1
147 p%Accuracy%lSampleBoost = 1
151 p%Max_l_tensor = 1500
152 p%Max_eta_k_tensor = 3000
154 p%WantDerivedParameters = .false.
156 p%WantScalars = .false.
157 p%WantTensors = .false.
158 p%WantVectors = .false.
159 p%WantTransfer = .true.
161 p%Reion%Reionization = .false.
163 p%Want_CMB_lensing = .false.
164 p%DoLensing = .false.
167 p%DoLateRadTruncation = .true.
168 p%Evolve_baryon_cs = .false.
169 p%Evolve_delta_xe = .false.
170 p%Evolve_delta_Ts =.false.
172 p%transfer_21cm_cl = .false.
173 p%Log_lvalues = .false.
174 p%use_cl_spline_template = .true.
176 end subroutine setcambparams
180 subroutine setcambpk (params, redshift, ns, As, pivot_scalar, accurate_massive_nu, kmax, nonlinear) bind(C, NAME='SetCAMBPk')
182 use,
intrinsic :: iso_c_binding, only: c_ptr, c_f_pointer, c_double, c_bool
183 type(c_ptr),
intent(in),
value :: params
184 real(c_double),
intent(in),
value :: redshift, ns, As, pivot_scalar, kmax
185 logical(c_bool),
intent(in),
value :: accurate_massive_nu, nonlinear
186 type(CAMBparams),
pointer :: p
188 call c_f_pointer(params, p)
195 select type(initpower=>p%InitPower)
196 class is (tinitialpowerlaw)
199 initpower%pivot_scalar = pivot_scalar
204 p%Transfer%PK_num_redshifts = 1
205 p%Transfer%PK_redshifts(1) = redshift
206 p%Transfer%kmax = kmax / (p%H0 / 100.)
209 p%Transfer%high_precision = .false.
210 p%Transfer%accurate_massive_neutrinos = accurate_massive_nu
211 p%Transfer%k_per_logint = 0
213 end subroutine setcambpk
217 subroutine getcambresults (params, data) bind(C, NAME='GetCAMBresults')
219 use,
intrinsic :: iso_c_binding, only: c_ptr, c_f_pointer, c_bool
220 type(c_ptr),
intent(in),
value :: params, data
221 type(CAMBparams),
pointer :: p
222 type(CAMBdata),
pointer :: pp
225 call c_f_pointer(params, p)
226 call c_f_pointer(
data, pp)
228 if (cambparams_validate(p) .eqv. .false.)
then
229 error stop
'CAMB stopped'
234 transfer_power_var = 7
235 pp%num_transfer_redshifts = 1
239 call camb_getresults(pp, p, error, .true., .true.)
241 end subroutine getcambresults
245 subroutine getcambpk (data, Pk_out, minkh, dlnkh, npoints) bind(C, NAME='GetCAMBPk')
247 use,
intrinsic :: iso_c_binding, only: c_ptr, c_f_pointer, c_double, c_int
248 type(c_ptr),
intent(in),
value :: data
249 real(c_double),
intent(in),
value :: minkh, dlnkh
250 real(c_double) :: Pk_out(npoints)
251 integer(c_int),
intent(in),
value :: npoints
252 real(dl) :: Pk(npoints)
254 type(CAMBdata),
pointer :: pp
256 call c_f_pointer(
data, pp)
258 var = transfer_power_var
259 call transfer_getmatterpowerd(pp, pp%MT, pk, 1, minkh, dlnkh, npoints, var, var)
266 end subroutine getcambpk
270 subroutine releasecambparams (params) bind(C, name='ReleaseCAMBparams')
272 use,
intrinsic :: iso_c_binding, only : c_ptr, c_f_pointer
273 type(c_ptr),
intent(in),
value :: params
274 type(CAMBparams),
pointer :: p
276 call c_f_pointer(params, p)
279 end subroutine releasecambparams
283 subroutine releasecambdata (data) bind(C, name='ReleaseCAMBdata')
285 use,
intrinsic :: iso_c_binding, only : c_ptr, c_f_pointer
286 type(c_ptr),
intent(in),
value :: data
287 type(CAMBdata),
pointer :: pp
289 call c_f_pointer(
data, pp)
292 end subroutine releasecambdata
294 end module cambinterface