CLASSpp Manual
Cosmology reference and developer manual
Loading...
Searching...
No Matches
scalar_field.h
1#pragma once
2#include <string_view>
3
4#include "../species/base_species.h"
5#include "background.h"
6#include "perturbations.h"
7#include "scalar_field_potential.h"
8#include "species_build_context.h"
9
10class BackgroundModule;
11
19 public:
20 static constexpr std::string_view kTypeName = "scalar_field";
21
22 ScalarFieldSpecies(const background& pba,
23 double omega0_scf,
24 std::vector<double> scf_parameters,
25 int scf_tuning_index,
26 bool attractor_ic_scf,
27 double phi_ini_scf,
28 double phi_prime_ini_scf,
29 ScalarFieldPotential potential = DefaultScalarFieldPotential(),
30 double beta = 0.);
31
32 double GetOmega0() const override {
33 return Omega0_scf_;
34 }
35
36 const std::vector<double>& scf_parameters() const {
37 return scf_parameters_;
38 }
39 int scf_tuning_index() const {
40 return scf_tuning_index_;
41 }
42 bool attractor_ic_scf() const {
43 return attractor_ic_scf_;
44 }
45 double phi_ini_scf() const {
46 return phi_ini_scf_;
47 }
48 double phi_prime_ini_scf() const {
49 return phi_prime_ini_scf_;
50 }
51 double beta() const {
52 return beta_;
53 }
54
55 // ── Background ──────────────────────────────────────────────────────────
56 void SetBackgroundModule(const BackgroundModule* bgm) override {
57 bgm_ = bgm;
58 }
59 void RegisterBackgroundIndices(int& index_bg) override {
60 index_bg_phi_scf_ = index_bg++;
61 index_bg_phi_prime_scf_ = index_bg++;
62 index_bg_V_scf_ = index_bg++;
63 index_bg_dV_scf_ = index_bg++;
64 index_bg_ddV_scf_ = index_bg++;
65 index_bg_rho_ = index_bg++;
66 index_bg_p_ = index_bg++;
67 index_bg_p_prime_scf_ = index_bg++;
68 }
69
70 void RegisterIntegrationIndices(int& index_bi) override {
71 index_bi_phi_scf_ = index_bi++;
72 index_bi_phi_prime_scf_ = index_bi++;
73 }
74
76
77 void ComputeBackground(double a, const double* pvecback_B, double* pvecback) override;
78
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
89 void WriteBackgroundData(const double* pvecback, BackgroundColumnWriter& w) const override;
90
91 // ── Perturbations ────────────────────────────────────────────────────────
92 struct PerturbLayout : BaseSpecies::PerturbLayout {
93 int idx_phi = -1; // delta_phi
94 // Synchronous: delta_phi'. Newtonian: q = delta_phi' - phi'_bg (psi + 3 phi).
95 int idx_phi_prime = -1;
96 };
97
98 std::unique_ptr<BaseSpecies::PerturbLayout> CreatePerturbLayout() const override {
99 return std::make_unique<PerturbLayout>();
100 }
101
102 void RegisterTransferSourceIndices(int& index_tp, const SourceRequestContext& ctx) override;
103 void RegisterPerturbationIndices(BaseSpecies::PerturbLayout& layout,
104 perturb_vector* pv,
105 const precision* ppr,
106 int& index_pt,
107 const perturb_workspace* ppw,
108 int gauge) override;
109 void PerturbDerivs(const BaseSpecies::PerturbLayout& layout,
110 double tau,
111 const double* y,
112 double* dy,
113 const perturb_parameters_and_workspace& ppaw) const override;
114
115 void FillSources(const BaseSpecies::PerturbLayout& layout,
116 const double* y,
117 const double* dy,
118 PerturbSourceContext& ctx) const override;
119
121 double* y,
122 const PerturbIcContext& ctx) override;
124 double* y,
125 const PerturbIcContext& ctx) override;
127 const BaseSpecies::PerturbLayout& new_layout,
128 const double* old_y,
129 double* new_y,
130 const PerturbSwitchContext& ctx) const override;
131
132 static std::vector<Named> CreateAll(const SpeciesBuildContext& ctx);
133
134 // Axion factory branch: scf_potential = axion. params = [m, f, n, Theta_ini],
135 // frozen ICs (phi = Theta*f, phi' = 0), always shoots m (tuning index 0)
136 // against Omega_scf / the closure value; m_axion is an optional Newton seed.
137 static std::vector<Named> CreateAxion(const SpeciesBuildContext& ctx, double omega0_scf);
138
139 // Shared build body for both the standalone factory (beta = 0) and the Type3
140 // composite (beta = scf_veta). Constructs the configured ScalarFieldSpecies with
141 // its shooting state set; CreateAll wraps it with the scf_veta suppression guard.
142 static std::vector<Named> CreateAllForComposite(const SpeciesBuildContext& ctx, double beta);
143
144 // ── Shooting hooks ───────────────────────────────────────────────────────
145 std::vector<ShootingTarget> GetShootingTargets() const override;
146 void ComputeShootingGuess(const SpeciesBuildContext& ctx,
147 std::vector<double>& guess,
148 std::vector<double>& dxdy) const override;
149 double ComputeShootingResidual(const ShootingResidualContext& ctx,
150 const ShootingTarget& target) const override;
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 PerturbColumnWriter& writer,
160 const PerturbationsModule& mod,
161 file_format fmt,
162 TransferColumnSection section = TransferColumnSection::all) const override;
163
165 double tau,
166 const double* y,
167 const PerturbationsModule& mod,
168 const perturb_workspace* ppw) const override;
169
170 double PPrime(double a,
171 double H,
172 const double* pvecback_B,
173 const double* pvecback) const override;
174 void FinalizeBackground(double a, double H, const double* pvecback_B, double* pvecback) override;
175
176 int bi_phi_index() const {
177 return index_bi_phi_scf_;
178 }
179 int bi_phi_prime_index() const {
180 return index_bi_phi_prime_scf_;
181 }
182
183 // Background pvecback slot accessors (used by the Type3 composite to replicate
184 // the scalar-field PrintVariables / coupling against its own nested layout).
185 int index_bg_phi_prime_scf() const {
186 return index_bg_phi_prime_scf_;
187 }
188 int index_bg_dV_scf() const {
189 return index_bg_dV_scf_;
190 }
191
192 private:
193 double V_scf(double phi) const;
194 double dV_scf(double phi) const;
195 double ddV_scf(double phi) const;
196
197 ScalarFieldPotential potential_;
198
199 ShootingTarget shooting_target_{}; // unknown_param empty => no shooting target
200 bool needs_shooting_ = false; // true iff the direct unknown was absent (we guessed)
201
202 const background& pba_;
203 const BackgroundModule* bgm_ = nullptr;
204 int index_tp_delta_ = -1; // #309 transfer-source slot
205 int index_tp_theta_ = -1;
206
207 int index_bg_phi_scf_ = -1;
208 int index_bg_phi_prime_scf_ = -1;
209 int index_bg_V_scf_ = -1;
210 int index_bg_dV_scf_ = -1;
211 int index_bg_ddV_scf_ = -1;
212 int index_bg_p_prime_scf_ = -1;
213 int index_bi_phi_scf_ = -1;
214 int index_bi_phi_prime_scf_ = -1;
215 double Omega0_scf_ = 0.;
216 std::vector<double> scf_parameters_;
217 int scf_tuning_index_ = 0;
218 bool attractor_ic_scf_ = true;
219 double phi_ini_scf_ = 1.;
220 double phi_prime_ini_scf_ = 1.;
221 double beta_ = 0.;
222};
Definition base_species.h:32
Definition base_species.h:76
Definition perturb_source_context.h:63
Definition scalar_field.h:18
void WriteOutputColumns(PerturbColumnWriter &writer, const PerturbationsModule &mod, file_format fmt, TransferColumnSection section=TransferColumnSection::all) const override
Definition scalar_field.cpp:313
void SetBackgroundInitialConditions(const BackgroundICContext &ctx) override
Definition scalar_field.cpp:39
void RegisterBackgroundIndices(int &index_bg) override
Definition scalar_field.h:59
void RegisterIntegrationIndices(int &index_bi) override
Definition scalar_field.h:70
double PPrime(double a, double H, const double *pvecback_B, const double *pvecback) const override
Definition scalar_field.cpp:108
void ApplyInitialConditions(const BaseSpecies::PerturbLayout &layout, double *y, const PerturbIcContext &ctx) override
Definition scalar_field.cpp:282
void FinalizeBackground(double a, double H, const double *pvecback_B, double *pvecback) override
Definition scalar_field.cpp:117
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 scalar_field.cpp:438
void PerturbSynchronousToNewtonian(const BaseSpecies::PerturbLayout &layout, double *y, const PerturbIcContext &ctx) override
Definition scalar_field.cpp:294
double GetOmega0() const override
Definition scalar_field.h:32
double Rho(const double *pvecback) const override
Definition scalar_field.h:81
void PrintVariables(PerturbColumnWriter &writer, double tau, const double *y, const PerturbationsModule &mod, const perturb_workspace *ppw) const override
Definition scalar_field.cpp:327
void ComputeBackground(double a, const double *pvecback_B, double *pvecback) override
Definition scalar_field.cpp:80
std::unique_ptr< BaseSpecies::PerturbLayout > CreatePerturbLayout() const override
Definition scalar_field.h:98
StressEnergyContribution StressEnergy(const BaseSpecies::PerturbLayout &layout, const perturb_vector *pv, const double *y, const double *pvecback, const perturb_workspace *ppw) const override
Definition scalar_field.cpp:386
void WriteBackgroundColumnTitles(BackgroundColumnWriter &w) const override
Definition scalar_field.cpp:124
void FillSources(const BaseSpecies::PerturbLayout &layout, const double *y, const double *dy, PerturbSourceContext &ctx) const override
Definition scalar_field.cpp:214
void RegisterTransferSourceIndices(int &index_tp, const SourceRequestContext &ctx) override
Definition scalar_field.cpp:147
void SetBackgroundModule(const BackgroundModule *bgm) override
Definition scalar_field.h:56
void WriteBackgroundData(const double *pvecback, BackgroundColumnWriter &w) const override
Definition scalar_field.cpp:135
double P(const double *pvecback) const override
Definition scalar_field.h:84
void PerturbDerivs(const BaseSpecies::PerturbLayout &layout, double tau, const double *y, double *dy, const perturb_parameters_and_workspace &ppaw) const override
Definition scalar_field.cpp:168
void BackgroundDerivs(double tau, const double *y, double *dy, const double *pvecback) override
Definition scalar_field.cpp:95
Definition perturbations.h:250
Definition perturbations.h:344
file_format
Definition precision.h:40
Definition background_ic_context.h:11
Definition base_species.h:89
Definition perturb_source_context.h:125
Definition perturb_source_context.h:103
Definition perturb_source_context.h:159
Definition scalar_field_potential.h:13
Definition shooting_target.h:7
Definition shooting_target.h:14
Definition perturb_source_context.h:48
Definition species_build_context.h:58
Definition perturbations_module.h:341
Definition precision.h:63