CLASSpp Manual
Cosmology reference and developer manual
Loading...
Searching...
No Matches
type3_species.h
1#pragma once
2#include <string_view>
3#include <vector>
4
5#include "background.h"
6#include "cdm.h"
7#include "composite_species.h"
8#include "scalar_field.h"
9#include "species_build_context.h"
10
11// ── Type-3 momentum-transfer coupling, as pure free functions (arXiv:1604.04222,
12// synchronous gauge). Factored out of AddCouplingDerivs / StressEnergy so the
13// physics is unit-testable without a perturb_parameters_and_workspace, and so the
14// same closed form feeds both the derivs and the stress-energy paths. Conventions:
15// Zbar = -phi_prime_bg/a; D = 3*rho_cdm*a2 - 2*beta*Zbar^2. Every term carries an
16// explicit `beta` factor, so both return exactly 0 at beta = 0.
17
18// phi-KG momentum source (added to dy[scf.idx_phi_prime]).
19double Type3CouplingDeltaPhiPrime(double beta, double phi_prime_bg, double theta_cdm);
20
21// CDM-Euler momentum-transfer source (added to dy[cdm.idx_theta]).
22double Type3CouplingDeltaThetaCdm(double beta,
23 double k2,
24 double a_prime_over_a,
25 double rho_cdm,
26 double a2,
27 double Zbar,
28 double dV,
29 double phi,
30 double phi_prime,
31 double phi_prime_bg,
32 double theta_cdm);
33
42 public:
43 static constexpr std::string_view kTypeName = "cdm_scf_momentum";
44
45 enum ChildIndex { kCdm = 0, kScf = 1 }; // children_ order, set in the ctor
46 static const CDMSpecies::PerturbLayout& cdm_layout(const CompositeSpecies::PerturbLayout& my) {
47 return static_cast<const CDMSpecies::PerturbLayout&>(*my.child_layouts[kCdm]);
48 }
49 static const ScalarFieldSpecies::PerturbLayout& scf_layout(
51 return static_cast<const ScalarFieldSpecies::PerturbLayout&>(*my.child_layouts[kScf]);
52 }
53
54 Type3Species(const background& pba, double omega0_cdm, std::unique_ptr<ScalarFieldSpecies> scf);
55
56 CDMSpecies& cdm() {
57 return *cdm_;
58 }
59 ScalarFieldSpecies& scf() {
60 return *scf_;
61 }
62 const CDMSpecies& cdm() const {
63 return *cdm_;
64 }
65 const ScalarFieldSpecies& scf() const {
66 return *scf_;
67 }
68 double beta() const {
69 return scf_->beta();
70 }
71
73 void WriteBackgroundData(const double* pvecback, BackgroundColumnWriter& w) const override;
74
76 PerturbColumnWriter& writer,
77 const PerturbationsModule& mod,
78 file_format fmt,
79 TransferColumnSection section = TransferColumnSection::all) const override;
81 double tau,
82 const double* y,
83 const PerturbationsModule& mod,
84 const perturb_workspace* ppw) const override;
85
86 std::vector<ShootingTarget> GetShootingTargets() const override {
87 return scf_->GetShootingTargets();
88 }
89 void ComputeShootingGuess(const SpeciesBuildContext& ctx,
90 std::vector<double>& guess,
91 std::vector<double>& dxdy) const override {
92 scf_->ComputeShootingGuess(ctx, guess, dxdy);
93 }
94 double ComputeShootingResidual(const ShootingResidualContext& ctx,
95 const ShootingTarget& target) const override {
96 return scf_->ComputeShootingResidual(ctx, target);
97 }
98
99 static std::vector<Named> CreateAll(const SpeciesBuildContext& ctx);
100
101 // Generic child sum (CompositeSpecies::StressEnergy) PLUS the coupling's
102 // -(2 beta/3) Zbar^2 theta_cdm contribution to the total (rho+p)theta. Used
103 // un-tallied at the IC delta_tot loop; the hot-path total goes through
104 // DelegateTally below, which adds the same cross-term.
106 const perturb_vector* pv,
107 const double* y,
108 const double* pvecback,
109 const perturb_workspace* ppw) const override;
110
111 // Hot-path total stress-energy for composites bypasses StressEnergy (it sums
112 // each child's StressEnergy via TallyStressEnergy). Override so the coupling
113 // cross-term reaches ppw->rho_plus_p_theta during the ODE, not only at ICs.
114 void DelegateTally(const BaseSpecies::PerturbLayout& layout,
115 const perturb_vector* pv,
116 const double* y,
117 const double* pvecback,
118 const perturb_workspace* ppw,
120 StressEnergyContribution& total_cold,
121 StressEnergyContribution& total_warm) const override;
122
123 protected:
124 void AddCouplingDerivs(double tau,
125 const double* y,
126 double* dy,
127 const perturb_parameters_and_workspace& ppaw) const override;
128
129 private:
130 // The -(2 beta/3) Zbar^2 theta_cdm coupling contribution to (rho+p)theta, shared
131 // by StressEnergy (ICs) and DelegateTally (hot path). Returns 0 at beta = 0.
132 double CrossTermRhoPlusPTheta(const BaseSpecies::PerturbLayout& layout,
133 const double* y,
134 const double* pvecback,
135 const perturb_workspace* ppw) const;
136
137 CDMSpecies* cdm_ = nullptr;
138 ScalarFieldSpecies* scf_ = nullptr;
139};
Definition base_species.h:32
Definition cdm.h:18
Definition composite_species.h:26
Definition perturb_source_context.h:63
Definition scalar_field.h:18
Definition type3_species.h:41
void PrintVariables(PerturbColumnWriter &writer, double tau, const double *y, const PerturbationsModule &mod, const perturb_workspace *ppw) const override
Definition type3_species.cpp:44
void WriteBackgroundData(const double *pvecback, BackgroundColumnWriter &w) const override
Definition type3_species.cpp:26
void AddCouplingDerivs(double tau, const double *y, double *dy, const perturb_parameters_and_workspace &ppaw) const override
Definition type3_species.cpp:153
void WriteOutputColumns(PerturbColumnWriter &writer, const PerturbationsModule &mod, file_format fmt, TransferColumnSection section=TransferColumnSection::all) const override
Definition type3_species.cpp:31
StressEnergyContribution StressEnergy(const BaseSpecies::PerturbLayout &layout, const perturb_vector *pv, const double *y, const double *pvecback, const perturb_workspace *ppw) const override
Definition type3_species.cpp:214
void WriteBackgroundColumnTitles(BackgroundColumnWriter &w) const override
Definition type3_species.cpp:21
Definition perturbations.h:250
Definition perturbations.h:344
file_format
Definition precision.h:40
Definition base_species.h:89
Definition base_species.h:332
Definition composite_species.h:36
Definition shooting_target.h:7
Definition shooting_target.h:14
Definition species_build_context.h:58
Definition perturbations_module.h:341