1 #ifndef ERF_SHOC_ENERGY_FIXER_H_
2 #define ERF_SHOC_ENERGY_FIXER_H_
14 amrex::Array4<const amrex::Real>
rho;
15 amrex::Array4<const amrex::Real>
dz;
16 amrex::Array4<const amrex::Real>
zt;
17 amrex::Array4<const amrex::Real>
exner;
25 amrex::Array4<const amrex::Real>
u_base;
26 amrex::Array4<const amrex::Real>
v_base;
30 amrex::Array4<const amrex::Real>
qw;
31 amrex::Array4<const amrex::Real>
u;
32 amrex::Array4<const amrex::Real>
v;
33 amrex::Array4<const amrex::Real>
tke;
43 col.
rho.const_array(),
46 col.
exner.const_array(),
60 col.
tke.const_array(),
66 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
73 for (
int k = nlev - 1; k >= 0; --k) {
82 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
97 for (
int k = 0; k <= shoc_top; ++k) {
98 const amrex::Real mass = v.rho(ic,k,0) * v.dz(ic,k,0);
109 v.qi_base(ic,k,0), v.shoc_ql(ic,k,0),
110 tabs_new, qv_new, qc_new, qi_new);
112 energy_before += mass *
moist_energy(tabs_old, v.zt(ic,k,0),
113 v.qv_base(ic,k,0), v.qc_base(ic,k,0), v.qi_base(ic,k,0),
114 v.u_base(ic,k,0), v.v_base(ic,k,0), v.tke_base(ic,k,0));
115 energy_after += mass *
moist_energy(tabs_new, v.zt(ic,k,0),
116 qv_new, qc_new, qi_new,
117 v.u(ic,k,0), v.v(ic,k,0), v.tke(ic,k,0));
128 * (
Cp_d * v.exner(ic,0,0) * v.surf_sens_flux(ic,0,0)
129 + latent_flux_coeff * v.surf_lat_flux(ic,0,0));
130 const amrex::Real delta_tabs = (energy_target - energy_after) / (
Cp_d * air_mass);
132 for (
int k = 0; k <= shoc_top; ++k) {
133 v.thetal(ic,k,0) += delta_tabs / amrex::max(v.exner(ic,k,0),
amrex::Real(1.0e-12));
144 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
155 const amrex::Vector<amrex::Real>& thl_old,
156 const amrex::Vector<amrex::Real>& qv_old,
157 const amrex::Vector<amrex::Real>& qc_old,
158 const amrex::Vector<amrex::Real>& qi_old,
159 const amrex::Vector<amrex::Real>& u_old,
160 const amrex::Vector<amrex::Real>& v_old,
161 const amrex::Vector<amrex::Real>& tke_old,
162 amrex::Vector<amrex::Real>& thl_new,
163 const amrex::Vector<amrex::Real>& qv_new,
164 const amrex::Vector<amrex::Real>& qc_new,
165 const amrex::Vector<amrex::Real>& qi_new,
166 const amrex::Vector<amrex::Real>& u_new,
167 const amrex::Vector<amrex::Real>& v_new,
168 const amrex::Vector<amrex::Real>& tke_new);
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:44
constexpr amrex::Real L_v
Definition: ERF_Constants.H:48
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_ShocEnergyFixer.H:140
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE int diagnose_active_top(const amrex::Array4< const amrex::Real > &tke, int ic, int nlev) noexcept
Definition: ERF_ShocEnergyFixer.H:145
static int diagnose_active_top(const amrex::Vector< amrex::Real > &tke)
static void apply_column(const ShocColumnData &col, int ic, amrex::Real dt, const amrex::Vector< amrex::Real > &thl_old, const amrex::Vector< amrex::Real > &qv_old, const amrex::Vector< amrex::Real > &qc_old, const amrex::Vector< amrex::Real > &qi_old, const amrex::Vector< amrex::Real > &u_old, const amrex::Vector< amrex::Real > &v_old, const amrex::Vector< amrex::Real > &tke_old, amrex::Vector< amrex::Real > &thl_new, const amrex::Vector< amrex::Real > &qv_new, const amrex::Vector< amrex::Real > &qc_new, const amrex::Vector< amrex::Real > &qi_new, const amrex::Vector< amrex::Real > &u_new, const amrex::Vector< amrex::Real > &v_new, const amrex::Vector< amrex::Real > &tke_new)
Definition: ERF_ShocEnergyFixer.cpp:19
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_tke() noexcept
Definition: ERF_ShocConstants.H:10
Definition: ERF_ShocConstants.H:7
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void apply_energy_fix_column(const ShocEnergyFixerView &v, int ic, amrex::Real dt) noexcept
Definition: ERF_ShocEnergyFixer.H:84
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int diagnose_active_top(const amrex::Array4< const amrex::Real > &tke, int ic, int nlev) noexcept
Definition: ERF_ShocEnergyFixer.H:68
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
ShocEnergyFixerView make_energy_fixer_view(ShocColumnData &col)
Definition: ERF_ShocEnergyFixer.H:40
Definition: ERF_ShocTypes.H:204
amrex::FArrayBox dz
Definition: ERF_ShocTypes.H:210
amrex::FArrayBox surf_lat_flux
Definition: ERF_ShocTypes.H:277
amrex::FArrayBox v_base
Definition: ERF_ShocTypes.H:266
amrex::FArrayBox rho
Definition: ERF_ShocTypes.H:213
amrex::FArrayBox tke_base_state
Definition: ERF_ShocTypes.H:267
amrex::FArrayBox qv_base
Definition: ERF_ShocTypes.H:262
amrex::FArrayBox shoc_ql
Definition: ERF_ShocTypes.H:243
amrex::FArrayBox tke
Definition: ERF_ShocTypes.H:223
amrex::FArrayBox qi_base
Definition: ERF_ShocTypes.H:264
amrex::FArrayBox exner
Definition: ERF_ShocTypes.H:215
amrex::FArrayBox u_base
Definition: ERF_ShocTypes.H:265
amrex::FArrayBox qc_base
Definition: ERF_ShocTypes.H:263
ShocColumnLayout layout
Definition: ERF_ShocTypes.H:205
amrex::FArrayBox surf_sens_flux
Definition: ERF_ShocTypes.H:276
amrex::FArrayBox qw
Definition: ERF_ShocTypes.H:221
amrex::FArrayBox v
Definition: ERF_ShocTypes.H:225
amrex::FArrayBox zt
Definition: ERF_ShocTypes.H:208
amrex::FArrayBox u
Definition: ERF_ShocTypes.H:224
amrex::FArrayBox thetal_base
Definition: ERF_ShocTypes.H:260
amrex::FArrayBox thetal
Definition: ERF_ShocTypes.H:217
int nlev
Definition: ERF_ShocTypes.H:196
Definition: ERF_ShocEnergyFixer.H:13
amrex::Array4< const amrex::Real > rho
Definition: ERF_ShocEnergyFixer.H:14
amrex::Array4< const amrex::Real > qc_base
Definition: ERF_ShocEnergyFixer.H:23
amrex::Array4< amrex::Real > thetal
Definition: ERF_ShocEnergyFixer.H:29
amrex::Array4< const amrex::Real > surf_lat_flux
Definition: ERF_ShocEnergyFixer.H:19
int nlev
Definition: ERF_ShocEnergyFixer.H:36
amrex::Array4< const amrex::Real > u
Definition: ERF_ShocEnergyFixer.H:31
amrex::Array4< const amrex::Real > zt
Definition: ERF_ShocEnergyFixer.H:16
amrex::Array4< const amrex::Real > tke
Definition: ERF_ShocEnergyFixer.H:33
amrex::Array4< const amrex::Real > tke_base
Definition: ERF_ShocEnergyFixer.H:27
amrex::Array4< const amrex::Real > u_base
Definition: ERF_ShocEnergyFixer.H:25
amrex::Array4< const amrex::Real > exner
Definition: ERF_ShocEnergyFixer.H:17
amrex::Array4< const amrex::Real > surf_sens_flux
Definition: ERF_ShocEnergyFixer.H:18
amrex::Array4< const amrex::Real > qv_base
Definition: ERF_ShocEnergyFixer.H:22
amrex::Array4< const amrex::Real > v_base
Definition: ERF_ShocEnergyFixer.H:26
amrex::Array4< const amrex::Real > v
Definition: ERF_ShocEnergyFixer.H:32
amrex::Array4< const amrex::Real > shoc_ql
Definition: ERF_ShocEnergyFixer.H:34
amrex::Array4< const amrex::Real > qi_base
Definition: ERF_ShocEnergyFixer.H:24
amrex::Array4< const amrex::Real > thetal_base
Definition: ERF_ShocEnergyFixer.H:21
amrex::Array4< const amrex::Real > dz
Definition: ERF_ShocEnergyFixer.H:15
amrex::Array4< const amrex::Real > qw
Definition: ERF_ShocEnergyFixer.H:30