EFTCAMB  Reference documentation for version 3.0
11_EFTCAMB_RGR.f90
Go to the documentation of this file.
1 !----------------------------------------------------------------------------------------
2 !
3 ! This file is part of EFTCAMB.
4 !
5 ! Copyright (C) 2013-2016 by the EFTCAMB authors
6 !
7 ! The EFTCAMB code is free software;
8 ! You can use it, redistribute it, and/or modify it under the terms
9 ! of the GNU General Public License as published by the Free Software Foundation;
10 ! either version 3 of the License, or (at your option) any later version.
11 ! The full text of the license can be found in the file eftcamb/LICENSE at
12 ! the top level of the EFTCAMB distribution.
13 !
14 !----------------------------------------------------------------------------------------
15 
18 
19 
20 !----------------------------------------------------------------------------------------
22 
24 
26 
27  use precision
28  use eft_def
29  use eftcamb_cache
33 
34  implicit none
35 
36  private
37 
39 
40 contains
41 
42  ! ---------------------------------------------------------------------------------------------
45  subroutine eftcambreturntogr_feedback( feedback_level, input_model, params_cache, RGR_time )
46 
47  implicit none
48 
49  integer , intent(in) :: feedback_level
50  class(eftcamb_model) , intent(in) :: input_model
51  type(eftcamb_parameter_cache), intent(in) :: params_cache
52  real(dl) , intent(in) :: RGR_time
53 
54  real(dl) :: eft_functions(21)
55  integer :: i
56 
57  if ( feedback_level > 1 ) then
58  write(*,'(a)') "***************************************************************"
59  write(*,'(a,F12.10)') ' EFTCAMB Return to GR time: ', rgr_time
60  end if
61 
62  if ( feedback_level > 2 ) then
63 
64  call eftcambreturntogr_functions( rgr_time, input_model, params_cache, eft_functions )
65 
66  write(*,'(a)')
67  write(*,'(a)') ' EFT functions at RGR time: '
68 
69  if ( eft_functions(1 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' OmegaV = ', eft_functions(1 ) +efttogr
70  if ( eft_functions(2 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' OmegaP = ', eft_functions(2 ) +efttogr
71  if ( eft_functions(3 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' OmegaPP = ', eft_functions(3 ) +efttogr
72  if ( eft_functions(4 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' OmegaPPP = ', eft_functions(4 ) +efttogr
73  if ( eft_functions(5 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTc = ', eft_functions(5 ) +efttogr
74  if ( eft_functions(6 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTLambda = ', eft_functions(6 ) +efttogr
75  if ( eft_functions(7 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTcdot = ', eft_functions(7 ) +efttogr
76  if ( eft_functions(8 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTLambdadot = ', eft_functions(8 ) +efttogr
77  if ( eft_functions(9 ) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma1V = ', eft_functions(9 ) +efttogr
78  if ( eft_functions(10) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma1P = ', eft_functions(10) +efttogr
79  if ( eft_functions(11) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma2V = ', eft_functions(11) +efttogr
80  if ( eft_functions(12) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma2P = ', eft_functions(12) +efttogr
81  if ( eft_functions(13) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma3V = ', eft_functions(13) +efttogr
82  if ( eft_functions(14) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma3P = ', eft_functions(14) +efttogr
83  if ( eft_functions(15) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma4V = ', eft_functions(15) +efttogr
84  if ( eft_functions(16) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma4P = ', eft_functions(16) +efttogr
85  if ( eft_functions(18) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma5V = ', eft_functions(18) +efttogr
86  if ( eft_functions(17) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma4PP = ', eft_functions(17) +efttogr
87  if ( eft_functions(19) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma5P = ', eft_functions(19) +efttogr
88  if ( eft_functions(20) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma6V = ', eft_functions(18) +efttogr
89  if ( eft_functions(21) .gt. 0._dl ) write(*,'(a18,E13.4)') ' EFTGamma6P = ', eft_functions(19) +efttogr
90 
91  end if
92 
93  end subroutine
94 
95  ! ---------------------------------------------------------------------------------------------
97  subroutine eftcambreturntogr( input_model, params_cache, initial_time, RGR_time )
98 
99  implicit none
100 
101  class(eftcamb_model) , intent(in) :: input_model
102  type(eftcamb_parameter_cache), intent(in) :: params_cache
103  real(dl) , intent(in) :: initial_time
104  real(dl) , intent(out) :: RGR_time
105 
106  real(dl) :: eft_functions(21)
107  real(dl) :: a_initial, a_final, log_a_initial, log_a_final, log_a_used, a_used
108  integer :: i
109 
110  ! initialize:
111  rgr_time = initial_time
112 
113  ! initial and final scale factors:
114  a_initial = initial_time
115  a_final = 1._dl
116  ! convert to logarithm of the scale factor:
117  log_a_initial = log10( a_initial )
118  log_a_final = log10( a_final )
119 
120  ! loop over the logarithm of the scale factor:
121  do i=1, eft_rgr_num_points
122 
123  ! initialize:
124  log_a_used = log_a_initial +real( i-1 )/real( eft_rgr_num_points -1 )*( log_a_final -log_a_initial )
125  a_used = 10._dl**log_a_used
126  eft_functions = 0._dl
127  ! compute RGR functions:
128  call eftcambreturntogr_functions( a_used, input_model, params_cache, eft_functions )
129 
130  ! check if above threshold:
131  if ( any( eft_functions > 0._dl ) ) then
132  rgr_time = a_used
133  return
134  end if
135 
136  end do
137 
138  rgr_time = 1.1_dl*a_final
139 
140  end subroutine eftcambreturntogr
141 
142  ! ---------------------------------------------------------------------------------------------
144  subroutine eftcambreturntogr_functions( a, input_model, params_cache, eft_functions )
146  implicit none
147 
148  real(dl) , intent(in) :: a
149  class(eftcamb_model) , intent(in) :: input_model
150  type(eftcamb_parameter_cache) :: params_cache
151  real(dl) , intent(out) :: eft_functions(21)
152 
153  type(eftcamb_timestep_cache) :: eft_cache
154 
155  real(dl) :: a2, adotoa, grhonu, gpinu, grhonudot, gpinudot, grhormass_t
156  integer :: nu_i
157 
158  ! prepare:
159  a2 = a*a
160  ! initialize the cache:
161  call eft_cache%initialize()
162  ! start filling:
163  eft_cache%a = a
164  ! compute background densities of different species
165  eft_cache%grhob_t = params_cache%grhob/a ! 8\pi G_N \rho_b a^2: baryons background density
166  eft_cache%grhoc_t = params_cache%grhoc/a ! 8\pi G_N \rho_{cdm} a^2: cold dark matter background density
167  eft_cache%grhor_t = params_cache%grhornomass/a2 ! 8\pi G_N \rho_{\nu} a^2: massless neutrinos background density
168  eft_cache%grhog_t = params_cache%grhog/a2 ! 8\pi G_N \rho_{\gamma} a^2: radiation background density
169  ! Massive neutrinos terms:
170  if ( params_cache%Num_Nu_Massive /= 0 ) then
171  do nu_i = 1, params_cache%Nu_mass_eigenstates
172  grhonu = 0._dl
173  gpinu = 0._dl
174  grhormass_t = params_cache%grhormass(nu_i)/a**2
175  call params_cache%Nu_background(a*params_cache%nu_masses(nu_i), grhonu, gpinu)
176  eft_cache%grhonu_tot = eft_cache%grhonu_tot + grhormass_t*grhonu
177  eft_cache%gpinu_tot = eft_cache%gpinu_tot + grhormass_t*gpinu
178  end do
179  end if
180  ! assemble total densities and pressure:
181  eft_cache%grhom_t = eft_cache%grhob_t +eft_cache%grhoc_t +eft_cache%grhor_t +eft_cache%grhog_t +eft_cache%grhonu_tot
182  eft_cache%gpresm_t = (+eft_cache%grhor_t +eft_cache%grhog_t)/3._dl +eft_cache%gpinu_tot
183  ! compute the other things:
184  select type ( model => input_model )
185  ! compute the background and the background EFT functions.
186  class is ( eftcamb_full_model )
187  ! background for full models. Here the expansion history is computed from the
188  ! EFT functions. Hence compute them first and then compute the expansion history.
189  call input_model%compute_background_EFT_functions( a, params_cache , eft_cache )
190  call input_model%compute_adotoa( a, params_cache , eft_cache )
191  class is ( eftcamb_designer_model )
192  ! background for designer models. Here the expansion history is parametrized
193  ! and does not depend on the EFT functions. Hence compute first the expansion history
194  ! and then the EFT functions.
195  call input_model%compute_adotoa( a, params_cache , eft_cache )
196  end select
197  ! store adotoa:
198  adotoa = eft_cache%adotoa
199  ! compute massive neutrinos stuff:
200  ! Massive neutrinos mod:
201  eft_cache%grhonu_tot = 0._dl
202  eft_cache%gpinu_tot = 0._dl
203  if ( params_cache%Num_Nu_Massive /= 0 ) then
204  do nu_i = 1, params_cache%Nu_mass_eigenstates
205  grhonu = 0._dl
206  gpinu = 0._dl
207  grhonudot = 0._dl
208  gpinudot = 0._dl
209  grhormass_t= params_cache%grhormass(nu_i)/a**2
210  call params_cache%Nu_background(a*params_cache%nu_masses(nu_i),grhonu,gpinu)
211  eft_cache%grhonu_tot = eft_cache%grhonu_tot + grhormass_t*grhonu
212  eft_cache%gpinu_tot = eft_cache%gpinu_tot + grhormass_t*gpinu
213  eft_cache%grhonudot_tot = eft_cache%grhonudot_tot + grhormass_t*( params_cache%Nu_drho(a*params_cache%nu_masses(nu_i), adotoa, grhonu)&
214  & -4._dl*adotoa*grhonu )
215  eft_cache%gpinudot_tot = eft_cache%gpinudot_tot + grhormass_t*( params_cache%Nu_pidot(a*params_cache%nu_masses(nu_i),adotoa, gpinu )&
216  & -4._dl*adotoa*gpinu )
217  end do
218  end if
219  ! compute pressure dot:
220  eft_cache%gpresdotm_t = -4._dl*adotoa*( eft_cache%grhog_t +eft_cache%grhor_t )/3._dl +eft_cache%gpinudot_tot
221  ! compute remaining quantities related to H:
222  call input_model%compute_H_derivs( a, params_cache, eft_cache )
223  ! compute backgrond EFT functions if model is designer:
224  select type ( model => input_model )
225  class is ( eftcamb_designer_model )
226  call input_model%compute_background_EFT_functions( a, params_cache, eft_cache )
227  end select
228  ! compute all other background stuff:
229  call input_model%compute_rhoQPQ( a, params_cache, eft_cache )
230  ! compute second order EFT functions:
231  call input_model%compute_secondorder_EFT_functions( a, params_cache, eft_cache )
232 
233  ! get the EFT functions:
234  eft_functions( 1) = abs( eft_cache%EFTOmegaV )
235  eft_functions( 2) = abs( a*adotoa*eft_cache%EFTOmegaP )
236  eft_functions( 3) = 0._dl
237  eft_functions( 4) = 0._dl
238  eft_functions( 5) = abs( eft_cache%EFTc/a2 )
239  eft_functions( 6) = abs( eft_cache%EFTLambda/a2 +params_cache%grhov )
240  eft_functions( 7) = abs( eft_cache%EFTcdot/a2 )
241  eft_functions( 8) = abs( eft_cache%EFTLambdadot/a2 )
242  eft_functions( 9) = abs( eft_cache%EFTGamma1V )
243  eft_functions(10) = abs( eft_cache%EFTGamma1P )
244  eft_functions(11) = abs( eft_cache%EFTGamma2V )
245  eft_functions(12) = abs( eft_cache%EFTGamma2P )
246  eft_functions(13) = abs( eft_cache%EFTGamma3V )
247  eft_functions(14) = abs( eft_cache%EFTGamma3P )
248  eft_functions(15) = abs( eft_cache%EFTGamma4V )
249  eft_functions(16) = abs( eft_cache%EFTGamma4P )
250  eft_functions(17) = 0._dl
251  eft_functions(18) = abs( eft_cache%EFTGamma5V )
252  eft_functions(19) = abs( eft_cache%EFTGamma5P )
253  eft_functions(20) = abs( eft_cache%EFTGamma6V )
254  eft_functions(21) = abs( eft_cache%EFTGamma6P )
255 
256  ! subtract the GR threshold:
257  eft_functions = eft_functions -efttogr
258 
259  end subroutine eftcambreturntogr_functions
260 
261  !----------------------------------------------------------------------------------------
262 
263 end module eftcamb_returntogr
264 
265 !----------------------------------------------------------------------------------------
subroutine, public eftcambreturntogr_feedback(feedback_level, input_model, params_cache, RGR_time)
Subroutine that prints feedback for the RGR module. Prints something only if EFTCAMB_feedback_level i...
This module contains the definition of the EFTCAMB caches. These are used to store parameters that ca...
This module contains the abstract definition of all the places where EFTCAMB interacts with CAMB...
real(dl), parameter efttogr
Return to GR flag: This is the threshold at which a theory is considered to be exactly GR...
Definition: 01_EFT_def.f90:39
subroutine, public eftcambreturntogr(input_model, params_cache, initial_time, RGR_time)
Subroutine that computes the return to GR of a theory.
This module contains the abstract definition of all the places where EFTCAMB interacts with CAMB in c...
This module contains the abstract definition of all the places where EFTCAMB interacts with CAMB in c...
This module contains the definitions of all the EFTCAMB compile time flags.
Definition: 01_EFT_def.f90:25
This module contains the RGR algorithm. This operates on general EFT models.
subroutine, public eftcambreturntogr_functions(a, input_model, params_cache, eft_functions)
Subroutine that computes the EFT functions as we need them for the RGR function.
integer, parameter eft_rgr_num_points
number of points to sample logaritmically the time in the return to GR module.
Definition: 01_EFT_def.f90:45