52 const Real fixed_dz = geom.CellSize(2);
53 const int nz = geom.Domain().length(2);
60 const bool ice =
m_ice;
65 for (MFIter mfi(*cons_in,
TileNoZ()); mfi.isValid(); ++mfi)
67 Box box = mfi.validbox();
70 const Array4<const Real>& cons_arr = cons_in->const_array(mfi);
71 const Array4<const Real>& z_nd_arr = (z_phys) ? z_phys->const_array(mfi) : Array4<const Real>{};
72 const Array4<Real>& deltaq_arr =
deltaq.array(mfi);
73 const Array4<Real>& flux_arr =
flux.array(mfi);
74 const Array4<Real>& radlwdn_arr =
radlwdn->array(mfi);
75 const Array4<Real>& radqrlw_arr =
radqrlw->array(mfi);
76 const Array4<Real>& qheating_arr = qheating_rates->array(mfi);
78 const Array4<Real>& radfluxes_arr = rad_fluxes->array(mfi);
80 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
86 for (
int k = 0; k < nz; k++)
89 Real qv = (have_qv) ? cons_arr(i, j, k, qv_comp) /
rho :
zero;
90 Real qc = (have_qc) ? cons_arr(i, j, k, qc_comp) /
rho :
zero;
93 Real dz = (z_nd_arr) ?
Real(0.25) * ( (z_nd_arr(i ,j ,k+1) - z_nd_arr(i ,j ,k))
94 + (z_nd_arr(i+1,j ,k+1) - z_nd_arr(i+1,j ,k))
95 + (z_nd_arr(i ,j+1,k+1) - z_nd_arr(i ,j+1,k))
96 + (z_nd_arr(i+1,j+1,k+1) - z_nd_arr(i+1,j+1,k)) ) : fixed_dz;
101 deltaq_arr(i, j, k) = xk *
rho * (
qc +
qi) *
dz;
107 itop = max(itop, k+1);
111 qzinf = qzinf + deltaq_arr(i, j, k);
118 for (
int k = 0; k <= itop; k++)
120 flux_arr(i, j, k) = coef*exp(-qzinf) + coef1*exp(-qzeroz);
121 qzinf = qzinf - deltaq_arr(i, j, k);
122 qzeroz = qzeroz + deltaq_arr(i, j, k);
128 Real z_itop = (z_nd_arr) ? z_nd_arr(i, j, itop) : itop * fixed_dz;
129 for (
int k = itop + 1; k < nz; k++) {
131 Real zi = (z_nd_arr) ? z_nd_arr(i, j, k) : k * fixed_dz;
132 flux_arr(i, j, k) = coef * exp(-qzinf) + coef1 * exp(-qzeroz)
133 + cp_spec * rho_nd * f0 * (0.25 *
zi + 0.75 * z_itop)
134 * pow(
zi - z_itop, 1.0 / 3.0);
135 qzinf = qzinf - deltaq_arr(i, j, k);
136 qzeroz = qzeroz + deltaq_arr(i, j, k);
139 Real zi = (z_nd_arr) ? z_nd_arr(i, j, nz) : nz * fixed_dz;
140 flux_arr(i, j, nz) = coef * exp(-qzinf) + coef1 * exp(-qzeroz)
141 + cp_spec * rho_nd * f0 * (0.25 *
zi + 0.75 * z_itop)
142 * pow(
zi - z_itop, 1.0 / 3.0);
151 for (
int k = 0; k < nz; k++)
153 Real dz = (z_nd_arr) ? 0.25 * ( (z_nd_arr(i ,j ,k+1) - z_nd_arr(i ,j ,k))
154 + (z_nd_arr(i+1,j ,k+1) - z_nd_arr(i+1,j ,k))
155 + (z_nd_arr(i ,j+1,k+1) - z_nd_arr(i ,j+1,k))
156 + (z_nd_arr(i+1,j+1,k+1) - z_nd_arr(i+1,j+1,k)) ) : fixed_dz;
159 Real FTHRL = -(flux_arr(i, j, k+1) - flux_arr(i, j, k)) / cpmassl;
161 Real pres =
getPgivenRTh(cons_arr(i,j,k,
RhoTheta_comp),cons_arr(i,j,k,
RhoQ1_comp)/cons_arr(i,j,k,
Rho_comp));
164 qheating_arr(i, j, k, 1) = FTHRL;
165 radlwdn_arr(i, j, k) = flux_arr(i, j, k);
166 radqrlw_arr(i, j, k) = FTHRL;
169 radfluxes_arr(i, j, k, 3) = flux_arr(i, j, k);
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:49
constexpr amrex::Real R_d
Definition: ERF_Constants.H:47
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getExnergivenP(const amrex::Real P, const amrex::Real rdOcp)
Definition: ERF_EOS.H:141
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getPgivenRTh(const amrex::Real rhotheta, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:81
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
@ pres
Definition: ERF_Kessler.H:27
@ rho
Definition: ERF_Kessler.H:24
@ qv
Definition: ERF_Kessler.H:30
@ qc
Definition: ERF_SatAdj.H:41
@ qi
Definition: ERF_WDM6.H:27
@ dz
Definition: ERF_AdvanceWDM6.cpp:270
@ zi
Definition: ERF_AdvanceWDM6.cpp:274