1#ifndef PERTURBATIONS_MODULE_H
2#define PERTURBATIONS_MODULE_H
6#include "base_module.h"
11class IDM_DRMD_IDR_DRMD_Species;
23struct ResolvedSpecies {
25 std::size_t idm_dr_idr_index =
static_cast<std::size_t
>(-1);
26 const IDM_DRMD_IDR_DRMD_Species* idm_drmd =
nullptr;
30 int idr_nature = idr_free_streaming;
31 std::size_t cdm_index =
static_cast<std::size_t
>(-1);
34class PerturbationsModule :
public BaseModule {
40 return resolved_.ppf_fluid;
43 PerturbationsModule(InputModulePtr input_module,
44 BackgroundModulePtr background_module,
45 ThermodynamicsModulePtr thermodynamics_module);
46 ~PerturbationsModule();
51 void perturb_output_titles(
file_format output_format, std::string& titles)
const;
52 void perturb_output_firstline_and_ic_suffix(
int index_ic,
53 std::string& first_line,
54 std::string& ic_suffix)
const;
57 const background* GetBackground() const noexcept {
60 const perturbs* GetPerturbs() const noexcept {
63 const precision* GetPrecision() const noexcept {
66 BackgroundModulePtr GetBackgroundModule()
const {
67 return background_module_;
69 ThermodynamicsModulePtr GetThermodynamicsModule()
const {
70 return thermodynamics_module_;
75 int index_md,
int index_ic,
int index_tp,
int index_tau,
int index_k,
double value) {
76 sources_[index_md][index_ic * tp_size_[index_md] + index_tp]
77 [index_tau * k_size_[index_md] + index_k] = value;
82 int index_md_scalars_;
83 int index_md_tensors_;
84 int index_md_vectors_;
89 int index_ic_ad_ = -1;
90 int index_ic_cdi_ = -1;
91 int index_ic_bi_ = -1;
92 int index_ic_nid_ = -1;
93 int index_ic_niv_ = -1;
94 int index_ic_ten_ = -1;
110 int index_tp_delta_tot_;
111 int index_tp_perturbed_recombination_delta_temp_;
112 int index_tp_perturbed_recombination_delta_chi_;
114 int index_tp_theta_m_;
115 int index_tp_theta_cb_;
116 int index_tp_theta_tot_;
119 int index_tp_phi_prime_;
120 int index_tp_phi_plus_psi_;
123 int index_tp_h_prime_;
125 int index_tp_eta_prime_;
126 int index_tp_H_T_Nb_prime_;
127 int index_tp_k2gamma_Nb_;
129 int index_tp_delta_m_;
130 int index_tp_delta_cb_;
136 ResolvedSpecies resolved_;
138 void ResolveSpecies();
147 std::vector<char> species_emits_source_;
151 bool has_source_delta_m_;
152 bool has_source_delta_cb_;
153 bool has_source_delta_tot_;
154 bool has_source_theta_m_;
155 bool has_source_theta_cb_;
156 bool has_source_theta_tot_;
157 bool has_source_phi_;
158 bool has_source_phi_prime_;
159 bool has_source_phi_plus_psi_;
160 bool has_source_psi_;
162 bool has_source_h_prime_;
163 bool has_source_eta_;
164 bool has_source_eta_prime_;
165 bool has_source_H_T_Nb_prime_;
167 has_source_k2gamma_Nb_;
172 index_k_output_values_;
182 std::vector<double> scalar_perturbations_data_
184 std::vector<double> vector_perturbations_data_
186 std::vector<double> tensor_perturbations_data_
189 int size_scalar_perturbation_data_
191 int size_vector_perturbation_data_
193 int size_tensor_perturbation_data_
201 std::vector<std::vector<std::vector<double>>> sources_;
217 std::vector<double> tau_sampling_;
220 std::vector<int> k_size_cl_;
223 std::vector<int> k_size_;
226 std::vector<std::vector<double>> k_;
231 void perturb_sources_at_tau(
232 int index_md,
int index_ic,
int index_tp,
double tau,
double* pvecsources)
const;
234 void perturb_indices_of_perturbs();
235 void perturb_timesampling_for_sources();
236 void perturb_get_k_list();
238 void perturb_solve(
int index_md,
int index_ic,
int index_k,
perturb_workspace* ppw);
239 void perturb_prepare_k_output();
240 void perturb_find_approximation_number(
int index_md,
245 int* interval_number,
246 int* interval_number_of);
247 void perturb_find_approximation_switches(
int index_md,
254 int* interval_number_of,
255 double* interval_limit,
256 int** interval_approx);
257 void perturb_vector_init(
258 int index_md,
int index_ic,
double k,
double tau,
perturb_workspace* ppw,
int* pa_old);
259 void perturb_initial_conditions(
261 void perturb_approximations(
int index_md,
double k,
double tau,
perturb_workspace* ppw);
262 void perturb_einstein(
int index_md,
double k,
double tau,
double* y,
perturb_workspace* ppw);
263 void perturb_total_stress_energy(
int index_md,
double k,
double* y,
perturb_workspace* ppw);
264 void perturb_timescale_member(
double tau,
void* parameters_and_workspace,
double* timescale);
265 static void perturb_timescale(
double tau,
void* parameters_and_workspace,
double* timescale);
266 void perturb_sources_member(
double tau,
267 double* pvecperturbations,
270 void* parameters_and_workspace);
271 static void perturb_sources(
double tau,
272 double* pvecperturbations,
275 void* parameters_and_workspace);
276 void perturb_print_variables_member(
double tau,
279 void* parameters_and_workspace);
280 static void perturb_print_variables(
double tau,
283 void* parameters_and_workspace);
284 void perturb_derivs_member(
double tau,
double* y,
double* dy,
void* parameters_and_workspace);
285 static void perturb_derivs(
double tau,
double* y,
double* dy,
void* parameters_and_workspace);
286 void perturb_tca_slip_and_shear(
double* y,
void* parameters_and_workspace);
287 void perturb_rsa_delta_and_theta(
288 double k,
double* y,
double a_prime_over_a,
double* pvecthermo,
perturb_workspace* ppw);
289 void perturb_rsa_idr_delta_and_theta(
290 double k,
double* y,
double a_prime_over_a,
double* pvecthermo,
perturb_workspace* ppw);
292 BackgroundModulePtr background_module_;
293 ThermodynamicsModulePtr thermodynamics_module_;
308 std::vector<std::vector<double*>> late_sources_;
313 std::vector<std::vector<std::vector<double>>>
320 int number_of_scalar_titles_;
321 int number_of_vector_titles_;
322 int number_of_tensor_titles_;
328 std::vector<int> k_size_cmb_;
343 PerturbationsModule*
const perturbations_module;
Definition base_species.h:76
Definition idm_dr_idr_species.h:16
Definition ppf_fluid.h:11
#define _MAX_NUMBER_OF_K_FILES_
Definition perturbations.h:89
Definition perturbations.h:344
Definition perturbations.h:100
file_format
Definition precision.h:40
Definition perturbations_module.h:341
int index_k
Definition perturbations_module.h:346
perturb_workspace * ppw
Definition perturbations_module.h:348
int index_ic
Definition perturbations_module.h:345
double k
Definition perturbations_module.h:347
int index_md
Definition perturbations_module.h:344
Definition precision.h:63