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

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/PDEOps.H Source File
AMR-Wind 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 "amr-wind/CFDSim.H"
9
10#include "AMReX_ParmParse.H"
11#include "AMReX_REAL.H"
12
13using namespace amrex::literals;
14
15namespace amr_wind::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("amr-wind::" + 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(
109 int nbx, int i, int j, int k, int n) noexcept {
110 vf_arrs[nbx](i, j, k, n) *= rho_arrs[nbx](i, j, k);
111 });
112 }
113 amrex::Gpu::streamSynchronize();
114 }
115
117 virtual void
118 operator()(const FieldState fstate, const bool /* mesh_mapping */)
119 {
120 // Zero out source term
121 this->fields.src_term.setVal(0.0_rt);
122
123 // Return early if there are no source terms to process
124 if (this->sources.empty()) {
125 return;
126 }
127
128 const int nlevels = this->fields.repo.num_active_levels();
129 for (int lev = 0; lev < nlevels; ++lev) {
130 auto& src_term = this->fields.src_term(lev);
131#ifdef AMREX_USE_OMP
132#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
133#endif
134 for (amrex::MFIter mfi(src_term, amrex::TilingIfNotGPU());
135 mfi.isValid(); ++mfi) {
136 const auto& bx = mfi.tilebox();
137 const auto& vf = src_term.array(mfi);
138
139 for (const auto& src : this->sources) {
140 (*src)(lev, mfi, bx, fstate, vf);
141 }
142 }
143 }
144
145 if (PDE::multiply_rho) {
146 this->multiply_rho(fstate);
147 }
148 }
149
152 amrex::Vector<std::unique_ptr<typename PDE::SrcTerm>> sources;
153};
154
158template <typename PDE>
160{
161 explicit SrcTermOp(PDEFields& fields_in) : SrcTermOpBase<PDE>(fields_in) {}
162};
163
164template <typename PDE, typename Scheme, typename = void>
166{};
167
168template <typename PDE, typename Scheme, typename = void>
170{};
171
175template <typename PDE>
177{
178 // cppcheck-suppress uninitMemberVar
180 : m_tmodel(tmodel), m_fields(fields)
181 {}
182
184 {
185 m_tmodel.update_scalar_diff(m_fields.mueff, m_fields.field.name());
186 }
187
190};
191
195template <typename PDE, typename = void>
196struct BCOp;
197
201template <typename PDE>
203{
204 explicit PostSolveOp(CFDSim& sim, PDEFields& fields)
205 : m_sim(sim), m_fields(fields)
206 {}
207
208 void operator()(const amrex::Real time) { m_fields.field.fillpatch(time); }
209
212};
213
214} // namespace amr_wind::pde
215
216#endif /* PDEOPS_H */
Definition CFDSim.H:54
Definition Field.H:116
Definition SimTime.H:33
Definition TurbulenceModel.H:32
FieldState
Definition FieldDescTypes.H:14
FieldState phi_state(const FieldState fstate)
Definition FieldUtils.H:115
Definition AdvOp_Godunov.H:21
PDEFields create_fields_instance(const SimTime &time, FieldRepo &repo, const FieldInterpolator itype=FieldInterpolator::CellConsLinear)
Definition PDEHelpers.H:49
Definition PDEOps.H:166
Definition PDEOps.H:196
Definition PDEOps.H:170
CFDSim & sim
Definition PDEOps.H:56
FieldRegOp(CFDSim &sim_in)
Definition PDEOps.H:39
PDEFields operator()(const SimTime &time)
Definition PDEOps.H:47
Definition PDEFields.H:27
CFDSim & m_sim
Definition PDEOps.H:210
PDEFields & m_fields
Definition PDEOps.H:211
void operator()(const amrex::Real time)
Definition PDEOps.H:208
PostSolveOp(CFDSim &sim, PDEFields &fields)
Definition PDEOps.H:204
amrex::Vector< std::unique_ptr< typename PDE::SrcTerm > > sources
Definition PDEOps.H:152
PDEFields & fields
Definition PDEOps.H:150
void multiply_rho(const FieldState fstate)
Helper method to multiply the source terms with density.
Definition PDEOps.H:94
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:118
Field & m_density
Definition PDEOps.H:151
void init_source_terms(const CFDSim &sim)
Definition PDEOps.H:81
SrcTermOp(PDEFields &fields_in)
Definition PDEOps.H:161
void operator()()
Definition PDEOps.H:183
turbulence::TurbulenceModel & m_tmodel
Definition PDEOps.H:188
TurbulenceOp(turbulence::TurbulenceModel &tmodel, PDEFields &fields)
Definition PDEOps.H:179
PDEFields & m_fields
Definition PDEOps.H:189