/home/runner/work/amr-wind/amr-wind/amr-wind/transport_models/ConstTransport.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/transport_models/ConstTransport.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
ConstTransport.H
Go to the documentation of this file.
1#ifndef CONSTTRANSPORT_H
2#define CONSTTRANSPORT_H
3
5#include "AMReX_ParmParse.H"
6
7namespace amr_wind::transport {
8
12class ConstTransport : public TransportModel::Register<ConstTransport>
13{
14public:
15 static constexpr bool constant_properties = true;
16
17 static std::string identifier() { return "ConstTransport"; }
18
19 explicit ConstTransport(const CFDSim& sim) : m_repo(sim.repo())
20 {
21 amrex::ParmParse pp("transport");
22 pp.query("viscosity", m_mu);
23 pp.query("laminar_prandtl", m_Pr);
24 pp.query("turbulent_prandtl", m_Prt);
25
26 // Backwards compatibility
27 amrex::ParmParse pp_boussinesq_buoyancy("BoussinesqBuoyancy");
28 amrex::ParmParse pp_abl("ABL");
29 if (pp.contains("thermal_expansion_coefficient")) {
30 pp.get("thermal_expansion_coefficient", m_constant_beta);
31 if (pp_boussinesq_buoyancy.contains("thermal_expansion_coeff")) {
32 amrex::Print()
33 << "WARNING: BoussinesqBuoyancy.thermal_expansion_coeff "
34 "option has been deprecated in favor of "
35 "transport.thermal_expansion_coefficient. Ignoring the "
36 "BoussinesqBuoyancy option in favor of the transport "
37 "option."
38 << std::endl;
39 }
40 } else if (pp_boussinesq_buoyancy.contains("thermal_expansion_coeff")) {
41 amrex::Print()
42 << "WARNING: BoussinesqBuoyancy.thermal_expansion_coeff option "
43 "has been deprecated in favor of "
44 "transport.thermal_expansion_coefficient. Please replace "
45 "this option."
46 << std::endl;
47 pp_boussinesq_buoyancy.get(
48 "thermal_expansion_coeff", m_constant_beta);
49 }
50
51 if (pp.contains("reference_temperature")) {
52 pp.get("reference_temperature", m_reference_temperature);
53 if (pp_boussinesq_buoyancy.contains("reference_temperature")) {
54 amrex::Print()
55 << "WARNING: BoussinesqBuoyancy.reference_temperature "
56 "option has been deprecated in favor of "
57 "transport.reference_temperature. Ignoring the "
58 "BoussinesqBuoyancy option in favor of the transport "
59 "option."
60 << std::endl;
61 } else if (pp_abl.contains("reference_temperature")) {
62 amrex::Print()
63 << "WARNING: ABL.reference_temperature "
64 "option has been deprecated in favor of "
65 "transport.reference_temperature. Ignoring the "
66 "ABL option in favor of the transport "
67 "option."
68 << std::endl;
69 }
70 } else if (pp_boussinesq_buoyancy.contains("reference_temperature")) {
71 amrex::Print()
72 << "WARNING: BoussinesqBuoyancy.reference_temperature option "
73 "has been deprecated in favor of "
74 "transport.reference_temperature. Please replace "
75 "this option."
76 << std::endl;
77 pp_boussinesq_buoyancy.get(
78 "reference_temperature", m_reference_temperature);
79 } else if (pp_abl.contains("reference_temperature")) {
80 amrex::Print() << "WARNING: ABL.reference_temperature option "
81 "has been deprecated in favor of "
82 "transport.reference_temperature. Please replace "
83 "this option."
84 << std::endl;
85 pp_abl.get("reference_temperature", m_reference_temperature);
86 }
87 }
88
89 ~ConstTransport() override = default;
90
91 inline amrex::Real viscosity() const { return m_mu; }
92
93 inline amrex::Real thermal_diffusivity() const { return m_mu / m_Pr; }
94
95 inline amrex::Real laminar_prandtl() const { return m_Pr; }
96
97 inline amrex::Real turbulent_prandtl() const { return m_Prt; }
98
99 static inline amrex::Real laminar_schmidt(const std::string& scalar_name)
100 {
101 amrex::ParmParse pp("transport");
102 const std::string key = scalar_name + "_laminar_schmidt";
103 amrex::Real lam_schmidt = 1.0;
104 pp.query(key.c_str(), lam_schmidt);
105 return lam_schmidt;
106 }
107
108 static inline amrex::Real turbulent_schmidt(const std::string& scalar_name)
109 {
110 amrex::ParmParse pp("transport");
111 const std::string key = scalar_name + "_turbulent_schmidt";
112 amrex::Real turb_schmidt = 1.0;
113 pp.query(key.c_str(), turb_schmidt);
114 return turb_schmidt;
115 }
116
118 inline std::unique_ptr<ScratchField> mu() override
119 {
120 auto mu = m_repo.create_scratch_field(1, m_ngrow);
121 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
122 (*mu)(lev).setVal(m_mu);
123 }
124 return mu;
125 }
126
128 inline std::unique_ptr<ScratchField> alpha() override
129 {
130 auto alpha = mu();
131 amrex::Real inv_Pr = 1.0 / m_Pr;
132 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
133 (*alpha)(lev).mult(inv_Pr);
134 }
135 return alpha;
136 }
137
138 inline std::unique_ptr<ScratchField>
139 scalar_diffusivity(const std::string& scalar_name) override
140 {
141 amrex::Real lam_schmidt = laminar_schmidt(scalar_name);
142
143 amrex::Real inv_schmidt = 1.0 / lam_schmidt;
144 auto diff = mu();
145 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
146 (*diff)(lev).mult(inv_schmidt);
147 }
148
149 return diff;
150 }
151
153 inline std::unique_ptr<ScratchField> beta() const override
154 {
155 auto beta = m_repo.create_scratch_field(1, m_ngrow);
156 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
157#ifdef AMREX_USE_OMP
158#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
159#endif
160 for (amrex::MFIter mfi((*beta)(lev)); mfi.isValid(); ++mfi) {
161 const auto& bx = mfi.tilebox();
162 const auto& beta_arr = (*beta)(lev).array(mfi);
163 beta_impl(lev, mfi, bx, beta_arr);
164 }
165 }
166 return beta;
167 }
168
170 inline void beta_impl(
171 const int lev,
172 const amrex::MFIter& mfi,
173 const amrex::Box& bx,
174 const amrex::Array4<amrex::Real>& beta) const override
175 {
176
177 if (m_constant_beta > 0.0) {
178 const amrex::Real beta_val = m_constant_beta;
179 amrex::ParallelFor(
180 bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
181 beta(i, j, k) = beta_val;
182 });
183 } else if (m_repo.field_exists("reference_temperature")) {
184 const auto& temp0 = m_repo.get_field("reference_temperature");
185 const auto& temp0_arr = temp0(lev).const_array(mfi);
186 amrex::ParallelFor(
187 bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
188 beta(i, j, k) = 1.0 / temp0_arr(i, j, k);
189 });
190 } else {
191 const amrex::Real beta_val = 1.0 / m_reference_temperature;
192 amrex::ParallelFor(
193 bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
194 beta(i, j, k) = beta_val;
195 });
196 }
197
198 if (m_repo.field_exists("vof")) {
199 const auto& vof = m_repo.get_field("vof");
200 const auto& vof_arr = vof(lev).const_array(mfi);
201 amrex::ParallelFor(
202 bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
203 if (vof_arr(i, j, k) > constants::TIGHT_TOL) {
204 beta(i, j, k) = 0.0;
205 }
206 });
207 }
208 }
209
210 inline amrex::Real reference_temperature() const override
211 {
213 }
214
216 inline std::unique_ptr<ScratchField> ref_theta() const override
217 {
218 if (m_reference_temperature < 0.0) {
219 amrex::Abort("Reference temperature was not set");
220 }
221
222 auto ref_theta = m_repo.create_scratch_field(1, m_ngrow);
223 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
224#ifdef AMREX_USE_OMP
225#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
226#endif
227 for (amrex::MFIter mfi((*ref_theta)(lev)); mfi.isValid(); ++mfi) {
228 const auto& bx = mfi.tilebox();
229 const auto& ref_theta_arr = (*ref_theta)(lev).array(mfi);
230 ref_theta_impl(lev, mfi, bx, ref_theta_arr);
231 }
232 }
233 return ref_theta;
234 }
235
237 inline void ref_theta_impl(
238 const int lev,
239 const amrex::MFIter& mfi,
240 const amrex::Box& bx,
241 const amrex::Array4<amrex::Real>& ref_theta) const override
242 {
243 if (m_reference_temperature < 0.0) {
244 amrex::Abort("Reference temperature was not set");
245 }
246
247 if (m_repo.field_exists("reference_temperature")) {
248 auto& temp0 = m_repo.get_field("reference_temperature");
249 const auto& temp0_arr = temp0(lev).const_array(mfi);
250 amrex::ParallelFor(
251 bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
252 ref_theta(i, j, k) = temp0_arr(i, j, k);
253 });
254 } else {
255 const amrex::Real ref_theta_val = m_reference_temperature;
256 amrex::ParallelFor(
257 bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
258 ref_theta(i, j, k) = ref_theta_val;
259 });
260 }
261 }
262
263private:
266
268 amrex::Real m_mu{1.0e-5};
269
271 amrex::Real m_Pr{1.0};
272
274 amrex::Real m_Prt{1.0};
275
277 amrex::Real m_constant_beta{0.0};
278
280 amrex::Real m_reference_temperature{-1.0};
281};
282
283} // namespace amr_wind::transport
284
285#endif /* CONSTTRANSPORT_H */
Definition CFDSim.H:54
Definition FieldRepo.H:86
std::unique_ptr< ScratchField > create_scratch_field(const std::string &name, const int ncomp=1, const int nghost=0, const FieldLoc floc=FieldLoc::CELL) const
Definition FieldRepo.cpp:302
Field & get_field(const std::string &name, const FieldState fstate=FieldState::New) const
Definition FieldRepo.cpp:149
int num_active_levels() const noexcept
Total number of levels currently active in the AMR mesh.
Definition FieldRepo.H:361
bool field_exists(const std::string &name, const FieldState fstate=FieldState::New) const
Definition FieldRepo.cpp:215
Definition ConstTransport.H:13
void ref_theta_impl(const int lev, const amrex::MFIter &mfi, const amrex::Box &bx, const amrex::Array4< amrex::Real > &ref_theta) const override
Compute the reference temperature.
Definition ConstTransport.H:237
amrex::Real m_mu
(Laminar) dynamic viscosity
Definition ConstTransport.H:268
amrex::Real thermal_diffusivity() const
Definition ConstTransport.H:93
FieldRepo & m_repo
Reference to the field repository (for creating scratch fields)
Definition ConstTransport.H:265
amrex::Real reference_temperature() const override
Definition ConstTransport.H:210
amrex::Real turbulent_prandtl() const
Definition ConstTransport.H:97
void beta_impl(const int lev, const amrex::MFIter &mfi, const amrex::Box &bx, const amrex::Array4< amrex::Real > &beta) const override
Compute the thermal expansion coefficient.
Definition ConstTransport.H:170
amrex::Real m_Prt
Turbulent Prandtl number.
Definition ConstTransport.H:274
static constexpr bool constant_properties
Definition ConstTransport.H:15
amrex::Real viscosity() const
Definition ConstTransport.H:91
static amrex::Real turbulent_schmidt(const std::string &scalar_name)
Definition ConstTransport.H:108
amrex::Real m_Pr
Prandtl number.
Definition ConstTransport.H:271
amrex::Real laminar_prandtl() const
Definition ConstTransport.H:95
static std::string identifier()
Definition ConstTransport.H:17
ConstTransport(const CFDSim &sim)
Definition ConstTransport.H:19
std::unique_ptr< ScratchField > beta() const override
Return the thermal expansion coefficient.
Definition ConstTransport.H:153
amrex::Real m_constant_beta
Constant thermal expansion coefficient.
Definition ConstTransport.H:277
static amrex::Real laminar_schmidt(const std::string &scalar_name)
Definition ConstTransport.H:99
amrex::Real m_reference_temperature
Reference temperature.
Definition ConstTransport.H:280
std::unique_ptr< ScratchField > ref_theta() const override
Return the reference temperature.
Definition ConstTransport.H:216
std::unique_ptr< ScratchField > scalar_diffusivity(const std::string &scalar_name) override
Definition ConstTransport.H:139
std::unique_ptr< ScratchField > alpha() override
Return the thermal diffusivity field.
Definition ConstTransport.H:128
std::unique_ptr< ScratchField > mu() override
Return the dynamic visocity field.
Definition ConstTransport.H:118
static constexpr amrex::Real TIGHT_TOL
A tight tolerance.
Definition constants.H:19
Definition CFDSim.H:26