Advertisement
Guest User

Untitled

a guest
May 28th, 2020
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module event_rates
  2.       contains
  3.  
  4.       function delay_time_distribution(ensemble, edges, NBins)
  5.             implicit none
  6.             integer  :: NBins
  7.             real     :: delay_time_distribution(0:NBins)
  8.             real     :: ensemble(0:)
  9.             real     :: edges(0:NBins)
  10.  
  11.             integer  :: i
  12.             real     :: merge_time
  13.             integer  :: mergers_upto
  14.             integer  :: culmulative_merge_rate
  15.             integer  :: mergers_in_bin
  16.             real     :: bin_width
  17.  
  18.             culmulative_merge_rate = 0
  19.  
  20.             ! Iterate over the bins
  21.             do i = 0, size(ensemble)-1
  22.                   ! Get the number of mergers up to the current bin
  23.                   merge_time = edges(i)
  24.                   bin_width = edges(i+1) - edges(i)
  25.  
  26.                   mergers_upto = merge_rate_f95(merge_time, ensemble)
  27.                   mergers_in_bin = mergers_upto - culmulative_merge_rate
  28.  
  29.                   culmulative_merge_rate = culmulative_merge_rate + mergers_in_bin
  30.  
  31.                   ! normalisation
  32.                   delay_time_distribution(i) = mergers_in_bin / 1E6 / bin_width
  33.             enddo
  34.  
  35.             return
  36.       end function
  37.  
  38.       function estimate_lookback(z)
  39.             implicit none
  40.             real    :: z, zi
  41.             integer :: i
  42.             real    :: integrand(0:ceiling(z/0.05))
  43.             real    :: om, ok, ol, tH
  44.             real    :: integral
  45.             real    :: estimate_lookback
  46.  
  47.             om = 0.3
  48.             ol = 0.7
  49.             ok = 0
  50.             tH = 1 / (70 / 3.086E19 * 315576E11)
  51.  
  52.             zi = 0
  53.             do i=0, ceiling(z/0.5)
  54.                   integrand(i) = 1e0 / ((1e0 + zi) * sqrt(om * (1e0+zi)**3) + ok * (1e0+zi)**2 + ol)
  55.                   zi = zi + 0.5
  56.             enddo
  57.  
  58.             integral = integrate(integrand, 0e0, z)
  59.             estimate_lookback = tH * integral
  60.  
  61.             return
  62.       end function
  63.  
  64.       function estimate_redshift(t)
  65.             implicit none
  66.             real    :: t
  67.             real    :: zest
  68.             integer :: zi
  69.             real    :: estimate_redshift
  70.            
  71.             estimate_redshift = 100
  72.             do zi = 0, 1000
  73.                   zest = abs(estimate_lookback(float(zi) / 10) - t)
  74.                   if(zest.le.estimate_redshift) then
  75.                         estimate_redshift = zest
  76.                   endif
  77.             enddo
  78.  
  79.  
  80.             return
  81.       end function
  82.  
  83.       function compute_SFR(z1, z2)
  84.             implicit none
  85.             real       :: z1
  86.             real       :: z2
  87.             integer    :: z
  88.             real       :: SFRD(0:ceiling(z2/0.01 - z1))
  89.             real       :: zit
  90.             real       :: compute_SFR
  91.             integer    :: i
  92.  
  93.             i = 0
  94.  
  95.             do z = 100*floor(z1), 100*ceiling(z2)
  96.                   zit = float(z) / 100
  97.                   SFRD(i) = 0.015 * (1e0+zit)**2.7 / (1e0+((1e0+zit)/2.9)**5.6)
  98.                   i = i + 1
  99.             enddo
  100.  
  101.             compute_SFR = integrate(SFRD, z1, z2)
  102.  
  103.             return
  104.       end function
  105.  
  106.       function integrate(f, x1, x2)
  107.             implicit none
  108.             real    :: f(0:)
  109.             real    :: x1
  110.             real    :: x2
  111.             integer :: i
  112.             real    :: integrate
  113.             integer :: NBins
  114.             integer :: bin_low, bin_up
  115.             real    :: lower_bin_area, upper_bin_area
  116.             real    :: width
  117.  
  118.             NBins = size(f)
  119.  
  120.             width = (maxval(f) - minval(f) / NBins)
  121.  
  122.             bin_low = floor(NBins * (x1 - NBins) / (NBins))
  123.             bin_up = floor(NBins * (x2 - NBins) / (NBins))
  124.  
  125.             if (bin_low == bin_up) then
  126.                   integrate = (x2 - x1) * f(bin_low)
  127.                   return
  128.             endif
  129.  
  130.             ! assume linear binning
  131.             lower_bin_area = f(bin_low) * width
  132.             upper_bin_area = f(bin_up) * width
  133.  
  134.             integrate = lower_bin_area + upper_bin_area
  135.  
  136.             if(bin_low + 1 /= bin_up) then
  137.                   do i = bin_low+1, bin_up
  138.                         integrate = integrate + f(i) * width
  139.                   enddo
  140.             endif
  141.  
  142.             return
  143.       end function
  144.  
  145.       function merge_rate_f95(t_merge, ensemble)
  146.             implicit none
  147.             real     :: t_merge
  148.             real     :: ensemble(0:)
  149.             integer  :: merge_rate_f95
  150.             integer  :: i, n
  151.  
  152.             n = size(ensemble)
  153.  
  154.             i = 0
  155.             merge_rate_f95 = 0
  156.             do while(i.le.n)
  157.                   if(ensemble(i).ge.t_merge) then
  158.                         merge_rate_f95 = merge_rate_f95 + 1
  159.                   endif
  160.                   i = i + 1
  161.             enddo
  162.  
  163.             return
  164.       end function
  165.  
  166.       subroutine event_rate_f95(events, edges, events_edges, lifetimes, lt_size, NBins)
  167.             implicit none
  168.             ! input parameters
  169.             real, intent(out)   :: events(0:NBins) ! event rate distribution
  170.             integer, intent(in) :: NBins ! number of bins
  171.             real, intent(in)    :: events_edges(0:NBins) ! Event histogram edges
  172.             real, intent(in)    :: edges(0:NBins) ! DTD edges
  173.             real, intent(in)    :: lifetimes(0:lt_size-1)
  174.             integer, intent(in) :: lt_size
  175.  
  176.             ! Custom parameters
  177.             real                :: dtd(0:NBins)
  178.             integer             :: i, j
  179.             real                :: t1, z1, t1_p
  180.             real                :: t2, z2, t2_p
  181.             real                :: SFR
  182.             real                :: bin_widths(0:NBins)
  183.             integer             :: events_in_bin
  184.             real                :: integral
  185.             integer             :: bin
  186.  
  187.             ! functions
  188.             dtd = delay_time_distribution(lifetimes, edges, NBins)
  189.             print *, "DTD generated"
  190.             do i = 1, NBins+1
  191.                   t1 = events_edges(i-1)
  192.                   t2 = events_edges(i)
  193.  
  194.                   print *, "Ts done"
  195.  
  196.                   z1 = estimate_redshift(t1)
  197.                   z2 = estimate_redshift(t2)
  198.  
  199.                   print *, 'computing sfr'
  200.  
  201.                   SFR = compute_SFR(z1, z2) / (1E-3) ** 3
  202.  
  203.                   print *, "about to enter inner loop"
  204.                   do j = 0, i-1
  205.                         t1_p = t2 - events_edges(j)
  206.                         t2_p = t2 - events_edges(j+1)
  207.  
  208.                         integral = integrate(dtd, t2_p, t1_p)
  209.                         events_in_bin = floor(integral * 1E9)
  210.                         bin = floor(NBins * (events_edges(j) - NBins) / (NBins))
  211.                         events(bin) = events(bin) + events_in_bin + SFR
  212.                   enddo
  213.  
  214.                   print *, "exited inner loop"
  215.                   print *, i
  216.  
  217.                   bin_widths(i-1) = (edges(i) - edges(i-1)) * 1E9
  218.             enddo
  219.  
  220.             do i = 0, NBins
  221.                   events(i) = events(i) / bin_widths(i)
  222.             enddo
  223.  
  224.       end subroutine
  225. end module event_rates
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement