50 auto domain =
m_geom.Domain();
51 int k_lo = domain.smallEnd(2);
52 int k_hi = domain.bigEnd(2);
64 auto ba =
tabs->boxArray();
65 auto dm =
tabs->DistributionMap();
66 auto ngrow =
tabs->nGrowVect();
69 fz.define(convert(ba, IntVect(0,0,1)), dm, 3, ngrow);
72 for (MFIter mfi(fz, TilingIfNotGPU()); mfi.isValid(); ++mfi) {
73 auto qpr_array =
qpr->const_array(mfi);
74 auto qps_array =
qps->const_array(mfi);
75 auto qpg_array =
qpg->const_array(mfi);
76 auto rho_array =
rho->const_array(mfi);
77 auto tabs_array =
tabs->const_array(mfi);
78 auto fz_array = fz.array(mfi);
80 const auto& box3d = mfi.tilebox();
82 ParallelFor(box3d, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
86 qpr_array, qps_array, qpg_array,
96 fz_array(i,j,k,0) = corrected_fluxes.
rain;
97 fz_array(i,j,k,1) = corrected_fluxes.
snow;
98 fz_array(i,j,k,2) = corrected_fluxes.
graupel;
104 Real max_reduced_flux;
106 auto const& ma_fz_arr = fz.const_arrays();
107 GpuTuple<Real> max = ParReduce(TypeList<ReduceOpMax>{},
110 [=] AMREX_GPU_DEVICE (
int box_no,
int i,
int j,
int k) noexcept
113 return { ma_fz_arr[box_no](i,j,k,0)
114 + ma_fz_arr[box_no](i,j,k,1)
115 + ma_fz_arr[box_no](i,j,k,2) };
117 max_reduced_flux = get<0>(max);
121 ParallelDescriptor::ReduceRealMax(max_reduced_flux);
124 "SAM::PrecipFall: the minimum cell height was never set (Set_dzmin), so the fall substeps cannot be sized");
127 coef /=
Real(n_substep);
128 dtn /=
Real(n_substep);
131 for (
int nsub(0); nsub<n_substep; ++nsub)
139 for (MFIter mfi(*
qp,
TileNoZ()); mfi.isValid(); ++mfi) {
140 auto qpr_array =
qpr->array(mfi);
141 auto qps_array =
qps->array(mfi);
142 auto qpg_array =
qpg->array(mfi);
143 auto qp_array =
qp->array(mfi);
144 auto rho_array =
rho->const_array(mfi);
145 auto tabs_array =
tabs->const_array(mfi);
146 auto fz_array = fz.array(mfi);
148 auto rain_accum_array =
rain_accum->array(mfi);
149 auto snow_accum_array =
snow_accum->array(mfi);
152 const auto dJ_array = (
m_detJ_cc) ?
m_detJ_cc->const_array(mfi) : Array4<const Real>{};
154 const auto& tbx = mfi.tilebox();
155 const auto& tbz = mfi.tilebox(IntVect(0,0,1),IntVect(0));
158 ParallelFor(tbz, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
162 qpr_array, qps_array, qpg_array,
163 i, j, k, k_lo, k_hi);
166 vrain, vsnow, vgrau);
172 const Real detJ_donor = (dJ_array) ? dJ_array(i,j,donor_k) :
one;
181 rho_array(i,j,donor_k),
182 qpr_array(i,j,donor_k),
186 rho_array(i,j,donor_k),
187 qps_array(i,j,donor_k),
191 rho_array(i,j,donor_k),
192 qpg_array(i,j,donor_k),
199 {fz_array(i,j,k,0), fz_array(i,j,k,1), fz_array(i,j,k,2)},
201 rain_accum_array(i,j,k) = rain_accum_array(i,j,k) + surface_accum.
rain;
202 snow_accum_array(i,j,k) = snow_accum_array(i,j,k) + surface_accum.
snow;
203 graup_accum_array(i,j,k) = graup_accum_array(i,j,k) + surface_accum.
graupel;
208 ParallelFor(tbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept
211 Real dJinv = (dJ_array) ?
one/dJ_array(i,j,k) :
one;
217 rho_array(i,j,k), dJinv, coef);
219 rho_array(i,j,k), dJinv, coef);
221 rho_array(i,j,k), dJinv, coef);
223 qpr_array(i,j,k) = std::max(
Real(0.0), qpr_array(i,j,k) + dqpr);
224 qps_array(i,j,k) = std::max(
Real(0.0), qps_array(i,j,k) + dqps);
225 qpg_array(i,j,k) = std::max(
Real(0.0), qpg_array(i,j,k) + dqpg);
226 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:39
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:1046
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:1116
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real sam_limit_precip_component_flux(const amrex::Real &raw_flux, const amrex::Real &rho_donor, const amrex::Real &q_donor, const amrex::Real &detJ_donor, const amrex::Real &coef) noexcept
Definition: ERF_SAMUtils.H:1088
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:965
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int sam_precip_face_donor_k(const int &face_k, const int &k_lo, const int &k_hi) noexcept
Definition: ERF_SAMUtils.H:902
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:1073
@ qp
Definition: ERF_Kessler.H:34
@ rain_accum
Definition: ERF_Kessler.H:36
@ qpg
Definition: ERF_Morrison.H:43
@ qps
Definition: ERF_Morrison.H:42
@ graup_accum
Definition: ERF_Morrison.H:54
@ qpr
Definition: ERF_Morrison.H:41
@ snow_accum
Definition: ERF_Morrison.H:53
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