Line data Source code
1 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3 : !!!!
4 : !!!! MIT License
5 : !!!!
6 : !!!! ParaMonte: plain powerful parallel Monte Carlo library.
7 : !!!!
8 : !!!! Copyright (C) 2012-present, The Computational Data Science Lab
9 : !!!!
10 : !!!! This file is part of the ParaMonte library.
11 : !!!!
12 : !!!! Permission is hereby granted, free of charge, to any person obtaining a
13 : !!!! copy of this software and associated documentation files (the "Software"),
14 : !!!! to deal in the Software without restriction, including without limitation
15 : !!!! the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 : !!!! and/or sell copies of the Software, and to permit persons to whom the
17 : !!!! Software is furnished to do so, subject to the following conditions:
18 : !!!!
19 : !!!! The above copyright notice and this permission notice shall be
20 : !!!! included in all copies or substantial portions of the Software.
21 : !!!!
22 : !!!! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 : !!!! EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 : !!!! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25 : !!!! IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
26 : !!!! DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
27 : !!!! OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
28 : !!!! OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 : !!!!
30 : !!!! ACKNOWLEDGMENT
31 : !!!!
32 : !!!! ParaMonte is an honor-ware and its currency is acknowledgment and citations.
33 : !!!! As per the ParaMonte library license agreement terms, if you use any parts of
34 : !!!! this library for any purposes, kindly acknowledge the use of ParaMonte in your
35 : !!!! work (education/research/industry/development/...) by citing the ParaMonte
36 : !!!! library as described on this page:
37 : !!!!
38 : !!!! https://github.com/cdslaborg/paramonte/blob/main/ACKNOWLEDGMENT.md
39 : !!!!
40 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
41 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
42 :
43 : !> \brief This module contains procedures for computing the Cosmic Star Formation Rate in the Universe.
44 : !> \author Amir Shahmoradi
45 :
46 : module StarFormation_mod
47 :
48 : use Constants_mod, only: IK, RK, PI, NEGINF_RK
49 :
50 : implicit none
51 :
52 : character(*), parameter :: MODULE_NAME = "@StarFormation_mod"
53 :
54 : real(RK) , parameter :: ZMIN = 0.1e0_RK
55 : real(RK) , parameter :: ZMAX = 1.0e2_RK
56 :
57 : abstract interface
58 : function getLogRate_proc(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
59 : import :: RK, IK
60 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
61 : real(RK) :: logRate
62 : end function getLogRate_proc
63 : end interface
64 :
65 : abstract interface
66 : function getRateDensity_proc(zplus1) result(rateDensity)
67 : import :: RK, IK
68 : real(RK), intent(in) :: zplus1
69 : real(RK) :: rateDensity
70 : end function getRateDensity_proc
71 : end interface
72 :
73 : abstract interface
74 : function getMergerDelayTimePDF_proc(mergerDelayTime) result(mergerDelayTimeProb)
75 : import :: RK, IK
76 : real(RK), intent(in) :: mergerDelayTime
77 : real(RK) :: mergerDelayTimeProb
78 : end function getMergerDelayTimePDF_proc
79 : end interface
80 :
81 : #if defined OS_IS_WSL
82 : procedure(getMergerDelayTimePDF_proc), pointer :: getMergerDelayTimePDF_WSL !< This madness bypasses the Microsoft Subsystem for Linux Internal Function call GFortran Segmentation Fault error.
83 : procedure(getRateDensity_proc), pointer :: getStarFormationRateDensity_WSL !< This madness bypasses the Microsoft Subsystem for Linux Internal Function call GFortran Segmentation Fault error.
84 : real(RK) :: maxRelativeErrorDefault_WSL !< This madness bypasses the Microsoft Subsystem for Linux Internal Function call GFortran Segmentation Fault error.
85 : integer(IK) :: nRefinementDefault_WSL !< This madness bypasses the Microsoft Subsystem for Linux Internal Function call GFortran Segmentation Fault error.
86 : real(RK) :: lookBackTimeRef_WSL !< This madness bypasses the Microsoft Subsystem for Linux Internal Function call GFortran Segmentation Fault error.
87 : #endif
88 :
89 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90 :
91 : contains
92 :
93 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94 :
95 : !> \brief
96 : !> Return GRBFR density based on the formation rate estimates of Petrosian et al (2015).
97 1 : pure function getLogRateDensityP15(logzplus1) result(logDensitySFR)
98 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
99 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateDensityP15
100 : #endif
101 : use Constants_mod, only: RK
102 : implicit none
103 : real(RK), intent(in) :: logzplus1
104 : real(RK), parameter :: logz1plus1 = log(1._RK+4.50_RK)
105 : real(RK), parameter :: exponentHighZ = -7.8_RK
106 : real(RK), parameter :: logNormFac2 = -exponentHighZ * logz1plus1
107 : real(RK) :: logDensitySFR
108 1 : if (logzplus1<0._RK) then
109 0 : logDensitySFR = NEGINF_RK
110 1 : elseif (logzplus1<logz1plus1) then
111 0 : logDensitySFR = 0._RK
112 : else
113 1 : logDensitySFR = logzplus1*exponentHighZ + logNormFac2
114 : end if
115 1 : end function getLogRateDensityP15
116 :
117 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
118 :
119 : !> \brief
120 : !> Return GRBFR density based on the formation rate estimates of Hopkins and Beacom (2007).
121 1 : pure function getLogRateDensityH06(logzplus1) result(logDensitySFR)
122 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
123 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateDensityH06
124 : #endif
125 1 : use Constants_mod, only: RK
126 : implicit none
127 : real(RK), intent(in) :: logzplus1
128 : real(RK), parameter :: logz0plus1 = log(1._RK+0.97_RK)
129 : real(RK), parameter :: logz1plus1 = log(1._RK+4.50_RK)
130 : real(RK), parameter :: g0 = +3.4_RK
131 : real(RK), parameter :: g1 = -0.3_RK
132 : real(RK), parameter :: g2 = -7.8_RK
133 : real(RK), parameter :: logNormFac1 = logz0plus1*(g0-g1)
134 : real(RK), parameter :: logNormFac2 = logz1plus1*(g1-g2) + logNormFac1
135 : real(RK) :: logDensitySFR
136 1 : if (logzplus1<0._RK) then
137 0 : logDensitySFR = NEGINF_RK
138 1 : elseif (logzplus1<logz0plus1) then
139 0 : logDensitySFR = logzplus1*g0
140 1 : elseif (logzplus1<logz1plus1) then
141 0 : logDensitySFR = logzplus1*g1 + logNormFac1
142 : else
143 1 : logDensitySFR = logzplus1*g2 + logNormFac2
144 : end if
145 1 : end function getLogRateDensityH06
146 :
147 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
148 :
149 : !> \brief
150 : !> Return GRBFR density based on the formation rate estimates of Li (2008).
151 1 : pure function getLogRateDensityL08(logzplus1) result(logDensitySFR)
152 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
153 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateDensityL08
154 : #endif
155 1 : use Constants_mod, only: RK
156 : implicit none
157 : real(RK), intent(in) :: logzplus1
158 : real(RK), parameter :: logz0plus1 = log(1._RK+0.993_RK)
159 : real(RK), parameter :: logz1plus1 = log(1._RK+3.800_RK)
160 : real(RK), parameter :: g0 = +3.3000_RK
161 : real(RK), parameter :: g1 = +0.0549_RK
162 : real(RK), parameter :: g2 = -4.4600_RK
163 : real(RK), parameter :: logNormFac1 = logz0plus1*(g0-g1)
164 : real(RK), parameter :: logNormFac2 = logz1plus1*(g1-g2) + logNormFac1
165 : real(RK) :: logDensitySFR
166 1 : if (logzplus1<0._RK) then
167 0 : logDensitySFR = NEGINF_RK
168 1 : elseif (logzplus1<logz0plus1) then
169 0 : logDensitySFR = logzplus1*g0
170 1 : elseif (logzplus1<logz1plus1) then
171 0 : logDensitySFR = logzplus1*g1 + logNormFac1
172 : else
173 1 : logDensitySFR = logzplus1*g2 + logNormFac2
174 : end if
175 1 : end function getLogRateDensityL08
176 :
177 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
178 :
179 : !> \brief
180 : !> Return GRBFR density based on the formation rate estimates of Butler et al. (2010).
181 : !>
182 : !> \remark
183 : !> The formation estimate of B10 takes into acount the metalicity-correction to the SFR.
184 1297 : pure function getLogRateDensityB10(logzplus1) result(logDensitySFR)
185 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
186 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateDensityB10
187 : #endif
188 1 : use Constants_mod, only: IK, RK
189 : implicit none
190 : real(RK), intent(in) :: logzplus1
191 : real(RK), parameter :: logz0plus1 = log(1._RK+0.97_RK)
192 : real(RK), parameter :: logz1plus1 = log(1._RK+4.00_RK)
193 : real(RK), parameter :: g0 = +3.14_RK
194 : real(RK), parameter :: g1 = +1.36_RK
195 : real(RK), parameter :: g2 = -2.92_RK
196 : real(RK), parameter :: logNormFac1 = logz0plus1*(g0-g1)
197 : real(RK), parameter :: logNormFac2 = logz1plus1*(g1-g2) + logNormFac1
198 : real(RK) :: logDensitySFR
199 1297 : if (logzplus1<0._RK) then
200 0 : logDensitySFR = NEGINF_RK
201 1297 : elseif (logzplus1<logz0plus1) then
202 0 : logDensitySFR = logzplus1*g0
203 1297 : elseif (logzplus1<logz1plus1) then
204 398 : logDensitySFR = logzplus1*g1 + logNormFac1
205 : else
206 899 : logDensitySFR = logzplus1*g2 + logNormFac2
207 : end if
208 1297 : end function getLogRateDensityB10
209 :
210 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
211 :
212 : !> \brief
213 : !> Return the Comoving Star Formation Rate Density according to Eqn 15 of Madau 2014: Cosmic Star-Formation History.\n
214 : !> `densitySFR(z) = 0.015 * (1+z)^2.7 / ( 1 + [(1+z)/2.9]^5.6 )`
215 1 : pure function getLogRateDensityM14(zplus1,logzplus1) result(logDensitySFR)
216 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
217 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateDensityM14
218 : #endif
219 1297 : use Constants_mod, only: RK
220 : implicit none
221 : real(RK), intent(in) :: zplus1, logzplus1
222 : real(RK) :: logDensitySFR
223 : real(RK), parameter :: logAmplitude = log(0.015_RK)
224 : real(RK), parameter :: lowerExp = 2.7_RK
225 : real(RK), parameter :: upperExp = 5.6_RK
226 : real(RK), parameter :: zplus1Break = 2.9_RK
227 : real(RK), parameter :: zplus1Coeff = 1._RK / (zplus1Break**upperExp)
228 1 : logDensitySFR = logAmplitude + lowerExp*logzplus1 - log( 1._RK + zplus1Coeff * zplus1**upperExp )
229 2 : end function getLogRateDensityM14
230 :
231 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
232 :
233 : !> \brief
234 : !> Return the Comoving Star Formation Rate Density according to Eqn 1 of Madau 2017: Cosmic Star-Formation History
235 : !> `densitySFR(z) = 0.01 * (1+z)^2.6 / ( 1 + [(1+z)/3.2]^6.2 )`
236 1 : pure function getLogRateDensityM17(zplus1,logzplus1) result(logDensitySFR)
237 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
238 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateDensityM17
239 : #endif
240 1 : use Constants_mod, only: RK
241 : implicit none
242 : real(RK), intent(in) :: zplus1, logzplus1
243 : real(RK) :: logDensitySFR
244 : real(RK), parameter :: logAmplitude = log(0.01_RK)
245 : real(RK), parameter :: lowerExp = 2.6_RK
246 : real(RK), parameter :: upperExp = 6.2_RK
247 : real(RK), parameter :: zplus1Break = 3.2_RK
248 : real(RK), parameter :: zplus1Coeff = 1._RK / (zplus1Break**upperExp)
249 1 : logDensitySFR = logAmplitude + lowerExp*logzplus1 - log( 1._RK + zplus1Coeff * zplus1**upperExp )
250 2 : end function getLogRateDensityM17
251 :
252 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
253 :
254 : !> \brief
255 : !> Return the Mordau Comoving Star Formation Rate Density with updated parameters from Fermi 2018.\n
256 : ! `densitySFR(z) = 0.013 * (1+z)^2.99 / ( 1 + [(1+z)/2.63]^6.19 )`
257 1 : pure function getLogRateDensityF18(zplus1,logzplus1) result(logDensitySFR)
258 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
259 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateDensityF18
260 : #endif
261 1 : use Constants_mod, only: RK
262 : implicit none
263 : real(RK), intent(in) :: zplus1, logzplus1
264 : real(RK) :: logDensitySFR
265 : real(RK), parameter :: logAmplitude = log(0.013_RK)
266 : real(RK), parameter :: lowerExp = 2.99_RK
267 : real(RK), parameter :: upperExp = 6.19_RK
268 : real(RK), parameter :: zplus1Break = 2.63_RK
269 : real(RK), parameter :: zplus1Coeff = 1._RK / (zplus1Break**upperExp)
270 1 : logDensitySFR = logAmplitude + lowerExp*logzplus1 - log( 1._RK + zplus1Coeff * zplus1**upperExp )
271 2 : end function getLogRateDensityF18
272 :
273 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274 :
275 : !> \brief
276 : !> Return the cosmic formation rate according to the work of Petrosian et al. (2015).
277 1 : pure function getLogRateP15(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
278 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
279 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateP15
280 : #endif
281 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
282 : use Constants_mod, only: RK, PI
283 : implicit none
284 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
285 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
286 : real(RK) :: logRate
287 : logRate = LOG_COEF + twiceLogLumDisMpc - ( 3._RK*logzplus1 + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) &
288 1 : + getLogRateDensityP15(logzplus1)
289 2 : end function getLogRateP15
290 :
291 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
292 :
293 : !> \brief
294 : !> Return the cosmic star formation rate according to the work of Hopkins and Beacom (2007).
295 1 : pure function getLogRateH06(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
296 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
297 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateH06
298 : #endif
299 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
300 : use Constants_mod, only: RK, PI
301 : implicit none
302 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
303 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
304 : real(RK) :: logRate
305 : logRate = LOG_COEF + twiceLogLumDisMpc - ( 3._RK*logzplus1 + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) &
306 1 : + getLogRateDensityH06(logzplus1)
307 2 : end function getLogRateH06
308 :
309 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
310 :
311 : !> \brief
312 : !> Return the cosmic star formation rate according to the work of Li (2008).
313 1 : pure function getLogRateL08(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
314 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
315 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateL08
316 : #endif
317 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
318 : use Constants_mod, only: RK, PI
319 : implicit none
320 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
321 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
322 : real(RK) :: logRate
323 : logRate = LOG_COEF + twiceLogLumDisMpc - ( 3._RK*logzplus1 + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) &
324 1 : + getLogRateDensityL08(logzplus1)
325 2 : end function getLogRateL08
326 :
327 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
328 :
329 : !> \brief
330 : !> Return the cosmic GRB formation rate according to the work of Butler et al. (2010).
331 1 : pure function getLogRateB10(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
332 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
333 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateB10
334 : #endif
335 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
336 : use Constants_mod, only: RK, PI
337 : implicit none
338 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
339 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
340 : real(RK) :: logRate
341 : logRate = LOG_COEF + twiceLogLumDisMpc - ( 3._RK*logzplus1 + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) &
342 1 : + getLogRateDensityB10(logzplus1)
343 2 : end function getLogRateB10
344 :
345 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
346 :
347 : !> \brief
348 : !> Return the cosmic star formation rate according to the work of Madau et al. (2014).
349 1 : pure function getLogRateM14(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
350 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
351 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateM14
352 : #endif
353 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
354 : use Constants_mod, only: RK, PI
355 : implicit none
356 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
357 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
358 : real(RK) :: logRate
359 : logRate = LOG_COEF + twiceLogLumDisMpc - ( 3._RK*logzplus1 + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) &
360 1 : + getLogRateDensityM14(zplus1,logzplus1)
361 2 : end function getLogRateM14
362 :
363 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
364 :
365 : !> \brief
366 : !> Return the cosmic star formation rate according to the work of Madau et al. (2017).
367 1 : pure function getLogRateM17(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
368 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
369 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateM17
370 : #endif
371 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
372 : use Constants_mod, only: RK, PI
373 : implicit none
374 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
375 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
376 : real(RK) :: logRate
377 : logRate = LOG_COEF + twiceLogLumDisMpc - ( 3._RK*logzplus1 + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) &
378 1 : + getLogRateDensityM17(zplus1,logzplus1)
379 2 : end function getLogRateM17
380 :
381 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
382 :
383 : !> \brief
384 : !> Return the cosmic star formation rate according to the work of the Fermi collaboration (2018).
385 1 : pure function getLogRateF18(zplus1,logzplus1,twiceLogLumDisMpc) result(logRate)
386 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
387 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogRateF18
388 : #endif
389 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
390 : use Constants_mod, only: RK, PI
391 : implicit none
392 : real(RK), intent(in) :: zplus1, logzplus1, twiceLogLumDisMpc
393 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
394 : real(RK) :: logRate
395 : logRate = LOG_COEF + twiceLogLumDisMpc - ( 3._RK*logzplus1 + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) &
396 1 : + getLogRateDensityF18(zplus1,logzplus1)
397 2 : end function getLogRateF18
398 :
399 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
400 :
401 : ! Amir Shahmoradi, Wednesday 5:43 PM, December 25, 2013, IFS, UT Austin
402 : ! compute the binary merger rate as a function of z, according to Shahmoradi and Nemiroff (2015)
403 : ! equivalent to delayed_rate_Belz_Li(z) in S15
404 : ! returns 0, if z>6.501_RK or z<0.09_RK
405 4 : pure function getBinaryMergerRateS15(z) result(binaryMergerRateS15)
406 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
407 : !DEC$ ATTRIBUTES DLLEXPORT :: getBinaryMergerRateS15
408 : #endif
409 1 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
410 : use Constants_mod, only: RK, PI
411 : implicit none
412 : real(RK) , intent(in) :: z
413 : real(RK) :: binaryMergerRateS15
414 4 : if (z>2.5_RK .and. z<=6.501_RK) then
415 : binaryMergerRateS15 = &
416 : - 2.09118024744342000_RK &
417 : + 5.15382361299299000_RK * z &
418 : - 5.46442271664195000_RK * z**2 &
419 : + 3.29445310883082000_RK * z**3 &
420 : - 1.24547016168265000_RK * z**4 &
421 : + 0.30628893690508400_RK * z**5 &
422 : - 0.04904403249641820_RK * z**6 &
423 : + 0.00493757380504717_RK * z**7 &
424 : - 2.84061971928750e-4_RK * z**8 &
425 1 : + 7.12674138757750e-6_RK * z**9
426 3 : elseif (z>1.0_RK .and. z<=2.5_RK) then
427 : binaryMergerRateS15 = &
428 : - 0.86022576265904100_RK &
429 : + 4.22669545558817000_RK * z &
430 : - 8.86086728534670000_RK * z**2 &
431 : + 10.4863792284648000_RK * z**3 &
432 : - 7.64722909221129000_RK * z**4 &
433 : + 3.51616699500767000_RK * z**5 &
434 : - 0.99555474471022000_RK * z**6 &
435 : + 0.15876893754371900_RK * z**7 &
436 1 : - 0.01092541997736420_RK * z**8
437 2 : elseif (z<=1._RK .and. z>=0.09_RK) then
438 : binaryMergerRateS15 = &
439 : + 1.92595299989370e-4_RK &
440 : - 0.00345273599582578_RK * z &
441 : + 0.03157500615320920_RK * z**2 &
442 : - 0.04470545521198460_RK * z**3 &
443 : + 0.06812481521281660_RK * z**4 &
444 0 : - 0.03846033416253570_RK * z**5
445 : else
446 2 : binaryMergerRateS15 = 0._RK
447 : end if
448 4 : end function getBinaryMergerRateS15
449 :
450 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
451 :
452 : ! computes the natural log of the binary merger rate as a function of logzplus1.
453 : ! However, note that the computed rate is dN/dz, even though the input is logzplus1.
454 : ! the merger delay time distribution is the same as that of Shahmoradi and Nemiroff (2015), but with the logMean:log(0.1_RK) and sigma: 0.9612813_RK..
455 : ! returns 0, if z>19.929999999999882_RK or z<0.03_RK
456 7 : pure function getLogBinaryMergerRateLognormH06(logzplus1) result(logBinaryMergerRate)
457 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
458 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogBinaryMergerRateLognormH06
459 : #endif
460 4 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
461 : use Constants_mod, only: RK, PI
462 : implicit none
463 : real(RK) , intent(in) :: logzplus1
464 : real(RK) :: logBinaryMergerRate
465 7 : if (logzplus1>0.02955880224154443_RK .and. logzplus1<=0.1441003439737565_RK) then
466 : logBinaryMergerRate = &
467 : - 14.26464149493092000_RK &
468 : + 84.73477757043948000_RK * logzplus1 &
469 : - 488.5893985602366500_RK * logzplus1**2 &
470 1 : + 1154.414655194473900_RK * logzplus1**3
471 6 : elseif (logzplus1>0.1441003439737565_RK .and. logzplus1<=0.6575200029167926_RK) then
472 : logBinaryMergerRate = &
473 : - 11.19700066921606300_RK &
474 : + 20.46712963401572300_RK * logzplus1 &
475 : - 24.31794334813894300_RK * logzplus1**2 &
476 1 : + 12.21213317590724400_RK * logzplus1**3
477 5 : elseif (logzplus1>0.6575200029167926_RK .and. logzplus1<=1.5591966959973538_RK) then
478 : logBinaryMergerRate = &
479 : - 9.094912666461765000_RK &
480 : + 15.23119806754538900_RK * logzplus1 &
481 : - 18.77526325204311800_RK * logzplus1**2 &
482 : + 9.941360355936961000_RK * logzplus1**3 &
483 1 : - 2.077370913197473000_RK * logzplus1**4
484 4 : elseif (logzplus1>1.5591966959973538_RK .and. logzplus1<=1.7056567701746455_RK) then
485 : logBinaryMergerRate = &
486 : - 2392.907733171019000_RK &
487 : + 6210.872744126407000_RK * logzplus1 &
488 : - 6054.866136454215000_RK * logzplus1**2 &
489 : + 2622.628785434413700_RK * logzplus1**3 &
490 1 : - 426.0273477222719000_RK * logzplus1**4
491 3 : elseif (logzplus1>1.7056567701746455_RK .and. logzplus1<=3.0411835364579027_RK) then
492 : logBinaryMergerRate = &
493 : + 9.538876239886940000_RK &
494 : - 8.753418172517534000_RK * logzplus1 &
495 : - 0.159980818030374640_RK * logzplus1**2 &
496 1 : - 0.088551503657680930_RK * logzplus1**3
497 2 : elseif (logzplus1<=0.02955880224154443_RK .or. logzplus1>3.0411835364579027_RK) then
498 2 : logBinaryMergerRate = 0._RK
499 : end if
500 7 : end function getLogBinaryMergerRateLognormH06
501 :
502 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
503 :
504 : ! computes the natural log of the binary merger rate as a function of logzplus1.
505 : ! However, note that the computed rate is dN/dz, even though the input is logzplus1.
506 : ! the merger delay time distribution is the same as that of Shahmoradi and Nemiroff (2015), but with the logMean:log(0.1_RK) and sigma: 0.9612813_RK..
507 : ! returns 0, if z>19.929999999999882_RK or z<0.03_RK
508 7 : pure function getLogBinaryMergerRateLognormL08(logzplus1) result(logBinaryMergerRate)
509 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
510 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogBinaryMergerRateLognormL08
511 : #endif
512 7 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
513 : use Constants_mod, only: RK, PI
514 : implicit none
515 : real(RK) , intent(in) :: logzplus1
516 : real(RK) :: logBinaryMergerRate
517 7 : if (logzplus1>0.02955880224154443_RK .and. logzplus1<=0.20701416938432557_RK) then
518 : logBinaryMergerRate = &
519 : - 14.53696144309043900_RK &
520 : + 94.70274747509626000_RK * logzplus1 &
521 : - 687.3663996060040000_RK * logzplus1**2 &
522 : + 2695.421036673770700_RK * logzplus1**3 &
523 1 : - 4077.601561165490000_RK * logzplus1**4
524 6 : elseif (logzplus1>0.20701416938432557_RK .and. logzplus1<=0.8241754429663476_RK) then
525 : logBinaryMergerRate = &
526 : - 13.5104005566057670_RK &
527 : + 49.6443928683743600_RK * logzplus1 &
528 : - 164.286063097338630_RK * logzplus1**2 &
529 : + 315.721394966368100_RK * logzplus1**3 &
530 : - 300.345052726248640_RK * logzplus1**4 &
531 1 : + 108.470535327547080_RK * logzplus1**5
532 5 : elseif (logzplus1>0.8241754429663476_RK .and. logzplus1<=1.4243124283074096_RK) then
533 : logBinaryMergerRate = &
534 : - 8.77634469738400500_RK &
535 : + 13.1999684738558810_RK * logzplus1 &
536 : - 15.8698236818922140_RK * logzplus1**2 &
537 : + 8.48676936452957000_RK * logzplus1**3 &
538 1 : - 1.83190451512279620_RK * logzplus1**4
539 4 : elseif (logzplus1>1.4243124283074096_RK .and. logzplus1<=1.6154199841116488_RK) then
540 : logBinaryMergerRate = &
541 : + 4158.29353781047900_RK &
542 : - 10954.1105856433040_RK * logzplus1 &
543 : + 10789.3451136201870_RK * logzplus1**2 &
544 : - 4713.80244702217800_RK * logzplus1**3 &
545 1 : + 770.488645040204600_RK * logzplus1**4
546 3 : elseif (logzplus1>1.6154199841116488_RK .and. logzplus1<=3.0411835364579027_RK) then
547 : logBinaryMergerRate = &
548 : + 0.37742655174185624_RK &
549 : + 0.30883738015163340_RK * logzplus1 &
550 : - 4.04937550957291800_RK * logzplus1**2 &
551 : + 1.11680537027038170_RK * logzplus1**3 &
552 1 : - 0.13770838345089523_RK * logzplus1**4
553 2 : elseif (logzplus1<=0.02955880224154443_RK .or. logzplus1>3.0411835364579027_RK) then
554 2 : logBinaryMergerRate = 0._RK
555 : end if
556 7 : end function getLogBinaryMergerRateLognormL08
557 :
558 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
559 :
560 : ! computes the natural log of the binary merger rate as a function of logzplus1.
561 : ! However, note that the computed rate is dN/dz, even though the input is logzplus1.
562 : ! the merger delay time distribution is the same as that of Shahmoradi and Nemiroff (2015), but with the logMean:log(0.1_RK) and sigma: 0.9612813_RK.
563 : ! returns 0, if z>19.929999999999882_RK or z<0.03_RK
564 7 : pure function getLogBinaryMergerRateLognormB10(logzplus1) result(logBinaryMergerRate)
565 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
566 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogBinaryMergerRateLognormB10
567 : #endif
568 7 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
569 : use Constants_mod, only: RK, PI
570 : implicit none
571 : real(RK) , intent(in) :: logzplus1
572 : real(RK) :: logBinaryMergerRate
573 7 : if (logzplus1>0.02955880224154443_RK .and. logzplus1<=0.20701416938432557_RK) then
574 : logBinaryMergerRate = &
575 : - 15.27802857671202000_RK &
576 : + 94.54179164991284000_RK * logzplus1 &
577 : - 687.3676159275769000_RK * logzplus1**2 &
578 : + 2695.420977251770600_RK * logzplus1**3 &
579 1 : - 4077.601406650646000_RK * logzplus1**4
580 6 : elseif (logzplus1>0.20701416938432557_RK .and. logzplus1<=0.8241754429663476_RK) then
581 : logBinaryMergerRate = &
582 : - 13.5066182170954650_RK &
583 : + 40.1985219822299200_RK * logzplus1 &
584 : - 121.506350703598660_RK * logzplus1**2 &
585 : + 224.621285123736100_RK * logzplus1**3 &
586 : - 210.878836655472500_RK * logzplus1**4 &
587 1 : + 76.3335749498628400_RK * logzplus1**5
588 5 : elseif (logzplus1>0.8241754429663476_RK .and. logzplus1<=1.4243124283074096_RK) then
589 : logBinaryMergerRate = &
590 : - 10.0515447816113700_RK &
591 : + 12.6659826494097970_RK * logzplus1 &
592 : - 13.2268991886238200_RK * logzplus1**2 &
593 : + 6.84523627043807100_RK * logzplus1**3 &
594 1 : - 1.44645280124922220_RK * logzplus1**4
595 4 : elseif (logzplus1>1.4243124283074096_RK .and. logzplus1<=1.6104374127671848_RK) then
596 : logBinaryMergerRate = &
597 : - 1187.90539057029950_RK &
598 : + 3240.19327021926350_RK * logzplus1 &
599 : - 3330.70645904271000_RK * logzplus1**2 &
600 : + 1522.87499612399850_RK * logzplus1**3 &
601 1 : - 261.341408956542300_RK * logzplus1**4
602 3 : elseif (logzplus1>1.6104374127671848_RK .and. logzplus1<=3.0411835364579027_RK) then
603 : logBinaryMergerRate = &
604 : - 1.43934839576471260_RK &
605 : + 1.72951867017028120_RK * logzplus1 &
606 : - 4.06729555225025000_RK * logzplus1**2 &
607 : + 1.18253386764330200_RK * logzplus1**3 &
608 1 : - 0.15201156018584210_RK * logzplus1**4
609 2 : elseif (logzplus1<=0.02955880224154443_RK .or. logzplus1>3.0411835364579027_RK) then
610 2 : logBinaryMergerRate = 0._RK
611 : end if
612 7 : end function getLogBinaryMergerRateLognormB10
613 :
614 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
615 :
616 : ! computes the natural log of the binary merger rate as a function of logzplus1.
617 : ! However, note that the computed rate is dN/dz, even though the input is logzplus1.
618 : ! the merger delay time distribution is the same as that of Shahmoradi and Nemiroff (2015), but with the logMean:log(0.1_RK) and sigma: 0.9612813_RK..
619 : ! returns 0, if z>19.929999999999882_RK or z<0.03_RK
620 7 : pure function getLogBinaryMergerRateLognormM14(logzplus1) result(logBinaryMergerRate)
621 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
622 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogBinaryMergerRateLognormM14
623 : #endif
624 7 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
625 : use Constants_mod, only: RK, PI
626 : implicit none
627 : real(RK) , intent(in) :: logzplus1
628 : real(RK) :: logBinaryMergerRate
629 7 : if (logzplus1>0.02955880224154443_RK .and. logzplus1<=0.16551443847757297_RK) then
630 : logBinaryMergerRate = &
631 : - 13.91129314580349600_RK &
632 : + 78.88963489621422000_RK * logzplus1 &
633 : - 420.9801740859396700_RK * logzplus1**2 &
634 1 : + 902.4783078800951000_RK * logzplus1**3
635 6 : elseif (logzplus1>0.16551443847757297_RK .and. logzplus1<=0.9282193027394269_RK) then
636 : logBinaryMergerRate = &
637 : - 11.00951046136480500_RK &
638 : + 21.38817515748999000_RK * logzplus1 &
639 : - 33.29451048508970000_RK * logzplus1**2 &
640 : + 29.32158835244860400_RK * logzplus1**3 &
641 1 : - 10.97377449040440000_RK * logzplus1**4
642 5 : elseif (logzplus1>0.9282193027394269_RK .and. logzplus1<=1.3937663759585892_RK) then
643 : logBinaryMergerRate = &
644 : - 8.254476015464371000_RK &
645 : + 3.620963332444886000_RK * logzplus1 &
646 : + 6.734585433384001000_RK * logzplus1**2 &
647 : - 9.151412394211048000_RK * logzplus1**3 &
648 1 : + 2.516171777428496000_RK * logzplus1**4
649 4 : elseif (logzplus1>1.3937663759585892_RK .and. logzplus1<=3.0411835364579027_RK) then
650 : logBinaryMergerRate = &
651 : - 6.539697727782377000_RK &
652 : + 8.522331572601950000_RK * logzplus1 &
653 : - 8.242990979412244000_RK * logzplus1**2 &
654 : + 2.316632169715435300_RK * logzplus1**3 &
655 2 : - 0.266462340853027450_RK * logzplus1**4
656 2 : elseif (logzplus1<=0.02955880224154443_RK .or. logzplus1>3.0411835364579027_RK) then
657 2 : logBinaryMergerRate = 0._RK
658 : end if
659 7 : end function getLogBinaryMergerRateLognormM14
660 :
661 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
662 :
663 : ! computes the natural log of the binary merger rate as a function of logzplus1.
664 : ! However, note that the computed rate is dN/dz, even though the input is logzplus1.
665 : ! the merger delay time distribution is the same as that of Shahmoradi and Nemiroff (2015), but with the logMean:log(0.1_RK) and sigma: 0.9612813_RK..
666 : ! returns 0, if z>19.929999999999882_RK or z<0.03_RK
667 7 : pure function getLogBinaryMergerRateLognormM17(logzplus1) result(logBinaryMergerRate)
668 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
669 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogBinaryMergerRateLognormM17
670 : #endif
671 7 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
672 : use Constants_mod, only: RK, PI
673 : implicit none
674 : real(RK) , intent(in) :: logzplus1
675 : real(RK) :: logBinaryMergerRate
676 7 : if (logzplus1>0.02955880224154443_RK .and. logzplus1<=0.16551443847757297_RK) then
677 : logBinaryMergerRate = &
678 : - 14.01939141013502300_RK &
679 : + 78.80010843737509000_RK * logzplus1 &
680 : - 420.9593253775164000_RK * logzplus1**2 &
681 1 : + 902.5668042795056000_RK * logzplus1**3
682 6 : elseif (logzplus1>0.16551443847757297_RK .and. logzplus1<=0.9282193027394269_RK) then
683 : logBinaryMergerRate = &
684 : - 11.12915953695671500_RK &
685 : + 21.43217730985805500_RK * logzplus1 &
686 : - 33.75904206577289000_RK * logzplus1**2 &
687 : + 30.03916282499634200_RK * logzplus1**3 &
688 1 : - 11.12086545981264500_RK * logzplus1**4
689 5 : elseif (logzplus1>0.9282193027394269_RK .and. logzplus1<=1.3937663759585892_RK) then
690 : logBinaryMergerRate = &
691 : - 1.802362223155230800_RK &
692 : - 20.58526172567768200_RK * logzplus1 &
693 : + 38.93828966743146000_RK * logzplus1**2 &
694 : - 27.19863916580484500_RK * logzplus1**3 &
695 1 : + 6.138928143113263000_RK * logzplus1**4
696 4 : elseif (logzplus1>1.3937663759585892_RK .and. logzplus1<=3.0411835364579027_RK) then
697 : logBinaryMergerRate = &
698 : - 7.711815956299844000_RK &
699 : + 11.68891993486079700_RK * logzplus1 &
700 : - 10.62908897824095300_RK * logzplus1**2 &
701 : + 2.945685425778300700_RK * logzplus1**3 &
702 2 : - 0.327069839977957850_RK * logzplus1**4
703 2 : elseif (logzplus1<=0.02955880224154443_RK .or. logzplus1>3.0411835364579027_RK) then
704 2 : logBinaryMergerRate = 0._RK
705 : end if
706 7 : end function getLogBinaryMergerRateLognormM17
707 :
708 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
709 :
710 : ! computes the natural log of the binary merger rate as a function of logzplus1.
711 : ! However, note that the computed rate is dN/dz, even though the input is logzplus1.
712 : ! the merger delay time distribution is the same as that of Shahmoradi and Nemiroff (2015), but with the logMean:log(0.1_RK) and sigma: 0.9612813_RK..
713 : ! returns 0, if z>19.929999999999882_RK or z<0.03_RK
714 7 : pure function getLogBinaryMergerRateLognormF18(logzplus1) result(logBinaryMergerRate)
715 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
716 : !DEC$ ATTRIBUTES DLLEXPORT :: getLogBinaryMergerRateLognormF18
717 : #endif
718 7 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE
719 : use Constants_mod, only: RK, PI
720 : implicit none
721 : real(RK) , intent(in) :: logzplus1
722 : real(RK) :: logBinaryMergerRate
723 7 : if (logzplus1>0.02955880224154443_RK .and. logzplus1<=0.16551443847757297_RK) then
724 : logBinaryMergerRate = &
725 : - 13.80128475140318000_RK &
726 : + 79.17963739241087000_RK * logzplus1 &
727 : - 420.9808813943490700_RK * logzplus1**2 &
728 1 : + 902.4149755380632000_RK * logzplus1**3
729 6 : elseif (logzplus1>0.16551443847757297_RK .and. logzplus1<=0.9282193027394269_RK) then
730 : logBinaryMergerRate = &
731 : - 10.89131941401880800_RK &
732 : + 21.59483273763076400_RK * logzplus1 &
733 : - 33.07662054750123000_RK * logzplus1**2 &
734 : + 29.23608723915102600_RK * logzplus1**3 &
735 1 : - 11.33984422193848700_RK * logzplus1**4
736 5 : elseif (logzplus1>0.9282193027394269_RK .and. logzplus1<=1.3937663759585892_RK) then
737 : logBinaryMergerRate = &
738 : - 14.02518830695731000_RK &
739 : + 24.92009885816913300_RK * logzplus1 &
740 : - 20.04762612951797000_RK * logzplus1**2 &
741 : + 4.885281389900379500_RK * logzplus1**3 &
742 1 : - 0.168402813838908260_RK * logzplus1**4
743 4 : elseif (logzplus1>1.3937663759585892_RK .and. logzplus1<=3.0411835364579027_RK) then
744 : logBinaryMergerRate = &
745 : - 4.348081430972656000_RK &
746 : + 4.815143234949144000_RK * logzplus1 &
747 : - 6.143880845780776000_RK * logzplus1**2 &
748 : + 1.738835623950871300_RK * logzplus1**3 &
749 2 : - 0.206972882929076480_RK * logzplus1**4
750 2 : elseif (logzplus1<=0.02955880224154443_RK .or. logzplus1>3.0411835364579027_RK) then
751 2 : logBinaryMergerRate = 0._RK
752 : end if
753 7 : end function getLogBinaryMergerRateLognormF18
754 :
755 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
756 :
757 8 : function getBinaryMergerRateDensity ( zplus1 &
758 : , zplus1Max &
759 : , nRefinement &
760 : , maxRelativeError &
761 : , getMergerDelayTimePDF &
762 : , getStarFormationRateDensity &
763 8 : ) result(binaryMergerRateDensity)
764 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
765 : !DEC$ ATTRIBUTES DLLEXPORT :: getBinaryMergerRateDensity
766 : #endif
767 : use, intrinsic :: iso_fortran_env, only: output_unit
768 7 : use Cosmology_mod, only: getLookBackTime
769 : use Constants_mod, only: RK, HUGE_RK
770 : use Integration_mod, only: doQuadRombOpen, ErrorMessage!, midinf
771 : use Integration_mod, only: midexp
772 : !use Integration_mod, only: midinf
773 : implicit none
774 : real(RK) , intent(in) :: zplus1
775 : real(RK) , intent(in), optional :: zplus1Max, maxRelativeError
776 : integer(IK) , intent(in), optional :: nRefinement
777 : procedure(getRateDensity_proc) :: getStarFormationRateDensity
778 : procedure(getMergerDelayTimePDF_proc) :: getMergerDelayTimePDF
779 : integer(IK) :: neval, ierr, nRefinementDefault
780 8 : real(RK) :: zplus1MaxDefault, maxRelativeErrorDefault, relerr
781 8 : real(RK) :: binaryMergerRateDensity, lookBackTimeRef
782 :
783 7 : nRefinementDefault = 7_IK; if (present(nRefinement)) nRefinementDefault = nRefinement
784 8 : zplus1MaxDefault = HUGE_RK; if (present(zplus1Max)) zplus1MaxDefault = zplus1Max
785 8 : maxRelativeErrorDefault = 1.e-6_RK; if (present(maxRelativeError)) maxRelativeErrorDefault = maxRelativeError
786 :
787 : lookBackTimeRef = getLookBackTime ( zplus1 = zplus1 &
788 : , maxRelativeError = maxRelativeErrorDefault &
789 : , nRefinement = nRefinementDefault &
790 8 : )
791 :
792 : #if defined OS_IS_WSL
793 : getMergerDelayTimePDF_WSL => getMergerDelayTimePDF
794 : getStarFormationRateDensity_WSL => getStarFormationRateDensity
795 : maxRelativeErrorDefault_WSL = maxRelativeErrorDefault
796 : nRefinementDefault_WSL = nRefinementDefault
797 : lookBackTimeRef_WSL = lookBackTimeRef
798 : #endif
799 :
800 : call doQuadRombOpen ( getFunc = getBinaryMergerRateDensityIntegrand &
801 : , integrate = midexp &
802 : !, integrate = midinf &
803 : , lowerLim = zplus1 &
804 : , upperLim = zplus1MaxDefault &
805 : , maxRelativeError = maxRelativeErrorDefault &
806 : , nRefinement = nRefinementDefault &
807 : , integral = binaryMergerRateDensity &
808 : , relativeError = relerr &
809 : , numFuncEval = neval &
810 : , ierr = ierr &
811 8 : )
812 8 : if (ierr/=0_IK) then
813 : ! LCOV_EXCL_START
814 : write(output_unit,"(A)") ErrorMessage(ierr)
815 : error stop
816 : ! LCOV_EXCL_STOP
817 : end if
818 :
819 : #if defined OS_IS_WSL
820 : nullify(getStarFormationRateDensity_WSL)
821 : nullify(getMergerDelayTimePDF_WSL)
822 : #else
823 : contains
824 :
825 1296 : function getBinaryMergerRateDensityIntegrand(zplus1) result(binaryMergerRateIntegrand)
826 :
827 8 : use Cosmology_mod, only: getUniverseAgeDerivative
828 : implicit none
829 : real(RK) , intent(in) :: zplus1
830 : real(RK) :: binaryMergerRateIntegrand !,lognormpdf
831 1296 : real(RK) :: mergerDelayTime
832 :
833 : ! note that zp<z always, so that delay>0.
834 : mergerDelayTime = getLookBackTime ( zplus1 = zplus1 &
835 : , maxRelativeError = maxRelativeErrorDefault &
836 : , nRefinement = nRefinementDefault &
837 1296 : )
838 1296 : mergerDelayTime = mergerDelayTime - lookBackTimeRef
839 1296 : if (mergerDelayTime<=0._RK) then
840 : ! LCOV_EXCL_START
841 : write(output_unit,"(A)") "The mergerDelayTime is non-positive in getBinaryMergerRateDensityIntegrand(): (zplus1, mergerDelayTime) = ", zplus1, mergerDelayTime
842 : error stop
843 : ! LCOV_EXCL_STOP
844 : end if
845 :
846 : binaryMergerRateIntegrand = getMergerDelayTimePDF(mergerDelayTime) &
847 : * getStarFormationRateDensity(zplus1) &
848 1296 : * getUniverseAgeDerivative(zplus1)
849 :
850 1296 : end function getBinaryMergerRateDensityIntegrand
851 : #endif
852 : end function getBinaryMergerRateDensity
853 :
854 : #if defined OS_IS_WSL
855 : ! This madness bypasses the Microsoft Subsystem for Linux Internal Function call GFortran Segmentation Fault error.
856 : function getBinaryMergerRateDensityIntegrand(zplus1) result(binaryMergerRateIntegrand)
857 : use, intrinsic :: iso_fortran_env, only: output_unit
858 : use Cosmology_mod, only: getUniverseAgeDerivative
859 : use Cosmology_mod, only: getLookBackTime
860 : implicit none
861 : real(RK) , intent(in) :: zplus1
862 : real(RK) :: binaryMergerRateIntegrand !,lognormpdf
863 : real(RK) :: mergerDelayTime
864 : ! note that zp<z always, so that delay>0.
865 : mergerDelayTime = getLookBackTime ( zplus1 = zplus1 &
866 : , maxRelativeError = maxRelativeErrorDefault_WSL &
867 : , nRefinement = nRefinementDefault_WSL &
868 : )
869 : mergerDelayTime = mergerDelayTime - lookBackTimeRef_WSL
870 : if (mergerDelayTime<=0._RK) then
871 : ! LCOV_EXCL_START
872 : write(output_unit,"(A)") "The mergerDelayTime is non-positive in getBinaryMergerRateDensityIntegrand(): (zplus1, mergerDelayTime) = ", zplus1, mergerDelayTime
873 : error stop
874 : end if
875 : ! LCOV_EXCL_START
876 :
877 : binaryMergerRateIntegrand = getMergerDelayTimePDF_WSL(mergerDelayTime) &
878 : * getStarFormationRateDensity_WSL(zplus1) &
879 : * getUniverseAgeDerivative(zplus1)
880 :
881 : end function getBinaryMergerRateDensityIntegrand
882 : #endif
883 :
884 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
885 :
886 : function getBinaryMergerRate( zplus1 &
887 : , zplus1Max &
888 : , nRefinement &
889 : , maxRelativeError &
890 : , getMergerDelayTimePDF &
891 : , getStarFormationRateDensity &
892 : ) result(binaryMergerRate)
893 : #if INTEL_COMPILER_ENABLED && defined DLL_ENABLED && (OS_IS_WINDOWS || defined OS_IS_DARWIN)
894 : !DEC$ ATTRIBUTES DLLEXPORT :: getBinaryMergerRate
895 : #endif
896 : use Cosmology_mod, only: LS2HC, OMEGA_DM, OMEGA_DE, getLogLumDisWicMpc
897 : use Constants_mod, only: RK, PI
898 : implicit none
899 : real(RK) , intent(in) :: zplus1
900 : real(RK) , intent(in), optional :: zplus1Max, maxRelativeError
901 : integer(IK) , intent(in), optional :: nRefinement
902 : procedure(getRateDensity_proc) :: getStarFormationRateDensity
903 : procedure(getMergerDelayTimePDF_proc) :: getMergerDelayTimePDF
904 : real(RK) :: binaryMergerRate
905 : real(RK), parameter :: LOG_COEF = log(4._RK*PI*LS2HC)
906 :
907 : binaryMergerRate = exp( LOG_COEF + 2_IK*getLogLumDisWicMpc(zplus1) - ( 3._RK*log(zplus1) + 0.5_RK*log(OMEGA_DM*zplus1**3+OMEGA_DE) ) ) &
908 : * getBinaryMergerRateDensity( zplus1 &
909 : , zplus1Max &
910 : , nRefinement &
911 : , maxRelativeError &
912 : , getMergerDelayTimePDF &
913 : , getStarFormationRateDensity &
914 : )
915 :
916 : end function getBinaryMergerRate
917 :
918 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
919 :
920 : end module StarFormation_mod
|