CLASSpp Manual
Cosmology reference and developer manual
Loading...
Searching...
No Matches
ncdm_base_species.h
1#pragma once
2#include <memory>
3#include <string>
4#include <tuple>
5#include <vector>
6
7#include "../species/base_species.h"
8#include "background.h"
9#include "parser.h"
10#include "quadrature.h"
11
12class BackgroundModule;
13
14#ifndef _zeta3_
15#define _zeta3_ \
16 1.2020569031595942853997381615114499907649862923404988817922
17#endif
18#ifndef _zeta5_
19#define _zeta5_ \
20 1.0369277551433699263313654864570341680570809195019128119741
21#endif
22#ifndef _PSD_DERIVATIVE_EXP_MIN_
23#define _PSD_DERIVATIVE_EXP_MIN_ -30
24#endif
25#ifndef _PSD_DERIVATIVE_EXP_MAX_
26#define _PSD_DERIVATIVE_EXP_MAX_ 2
27#endif
28
29struct NcdmSettings {
30 double h;
31 double T_cmb;
32 double tol_ncdm;
33 double tol_ncdm_bg;
34 double tol_M_ncdm;
35};
36
43 public:
44 // ── PerturbLayout ─────────────────────────────────────────────────────────
51 int l_max = -1;
52 int q_size = -1;
53 std::vector<int> index_per_q; // absolute offsets into pv->y, one per momentum bin
54 int total_size() const {
55 return q_size * (l_max + 1);
56 }
57 };
58
59 std::unique_ptr<BaseSpecies::PerturbLayout> CreatePerturbLayout() const override {
60 return std::make_unique<PerturbLayout>();
61 }
62
63 // ── Public accessors ──────────────────────────────────────────────────────
64 double GetOmega0() const override;
65 double GetNeff(double z) const;
66 double GetMassInElectronvolt() const {
67 return m_in_eV_;
68 }
69 double GetDeg() const {
70 return deg_;
71 }
77 bool ClustersAsMatter() const override {
78 return true;
79 }
80 bool IsColdMatterSpecies() const override {
81 return false;
82 }
83
84 double GetIni(double a, double tol_ncdm_initial_w) const;
85
87 double BackgroundAIni(double a_proposed, double tol) const override {
88 return GetIni(a_proposed, tol);
89 }
90
91 double GetRescalingFactor(const double* lnf_array) const;
92 virtual std::tuple<double, double> GetRescaledParameters(double a, const double* lnf_array) const;
93
94 // Called from NCDMSpecies/DNCDMSpecies background methods
95 void ComputeMomenta(
96 double z, double* n, double* rho, double* p, double* drho_dM, double* pseudo_p) const;
97
98 int q_size() const {
99 return static_cast<int>(q_.size());
100 }
101 int q_size_bg() const {
102 return static_cast<int>(q_bg_.size());
103 }
104
105 // Public accessors for quadrature/distribution data (used by module code)
106 const std::vector<double>& q() const {
107 return q_;
108 }
109 const std::vector<double>& w() const {
110 return w_;
111 }
112 const std::vector<double>& dlnf0_dlnq() const {
113 return dlnf0_dlnq_;
114 }
115 double M() const {
116 return M_;
117 }
118 double factor() const {
119 return factor_;
120 }
121
122 void PrintNeffInfo() const override;
123 void PrintMassInfo() const override;
124
125 double NeutrinoOmega0() const override {
126 return GetOmega0();
127 }
128 double NeffContribution(double z) const override {
129 return GetNeff(z);
130 }
131 double TensorMasslessRelativisticRho(const double* pvecback) const override {
132 return 3. * P(pvecback);
133 }
134 void CheckUltraRelativisticAtIc(const double* pvecback, double tol) const override;
135 bool IsUltraRelativisticAtIc(const double* pvecback, double tol) const override;
136 void WarnIfTooHeavyForHalofit(double m_ev_threshold) const override;
137
138 void SetDeg_from_Omega_ini(double z_ini, double H0, double Omega_ini);
139
140 // Background overrides (shared by NCDMSpecies and DNCDMSpecies)
141 void SetBackgroundModule(const BackgroundModule* bgm) override {
142 bgm_ = bgm;
143 }
144 void SetPerturbs(const perturbs* ppt) override {
145 ppt_ = ppt;
146 }
147
148 void RegisterTransferSourceIndices(int& index_tp, const SourceRequestContext& ctx) override;
149
150 // ── Layout-based tensor register (shared by NCDM and DNCDM) ──────────────
151 void RegisterTensorPerturbationIndices(BaseSpecies::PerturbLayout& layout,
152 perturb_vector* pv,
153 const precision* ppr,
154 int& index_pt,
155 const perturb_workspace* ppw,
156 int gauge) override;
157
158 // ── Layout-based tensor Boltzmann hierarchy ───────────────────────────────
163 double tau,
164 const double* y,
165 double* dy,
166 const perturb_parameters_and_workspace& ppaw) const override;
167
168 // ── Tensor GW source contribution ────────────────────────────────────────
172 double a,
173 const double* y,
174 perturb_workspace* ppw) const override;
175
176 // ── MarkUsedInSources ────────────────────────────────────────────────────
179 const perturb_workspace* ppw,
180 int* used_in_sources) const override;
181
183 double* y,
184 const PerturbIcContext& ctx) override;
185
186 // ── CopyPerturbationsAcrossSwitch ─────────────────────────────────────────
195 const BaseSpecies::PerturbLayout& new_layout,
196 const double* old_y,
197 double* new_y,
198 const PerturbSwitchContext& ctx) const override;
199
200 protected:
201 int index_tp_delta_ = -1; // #309 transfer-source slot (this ncdm flavor)
202 int index_tp_theta_ = -1;
203
207 virtual double GetDlnf0Dlnq(int iq, const double* pvecback) const = 0;
208
211 virtual double GetW0ForGwSource(int iq, const double* pvecback) const;
212
215 virtual double EvaluatePsdAnalytic(double q) const;
216
221 virtual quadrature_method DefaultQuadratureStrategy() const {
222 return qm_auto;
223 }
224
226 virtual void FillQuadratureParams(GBQuadParams& /*p*/) const {}
227
228 // Constructor: reads parameters per-instance via SpeciesInput (dot-syntax).
229 NCDMBaseSpecies(std::string name,
230 EnergyType energy_type,
231 FileContent* pfc,
232 const std::string& instance_name,
233 const NcdmSettings& settings);
234
238 struct DeferInit {};
239
240 NCDMBaseSpecies(std::string name,
241 EnergyType energy_type,
242 FileContent* pfc,
243 const std::string& instance_name,
244 const NcdmSettings& settings,
245 DeferInit);
246
250 void BuildQuadratureAndMass(const NcdmSettings& settings);
251
252 void InitQuadrature(const NcdmSettings& settings);
253
254 void SetOmega0(double Omega0, double h);
255 void SetDegAndFactor(double deg);
256
257 // Momenta variant with variable degeneracy (used by SetDeg_from_Omega_ini):
258 void ComputeMomentaDeg(double deg,
259 double z,
260 double* n,
261 double* rho,
262 double* p,
263 double* drho_ddeg,
264 double* pseudo_p) const;
265
266 // Infer M from Omega:
267 double MFromOmega(double H0, double Omega0, double tol_M_ncdm) const;
268
269 // Compute dq[i] = w_bg_[i] / f0(q_bg_[i]) for decay_dr species.
270 // Must be called after InitQuadrature (i.e., at end of subclass constructor).
271 std::vector<double> ComputeDq() const;
272
273 // ── Quadrature — perturbation sampling ───────────────────────────────────
274 std::vector<double> q_;
275 std::vector<double> w_;
276 std::vector<double> dlnf0_dlnq_;
277
278 // ── Quadrature — background sampling ─────────────────────────────────────
279 std::vector<double> q_bg_;
280 std::vector<double> w_bg_;
281
282 double factor_ = 0.;
283
284 // ── Species thermodynamic parameters ─────────────────────────────────────
285 double m_in_eV_ = 0.;
286 double M_ = 0.; // dimensionless mass: m / (k_B * T_ncdm)
287 double deg_ = 1.;
288 double T_ = 0.71611; // T_ncdm / T_cmb
289 double ksi_ = 0.; // mu / T_ncdm
290
291 const BackgroundModule* bgm_ = nullptr;
292 double T_cmb_ = 0.;
293 double h_ = 0.;
294
295 private:
296 const perturbs* ppt_ = nullptr;
297
298 struct DistributionParams {
299 const NCDMBaseSpecies* sp = nullptr;
300 // For file-based PSD interpolation:
301 int tablesize = 0;
302 std::vector<double> q, f0, d2f0;
303 int last_index = 0;
304 };
305
306 void ReadParametersByInstance(FileContent* pfc,
307 const std::string& instance_name,
308 const NcdmSettings& settings);
309 void InitDistribution(FileContent* pfc, int species_index);
310
311 void ComputeMomentaMass(double M,
312 double z,
313 double* n,
314 double* rho,
315 double* p,
316 double* drho_dM,
317 double* pseudo_p) const;
318
319 static void DistributionFunction(void* params, double q, double* f0);
320 static void TestFunction(void* params, double q, double* test);
321
322 int quadrature_strategy_ = 0;
323 int input_q_size_ = 5;
324 int input_q_size_bg_ = 5;
325 double qmax_ = 15.;
326 bool got_file_ = false;
327 std::string psd_file_;
328
329 double rho_nu_rel_ = 0.;
330 double Omega0_ = 0.;
331 double omega0_ = 0.;
332};
Definition base_species.h:76
virtual double P(const double *pvecback) const =0
EnergyType
Definition base_species.h:79
Definition parser.h:21
Definition ncdm_base_species.h:42
void SetPerturbs(const perturbs *ppt) override
Definition ncdm_base_species.h:144
double TensorMasslessRelativisticRho(const double *pvecback) const override
Definition ncdm_base_species.h:131
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 ncdm_base_species.cpp:729
void WarnIfTooHeavyForHalofit(double m_ev_threshold) const override
Definition ncdm_base_species.cpp:626
virtual void FillQuadratureParams(GBQuadParams &) const
Definition ncdm_base_species.h:226
void PerturbSynchronousToNewtonian(const BaseSpecies::PerturbLayout &layout, double *y, const PerturbIcContext &ctx) override
Definition ncdm_base_species.cpp:695
double NeffContribution(double z) const override
Definition ncdm_base_species.h:128
bool ClustersAsMatter() const override
Definition ncdm_base_species.h:77
bool IsUltraRelativisticAtIc(const double *pvecback, double tol) const override
Definition ncdm_base_species.cpp:622
virtual double EvaluatePsdAnalytic(double q) const
Definition ncdm_base_species.cpp:271
virtual double GetW0ForGwSource(int iq, const double *pvecback) const
Definition ncdm_base_species.cpp:799
std::unique_ptr< BaseSpecies::PerturbLayout > CreatePerturbLayout() const override
Definition ncdm_base_species.h:59
double NeutrinoOmega0() const override
Definition ncdm_base_species.h:125
void RegisterTransferSourceIndices(int &index_tp, const SourceRequestContext &ctx) override
Definition ncdm_base_species.cpp:836
void CheckUltraRelativisticAtIc(const double *pvecback, double tol) const override
Definition ncdm_base_species.cpp:609
double BackgroundAIni(double a_proposed, double tol) const override
Definition ncdm_base_species.h:87
void ContributeTensorGwSource(const BaseSpecies::PerturbLayout &layout, double a, const double *y, perturb_workspace *ppw) const override
Definition ncdm_base_species.cpp:809
bool IsColdMatterSpecies() const override
Definition ncdm_base_species.h:80
virtual double GetDlnf0Dlnq(int iq, const double *pvecback) const =0
void BuildQuadratureAndMass(const NcdmSettings &settings)
Definition ncdm_base_species.cpp:39
void PerturbTensorDerivs(const BaseSpecies::PerturbLayout &layout, double tau, const double *y, double *dy, const perturb_parameters_and_workspace &ppaw) const override
Definition ncdm_base_species.cpp:754
void PrintNeffInfo() const override
Definition ncdm_base_species.cpp:589
void MarkUsedInSources(const BaseSpecies::PerturbLayout &layout, const perturb_workspace *ppw, int *used_in_sources) const override
Definition ncdm_base_species.cpp:672
double GetOmega0() const override
Definition ncdm_base_species.cpp:499
void SetBackgroundModule(const BackgroundModule *bgm) override
Definition ncdm_base_species.h:141
void PrintMassInfo() const override
Definition ncdm_base_species.cpp:603
virtual quadrature_method DefaultQuadratureStrategy() const
Definition ncdm_base_species.h:221
Definition ncdm_base_species.h:238
Definition perturbations.h:250
Definition perturbations.h:344
Definition perturbations.h:100
Definition base_species.h:89
Definition quadrature.h:30
Definition ncdm_base_species.h:50
Definition perturb_source_context.h:125
Definition perturb_source_context.h:159
Definition perturb_source_context.h:48
Definition perturbations_module.h:341
Definition precision.h:63