50 auto domain =
m_geom.Domain();
51 int k_lo = domain.smallEnd(2);
52 int k_hi = domain.bigEnd(2);
65 auto ba =
tabs->boxArray();
66 auto dm =
tabs->DistributionMap();
67 auto ngrow =
tabs->nGrowVect();
70 fz.define(convert(ba, IntVect(0,0,1)), dm, 3, ngrow);
84 for (MFIter mfi(fz, TilingIfNotGPU()); mfi.isValid(); ++mfi) {
85 auto qpr_array =
qpr->const_array(mfi);
86 auto qps_array =
qps->const_array(mfi);
87 auto qpg_array =
qpg->const_array(mfi);
88 auto rho_array =
rho->const_array(mfi);
89 auto tabs_array =
tabs->const_array(mfi);
90 auto fz_array = fz.array(mfi);
92 const auto& box3d = mfi.tilebox();
94 ParallelFor(box3d, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
98 qpr_array, qps_array, qpg_array,
102 vrain, vsnow, vgrau);
108 fz_array(i,j,k,0) = corrected_fluxes.
rain;
109 fz_array(i,j,k,1) = corrected_fluxes.
snow;
110 fz_array(i,j,k,2) = corrected_fluxes.
graupel;
116 Real max_reduced_flux;
118 auto const& ma_fz_arr = fz.const_arrays();
119 GpuTuple<Real> max = ParReduce(TypeList<ReduceOpMax>{},
122 [=] AMREX_GPU_DEVICE (
int box_no,
int i,
int j,
int k) noexcept
125 return { ma_fz_arr[box_no](i,j,k,0)
126 + ma_fz_arr[box_no](i,j,k,1)
127 + ma_fz_arr[box_no](i,j,k,2) };
129 max_reduced_flux = get<0>(max);
133 ParallelDescriptor::ReduceRealMax(max_reduced_flux);
136 "SAM::PrecipFall: the minimum cell height was never set (Set_dzmin), so the fall substeps cannot be sized");
139 coef /=
Real(n_substep);
140 dtn /=
Real(n_substep);
143 for (
int nsub(0); nsub<n_substep; ++nsub)
151 for (MFIter mfi(*
qp,
TileNoZ()); mfi.isValid(); ++mfi) {
152 auto qpr_array =
qpr->array(mfi);
153 auto qps_array =
qps->array(mfi);
154 auto qpg_array =
qpg->array(mfi);
155 auto qp_array =
qp->array(mfi);
156 auto rho_array =
rho->const_array(mfi);
157 auto tabs_array =
tabs->const_array(mfi);
158 auto fz_array = fz.array(mfi);
160 auto rain_accum_array =
rain_accum->array(mfi);
161 auto snow_accum_array =
snow_accum->array(mfi);
166 : Array4<const Real>{};
170 const auto dJ_array = (
m_detJ_cc) ?
m_detJ_cc->const_array(mfi) : Array4<const Real>{};
172 const auto& tbx = mfi.tilebox();
173 const auto& tbz = mfi.tilebox(IntVect(0,0,1),IntVect(0));
176 ParallelFor(tbz, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
180 qpr_array, qps_array, qpg_array,
181 i, j, k, k_lo, k_hi);
184 vrain, vsnow, vgrau);
190 const Real detJ_donor = (dJ_array) ? dJ_array(i,j,donor_k) :
one;
199 rho_array(i,j,donor_k),
200 qpr_array(i,j,donor_k),
204 rho_array(i,j,donor_k),
205 qps_array(i,j,donor_k),
209 rho_array(i,j,donor_k),
210 qpg_array(i,j,donor_k),
216 if (inflow_array && inflow_array(i,j,k,inflow_flag) >
Real(0.5)) {
217 fz_array(i,j,k,0) = inflow_array(i,j,k,0) * inv_dt;
218 fz_array(i,j,k,1) = inflow_array(i,j,k,1) * inv_dt;
219 fz_array(i,j,k,2) = inflow_array(i,j,k,2) * inv_dt;
222 sed_array(i,j,k,0) += fz_array(i,j,k,0) * dtn;
223 sed_array(i,j,k,1) += fz_array(i,j,k,1) * dtn;
224 sed_array(i,j,k,2) += fz_array(i,j,k,2) * dtn;
229 {fz_array(i,j,k,0), fz_array(i,j,k,1), fz_array(i,j,k,2)},
231 rain_accum_array(i,j,k) = rain_accum_array(i,j,k) + surface_accum.
rain;
232 snow_accum_array(i,j,k) = snow_accum_array(i,j,k) + surface_accum.
snow;
233 graupel_accum_array(i,j,k) = graupel_accum_array(i,j,k) + surface_accum.
graupel;
235 precip_accum_array(i,j,k) += (fz_array(i,j,k,0) + fz_array(i,j,k,1) + fz_array(i,j,k,2))
241 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
244 Real dJinv = (dJ_array) ?
one/dJ_array(i,j,k) :
one;
250 rho_array(i,j,k), dJinv, coef);
252 rho_array(i,j,k), dJinv, coef);
254 rho_array(i,j,k), dJinv, coef);
256 qpr_array(i,j,k) = std::max(
Real(0.0), qpr_array(i,j,k) + dqpr);
257 qps_array(i,j,k) = std::max(
Real(0.0), qps_array(i,j,k) + dqps);
258 qpg_array(i,j,k) = std::max(
Real(0.0), qpg_array(i,j,k) + dqpg);
259 qp_array(i,j,k) = qpr_array(i,j,k) + qps_array(i,j,k) + qpg_array(i,j,k);
Real rho_0
Definition: ERF_InitCustomPert_ABL.H:18
constexpr amrex::Real csnow
Definition: ERF_MicrophysicsConstants.H:70
constexpr amrex::Real nzerog
Definition: ERF_MicrophysicsConstants.H:95
constexpr amrex::Real cgrau
Definition: ERF_MicrophysicsConstants.H:71
constexpr amrex::Real a_grau
Definition: ERF_MicrophysicsConstants.H:66
constexpr amrex::Real nzeror
Definition: ERF_MicrophysicsConstants.H:93
constexpr amrex::Real a_rain
Definition: ERF_MicrophysicsConstants.H:62
constexpr amrex::Real nzeros
Definition: ERF_MicrophysicsConstants.H:94
constexpr amrex::Real a_snow
Definition: ERF_MicrophysicsConstants.H:64
constexpr amrex::Real crain
Definition: ERF_MicrophysicsConstants.H:69
constexpr amrex::Real PI
Definition: ERF_NumericalConstants.H:46
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SAMPrecipFluxComponents sam_precip_component_fluxes_from_face_state(const SAMPrecipComponentFaceState &face_state, const amrex::Real &vrain, const amrex::Real &vsnow, const amrex::Real &vgrau) noexcept
Definition: ERF_SAMUtils.H:1056
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SAMSurfaceAccumulation sam_surface_accumulation_from_component_fluxes(const SAMPrecipFluxComponents &component_fluxes, const amrex::Real &dtn) noexcept
Definition: ERF_SAMUtils.H:1126
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SAMPrecipComponentFaceState sam_precip_component_face_state(const amrex::Array4< const amrex::Real > &rho_array, const amrex::Array4< const amrex::Real > &tabs_array, const amrex::Array4< const amrex::Real > &qpr_array, const amrex::Array4< const amrex::Real > &qps_array, const amrex::Array4< const amrex::Real > &qpg_array, const int &i, const int &j, const int &k, const int &k_lo, const int &k_hi) noexcept
Definition: ERF_SAMUtils.H:973
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SAMPrecipFluxComponents sam_precip_flux_components_density_corrected(const SAMPrecipFluxComponents &precip_fluxes, const amrex::Real &rho_0, const amrex::Real &rho_avg) noexcept
Definition: ERF_SAMUtils.H:1083
@ qp
Definition: ERF_Kessler.H:34
@ rain_accum
Definition: ERF_Kessler.H:36
@ graupel_accum
Definition: ERF_Morrison.H:55
@ qpg
Definition: ERF_Morrison.H:44
@ qps
Definition: ERF_Morrison.H:43
@ qpr
Definition: ERF_Morrison.H:42
@ snow_accum
Definition: ERF_Morrison.H:54
Definition: ERF_SAMUtils.H:125
amrex::Real rho_avg
Definition: ERF_SAMUtils.H:126
Definition: ERF_SAMUtils.H:146
amrex::Real snow
Definition: ERF_SAMUtils.H:148
amrex::Real rain
Definition: ERF_SAMUtils.H:147
amrex::Real graupel
Definition: ERF_SAMUtils.H:149
Definition: ERF_SAMUtils.H:140
amrex::Real rain
Definition: ERF_SAMUtils.H:141
amrex::Real snow
Definition: ERF_SAMUtils.H:142
amrex::Real graupel
Definition: ERF_SAMUtils.H:143