55 const Real fixed_dz = geom.CellSize(2);
56 const int nz = geom.Domain().length(2);
63 const bool ice =
m_ice;
68 for (MFIter mfi(*cons_in,
TileNoZ()); mfi.isValid(); ++mfi)
70 Box box = mfi.validbox();
73 const Array4<const Real>& cons_arr = cons_in->const_array(mfi);
74 const Array4<const Real>& z_nd_arr = (z_phys) ? z_phys->const_array(mfi) : Array4<const Real>{};
75 const Array4<Real>& deltaq_arr =
deltaq.array(mfi);
76 const Array4<Real>& flux_arr =
flux.array(mfi);
77 const Array4<Real>& radlwdn_arr =
radlwdn->array(mfi);
78 const Array4<Real>& radqrlw_arr =
radqrlw->array(mfi);
79 const Array4<Real>& qheating_arr = qheating_rates->array(mfi);
81 const Array4<Real>& radfluxes_arr = rad_fluxes->array(mfi);
83 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
89 for (
int k = 0; k < nz; k++)
92 Real qv = (have_qv) ? cons_arr(i, j, k, qv_comp) /
rho :
zero;
93 Real qc = (have_qc) ? cons_arr(i, j, k, qc_comp) /
rho :
zero;
96 Real dz = (z_nd_arr) ?
Real(0.25) * ( (z_nd_arr(i ,j ,k+1) - z_nd_arr(i ,j ,k))
97 + (z_nd_arr(i+1,j ,k+1) - z_nd_arr(i+1,j ,k))
98 + (z_nd_arr(i ,j+1,k+1) - z_nd_arr(i ,j+1,k))
99 + (z_nd_arr(i+1,j+1,k+1) - z_nd_arr(i+1,j+1,k)) ) : fixed_dz;
104 deltaq_arr(i, j, k) = xk *
rho * (
qc +
qi) *
dz;
110 itop = max(itop, k+1);
114 qzinf = qzinf + deltaq_arr(i, j, k);
121 for (
int k = 0; k <= itop; k++)
123 flux_arr(i, j, k) = coef*exp(-qzinf) + coef1*exp(-qzeroz);
124 qzinf = qzinf - deltaq_arr(i, j, k);
125 qzeroz = qzeroz + deltaq_arr(i, j, k);
131 Real z_itop = (z_nd_arr) ? z_nd_arr(i, j, itop) : itop * fixed_dz;
132 for (
int k = itop + 1; k < nz; k++) {
134 Real zi = (z_nd_arr) ? z_nd_arr(i, j, k) : k * fixed_dz;
135 flux_arr(i, j, k) = coef * exp(-qzinf) + coef1 * exp(-qzeroz)
136 + cp_spec * rho_nd * f0 * (0.25 *
zi + 0.75 * z_itop)
137 * pow(
zi - z_itop, 1.0 / 3.0);
138 qzinf = qzinf - deltaq_arr(i, j, k);
139 qzeroz = qzeroz + deltaq_arr(i, j, k);
142 Real zi = (z_nd_arr) ? z_nd_arr(i, j, nz) : nz * fixed_dz;
143 flux_arr(i, j, nz) = coef * exp(-qzinf) + coef1 * exp(-qzeroz)
144 + cp_spec * rho_nd * f0 * (0.25 *
zi + 0.75 * z_itop)
145 * pow(
zi - z_itop, 1.0 / 3.0);
154 for (
int k = 0; k < nz; k++)
156 Real dz = (z_nd_arr) ? 0.25 * ( (z_nd_arr(i ,j ,k+1) - z_nd_arr(i ,j ,k))
157 + (z_nd_arr(i+1,j ,k+1) - z_nd_arr(i+1,j ,k))
158 + (z_nd_arr(i ,j+1,k+1) - z_nd_arr(i ,j+1,k))
159 + (z_nd_arr(i+1,j+1,k+1) - z_nd_arr(i+1,j+1,k)) ) : fixed_dz;
162 Real FTHRL = -(flux_arr(i, j, k+1) - flux_arr(i, j, k)) / cpmassl;
164 Real pres =
getPgivenRTh(cons_arr(i,j,k,
RhoTheta_comp),cons_arr(i,j,k,
RhoQ1_comp)/cons_arr(i,j,k,
Rho_comp));
167 qheating_arr(i, j, k, 1) = FTHRL;
168 radlwdn_arr(i, j, k) = flux_arr(i, j, k);
169 radqrlw_arr(i, j, k) = FTHRL;
172 radfluxes_arr(i, j, k, 3) = flux_arr(i, j, k);
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:48
constexpr amrex::Real R_d
Definition: ERF_Constants.H:46
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:42
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:43
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:48
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:28
@ rho
Definition: ERF_Kessler.H:25
@ qv
Definition: ERF_Kessler.H:31
@ qc
Definition: ERF_SatAdj.H:42
@ qi
Definition: ERF_WDM6.H:28
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
@ zi
Definition: ERF_AdvanceWDM6.cpp:276