CLASSpp Manual
Cosmology reference and developer manual
Loading...
Searching...
No Matches
dncdm_species.h
1#pragma once
2#include <cmath>
3#include <memory>
4#include <optional>
5#include <string_view>
6#include <tuple>
7#include <utility>
8#include <vector>
9
10#include "../species/ncdm_base_species.h"
11#include "../species/species_build_context.h"
12#include "background.h"
13#include "perturbations.h"
14
15class BackgroundModule;
16
23 public:
24 static constexpr std::string_view kTypeName = "ncdm_decay_dr";
25
26 // Reads all DNCDM-specific parameters from the dot-syntax instance
27 // identified by instance_name (e.g. "dncdm1").
29 const std::string& instance_name,
30 const NcdmSettings& settings,
31 const background* pba,
32 const BackgroundModule* bgm);
33
34 // Accessors for deferred closure (used by CreateAll after construction)
35 const std::optional<double>& Omega_ini_pending() const {
36 return Omega_ini_pending_;
37 }
38 const std::optional<double>& Neff_ini_pending() const {
39 return Neff_ini_pending_;
40 }
41 const std::optional<double>& Omega_dncdmdr_pending() const {
42 return Omega_dncdmdr_pending_;
43 }
44
48 bool InitialAbundanceMode() const {
49 return Omega_ini_pending_.has_value() || Neff_ini_pending_.has_value();
50 }
51
57 void BackfillOmega0FromToday(const double* pvecback_today, double H0, double h) {
58 SetOmega0(Rho(pvecback_today) / (H0 * H0), h);
59 }
60
61 // Compute a (deg_guess, dxdy) pair for Newton shooting that varies deg to hit
62 // a target today-density Omega_target = (rho_dncdm + rho_dr) / H0^2 at z=0.
63 // Ported from input_module.cpp:3759-3800 (single-flavor, no loop).
64 std::pair<double, double> DegGuessFromOmegaToday(const SpeciesBuildContext& ctx,
65 double Omega_target) const;
66
67 struct Named {
68 std::string key;
69 std::unique_ptr<DNCDMSpecies> species;
70 };
71
72 static std::vector<Named> CreateAll(const SpeciesBuildContext& ctx);
73
74 // ── Background ──────────────────────────────────────────────────────────
75 void RegisterBackgroundIndices(int& index_bg) override;
76 void RegisterIntegrationIndices(int& index_bi) override;
78 void ComputeBackground(double a, const double* pvecback_B, double* pvecback) override;
79 void BackgroundDerivs(double tau, const double* y, double* dy, const double* pvecback) override;
80
81 double Rho(const double* pvecback) const override {
82 return pvecback[index_bg_rho_];
83 }
84 double P(const double* pvecback) const override {
85 return pvecback[index_bg_p_];
86 }
87 double PPrime(double a,
88 double H,
89 const double* /*pvecback_B*/,
90 const double* pvecback) const override {
91 return a * H * (pvecback[index_bg_pseudo_p_] - 5. * pvecback[index_bg_p_]);
92 }
93
94 // ── Perturbations ────────────────────────────────────────────────────────
95
96 // Layout-based scalar register (writes both layout and legacy pv arrays).
97 void RegisterPerturbationIndices(BaseSpecies::PerturbLayout& layout,
99 const precision* ppr,
100 int& index_pt,
101 const perturb_workspace* ppw,
102 int gauge) override;
103
104 // Scalar PerturbDerivs (called by DNCDM_DR_Species composite with my.dncdm).
105 void PerturbDerivs(const BaseSpecies::PerturbLayout& layout,
106 double tau,
107 const double* y,
108 double* dy,
109 const perturb_parameters_and_workspace& ppaw) const override;
110
112 double* y,
113 const PerturbIcContext& ctx) override;
114
118 StressEnergyContribution StressEnergy(const BaseSpecies::PerturbLayout& layout,
119 const perturb_vector* pv,
120 const double* y,
121 const double* pvecback,
122 const perturb_workspace* ppw) const override;
123
124 bool IsFreestreaming() const override {
125 return true;
126 }
128 void WriteBackgroundData(const double* pvecback, BackgroundColumnWriter& w) const override;
129
130 // ── Accessors for DNCDM_DR_Species coupling ───────────────────────────────
131 int bg_number_index() const {
132 return index_bg_number_;
133 }
134 int bg_pseudo_p_index() const {
135 return index_bg_pseudo_p_;
136 }
137 int bg_lnf_index() const {
138 return index_bg_lnf_decay_dr1_;
139 }
140 int bg_dlnfdlnq_index() const {
141 return index_bg_dlnfdlnq_decay_;
142 }
143 int bg_dlnfdlnq_sep_index() const {
144 return index_bg_dlnfdlnq_sep_;
145 }
146 int bi_lnf_index() const {
147 return index_bi_lnf_decay_dr1_;
148 }
149 int bi_dlnfdlnq_sep_index() const {
150 return index_bi_dlnfdlnq_separate_decay_;
151 }
152
153 double Gamma() const {
154 return Gamma_;
155 }
156 const std::vector<double>& dq() const {
157 return dq_;
158 }
159 double GetMass() const {
160 return M_;
161 }
162 const std::vector<double>& GetQ() const {
163 return q_;
164 }
165
166 // Override GetRescaledParameters to use dq_ (not standard w_ weights)
167 std::tuple<double, double> GetRescaledParameters(double a,
168 const double* lnf_array) const override;
169
182 std::tuple<double, double, double> RescaledPerturbations(
183 const NCDMBaseSpecies::PerturbLayout& layout,
184 double a,
185 double k,
186 const perturb_workspace* ppw) const;
187
188 protected:
189 double GetDlnf0Dlnq(int iq, const double* pvecback) const override {
190 return pvecback[index_bg_dlnfdlnq_decay_ + iq];
191 }
192 double GetW0ForGwSource(int iq, const double* pvecback) const override {
193 return dq_[iq] * std::exp(pvecback[index_bg_lnf_decay_dr1_ + iq]);
194 }
195
196 private:
197 const background* pba_;
198
199 // Deferred closure stash (instance-name constructor only).
200 // Set when the user specifies Omega_ini/omega_ini or Neff_ini; CreateAll
201 // applies SetDeg_from_Omega_ini once a_ini is available.
202 std::optional<double> Omega_ini_pending_;
203 std::optional<double> Neff_ini_pending_;
204 // Today-density target: shoot deg so that (rho_dncdm+rho_dr)/H0^2 == this value at z=0.
205 std::optional<double> Omega_dncdmdr_pending_;
206
207 // Absorbed from DecayDRProperties
208 double Gamma_ = 0.;
209 std::vector<double> dq_;
210
211 // Background indices
212 int index_bg_number_ = -1;
213 int index_bg_pseudo_p_ = -1;
214
215 int index_bi_lnf_decay_dr1_ = -1;
216 int index_bi_dlnfdlnq_separate_decay_ = -1;
217
218 int index_bg_lnf_decay_dr1_ = -1;
219 int index_bg_dlnfdlnq_decay_ = -1;
220 int index_bg_dlnfdlnq_sep_ = -1;
221
222 // Perturbation indices
223 int index_pt_psi0_ = -1;
224};
Definition base_species.h:32
Definition dncdm_species.h:22
void BackfillOmega0FromToday(const double *pvecback_today, double H0, double h)
Definition dncdm_species.h:57
std::tuple< double, double, double > RescaledPerturbations(const NCDMBaseSpecies::PerturbLayout &layout, double a, double k, const perturb_workspace *ppw) const
Definition dncdm_species.cpp:578
double PPrime(double a, double H, const double *, const double *pvecback) const override
Definition dncdm_species.h:87
void WriteBackgroundData(const double *pvecback, BackgroundColumnWriter &w) const override
Definition dncdm_species.cpp:431
void WriteBackgroundColumnTitles(BackgroundColumnWriter &w) const override
Definition dncdm_species.cpp:418
void SetBackgroundInitialConditions(const BackgroundICContext &ctx) override
Definition dncdm_species.cpp:337
double GetDlnf0Dlnq(int iq, const double *pvecback) const override
Definition dncdm_species.h:189
void ApplyInitialConditions(const BaseSpecies::PerturbLayout &layout, double *y, const PerturbIcContext &ctx) override
Definition dncdm_species.cpp:514
void RegisterIntegrationIndices(int &index_bi) override
Definition dncdm_species.cpp:330
double Rho(const double *pvecback) const override
Definition dncdm_species.h:81
StressEnergyContribution StressEnergy(const BaseSpecies::PerturbLayout &layout, const perturb_vector *pv, const double *y, const double *pvecback, const perturb_workspace *ppw) const override
Definition dncdm_species.cpp:543
bool IsFreestreaming() const override
Definition dncdm_species.h:124
void RegisterBackgroundIndices(int &index_bg) override
Definition dncdm_species.cpp:316
void BackgroundDerivs(double tau, const double *y, double *dy, const double *pvecback) override
Definition dncdm_species.cpp:400
double P(const double *pvecback) const override
Definition dncdm_species.h:84
void ComputeBackground(double a, const double *pvecback_B, double *pvecback) override
Definition dncdm_species.cpp:349
bool InitialAbundanceMode() const
Definition dncdm_species.h:48
void PerturbDerivs(const BaseSpecies::PerturbLayout &layout, double tau, const double *y, double *dy, const perturb_parameters_and_workspace &ppaw) const override
Definition dncdm_species.cpp:471
double GetW0ForGwSource(int iq, const double *pvecback) const override
Definition dncdm_species.h:192
Definition parser.h:21
Definition ncdm_base_species.h:42
Definition perturbations.h:250
Definition perturbations.h:344
Definition background_ic_context.h:11
Definition base_species.h:89
Definition ncdm_base_species.h:50
Definition species_build_context.h:90
Definition perturb_source_context.h:125
Definition species_build_context.h:58
Definition perturbations_module.h:341
Definition precision.h:63