Skip to content
Snippets Groups Projects
Commit cb0d7c26 authored by lhausamm's avatar lhausamm Committed by Loic Hausammann
Browse files

Add function giving scale factor from time

parent 81cf00f7
No related branches found
No related tags found
1 merge request!560Output time from a file
...@@ -650,6 +650,47 @@ double cosmology_get_a_from_z(const struct cosmology *c, double redshift) { ...@@ -650,6 +650,47 @@ double cosmology_get_a_from_z(const struct cosmology *c, double redshift) {
return 1. / (1. + redshift); return 1. / (1. + redshift);
} }
/**
* @brief Compute scale factor from time since big bang.
*
* WARNING: This function is slow, therefore it should not be called more than
* once per time step.
*
* Find the scale factor from the time since big bang using the bisection method
* on $ t - f(a) = 0 $ where $ f(a) $ is #cosmology_get_time_since_big_bang
*
* By knowing that this function is a decreasing monotonic function, we can
* avoid a few checks.
*
* @param cosmo The current #cosmology.
* @param t since the big bang
* @return The scale factor.
*/
double cosmology_get_scale_factor(const struct cosmology *cosmo, double t) {
/* convergence limit and current error */
const double limit = 1e-8;
double eps = 1.;
/* limits in scale factor */
double a_low = 1e-9;
double a_up = 1.;
/* do the bisection method */
while (eps > limit) {
double a_tmp = 0.5 * (a_low + a_up);
double f_tmp = t - cosmology_get_time_since_big_bang(cosmo, a_tmp);
if (f_tmp > 0)
a_low = a_tmp;
else
a_up = a_tmp;
eps = a_up - a_low;
}
return 0.5 * (a_low + a_up);
}
/** /**
* @brief Prints the #cosmology model to stdout. * @brief Prints the #cosmology model to stdout.
*/ */
......
...@@ -186,6 +186,8 @@ double cosmology_get_delta_time(const struct cosmology *c, double a1, ...@@ -186,6 +186,8 @@ double cosmology_get_delta_time(const struct cosmology *c, double a1,
double cosmology_get_a_from_z(const struct cosmology *c, double cosmology_get_a_from_z(const struct cosmology *c,
double redshift); double redshift);
double cosmology_get_scale_factor(const struct cosmology *cosmo, double t);
double cosmology_get_time_since_big_bang(const struct cosmology *c, double a); double cosmology_get_time_since_big_bang(const struct cosmology *c, double a);
void cosmology_init(struct swift_params *params, const struct unit_system *us, void cosmology_init(struct swift_params *params, const struct unit_system *us,
const struct phys_const *phys_const, struct cosmology *c); const struct phys_const *phys_const, struct cosmology *c);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment