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

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/equation_systems/PDEOps.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
PDEOps.H
Go to the documentation of this file.
1#ifndef PDEOPS_H
2#define PDEOPS_H
3
8#include "src/CFDSim.H"
9
10#include "AMReX_ParmParse.H"
11#include "AMReX_REAL.H"
12
13using namespace amrex::literals;
14
15namespace kynema_sgf::pde {
16
28
36template <typename PDE, typename Scheme>
38{
39 explicit FieldRegOp(CFDSim& sim_in) : sim(sim_in) {}
40
48 {
49 auto fields = create_fields_instance<PDE, Scheme>(time, sim.repo());
50
51 // Register solution variable for this PDE as output/restart variable
52 sim.io_manager().register_io_var(fields.field.name());
53 return fields;
54 }
55
57};
58
70template <typename PDE>
72{
73 explicit SrcTermOpBase(PDEFields& fields_in)
74 : fields(fields_in), m_density(fields_in.repo.get_field("density"))
75 {}
76
81 void init_source_terms(const CFDSim& sim)
82 {
83 amrex::ParmParse pp(PDE::pde_name());
84 amrex::Vector<std::string> src_terms;
85 pp.queryarr("source_terms", src_terms);
86
87 for (auto& src_name : src_terms) {
88 // Prefer to use emplace_back here
89 sources.emplace_back(PDE::SrcTerm::create(src_name, sim));
90 }
91 }
92
94 void multiply_rho(const FieldState fstate)
95 {
96 BL_PROFILE("kynema-sgf::" + PDE::pde_name() + "::multiply_rho");
97 const auto rhostate = field_impl::phi_state(fstate);
98 const auto& density = m_density.state(rhostate);
99
100 const int nlevels = fields.repo.num_active_levels();
101 for (int lev = 0; lev < nlevels; ++lev) {
102 auto& src_term = fields.src_term(lev);
103 const auto& vf_arrs = src_term.arrays();
104 const auto& rho_arrs = density(lev).const_arrays();
105
106 amrex::ParallelFor(
107 src_term, amrex::IntVect(0), fields.src_term.num_comp(),
108 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k, int n) {
109 vf_arrs[nbx](i, j, k, n) *= rho_arrs[nbx](i, j, k);
110 });
111 }
112 amrex::Gpu::streamSynchronize();
113 }
114
116 virtual void
117 operator()(const FieldState fstate, const bool /* mesh_mapping */)
118 {
119 // Zero out source term
120 this->fields.src_term.setVal(0.0_rt);
121
122 // Return early if there are no source terms to process
123 if (this->sources.empty()) {
124 return;
125 }
126
127 const int nlevels = this->fields.repo.num_active_levels();
128 for (int lev = 0; lev < nlevels; ++lev) {
129 auto& src_term = this->fields.src_term(lev);
130
131 for (const auto& src : this->sources) {
132 (*src)(lev, fstate, src_term);
133 }
134 amrex::Gpu::streamSynchronize();
135 }
136
137 if (PDE::multiply_rho) {
138 this->multiply_rho(fstate);
139 }
140 }
141
144 amrex::Vector<std::unique_ptr<typename PDE::SrcTerm>> sources;
145};
146
150template <typename PDE>
152{
153 explicit SrcTermOp(PDEFields& fields_in) : SrcTermOpBase<PDE>(fields_in) {}
154};
155
156template <typename PDE, typename Scheme, typename = void>
158{};
159
160template <typename PDE, typename Scheme, typename = void>
162{};
163
167template <typename PDE>
169{
170 // cppcheck-suppress uninitMemberVar
172 : m_tmodel(tmodel), m_fields(fields)
173 {}
174
176 {
177 m_tmodel.update_scalar_diff(m_fields.mueff, m_fields.field.name());
178 }
179
182};
183
187template <typename PDE, typename = void>
188struct BCOp;
189
193template <typename PDE>
195{
196 explicit PostSolveOp(CFDSim& sim, PDEFields& fields)
197 : m_sim(sim), m_fields(fields)
198 {}
199
200 void operator()(const amrex::Real time) { m_fields.field.fillpatch(time); }
201
204};
205
206} // namespace kynema_sgf::pde
207
208#endif /* PDEOPS_H */
Definition CFDSim.H:55
Definition Field.H:112
Definition SimTime.H:33
Definition TurbulenceModel.H:32
FieldState
Definition FieldDescTypes.H:16
AMREX_INLINE FieldState phi_state(const FieldState fstate)
Definition FieldUtils.H:115
Definition AdvOp_Godunov.H:22
PDEFields create_fields_instance(const SimTime &time, FieldRepo &repo, const FieldInterpolator itype=FieldInterpolator::CellConsLinear)
Definition PDEHelpers.H:52
Definition PDEOps.H:158
Definition PDEOps.H:188
Definition PDEOps.H:162
PDEFields operator()(const SimTime &time)
Definition PDEOps.H:47
CFDSim & sim
Definition PDEOps.H:56
FieldRegOp(CFDSim &sim_in)
Definition PDEOps.H:39
Definition PDEFields.H:27
CFDSim & m_sim
Definition PDEOps.H:202
PDEFields & m_fields
Definition PDEOps.H:203
void operator()(const amrex::Real time)
Definition PDEOps.H:200
PostSolveOp(CFDSim &sim, PDEFields &fields)
Definition PDEOps.H:196
Field & m_density
Definition PDEOps.H:143
PDEFields & fields
Definition PDEOps.H:142
amrex::Vector< std::unique_ptr< typename PDE::SrcTerm > > sources
Definition PDEOps.H:144
SrcTermOpBase(PDEFields &fields_in)
Definition PDEOps.H:73
virtual void operator()(const FieldState fstate, const bool)
Update source terms during time-integration procedure.
Definition PDEOps.H:117
void init_source_terms(const CFDSim &sim)
Definition PDEOps.H:81
void multiply_rho(const FieldState fstate)
Helper method to multiply the source terms with density.
Definition PDEOps.H:94
SrcTermOp(PDEFields &fields_in)
Definition PDEOps.H:153
PDEFields & m_fields
Definition PDEOps.H:181
TurbulenceOp(turbulence::TurbulenceModel &tmodel, PDEFields &fields)
Definition PDEOps.H:171
turbulence::TurbulenceModel & m_tmodel
Definition PDEOps.H:180
void operator()()
Definition PDEOps.H:175