ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_ShocThermoUtils.H
Go to the documentation of this file.
1 #ifndef ERF_SHOC_THERMO_UTILS_H_
2 #define ERF_SHOC_THERMO_UTILS_H_
3 
4 #include "ERF_Constants.H"
5 #include "ERF_ShocConstants.H"
6 #include "ERF_ShocTypes.H"
7 
8 namespace shoc {
9 
10 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
12 latent_sublimation () noexcept
13 {
14  return L_v + constants::latent_ice();
15 }
16 
17 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
20  amrex::Real qi) noexcept
21 {
22  return L_v * amrex::max(amrex::Real(0.0), qc)
23  + latent_sublimation() * amrex::max(amrex::Real(0.0), qi);
24 }
25 
26 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
31  amrex::Real exner) noexcept
32 {
33  return thetal
35  / (Cp_d * amrex::max(exner, amrex::Real(1.0e-12)));
36 }
37 
38 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
43  amrex::Real exner) noexcept
44 {
45  return amrex::max(constants::min_temp(),
46  thetal * amrex::max(exner, amrex::Real(1.0e-12))
48 }
49 
50 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
55  amrex::Real exner) noexcept
56 {
57  return theta
59  / (Cp_d * amrex::max(exner, amrex::Real(1.0e-12)));
60 }
61 
62 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
65  amrex::Real z,
69  amrex::Real u,
70  amrex::Real v,
71  amrex::Real tke) noexcept
72 {
73  // Ice-reference moist energy has no explicit qi term; qi is retained in
74  // the signature so callers pass a complete vapor/liquid/ice state.
75  amrex::ignore_unused(qi);
76  return Cp_d * tabs
77  + CONST_GRAV * z
78  + amrex::Real(0.5) * (u * u + v * v)
79  + tke
81  + constants::latent_ice() * amrex::max(amrex::Real(0.0), qc);
82 }
83 
84 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
85 void
87  amrex::Real qw,
88  amrex::Real exner,
89  amrex::Real qi_seed,
90  amrex::Real pdf_ql,
92  amrex::Real& qv,
93  amrex::Real& qc,
94  amrex::Real& qi) noexcept
95 {
96  // Interim native-SHOC contract: preserve any existing ice seed for
97  // phase-aware thermodynamics, but do not create or repartition cloud ice.
98  const amrex::Real qi_total = shoc_clamp(qi_seed, amrex::Real(0.0), amrex::max(amrex::Real(0.0), qw));
99  const amrex::Real ql_total = shoc_clamp(pdf_ql, amrex::Real(0.0), amrex::max(amrex::Real(0.0), qw - qi_total));
100 
101  qc = ql_total;
102  qi = qi_total;
103  tabs = temperature_from_thetal(thetal, qc, qi, exner);
104  qv = amrex::max(amrex::Real(0.0), qw - qc - qi);
105 }
106 
107 } // namespace shoc
108 
109 #endif
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:44
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:53
constexpr amrex::Real L_v
Definition: ERF_Constants.H:48
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T shoc_clamp(T value, T lo, T hi)
Definition: ERF_ShocTypes.H:382
@ theta
Definition: ERF_MM5.H:20
@ tabs
Definition: ERF_Kessler.H:25
@ qv
Definition: ERF_Kessler.H:29
@ qc
Definition: ERF_SatAdj.H:40
@ qi
Definition: ERF_WSM6.H:26
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real latent_ice() noexcept
Definition: ERF_ShocConstants.H:13
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real min_temp() noexcept
Definition: ERF_ShocConstants.H:16
Definition: ERF_ShocConstants.H:7
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real condensate_latent_heat(amrex::Real qc, amrex::Real qi) noexcept
Definition: ERF_ShocThermoUtils.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void reconstruct_pdf_state(amrex::Real thetal, amrex::Real qw, amrex::Real exner, amrex::Real qi_seed, amrex::Real pdf_ql, amrex::Real &tabs, amrex::Real &qv, amrex::Real &qc, amrex::Real &qi) noexcept
Definition: ERF_ShocThermoUtils.H:86
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real moist_energy(amrex::Real tabs, amrex::Real z, amrex::Real qv, amrex::Real qc, amrex::Real qi, amrex::Real u, amrex::Real v, amrex::Real tke) noexcept
Definition: ERF_ShocThermoUtils.H:64
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real temperature_from_thetal(amrex::Real thetal, amrex::Real qc, amrex::Real qi, amrex::Real exner) noexcept
Definition: ERF_ShocThermoUtils.H:40
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real theta_from_thetal(amrex::Real thetal, amrex::Real qc, amrex::Real qi, amrex::Real exner) noexcept
Definition: ERF_ShocThermoUtils.H:28
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real thetal_from_theta(amrex::Real theta, amrex::Real qc, amrex::Real qi, amrex::Real exner) noexcept
Definition: ERF_ShocThermoUtils.H:52
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real latent_sublimation() noexcept
Definition: ERF_ShocThermoUtils.H:12