1 #ifndef ERF_MOISTUTILS_H_
2 #define ERF_MOISTUTILS_H_
17 const amrex::Array4<amrex::Real const>& cell_data,
19 amrex::Real& qc_liquid,
23 qv = 0.0; qc_liquid = 0.0; qc_ice = 0.0;
26 if (moisture_indices.
qv >= 0) {
27 qv = cell_data(i,j,k,moisture_indices.
qv)/cell_data(i,j,k,
Rho_comp);
31 if (moisture_indices.
qc >= 0) {
32 qc_liquid = cell_data(i,j,k,moisture_indices.
qc)/cell_data(i,j,k,
Rho_comp);
36 if (moisture_indices.
qi >= 0) {
37 qc_ice = cell_data(i,j,k,moisture_indices.
qi)/cell_data(i,j,k,
Rho_comp);
42 if (moisture_indices.
qr >= 0) {
43 qc_liquid += cell_data(i,j,k,moisture_indices.
qr)/cell_data(i,j,k,
Rho_comp);
45 if (moisture_indices.
qs >= 0) {
46 qc_ice += cell_data(i,j,k,moisture_indices.
qs)/cell_data(i,j,k,
Rho_comp);
48 if (moisture_indices.
qg >= 0) {
49 qc_ice += cell_data(i,j,k,moisture_indices.
qg)/cell_data(i,j,k,
Rho_comp);
60 amrex::Real qc_liquid,
63 amrex::Real qc_total = qc_liquid + qc_ice;
64 return theta * (1.0 + 0.61*
qv - qc_total);
73 const amrex::Array4<amrex::Real const>& cell_data,
91 amrex::Real qc_liquid)
102 const amrex::Array4<amrex::Real const>& cell_data,
124 const amrex::Array4<amrex::Real const>& cell_data,
127 amrex::Real inv_theta0,
131 amrex::Real
qv, qc_liquid, qc_ice;
135 amrex::Real theta_v_upper =
GetThetav(i, j, k+1, cell_data, moisture_indices);
136 amrex::Real theta_v_lower =
GetThetav(i, j, k-1, cell_data, moisture_indices);
138 amrex::Real dthetav_dz = 0.5 * (theta_v_upper - theta_v_lower) * dzInv;
139 amrex::Real stratification = abs_g * dthetav_dz * inv_theta0;
142 amrex::Real total_condensate = qc_liquid + qc_ice;
143 if (total_condensate > 1e-8) {
148 amrex::Real liquid_fraction = qc_liquid / (total_condensate + 1e-12);
149 amrex::Real ice_fraction = 1.0 - liquid_fraction;
150 amrex::Real L_eff = liquid_fraction *
L_v + ice_fraction * (
L_v +
lat_ice);
153 amrex::Real qsat_liquid = 0.0, qsat_ice = 0.0;
156 erf_qsatw(T_current, pres_current, qsat_liquid);
157 erf_qsati(T_current, pres_current, qsat_ice);
159 amrex::Real qsat_eff = liquid_fraction * qsat_liquid + ice_fraction * qsat_ice;
162 amrex::Real gamma_moist_factor = (1.0 + L_eff*qsat_eff/(
R_d*T_current)) /
163 (1.0 + L_eff*L_eff*qsat_eff/(
Cp_d*
R_v*T_current*T_current));
165 stratification *= gamma_moist_factor;
168 return stratification;
177 const amrex::Array4<amrex::Real const>& cell_data,
180 amrex::Real inv_theta0,
185 if (use_moisture && (rho_qv_comp >= 0)) {
192 amrex::Real dtheta_dz = 0.5 * (theta_hi - theta_lo) * dzInv;
193 return abs_g * dtheta_dz * inv_theta0;
constexpr amrex::Real R_v
Definition: ERF_Constants.H:11
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:12
constexpr amrex::Real lat_ice
Definition: ERF_Constants.H:86
constexpr amrex::Real R_d
Definition: ERF_Constants.H:10
constexpr amrex::Real L_v
Definition: ERF_Constants.H:16
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=0.)
Definition: ERF_EOS.H:81
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getTgivenRandRTh(const amrex::Real rho, const amrex::Real rhotheta, const amrex::Real qv=0.0)
Definition: ERF_EOS.H:46
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsatw(amrex::Real t, amrex::Real p, amrex::Real &qsatw)
Definition: ERF_MicrophysicsUtils.H:163
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsati(amrex::Real t, amrex::Real p, amrex::Real &qsati)
Definition: ERF_MicrophysicsUtils.H:152
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real GetThetal(int i, int j, int k, const amrex::Array4< amrex::Real const > &cell_data, const MoistureComponentIndices &moisture_indices)
Definition: ERF_MoistUtils.H:101
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real ComputeMoistStratification(int i, int j, int k, const amrex::Array4< amrex::Real const > &cell_data, amrex::Real dzInv, amrex::Real abs_g, amrex::Real inv_theta0, const MoistureComponentIndices &moisture_indices)
Definition: ERF_MoistUtils.H:123
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real ComputeVirtualPotentialTemperature(amrex::Real theta, amrex::Real qv, amrex::Real qc_liquid, amrex::Real qc_ice)
Definition: ERF_MoistUtils.H:58
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void GetMoistureVars(int i, int j, int k, const amrex::Array4< amrex::Real const > &cell_data, amrex::Real &qv, amrex::Real &qc_liquid, amrex::Real &qc_ice, const MoistureComponentIndices &moisture_indices)
Definition: ERF_MoistUtils.H:16
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real ComputeLiquidWaterPotentialTemperature(amrex::Real theta, amrex::Real T, amrex::Real qc_liquid)
Definition: ERF_MoistUtils.H:89
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real ComputeStratificationForSmagorinsky(int i, int j, int k, const amrex::Array4< amrex::Real const > &cell_data, amrex::Real dzInv, amrex::Real abs_g, amrex::Real inv_theta0, bool use_moisture, int rho_qv_comp, const MoistureComponentIndices &moisture_indices)
Definition: ERF_MoistUtils.H:176
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real GetThetav(int i, int j, int k, const amrex::Array4< amrex::Real const > &cell_data, const MoistureComponentIndices &moisture_indices)
Definition: ERF_MoistUtils.H:72
@ theta
Definition: ERF_MM5.H:20
@ qcl
Definition: ERF_Kessler.H:29
@ qv
Definition: ERF_Kessler.H:28
@ qci
Definition: ERF_Morrison.H:36
@ T
Definition: ERF_IndexDefines.H:110
Definition: ERF_DataStruct.H:99
int qs
Definition: ERF_DataStruct.H:104
int qr
Definition: ERF_DataStruct.H:103
int qi
Definition: ERF_DataStruct.H:102
int qv
Definition: ERF_DataStruct.H:100
int qc
Definition: ERF_DataStruct.H:101
int qg
Definition: ERF_DataStruct.H:105