/home/runner/work/kynema-sgf/kynema-sgf/src/transport_models/ConstTransport.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/transport_models/ConstTransport.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
ConstTransport.H
Go to the documentation of this file.
1#ifndef CONSTTRANSPORT_H
2#define CONSTTRANSPORT_H
3
6#include "AMReX_ParmParse.H"
7#include "AMReX_REAL.H"
8
9using namespace amrex::literals;
10
11namespace kynema_sgf::transport {
12
16class ConstTransport : public TransportModel::Register<ConstTransport>
17{
18public:
19 static constexpr bool constant_properties = true;
20
21 static std::string identifier() { return "ConstTransport"; }
22
23 explicit ConstTransport(const CFDSim& sim) : m_repo(sim.repo())
24 {
25 amrex::ParmParse pp("transport");
26 pp.query("viscosity", m_mu);
27 pp.query("laminar_prandtl", m_Pr);
28 pp.query("turbulent_prandtl", m_Prt);
29
30 // Backwards compatibility
31 amrex::ParmParse pp_boussinesq_buoyancy("BoussinesqBuoyancy");
32 amrex::ParmParse pp_abl("ABL");
33 if (pp.contains("thermal_expansion_coefficient")) {
34 pp.get("thermal_expansion_coefficient", m_constant_beta);
35 if (pp_boussinesq_buoyancy.contains("thermal_expansion_coeff")) {
36 amrex::Print()
37 << "WARNING: BoussinesqBuoyancy.thermal_expansion_coeff "
38 "option has been deprecated in favor of "
39 "transport.thermal_expansion_coefficient. Ignoring the "
40 "BoussinesqBuoyancy option in favor of the transport "
41 "option."
42 << '\n';
43 }
44 } else if (pp_boussinesq_buoyancy.contains("thermal_expansion_coeff")) {
45 amrex::Print()
46 << "WARNING: BoussinesqBuoyancy.thermal_expansion_coeff option "
47 "has been deprecated in favor of "
48 "transport.thermal_expansion_coefficient. Please replace "
49 "this option."
50 << '\n';
51 pp_boussinesq_buoyancy.get(
52 "thermal_expansion_coeff", m_constant_beta);
53 }
54
55 if (pp.contains("reference_temperature")) {
56 pp.get("reference_temperature", m_reference_temperature);
57 if (pp_boussinesq_buoyancy.contains("reference_temperature")) {
58 amrex::Print()
59 << "WARNING: BoussinesqBuoyancy.reference_temperature "
60 "option has been deprecated in favor of "
61 "transport.reference_temperature. Ignoring the "
62 "BoussinesqBuoyancy option in favor of the transport "
63 "option."
64 << '\n';
65 } else if (pp_abl.contains("reference_temperature")) {
66 amrex::Print()
67 << "WARNING: ABL.reference_temperature "
68 "option has been deprecated in favor of "
69 "transport.reference_temperature. Ignoring the "
70 "ABL option in favor of the transport "
71 "option."
72 << '\n';
73 }
74 } else if (pp_boussinesq_buoyancy.contains("reference_temperature")) {
75 amrex::Print()
76 << "WARNING: BoussinesqBuoyancy.reference_temperature option "
77 "has been deprecated in favor of "
78 "transport.reference_temperature. Please replace "
79 "this option."
80 << '\n';
81 pp_boussinesq_buoyancy.get(
82 "reference_temperature", m_reference_temperature);
83 } else if (pp_abl.contains("reference_temperature")) {
84 amrex::Print() << "WARNING: ABL.reference_temperature option "
85 "has been deprecated in favor of "
86 "transport.reference_temperature. Please replace "
87 "this option."
88 << '\n';
89 pp_abl.get("reference_temperature", m_reference_temperature);
90 }
91 }
92
93 ~ConstTransport() override = default;
94
95 [[nodiscard]] amrex::Real viscosity() const { return m_mu; }
96
97 [[nodiscard]] amrex::Real thermal_diffusivity() const
98 {
99 return m_mu / m_Pr;
100 }
101
102 [[nodiscard]] amrex::Real laminar_prandtl() const { return m_Pr; }
103
104 [[nodiscard]] amrex::Real turbulent_prandtl() const { return m_Prt; }
105
106 static amrex::Real laminar_schmidt(const std::string& scalar_name)
107 {
108 amrex::ParmParse pp("transport");
109 const std::string key = scalar_name + "_laminar_schmidt";
110 amrex::Real lam_schmidt = 1.0_rt;
111 pp.query(key, lam_schmidt);
112 return lam_schmidt;
113 }
114
115 static amrex::Real turbulent_schmidt(const std::string& scalar_name)
116 {
117 amrex::ParmParse pp("transport");
118 const std::string key = scalar_name + "_turbulent_schmidt";
119 amrex::Real turb_schmidt = 1.0_rt;
120 pp.query(key, turb_schmidt);
121 return turb_schmidt;
122 }
123
125 std::unique_ptr<ScratchField> mu() override
126 {
127 auto mu = m_repo.create_scratch_field(1, m_ngrow);
128 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
129 (*mu)(lev).setVal(m_mu);
130 }
131 return mu;
132 }
133
135 std::unique_ptr<ScratchField> alpha() override
136 {
137 auto alpha = mu();
138 amrex::Real inv_Pr = 1.0_rt / m_Pr;
139 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
140 (*alpha)(lev).mult(inv_Pr);
141 }
142 return alpha;
143 }
144
145 std::unique_ptr<ScratchField>
146 scalar_diffusivity(const std::string& scalar_name) override
147 {
148 amrex::Real lam_schmidt = laminar_schmidt(scalar_name);
149
150 amrex::Real inv_schmidt = 1.0_rt / lam_schmidt;
151 auto diff = mu();
152 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
153 (*diff)(lev).mult(inv_schmidt);
154 }
155
156 return diff;
157 }
158
160 [[nodiscard]] std::unique_ptr<ScratchField> beta() const override
161 {
162 auto beta = m_repo.create_scratch_field(1, m_ngrow);
163 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
164 beta_fill(lev, (*beta)(lev));
165 }
166 return beta;
167 }
168
169 [[nodiscard]] amrex::Real reference_temperature() const override
170 {
172 }
173
174 void beta_fill(const int lev, amrex::MultiFab& beta_mf) const override
175 {
176 if (m_constant_beta > 0.0_rt) {
177 beta_mf.setVal(m_constant_beta);
178 } else if (m_repo.field_exists("reference_temperature")) {
179 const auto& temp0 = m_repo.get_field("reference_temperature");
180 auto const& beta_arrs = beta_mf.arrays();
181 auto const& temp0_arrs = temp0(lev).const_arrays();
182 amrex::ParallelFor(
183 beta_mf, amrex::IntVect(0), 1,
184 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k, int) {
185 beta_arrs[nbx](i, j, k) = 1.0_rt / temp0_arrs[nbx](i, j, k);
186 });
187 amrex::Gpu::streamSynchronize();
188 } else {
189 beta_mf.setVal(1.0_rt / m_reference_temperature);
190 }
191
192 if (m_repo.field_exists("vof")) {
193 const auto& vof = m_repo.get_field("vof");
194 auto const& beta_arrs = beta_mf.arrays();
195 auto const& vof_arrs = vof(lev).const_arrays();
196 amrex::ParallelFor(
197 beta_mf, amrex::IntVect(0), 1,
198 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k, int) {
199 if (vof_arrs[nbx](i, j, k) > constants::VOF_TOL) {
200 beta_arrs[nbx](i, j, k) = 0.0_rt;
201 }
202 });
203 amrex::Gpu::streamSynchronize();
204 }
205 }
206
207 void
208 ref_theta_fill(const int lev, amrex::MultiFab& ref_theta_mf) const override
209 {
210 if (m_reference_temperature < 0.0_rt) {
211 amrex::Abort("Reference temperature was not set");
212 }
213
214 if (m_repo.field_exists("reference_temperature")) {
215 const auto& temp0 = m_repo.get_field("reference_temperature");
216 amrex::MultiFab::Copy(ref_theta_mf, temp0(lev), 0, 0, 1, 0);
217 } else {
218 ref_theta_mf.setVal(m_reference_temperature);
219 }
220 }
221
223 [[nodiscard]] std::unique_ptr<ScratchField> ref_theta() const override
224 {
225 if (m_reference_temperature < 0.0_rt) {
226 amrex::Abort("Reference temperature was not set");
227 }
228
229 auto ref_theta = m_repo.create_scratch_field(1, m_ngrow);
230 for (int lev = 0; lev < m_repo.num_active_levels(); ++lev) {
231 ref_theta_fill(lev, (*ref_theta)(lev));
232 }
233 return ref_theta;
234 }
235
236private:
239
241 amrex::Real m_mu{1.0e-5_rt};
242
244 amrex::Real m_Pr{1.0_rt};
245
247 amrex::Real m_Prt{1.0_rt};
248
250 amrex::Real m_constant_beta{0.0_rt};
251
253 amrex::Real m_reference_temperature{-1.0_rt};
254};
255
256} // namespace kynema_sgf::transport
257
258#endif /* CONSTTRANSPORT_H */
Definition CFDSim.H:55
Definition FieldRepo.H:86
void ref_theta_fill(const int lev, amrex::MultiFab &ref_theta_mf) const override
Definition ConstTransport.H:208
amrex::Real laminar_prandtl() const
Definition ConstTransport.H:102
static constexpr bool constant_properties
Definition ConstTransport.H:19
static amrex::Real turbulent_schmidt(const std::string &scalar_name)
Definition ConstTransport.H:115
std::unique_ptr< ScratchField > ref_theta() const override
Return the reference temperature.
Definition ConstTransport.H:223
std::unique_ptr< ScratchField > mu() override
Return the dynamic visocity field.
Definition ConstTransport.H:125
static std::string identifier()
Definition ConstTransport.H:21
static amrex::Real laminar_schmidt(const std::string &scalar_name)
Definition ConstTransport.H:106
amrex::Real m_mu
(Laminar) dynamic viscosity
Definition ConstTransport.H:241
amrex::Real m_constant_beta
Constant thermal expansion coefficient.
Definition ConstTransport.H:250
void beta_fill(const int lev, amrex::MultiFab &beta_mf) const override
Definition ConstTransport.H:174
ConstTransport(const CFDSim &sim)
Definition ConstTransport.H:23
std::unique_ptr< ScratchField > scalar_diffusivity(const std::string &scalar_name) override
Definition ConstTransport.H:146
FieldRepo & m_repo
Reference to the field repository (for creating scratch fields)
Definition ConstTransport.H:238
amrex::Real m_Prt
Turbulent Prandtl number.
Definition ConstTransport.H:247
amrex::Real m_reference_temperature
Reference temperature.
Definition ConstTransport.H:253
amrex::Real thermal_diffusivity() const
Definition ConstTransport.H:97
std::unique_ptr< ScratchField > beta() const override
Return the thermal expansion coefficient.
Definition ConstTransport.H:160
amrex::Real m_Pr
Prandtl number.
Definition ConstTransport.H:244
amrex::Real reference_temperature() const override
Definition ConstTransport.H:169
std::unique_ptr< ScratchField > alpha() override
Return the thermal diffusivity field.
Definition ConstTransport.H:135
amrex::Real turbulent_prandtl() const
Definition ConstTransport.H:104
amrex::Real viscosity() const
Definition ConstTransport.H:95
static constexpr amrex::Real VOF_TOL
Tolerance for vof determining presence of liquid.
Definition constants.H:34
Definition CFDSim.H:27