/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(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#ifdef AMREX_USE_OMP
131#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
132#endif
133 for (amrex::MFIter mfi(src_term, amrex::TilingIfNotGPU());
134 mfi.isValid(); ++mfi) {
135 const auto& bx = mfi.tilebox();
136 const auto& vf = src_term.array(mfi);
137
138 for (const auto& src : this->sources) {
139 (*src)(lev, mfi, bx, fstate, vf);
140 }
141 }
142 }
143
144 if (PDE::multiply_rho) {
145 this->multiply_rho(fstate);
146 }
147 }
148
151 amrex::Vector<std::unique_ptr<typename PDE::SrcTerm>> sources;
152};
153
157template <typename PDE>
159{
160 explicit SrcTermOp(PDEFields& fields_in) : SrcTermOpBase<PDE>(fields_in) {}
161};
162
163template <typename PDE, typename Scheme, typename = void>
165{};
166
167template <typename PDE, typename Scheme, typename = void>
169{};
170
174template <typename PDE>
176{
177 // cppcheck-suppress uninitMemberVar
179 : m_tmodel(tmodel), m_fields(fields)
180 {}
181
183 {
184 m_tmodel.update_scalar_diff(m_fields.mueff, m_fields.field.name());
185 }
186
189};
190
194template <typename PDE, typename = void>
195struct BCOp;
196
200template <typename PDE>
202{
203 explicit PostSolveOp(CFDSim& sim, PDEFields& fields)
204 : m_sim(sim), m_fields(fields)
205 {}
206
207 void operator()(const amrex::Real time) { m_fields.field.fillpatch(time); }
208
211};
212
213} // namespace amr_wind::pde
214
215#endif /* PDEOPS_H */
Definition CFDSim.H:54
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:21
PDEFields create_fields_instance(const SimTime &time, FieldRepo &repo, const FieldInterpolator itype=FieldInterpolator::CellConsLinear)
Definition PDEHelpers.H:52
Definition PDEOps.H:165
Definition PDEOps.H:195
Definition PDEOps.H:169
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:209
PDEFields & m_fields
Definition PDEOps.H:210
void operator()(const amrex::Real time)
Definition PDEOps.H:207
PostSolveOp(CFDSim &sim, PDEFields &fields)
Definition PDEOps.H:203
amrex::Vector< std::unique_ptr< typename PDE::SrcTerm > > sources
Definition PDEOps.H:151
PDEFields & fields
Definition PDEOps.H:149
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:117
Field & m_density
Definition PDEOps.H:150
void init_source_terms(const CFDSim &sim)
Definition PDEOps.H:81
SrcTermOp(PDEFields &fields_in)
Definition PDEOps.H:160
void operator()()
Definition PDEOps.H:182
turbulence::TurbulenceModel & m_tmodel
Definition PDEOps.H:187
TurbulenceOp(turbulence::TurbulenceModel &tmodel, PDEFields &fields)
Definition PDEOps.H:178
PDEFields & m_fields
Definition PDEOps.H:188