CLASSpp Manual
Cosmology reference and developer manual
Loading...
Searching...
No Matches
idr.h
1#pragma once
2#include <vector>
3
4#include "background.h"
5#include "base_species.h"
6#include "perturbations.h"
7
8class ThermodynamicsModule; // forward declaration
9
14class IDRSpecies : public BaseSpecies {
15 public:
16 IDRSpecies(const background& pba,
17 double omega0_idr,
18 bool has_sibling_idm_dr = false,
19 double T_idr = 0.,
20 int l_max_idr = 0,
21 double b_idr = 0.,
22 int idr_nature = 0,
23 std::vector<double> alpha_idm_dr = {},
24 std::vector<double> beta_idr = {})
25 : BaseSpecies("IDR", EnergyType::Radiation), pba_(pba), Omega0_idr_(omega0_idr),
26 has_sibling_idm_dr_(has_sibling_idm_dr), T_idr_(T_idr), l_max_idr_(l_max_idr),
27 b_idr_(b_idr), idr_nature_(idr_nature), alpha_idm_dr_(std::move(alpha_idm_dr)),
28 beta_idr_(std::move(beta_idr)) {}
29
30 bool has_sibling_idm_dr() const {
31 return has_sibling_idm_dr_;
32 }
33
34 double T_idr() const {
35 return T_idr_;
36 }
37 int l_max_idr() const {
38 return l_max_idr_;
39 }
40
41 double b_idr() const {
42 return b_idr_;
43 }
44 int idr_nature() const {
45 return idr_nature_;
46 }
47 const std::vector<double>& alpha_idm_dr() const {
48 return alpha_idm_dr_;
49 }
50 const std::vector<double>& beta_idr() const {
51 return beta_idr_;
52 }
53
54 void SetThermodynamicsModule(const ThermodynamicsModule* thm) override {
55 thm_ = thm;
56 }
57 void SetPerturbs(const perturbs* ppt) override {
58 ppt_ = ppt;
59 }
60
61 double GetOmega0() const override {
62 return Omega0_idr_;
63 }
64
66 double GetRadiationOmega0() const override {
67 return Omega0_idr_;
68 }
69
70 bool IsFreestreaming() const override {
71 return true;
72 }
73
74 void RegisterBackgroundIndices(int& index_bg) override {
75 index_bg_rho_ = index_bg++;
76 }
77
78 void ComputeBackground(double a, const double* /*pvecback_B*/, double* pvecback) override {
79 pvecback[index_bg_rho_] = Omega0_idr_ * pba_.H0 * pba_.H0 / (a * a * a * a);
80 }
81
82 double Rho(const double* pvecback) const override {
83 return pvecback[index_bg_rho_];
84 }
85 double P(const double* pvecback) const override {
86 return pvecback[index_bg_rho_] / 3.;
87 }
88 double PPrime(double a,
89 double H,
90 const double* /*pvecback_B*/,
91 const double* pvecback) const override {
92 return a * H * (-4. / 3. * pvecback[index_bg_rho_]);
93 }
94
95 // ── PerturbLayout ──────────────────────────────────────────────────────────
96
108 int idx_delta = -1;
109 int idx_theta = -1;
110 int idx_shear = -1;
111 int idx_l3 = -1;
112 int l_max = -1;
113 };
114
115 std::unique_ptr<BaseSpecies::PerturbLayout> CreatePerturbLayout() const override {
116 return std::make_unique<PerturbLayout>();
117 }
118
129 double TcaShearIdr(const PerturbLayout& layout,
130 const double* y,
131 const perturb_workspace* ppw) const;
132
133 // ── Perturbation index registration ────────────────────────────────────────
134
135 void RegisterPerturbationIndices(BaseSpecies::PerturbLayout& layout,
136 perturb_vector* pv,
137 const precision* ppr,
138 int& index_pt,
139 const perturb_workspace* ppw,
140 int gauge) override;
141
142 // ── PerturbDerivs ──────────────────────────────────────────────────────────
143
144 void PerturbDerivs(const BaseSpecies::PerturbLayout& layout,
145 double tau,
146 const double* y,
147 double* dy,
148 const perturb_parameters_and_workspace& ppaw) const override;
149
150 // ── Stress-energy observables ───────────────────────────────────────────────
151
152 StressEnergyContribution StressEnergy(const BaseSpecies::PerturbLayout& layout,
153 const perturb_vector* pv,
154 const double* y,
155 const double* pvecback,
156 const perturb_workspace* ppw) const override;
157
159 double* y,
160 const PerturbIcContext& ctx) override;
161
162 // ── Switch-copy hook (for Phase C / Task 25) ───────────────────────────────
163
172 const BaseSpecies::PerturbLayout& new_layout,
173 const double* old_y,
174 double* new_y,
175 const PerturbSwitchContext& ctx) const override;
176
177 private:
178 const background& pba_;
179 double Omega0_idr_;
180 bool has_sibling_idm_dr_;
181 double T_idr_ = 0.;
182 int l_max_idr_ = 0;
183 const ThermodynamicsModule* thm_ = nullptr;
184 const perturbs* ppt_ = nullptr;
185 double b_idr_ = 0.;
186 int idr_nature_ = 0;
187 std::vector<double> alpha_idm_dr_;
188 std::vector<double> beta_idr_;
189};
Definition base_species.h:76
Definition idr.h:14
void RegisterBackgroundIndices(int &index_bg) override
Definition idr.h:74
void CopyPerturbationsAcrossSwitch(const BaseSpecies::PerturbLayout &old_layout, const BaseSpecies::PerturbLayout &new_layout, const double *old_y, double *new_y, const PerturbSwitchContext &ctx) const override
Definition interacting_species.cpp:254
double P(const double *pvecback) const override
Definition idr.h:85
double PPrime(double a, double H, const double *, const double *pvecback) const override
Definition idr.h:88
std::unique_ptr< BaseSpecies::PerturbLayout > CreatePerturbLayout() const override
Definition idr.h:115
double Rho(const double *pvecback) const override
Definition idr.h:82
void ComputeBackground(double a, const double *, double *pvecback) override
Definition idr.h:78
void SetThermodynamicsModule(const ThermodynamicsModule *thm) override
Definition idr.h:54
void SetPerturbs(const perturbs *ppt) override
Definition idr.h:57
void PerturbDerivs(const BaseSpecies::PerturbLayout &layout, double tau, const double *y, double *dy, const perturb_parameters_and_workspace &ppaw) const override
Definition interacting_species.cpp:141
double GetOmega0() const override
Definition idr.h:61
bool IsFreestreaming() const override
Definition idr.h:70
StressEnergyContribution StressEnergy(const BaseSpecies::PerturbLayout &layout, const perturb_vector *pv, const double *y, const double *pvecback, const perturb_workspace *ppw) const override
Definition interacting_species.cpp:205
void PerturbSynchronousToNewtonian(const BaseSpecies::PerturbLayout &layout, double *y, const PerturbIcContext &ctx) override
Definition interacting_species.cpp:243
double GetRadiationOmega0() const override
Definition idr.h:66
double TcaShearIdr(const PerturbLayout &layout, const double *y, const perturb_workspace *ppw) const
Definition interacting_species.cpp:284
Definition perturbations.h:250
Definition perturbations.h:344
Definition perturbations.h:100
Definition base_species.h:89
Definition idr.h:107
int idx_delta
index_pt_delta_idr
Definition idr.h:108
int idx_shear
index_pt_shear_idr (free-streaming + tca_off only)
Definition idr.h:110
int l_max
IDRSpecies::l_max_idr() when full hierarchy, else -1.
Definition idr.h:112
int idx_l3
index_pt_l3_idr (free-streaming + tca_off + l_max>=3)
Definition idr.h:111
int idx_theta
index_pt_theta_idr
Definition idr.h:109
Definition perturb_source_context.h:125
Definition perturb_source_context.h:159
Definition perturbations_module.h:341
Definition precision.h:63