/home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/PDE.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/PDE.H Source File
AMR-Wind 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 "amr-wind/CFDSim.H"
10#include "AMReX_REAL.H"
11
12using namespace amrex::literals;
13
14namespace amr_wind::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("amr-wind::" + 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 "amr-wind::" + 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 const PDEFields& fields() const override { return m_fields; }
107
108 void compute_source_term(const FieldState fstate) override
109 {
110 BL_PROFILE("amr-wind::" + this->identifier() + "::compute_source_term");
111 m_src_op(fstate, m_sim.has_mesh_mapping());
112 }
113
114 void compute_mueff(const FieldState /*unused*/) override
115 {
116 if (PDE::has_diffusion) {
117 BL_PROFILE("amr-wind::" + this->identifier() + "::compute_mueff");
118 (*m_turb_op)();
119 }
120 }
121
122 void compute_diffusion_term(const FieldState fstate) override
123 {
124 if (PDE::has_diffusion) {
125 BL_PROFILE(
126 "amr-wind::" + this->identifier() + "::compute_diffusion_term");
127 m_bc_op.apply_bcs(fstate);
128 m_diff_op->compute_diff_term(fstate);
129 }
130 }
131
132 void compute_advection_term(const FieldState fstate) override
133 {
134 BL_PROFILE(
135 "amr-wind::" + this->identifier() + "::compute_advection_term");
136 (*m_adv_op)(fstate, m_time.delta_t());
137 }
138
139 void pre_advection_actions(const FieldState fstate) override
140 {
141 BL_PROFILE(
142 "amr-wind::" + this->identifier() + "::pre_advection_actions");
143 m_adv_op->preadvect(
144 fstate, m_time.delta_t(),
145 0.5_rt * (m_time.current_time() + m_time.new_time()));
146 }
147
148 void compute_predictor_rhs(const DiffusionType difftype) override
149 {
150 BL_PROFILE(
151 "amr-wind::" + this->identifier() + "::compute_predictor_rhs");
152 m_rhs_op.predictor_rhs(
153 difftype, m_time.delta_t(), m_sim.has_mesh_mapping());
154 }
155
156 void compute_corrector_rhs(const DiffusionType difftype) override
157 {
158 BL_PROFILE(
159 "amr-wind::" + this->identifier() + "::compute_corrector_rhs");
160 m_rhs_op.corrector_rhs(
161 difftype, m_time.delta_t(), m_sim.has_mesh_mapping());
162 }
163
164 void solve(const amrex::Real dt) override
165 {
166 if (PDE::has_diffusion) {
167 BL_PROFILE("amr-wind::" + this->identifier() + "::linsys_solve");
168 m_bc_op.apply_bcs(FieldState::New);
169 m_diff_op->linsys_solve(dt);
170 }
171 }
172
173 void post_solve_actions() override { m_post_solve_op(m_time.new_time()); }
174
175 void improve_explicit_diffusion(const amrex::Real dt) override
176 {
177 if (PDE::has_diffusion) {
178 BL_PROFILE(
179 "amr-wind::" + this->identifier() +
180 "::improve_explicit_diffusion");
181 m_rhs_op.improve_explicit_diff(dt);
182 }
183 }
184
185protected:
188
191
194
196
199
201 std::unique_ptr<AdvectionOp<PDE, Scheme>> m_adv_op;
202
205
207 std::unique_ptr<DiffusionOp<PDE, Scheme>> m_diff_op;
208
210 std::unique_ptr<TurbulenceOp<PDE>> m_turb_op;
211
213
215};
216
217} // namespace amr_wind::pde
218
219#endif /* PDE_H */
Definition CFDSim.H:54
Definition FieldRepo.H:86
Definition SimTime.H:33
static std::string identifier()
Unique identifier used to register and create this instance on-demand through the factor interface.
Definition PDE.H:37
std::unique_ptr< DiffusionOp< PDE, Scheme > > m_diff_op
Diffusion term computation operator.
Definition PDE.H:207
void initialize() override
Perform initialization actions after the mesh is created.
Definition PDE.H:59
const PDEFields & fields() const override
Definition PDE.H:106
PDEFields & fields() override
Return the object holding the fields necessary for solving this PDE.
Definition PDE.H:105
PDESystem(CFDSim &sim)
Definition PDE.H:45
PostSolveOp< PDE > m_post_solve_op
Definition PDE.H:214
SrcTermOp< PDE > m_src_op
Source term computation operator.
Definition PDE.H:198
CFDSim & m_sim
CFD simulation controller instance.
Definition PDE.H:187
FieldRepo & m_repo
Field repository.
Definition PDE.H:193
ComputeRHSOp< PDE, Scheme > m_rhs_op
RHS computation operator.
Definition PDE.H:204
void improve_explicit_diffusion(const amrex::Real dt) override
Definition PDE.H:175
const SimTime & m_time
Time controls instance.
Definition PDE.H:190
void compute_predictor_rhs(const DiffusionType difftype) override
Definition PDE.H:148
void compute_source_term(const FieldState fstate) override
Definition PDE.H:108
void compute_mueff(const FieldState) override
Definition PDE.H:114
void post_solve_actions() override
Definition PDE.H:173
void pre_advection_actions(const FieldState fstate) override
Definition PDE.H:139
std::unique_ptr< TurbulenceOp< PDE > > m_turb_op
Turbulence operator.
Definition PDE.H:210
PDEFields m_fields
Definition PDE.H:195
PDE PDEType
Definition PDE.H:32
void compute_diffusion_term(const FieldState fstate) override
Definition PDE.H:122
BCOp< PDE > m_bc_op
Definition PDE.H:212
void compute_corrector_rhs(const DiffusionType difftype) override
Definition PDE.H:156
void compute_advection_term(const FieldState fstate) override
Definition PDE.H:132
void solve(const amrex::Real dt) override
Definition PDE.H:164
std::unique_ptr< AdvectionOp< PDE, Scheme > > m_adv_op
Advection term computation operator.
Definition PDE.H:201
Scheme SchemeType
Definition PDE.H:33
void post_regrid_actions() override
Perform update actions after a regrid is performed.
Definition PDE.H:83
FieldState
Definition FieldDescTypes.H:14
@ New
Same as FieldState::NP1.
Definition FieldDescTypes.H:20
DiffusionType
Definition incflo_enums.H:4
Definition AdvOp_Godunov.H:21
Definition PDEOps.H:166
Definition PDEOps.H:196
Definition CompRHSOps.H:21
Definition PDEOps.H:170
Definition PDEOps.H:38
Definition PDEFields.H:27
Definition PDEOps.H:203
Definition PDEOps.H:160
Definition PDEOps.H:177