/home/runner/work/kynema-sgf/kynema-sgf/src/equation_systems/PDE.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/equation_systems/PDE.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
PDE.H
Go to the documentation of this file.
1#ifndef PDE_H
2#define PDE_H
3
4#include <string>
5#include "src/CFDSim.H"
10#include "AMReX_REAL.H"
11
12using namespace amrex::literals;
13
14namespace kynema_sgf::pde {
15
28template <typename PDE, typename Scheme>
29class PDESystem : public PDEBase::Register<PDESystem<PDE, Scheme>>
30{
31public:
32 using PDEType = PDE;
33 using SchemeType = Scheme;
34
37 static std::string identifier()
38 {
39 return PDE::pde_name() + "-" + Scheme::scheme_name();
40 }
41
45 explicit PDESystem(CFDSim& sim)
46 : m_sim(sim)
47 , m_time(sim.time())
48 , m_repo(sim.repo())
49 , m_fields(FieldRegOp<PDE, Scheme>(m_sim)(m_time))
54 {
55 m_bc_op.init_bcs();
56 }
57
59 void initialize() override
60 {
61 if (PDE::has_diffusion) {
62 BL_PROFILE("kynema-sgf::" + this->identifier() + "::initialize");
64 m_fields, m_sim.has_overset(), m_sim.has_mesh_mapping()));
65 m_turb_op.reset(
66 new TurbulenceOp<PDE>(m_sim.turbulence_model(), m_fields));
67 }
68
69 const bool variable_density =
70 (!m_sim.pde_manager().constant_density() ||
71 m_sim.physics_manager().contains("MultiPhase"));
72
74 m_sim, m_fields, m_sim.has_overset(), variable_density,
75 m_sim.has_mesh_mapping(), m_sim.is_anelastic()));
76 m_src_op.init_source_terms(m_sim);
77
78 // Post-solve operations should also apply after initialization
79 m_post_solve_op(m_time.current_time());
80 }
81
83 void post_regrid_actions() override
84 {
85 if (PDE::has_diffusion) {
86 BL_PROFILE(
87 "kynema-sgf::" + this->identifier() + "::post_regrid_actions");
89 m_fields, m_sim.has_overset(), m_sim.has_mesh_mapping()));
90 }
91
92 const bool variable_density =
93 (!m_sim.pde_manager().constant_density() ||
94 m_sim.physics_manager().contains("MultiPhase"));
95
97 m_sim, m_fields, m_sim.has_overset(), variable_density,
98 m_sim.has_mesh_mapping(), m_sim.is_anelastic()));
99
100 // Post-solve operations should also apply after a regrid
101 m_post_solve_op(m_time.current_time());
102 }
103
105 PDEFields& fields() override { return m_fields; }
106 [[nodiscard]] const PDEFields& fields() const override { return m_fields; }
107
108 void compute_source_term(const FieldState fstate) override
109 {
110 BL_PROFILE(
111 "kynema-sgf::" + this->identifier() + "::compute_source_term");
112 m_src_op(fstate, m_sim.has_mesh_mapping());
113 }
114
115 void compute_mueff(const FieldState /*unused*/) override
116 {
117 if (PDE::has_diffusion) {
118 BL_PROFILE("kynema-sgf::" + this->identifier() + "::compute_mueff");
119 (*m_turb_op)();
120 }
121 }
122
123 void compute_diffusion_term(const FieldState fstate) override
124 {
125 if (PDE::has_diffusion) {
126 BL_PROFILE(
127 "kynema-sgf::" + this->identifier() +
128 "::compute_diffusion_term");
129 m_bc_op.apply_bcs(fstate);
130 m_diff_op->compute_diff_term(fstate);
131 }
132 }
133
134 void compute_advection_term(const FieldState fstate) override
135 {
136 BL_PROFILE(
137 "kynema-sgf::" + this->identifier() + "::compute_advection_term");
138 (*m_adv_op)(fstate, m_time.delta_t());
139 }
140
141 void pre_advection_actions(const FieldState fstate) override
142 {
143 BL_PROFILE(
144 "kynema-sgf::" + this->identifier() + "::pre_advection_actions");
145 m_adv_op->preadvect(
146 fstate, m_time.delta_t(),
147 0.5_rt * (m_time.current_time() + m_time.new_time()));
148 }
149
150 void compute_predictor_rhs(const DiffusionType difftype) override
151 {
152 BL_PROFILE(
153 "kynema-sgf::" + this->identifier() + "::compute_predictor_rhs");
154 m_rhs_op.predictor_rhs(
155 difftype, m_time.delta_t(), m_sim.has_mesh_mapping());
156 }
157
158 void compute_corrector_rhs(const DiffusionType difftype) override
159 {
160 BL_PROFILE(
161 "kynema-sgf::" + this->identifier() + "::compute_corrector_rhs");
162 m_rhs_op.corrector_rhs(
163 difftype, m_time.delta_t(), m_sim.has_mesh_mapping());
164 }
165
166 void solve(const amrex::Real dt) override
167 {
168 if (PDE::has_diffusion) {
169 BL_PROFILE("kynema-sgf::" + this->identifier() + "::linsys_solve");
170 m_bc_op.apply_bcs(FieldState::New);
171 m_diff_op->linsys_solve(dt);
172 }
173 }
174
175 void post_solve_actions() override { m_post_solve_op(m_time.new_time()); }
176
177 void improve_explicit_diffusion(const amrex::Real dt) override
178 {
179 if (PDE::has_diffusion) {
180 BL_PROFILE(
181 "kynema-sgf::" + this->identifier() +
182 "::improve_explicit_diffusion");
183 m_rhs_op.improve_explicit_diff(dt);
184 }
185 }
186
187protected:
190
193
196
198
201
203 std::unique_ptr<AdvectionOp<PDE, Scheme>> m_adv_op;
204
207
209 std::unique_ptr<DiffusionOp<PDE, Scheme>> m_diff_op;
210
212 std::unique_ptr<TurbulenceOp<PDE>> m_turb_op;
213
215
217};
218
219} // namespace kynema_sgf::pde
220
221#endif /* PDE_H */
Definition CFDSim.H:55
Definition FieldRepo.H:86
Definition SimTime.H:33
PDEFields & fields() override
Return the object holding the fields necessary for solving this PDE.
Definition PDE.H:105
void improve_explicit_diffusion(const amrex::Real dt) override
Definition PDE.H:177
FieldRepo & m_repo
Field repository.
Definition PDE.H:195
void compute_diffusion_term(const FieldState fstate) override
Definition PDE.H:123
BCOp< PDE > m_bc_op
Definition PDE.H:214
static std::string identifier()
Unique identifier used to register and create this instance on-demand through the factor interface.
Definition PDE.H:37
Scheme SchemeType
Definition PDE.H:33
CFDSim & m_sim
CFD simulation controller instance.
Definition PDE.H:189
const PDEFields & fields() const override
Definition PDE.H:106
void compute_predictor_rhs(const DiffusionType difftype) override
Definition PDE.H:150
std::unique_ptr< AdvectionOp< PDE, Scheme > > m_adv_op
Advection term computation operator.
Definition PDE.H:203
void compute_mueff(const FieldState) override
Definition PDE.H:115
std::unique_ptr< DiffusionOp< PDE, Scheme > > m_diff_op
Diffusion term computation operator.
Definition PDE.H:209
std::unique_ptr< TurbulenceOp< PDE > > m_turb_op
Turbulence operator.
Definition PDE.H:212
void pre_advection_actions(const FieldState fstate) override
Definition PDE.H:141
void initialize() override
Perform initialization actions after the mesh is created.
Definition PDE.H:59
PDESystem(CFDSim &sim)
Definition PDE.H:45
SrcTermOp< PDE > m_src_op
Source term computation operator.
Definition PDE.H:200
PostSolveOp< PDE > m_post_solve_op
Definition PDE.H:216
void compute_source_term(const FieldState fstate) override
Definition PDE.H:108
void post_solve_actions() override
Definition PDE.H:175
ComputeRHSOp< PDE, Scheme > m_rhs_op
RHS computation operator.
Definition PDE.H:206
const SimTime & m_time
Time controls instance.
Definition PDE.H:192
void solve(const amrex::Real dt) override
Definition PDE.H:166
PDE PDEType
Definition PDE.H:32
void post_regrid_actions() override
Perform update actions after a regrid is performed.
Definition PDE.H:83
PDEFields m_fields
Definition PDE.H:197
void compute_corrector_rhs(const DiffusionType difftype) override
Definition PDE.H:158
void compute_advection_term(const FieldState fstate) override
Definition PDE.H:134
FieldState
Definition FieldDescTypes.H:16
@ New
Same as FieldState::NP1.
Definition FieldDescTypes.H:22
DiffusionType
Definition incflo_enums.H:6
Definition AdvOp_Godunov.H:21
Definition PDEOps.H:165
Definition PDEOps.H:195
Definition CompRHSOps.H:21
Definition PDEOps.H:169
Definition PDEOps.H:38
Definition PDEFields.H:27
Definition PDEOps.H:202
Definition PDEOps.H:159
Definition PDEOps.H:176