FML
Data Structures | Typedefs | Functions
FML::COSMOLOGY::SPHERICALCOLLAPSE Namespace Reference

Data Structures

class  SphericalCollapse
 Class for doing general spherical collapse calculations, i.e. More...
 
class  SphericalCollapseModel
 The class contains all the info about the model needed to run the spherical collapse and halomodel Cosmology/gravity functions provided using lambda functions. More...
 

Typedefs

using Timer = FML::UTILS::Timings
 
using DVector = FML::SOLVERS::ODESOLVER::DVector
 
using DVector2D = FML::SOLVERS::ODESOLVER::DVector2D
 
using ODEFunction = FML::SOLVERS::ODESOLVER::ODEFunction
 
using ODEFunctionJacobian = FML::SOLVERS::ODESOLVER::ODEFunctionJacobian
 
using ODESolver = FML::SOLVERS::ODESOLVER::ODESolver
 
using Spline = FML::INTERPOLATION::SPLINE::Spline
 
using Func1 = std::function< double(double)>
 

Functions

void compute_growthfactor (const SphericalCollapseModel &model, Spline &growthfactor_spline, Spline &growthrate_spline, const double xini=std::log(1e-5), const double xend=0.0, const int npts=1000)
 Computes the growth factor (not normalized) and growth rate for a given model and returns splines with \(D(x)\) and \(f(x)\) where \(x=\log(a)\). More...
 
double roverR_of_delta_and_x (double delta, double x, double RH0=1.0, double delta_ini=0.0)
 This is the dimensionless quantity \(r(x)/R\) (the radius of the tophat) for spherical collapse evolution,. More...
 
double evolve_spherical_collapse_equations (const SphericalCollapseModel &model, const double delta_ini, DVector &x_array, DVector &delta_array, DVector &delta_prime_array, DVector &delta_lin_array, DVector &delta_lin_prime_array, const bool get_arrays=true, const double xini=std::log(1e-3), const double xcollapse=std::log(1.0), const int npts=1000, const double delta_infinity=1e16)
 Evolve the spherical collapse equation + linear for a given set of IC delta_ini over a given range [xini,xcollapse] and return the arrays + the x-value where delta(x) > delta_infinity (i.e. More...
 
double find_delta_ini (const SphericalCollapseModel &model, const double xini=std::log(1e-3), const double xcollapse=std::log(1.0), const int npts=1000, const double epsilon_delta=1e-8)
 Do root finding to figure out the delta_ini that gives collapse at x=xcollapse. More...
 
auto compute_times (const double xini, const double xcollapse, const SphericalCollapseModel &model, const Spline &delta_spline, const Spline &delta_prime_spline) -> std::tuple< double, double, double, double >
 Extract useful times from spherical collapse evolution like turnaround, virialization and non-linear onset. More...
 
void compute_sphericalcollapse_splines (const SphericalCollapseModel &model, Spline &deltac_of_x_spline, Spline &DeltaVir_of_x_spline, Spline &xnl_of_x_spline, Spline &xta_of_x_spline, Spline &xvir_of_x_spline, Spline &delta_ini_of_x_spline, const double xini=std::log(1e-3), const int npts=1000, bool verbose=false)
 Do spherical collapse for all times. More...
 

Typedef Documentation

◆ DVector

Definition at line 21 of file SphericalCollapse.h.

◆ DVector2D

Definition at line 22 of file SphericalCollapse.h.

◆ Func1

using FML::COSMOLOGY::SPHERICALCOLLAPSE::Func1 = typedef std::function<double(double)>

Definition at line 14 of file SphericalCollapseModel.h.

◆ ODEFunction

Definition at line 23 of file SphericalCollapse.h.

◆ ODEFunctionJacobian

Definition at line 24 of file SphericalCollapse.h.

◆ ODESolver

Definition at line 25 of file SphericalCollapse.h.

◆ Spline

Definition at line 26 of file SphericalCollapse.h.

◆ Timer

Definition at line 20 of file SphericalCollapse.h.

Function Documentation

◆ compute_growthfactor()

void FML::COSMOLOGY::SPHERICALCOLLAPSE::compute_growthfactor ( const SphericalCollapseModel &  model,
Spline &  growthfactor_spline,
Spline &  growthrate_spline,
const double  xini = std::log(1e-5),
const double  xend = 0.0,
const int  npts = 1000 
)

Computes the growth factor (not normalized) and growth rate for a given model and returns splines with \(D(x)\) and \(f(x)\) where \(x=\log(a)\).

Parameters
[in]modelThe spherical-collapse model
[in,out]growthfactor_splineSpline of the growthfactor \(D(\log a)\)
[in,out]growthrate_splineSpline of the growth-rate \(d\log D(\log a)/d\log a\)
[in]xiniThe time \(x=\log(a)\) we start the integration. Fiducial \(a=10^{-5}\).
[in]xendThe time we end the integration.
[in]nptsNumber of points (linear between xini and xend) to compute it on.

Definition at line 12 of file SphericalCollapse.cpp.

18 {
19
20 auto x_array = FML::MATH::linspace(xini, xend, npts);
21 ODEFunction deriv = [&model](double x, const double * y, double * dydx) {
22 return model.ode_system_linear_growth(x, y, dydx);
23 };
24
25 // EdS D ~ a so D'=D
26 DVector y_initial{std::exp(xini), std::exp(xini)};
27 ODESolver ode;
28 ode.solve(deriv, x_array, y_initial);
29 const auto growthfactor_array = ode.get_data_by_component(0);
30 const auto delta_prime_lin_array = ode.get_data_by_component(1);
31 auto growthrate_array = delta_prime_lin_array;
32 for(size_t i = 0; i < growthfactor_array.size(); i++){
33 growthrate_array[i] /= growthfactor_array[i];
34 }
35 growthfactor_of_x_spline = Spline(x_array, growthfactor_array, "Growthfactor D(loga)");
36 growthrate_of_x_spline = Spline(x_array, growthrate_array, "Growthrate f(loga)");
37 }
This is a wrapper around the GSL library to easily solve ODEs and return the data in whatever format ...
Definition: ODESolver.h:87
DVector get_data_by_component(int icomponent) const
Get the data for a particular component y_i(xarr)
Definition: ODESolver.cpp:178
void solve(ODEFunctionPointer ode_equation, void *parameters, DVector &xarr, DVector &yinitial, const gsl_odeiv2_step_type *stepper=ODESOLVER_FIDUCIAL_STEPPER, ODEFunctionPointerJacobian jacobian=nullptr)
Definition: ODESolver.cpp:71
FML::SOLVERS::ODESOLVER::ODEFunction ODEFunction
std::vector< double > DVector
FML::INTERPOLATION::SPLINE::Spline Spline
Definition: CAMBReader.h:14
DVector linspace(double xmin, double xmax, int num)
Python linspace. Generate a lineary spaced array.
Definition: Math.cpp:269
return y
Definition: Global.h:265
const double exp
Definition: Global.h:259
x
Definition: test.py:18

◆ compute_sphericalcollapse_splines()

void FML::COSMOLOGY::SPHERICALCOLLAPSE::compute_sphericalcollapse_splines ( const SphericalCollapseModel &  model,
Spline &  deltac_of_x_spline,
Spline &  DeltaVir_of_x_spline,
Spline &  xnl_of_x_spline,
Spline &  xta_of_x_spline,
Spline &  xvir_of_x_spline,
Spline &  delta_ini_of_x_spline,
const double  xini,
const int  npts,
bool  verbose 
)

Do spherical collapse for all times.

Definition at line 206 of file SphericalCollapse.cpp.

216 {
217
218 // Run spherical collapse and extract splines
219 auto run_and_generate_delta_splines = [](
220 const double xini,
221 const double xcollapse,
222 const int npts,
224 Spline & delta_spline,
225 Spline & delta_prime_spline,
226 Spline & delta_lin_spline,
227 double delta_ini = -1.0){
228 if(delta_ini < 0.0)
229 delta_ini = find_delta_ini(model, xini, xcollapse, npts);
230 DVector x_array, delta_array, delta_prime_array, delta_lin_array, delta_lin_prime_array;
232 model,
233 delta_ini,
234 x_array,
235 delta_array,
236 delta_prime_array,
237 delta_lin_array,
238 delta_lin_prime_array,
239 true,
240 xini,
241 xcollapse,
242 npts);
243 delta_spline = Spline(x_array, delta_array, "delta(loga)");
244 delta_prime_spline = Spline(x_array, delta_prime_array, "ddelta/dloga(loga)");
245 delta_lin_spline = Spline(x_array, delta_lin_array, "deltaLin(loga)");
246 return delta_ini;
247 };
248
249 // Range we want deltac(z) etc on
250 const double zini = 10.0;
251 const double zend = 0.0;
252 const int npts_z = 100;
253 const auto xcollapse_array = FML::MATH::linspace(std::log(1.0/(1.0+zini)),std::log(1.0/(1.0+zend)),npts_z);
254
255 DVector deltac_array(xcollapse_array.size());
256 DVector DeltaVir_array(xcollapse_array.size());
257 DVector xta_array(xcollapse_array.size());
258 DVector xvir_array(xcollapse_array.size());
259 DVector xnl_array(xcollapse_array.size());
260 DVector delta_ini_array(xcollapse_array.size());
261
262#ifdef USE_OMP
263#pragma omp parallel for schedule(dynamic,1)
264#endif
265 for(size_t i = 0; i < xcollapse_array.size(); i++){
266 auto xcollapse = xcollapse_array[i];
267
268 // Generate solution
269 Spline delta_spline;
270 Spline delta_prime_spline;
271 Spline delta_lin_spline;
272 const double delta_ini = run_and_generate_delta_splines(
273 xini,
274 xcollapse,
275 npts,
276 model,
277 delta_spline,
278 delta_prime_spline,
279 delta_lin_spline);
280
281 // Compute quantities
282 const auto times = compute_times(xini, xcollapse, model, delta_spline, delta_prime_spline);
283 const double xta = std::get<0>(times);
284 const double xvir = std::get<1>(times);
285 const double xnl = std::get<2>(times);
286 const double xta2 = std::get<3>(times);
287 const double DeltaVir = (1.0+delta_spline(xvir))*std::exp(3.0*xcollapse-3.0*xvir);
288 const double deltac = delta_lin_spline(xcollapse);
289
290 if(xcollapse == 0.0 and verbose){
291 std::cout << "\n#=====================================================\n";
292 std::cout << "# For collapse at z=0 we get:\n";
293 std::cout << "#=====================================================\n";
294 std::cout << " deltac = " << deltac << "\n";
295 std::cout << " DeltaVir = " << DeltaVir << "\n";
296 std::cout << " Turnaround r = " << roverR_of_delta_and_x(delta_spline(xta),xta,1.0,0.0) << "\n";
297 std::cout << " Virial r = " << roverR_of_delta_and_x(delta_spline(xvir),xvir,1.0,0.0) << "\n";
298 std::cout << " rta/2 = " << roverR_of_delta_and_x(delta_spline(xta2),xta2,1.0,0.0) << "\n";
299 std::cout << "#=====================================================\n";
300 }
301
302 xta_array[i] = xta;
303 xnl_array[i] = xnl;
304 xvir_array[i] = xvir;
305 deltac_array[i] = deltac;
306 DeltaVir_array[i] = DeltaVir;
307 delta_ini_array[i] = delta_ini;
308
309 // In this case the problem is not well posed so return nan
310 if(model.muofx(xcollapse) <= 0.0){
311 throw std::runtime_error("Spherical collapse. Negative Geff/G encountere. Problem not well posed!");
312 }
313 }
314 xta_of_x_spline = Spline(xcollapse_array, xta_array, "loga_turnaround(loga_collapse)");
315 xnl_of_x_spline = Spline(xcollapse_array, xnl_array, "loga_nonlinear(loga_collapse)");
316 xvir_of_x_spline = Spline(xcollapse_array, xvir_array, "loga_virialization(loga_collapse)");
317 deltac_of_x_spline = Spline(xcollapse_array, deltac_array, "deltac(loga_collapse)");
318 DeltaVir_of_x_spline = Spline(xcollapse_array, DeltaVir_array, "DeltaVir(loga_collapse)");
319 delta_ini_of_x_spline = Spline(xcollapse_array, delta_ini_array, "delta_ini(loga_collapse)");
320 }
const double zini
Definition: Main.cpp:40
The class contains all the info about the model needed to run the spherical collapse and halomodel Co...
This is a wrapper class for easy use of GSL splines It is (OpenMP) thread safe as long as splines are...
Definition: Spline.h:80
double evolve_spherical_collapse_equations(const SphericalCollapseModel &model, const double delta_ini, DVector &x_array, DVector &delta_array, DVector &delta_prime_array, DVector &delta_lin_array, DVector &delta_lin_prime_array, const bool get_arrays, const double xini, const double xcollapse, const int npts, const double delta_infinity)
Evolve the spherical collapse equation + linear for a given set of IC delta_ini over a given range [x...
auto compute_times(const double xini, const double xcollapse, const SphericalCollapseModel &model, const Spline &delta_spline, const Spline &delta_prime_spline) -> std::tuple< double, double, double, double >
Extract useful times from spherical collapse evolution like turnaround, virialization and non-linear ...
double find_delta_ini(const SphericalCollapseModel &model, const double xini, const double xcollapse, const int npts, const double epsilon_delta)
Do root finding to figure out the delta_ini that gives collapse at x=xcollapse.
double roverR_of_delta_and_x(double delta, double x, double RH0, double delta_ini)
This is the dimensionless quantity (the radius of the tophat) for spherical collapse evolution,...
FML::SOLVERS::ODESOLVER::DVector DVector
deltac
Definition: example.py:67
bool verbose
Definition: example.py:19

◆ compute_times()

auto FML::COSMOLOGY::SPHERICALCOLLAPSE::compute_times ( const double  xini,
const double  xcollapse,
const SphericalCollapseModel &  model,
const Spline &  delta_spline,
const Spline &  delta_prime_spline 
) -> std::tuple< double, double, double, double >

Extract useful times from spherical collapse evolution like turnaround, virialization and non-linear onset.

Definition at line 147 of file SphericalCollapse.cpp.

152 {
153
154 // Accuracy in x for finding times
155 const double epsilon_x = 1e-8;
156
157 // Compute turnaround time
158 auto turnaround_condition = [&delta_spline, &delta_prime_spline](double x){
159 const double delta = delta_spline(x), delta_prime = delta_prime_spline(x);
160 return 1.0 - delta_prime/3.0/(1.0+delta);
161 };
162 const double xturnaround = FML::MATH::find_root_bisection(turnaround_condition, {xini, xcollapse}, epsilon_x);
163
164 // Compute virialization time
165 auto virial_condition = [&model, &delta_spline, &delta_prime_spline](double x) {
166 const double delta = delta_spline(x), delta_prime = delta_prime_spline(x);
167 const double roverR = roverR_of_delta_and_x(delta, x);
168 return model.virial_condition(delta, delta_prime, roverR, x);
169 };
170 // If we have several times where 2T+W=0 pick the one with largest redshift
171 double x_search = xturnaround;
172 const double deltax = 0.01;
173 const int sign = virial_condition(x_search) > 0 ? 1 : -1;
174 while(true){
175 const int sign1 = virial_condition(x_search) > 0 ? 1 : -1;
176 if(sign * sign1 == -1) break;
177 x_search += deltax;
178 }
179 const double xvir = FML::MATH::find_root_bisection(virial_condition, {xturnaround, x_search}, epsilon_x);
180
181 // Compute non-linear time
182 auto nonlinear_condition = [&model, &delta_spline, &delta_prime_spline](double x){
183 const double delta = delta_spline(x), delta_prime = delta_prime_spline(x);
184 const double roverR = roverR_of_delta_and_x(delta, x);
185 return model.nonlinear_condition(delta, delta_prime, roverR, x);;
186 };
187 const double xnl = FML::MATH::find_root_bisection(nonlinear_condition, {xini, xcollapse}, epsilon_x);
188
189 // Compute time for which r=rturnaround/2
190 const double roverR_turnaround = roverR_of_delta_and_x(delta_spline(xturnaround), xturnaround);
191 auto halfturnaround_condition = [&roverR_turnaround, &delta_spline](double x) {
192 const double delta = delta_spline(x);
193 const double roverR = roverR_of_delta_and_x(delta, x);
194 return roverR - roverR_turnaround/2.0;
195 };
196 const double xhalfturnaround = FML::MATH::find_root_bisection(halfturnaround_condition, {xturnaround, xcollapse}, epsilon_x);
197
198 return std::tuple(xturnaround, xvir, xnl, xhalfturnaround);
199 }
double find_root_bisection(const std::function< double(double)> &function, std::pair< double, double > xrange, double epsilon)
Find roots using bisection.
Definition: Math.cpp:51

◆ evolve_spherical_collapse_equations()

double FML::COSMOLOGY::SPHERICALCOLLAPSE::evolve_spherical_collapse_equations ( const SphericalCollapseModel &  model,
const double  delta_ini,
DVector &  x_array,
DVector &  delta_array,
DVector &  delta_prime_array,
DVector &  delta_lin_array,
DVector &  delta_lin_prime_array,
const bool  get_arrays = true,
const double  xini = std::log(1e-3),
const double  xcollapse = std::log(1.0),
const int  npts = 1000,
const double  delta_infinity = 1e16 
)

Evolve the spherical collapse equation + linear for a given set of IC delta_ini over a given range [xini,xcollapse] and return the arrays + the x-value where delta(x) > delta_infinity (i.e.

it has collapsed completely). If it haven't collapsed return xcollapse This value can be used to more easily figure out delta_ini that corresponds to collapse at exactly xcollapse via root finding

Definition at line 61 of file SphericalCollapse.cpp.

73 {
74
75 // ODE solver parameters
76 const double hstart = 1e-3;
77 const double epsilon_abs = 1e-6;
78 const double epsilon_rel = 1e-6;
79
80 // The first x for which delta > delta_infinity
81 double xminover = xcollapse;
82
83 // Set x array (linear in 'a' seems to work well)
84 x_array = FML::MATH::linspace(std::exp(xini),std::exp(xcollapse),npts);
85 for(auto & x : x_array) x = std::log(x);
86
87 ODEFunction deriv = [&model,&xminover,&delta_infinity](double x, const double * y, double * dydx) -> int {
88 // Check if we have collapsed
89 if(y[0] > delta_infinity){
90 if(x < xminover) xminover = x;
91 dydx[0] = dydx[1] = 0.0;
92 return GSL_SUCCESS;
93 }
94 return model.ode_system_non_linear_growth(x, y, dydx);
95 };
96
97 // The growing mode has D ~ a = exp(x) so D' = D
98 DVector y_initial{delta_ini, delta_ini, delta_ini, delta_ini};
99 ODESolver ode;
100 ode.set_accuracy(hstart, epsilon_abs, epsilon_rel);
101 ode.solve(deriv, x_array, y_initial, gsl_odeiv2_step_rkck);
102
103 // Fetch solution arrays
104 if(get_arrays){
105 delta_array = ode.get_data_by_component(0);
106 delta_prime_array = ode.get_data_by_component(1);
107 delta_lin_array = ode.get_data_by_component(2);
108 delta_lin_prime_array = ode.get_data_by_component(3);
109 }
110 return xminover;
111 }
FML::INTERPOLATION::SPLINE::DVector DVector
Definition: Simulation.h:39
void set_accuracy(const double hstart, const double abserr, const double relerr)
Set the accuracy parameters (first guess for the step-size, the absolute and relative error)
Definition: ODESolver.cpp:204

◆ find_delta_ini()

double FML::COSMOLOGY::SPHERICALCOLLAPSE::find_delta_ini ( const SphericalCollapseModel &  model,
const double  xini,
const double  xcollapse,
const int  npts,
const double  epsilon_delta 
)

Do root finding to figure out the delta_ini that gives collapse at x=xcollapse.

Definition at line 117 of file SphericalCollapse.cpp.

122 {
123
124 auto condition = [&](double delta_ini){
125 DVector x_array, delta_array, delta_prime_array, delta_lin_array, delta_lin_prime_array;
126 const double xminover = evolve_spherical_collapse_equations(
127 model,
128 delta_ini,
129 x_array,
130 delta_array,
131 delta_prime_array,
132 delta_lin_array,
133 delta_lin_prime_array,
134 false,
135 xini,
136 xcollapse,
137 npts);
138 return xminover - xcollapse;
139 };
140 return FML::MATH::find_root_bisection(condition, {0.0, 1.0}, epsilon_delta);
141 }

◆ roverR_of_delta_and_x()

double FML::COSMOLOGY::SPHERICALCOLLAPSE::roverR_of_delta_and_x ( double  delta,
double  x,
double  RH0,
double  delta_ini 
)

This is the dimensionless quantity \(r(x)/R\) (the radius of the tophat) for spherical collapse evolution,.

Definition at line 43 of file SphericalCollapse.cpp.

47 {
48 return (RH0) * std::pow((1.0+delta_ini)/(1.0+delta),1.0/3.0)*std::exp(x);
49 };