707 #ifdef ERF_USE_WDM6_FORT
708 static int call_count = 0;
710 [[maybe_unused]]
const bool first_call = (call_count == 1);
713 static bool wdm6_inited =
false;
715 constexpr
double den0 = 1.28;
716 constexpr
double denr =
static_cast<double>(
rhoh2o);
717 constexpr
double dens =
static_cast<double>(
rhos);
718 constexpr
double cl =
static_cast<double>(
Cp_l);
719 constexpr
double cpv =
static_cast<double>(
Cp_v);
720 const double ccn0 =
static_cast<double>(
m_ccn0);
730 amrex::Print() <<
"WDM6 Fortran bridge initialized\n";
735 int microphysics_debug = 0;
736 std::vector<int> micro_diag_target_column;
738 amrex::ParmParse
pp(
"erf");
739 pp.queryAdd(
"microphysics_debug", microphysics_debug);
740 pp.queryarr(
"micro_diag_target_column", micro_diag_target_column);
742 microphysics_debug = std::max(0, std::min(2, microphysics_debug));
743 #ifdef ERF_USE_WDM6_FORT
744 bool use_wdm6_cpp_answer =
false;
746 amrex::ParmParse
pp(
"erf");
747 pp.queryAdd(
"use_wdm6_cpp_answer", use_wdm6_cpp_answer);
749 const bool run_wdm6_fort = !use_wdm6_cpp_answer;
754 "WDM6: the Fortran bridge (erf.use_wdm6_cpp_answer = false) requires every box to span "
755 "the domain in z (no grids split in z, and no refined levels short of the domain top or bottom)");
759 [[maybe_unused]] constexpr
double g =
static_cast<double>(
CONST_GRAV);
760 constexpr
double cpd =
static_cast<double>(
Cp_d);
761 constexpr
double cpv =
static_cast<double>(
Cp_v);
762 [[maybe_unused]] constexpr
double rd =
static_cast<double>(
R_d);
763 constexpr
double rv =
static_cast<double>(
R_v);
764 constexpr
double t0c = 273.15;
765 [[maybe_unused]] constexpr
double ep1 =
static_cast<double>(
R_v /
R_d -
one);
766 constexpr
double ep2 =
static_cast<double>(
R_d /
R_v);
767 constexpr
double qmin = 1.0e-12;
768 constexpr
double xls =
static_cast<double>(
lsub);
769 constexpr
double xlv0 =
static_cast<double>(
lat_vap);
770 constexpr
double xlf0 =
static_cast<double>(
lat_ice);
771 constexpr
double den0 = 1.28;
772 constexpr
double denr =
static_cast<double>(
rhoh2o);
773 constexpr
double dens =
static_cast<double>(
rhos);
774 constexpr
double cliq =
static_cast<double>(
Cp_l);
775 constexpr
double cice = 2106.0;
776 constexpr
double psat = 610.78;
779 amrex::ignore_unused(
g, rd, ep1);
780 [[maybe_unused]]
const double ccn0 =
static_cast<double>(
m_ccn0);
783 const Box box = mfi.tilebox();
784 const Box fab_box = mfi.fabbox();
803 auto const& sed_arr =
m_sed.
down->array(mfi);
805 const int ilo = box.smallEnd(0);
806 const int ihi = box.bigEnd(0);
807 const int jlo = box.smallEnd(1);
808 const int jhi = box.bigEnd(1);
809 const int klo = box.smallEnd(2);
810 const int khi = box.bigEnd(2);
812 [[maybe_unused]]
const int imlo = fab_box.smallEnd(0);
813 [[maybe_unused]]
const int imhi = fab_box.bigEnd(0);
814 [[maybe_unused]]
const int jmlo = fab_box.smallEnd(1);
815 [[maybe_unused]]
const int jmhi = fab_box.bigEnd(1);
816 [[maybe_unused]]
const int kmlo = fab_box.smallEnd(2);
817 [[maybe_unused]]
const int kmhi = fab_box.bigEnd(2);
818 const bool has_target_override = (micro_diag_target_column.size() == 2);
819 const int diag_i = has_target_override ? micro_diag_target_column[0] : ilo;
820 const int diag_j = has_target_override ? micro_diag_target_column[1] : jlo;
824 #if defined(ERF_USE_WDM6_FORT) && defined(AMREX_USE_GPU)
825 Arena*
Arena_Used = run_wdm6_fort ? The_Pinned_Arena() : The_Async_Arena();
830 #ifdef ERF_USE_WDM6_FORT
842 auto const& delz_arr = delz_fab.array();
843 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
844 delz_arr(i,j,k) = dz_val;
848 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
849 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
850 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
851 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
852 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
864 box2d.makeSlab(2,
klo);
865 Box fab_box2d(fab_box);
866 fab_box2d.makeSlab(2,
klo);
878 FArrayBox xland_fab(fab_box2d, 1,
Arena_Used);
879 auto const& xland_arr = xland_fab.array();
881 auto const& lmask_arr =
m_lmask->const_array(mfi);
882 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
883 xland_arr(i,j,k) = (lmask_arr(i,j,0) == 0) ?
Real(2.0) :
Real(1.0);
887 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
888 xland_arr(i,j,k) =
Real(1.0);
896 FArrayBox rainacc_fab(fab_box2d, 1,
Arena_Used);
897 FArrayBox rainncv_fab(fab_box2d, 1,
Arena_Used);
899 FArrayBox snowacc_fab(fab_box2d, 1,
Arena_Used);
900 FArrayBox snowncv_fab(fab_box2d, 1,
Arena_Used);
901 FArrayBox graupacc_fab(fab_box2d, 1,
Arena_Used);
902 FArrayBox graupelncv_fab(fab_box2d, 1,
Arena_Used);
903 FArrayBox rainonly_fab(fab_box2d, 1,
Arena_Used);
904 FArrayBox snowonly_fab(fab_box2d, 1,
Arena_Used);
906 auto const& rainacc_arr = rainacc_fab.array();
907 auto const& rainncv_arr = rainncv_fab.array();
908 auto const& sr_arr = sr_fab.array();
909 auto const& snowacc_arr = snowacc_fab.array();
910 auto const& snowncv_arr = snowncv_fab.array();
911 auto const& graupacc_arr = graupacc_fab.array();
912 auto const& graupelncv_arr = graupelncv_fab.array();
913 auto const& rainonly_arr = rainonly_fab.array();
914 auto const& snowonly_arr = snowonly_fab.array();
918 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
919 rainacc_arr(i,j,k) =
Real(0.0);
920 rainncv_arr(i,j,k) =
Real(0.0);
921 sr_arr(i,j,k) =
Real(0.0);
922 snowacc_arr(i,j,k) =
Real(0.0);
923 snowncv_arr(i,j,k) =
Real(0.0);
924 graupacc_arr(i,j,k) =
Real(0.0);
925 graupelncv_arr(i,j,k) =
Real(0.0);
926 rainonly_arr(i,j,k) =
Real(0.0);
927 snowonly_arr(i,j,k) =
Real(0.0);
937 Gpu::streamSynchronize();
942 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
943 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
944 nn_arr.dataPtr(), nc_arr.dataPtr(), nr_arr.dataPtr(),
945 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
946 static_cast<double>(dt_advance),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
948 ccn0, xland_arr.dataPtr(),
949 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
950 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
951 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
952 rainonly_arr.dataPtr(), snowonly_arr.dataPtr(),
953 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
954 ilo, ihi, jlo, jhi,
klo,
khi,
955 microphysics_debug, diag_i, diag_j);
964 const bool use_anelastic_reference_pressure =
966 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
971 t_arr(i,j,k), p_arr(i,j,k), configured_rdOcp,
972 use_anelastic_reference_pressure);
980 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
981 rain_arr(i,j,k) += rainonly_arr(i,j,k);
982 snow_arr(i,j,k) += snowonly_arr(i,j,k);
983 graupel_arr(i,j,k) += graupacc_arr(i,j,k);
984 precip_arr(i,j,k) += rainacc_arr(i,j,k);
1002 FArrayBox rslopec_fab(fab_box,1,
Arena_Used);
1003 FArrayBox rslopec2_fab(fab_box,1,
Arena_Used);
1004 FArrayBox rslopec3_fab(fab_box,1,
Arena_Used);
1006 FArrayBox rslopeb_fab(fab_box,3,
Arena_Used);
1007 FArrayBox rslope2_fab(fab_box,3,
Arena_Used);
1008 FArrayBox rslope3_fab(fab_box,3,
Arena_Used);
1018 Box box2d(IntVect(ilo,jlo,
klo), IntVect(ihi,jhi,
klo));
1030 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1076 FArrayBox act_ratio_fab(fab_box,1,
Arena_Used);
1077 FArrayBox act_fraction_fab(fab_box,1,
Arena_Used);
1078 FArrayBox act_raw_fab(fab_box,1,
Arena_Used);
1079 FArrayBox act_cap_fab(fab_box,1,
Arena_Used);
1084 FArrayBox qrs_tmp_fab(fab_box,3,
Arena_Used);
1085 FArrayBox ncr_tmp_fab(fab_box,1,
Arena_Used);
1100 auto const& delz_arr = delz_fab.array();
1101 auto const& denfac_arr = denfac_fab.array();
1102 auto const& xni_arr = xni_fab.array();
1103 auto const& rslopec_arr = rslopec_fab.array();
1104 auto const& rslopec2_arr = rslopec2_fab.array();
1105 auto const& rslopec3_arr = rslopec3_fab.array();
1106 auto const& rslope_arr = rslope_fab.array();
1107 auto const& rslopeb_arr = rslopeb_fab.array();
1108 auto const& rslope2_arr = rslope2_fab.array();
1109 auto const& rslope3_arr = rslope3_fab.array();
1110 auto const& work1_arr = work1_fab.array();
1111 auto const& workn_arr = workn_fab.array();
1112 auto const& work2_arr = work2_fab.array();
1113 auto const& mstep_arr = mstep_fab.array();
1114 auto const& numdt_arr = numdt_fab.array();
1115 auto const& sr_arr = sr_fab.array();
1116 auto const& cpm_arr = cpm_fab.array();
1117 auto const& xl_arr = xl_fab.array();
1118 auto const& qsatw_arr = qsatw_fab.array();
1119 auto const& qsati_arr = qsati_fab.array();
1120 auto const& rhw_arr = rhw_fab.array();
1121 auto const& rhi_arr = rhi_fab.array();
1122 auto const& qcr_arr = qcr_fab.array();
1123 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1124 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1125 auto const& praut_arr = praut_fab.array();
1126 auto const& pracw_arr = pracw_fab.array();
1127 auto const& prevp_arr = prevp_fab.array();
1128 auto const& pidep_arr = pidep_fab.array();
1129 auto const& psdep_arr = psdep_fab.array();
1130 auto const& pgdep_arr = pgdep_fab.array();
1131 auto const& pigen_arr = pigen_fab.array();
1132 auto const& psaut_arr = psaut_fab.array();
1133 auto const& pgaut_arr = pgaut_fab.array();
1134 auto const& pcact_arr = pcact_fab.array();
1135 auto const& pcond_arr = pcond_fab.array();
1136 auto const& praci_arr = praci_fab.array();
1137 auto const& piacr_arr = piacr_fab.array();
1138 auto const& niacr_arr = niacr_fab.array();
1139 auto const& psaci_arr = psaci_fab.array();
1140 auto const& pgaci_arr = pgaci_fab.array();
1141 auto const& psacw_arr = psacw_fab.array();
1142 auto const& nsacw_arr = nsacw_fab.array();
1143 auto const& pgacw_arr = pgacw_fab.array();
1144 auto const& ngacw_arr = ngacw_fab.array();
1145 auto const& paacw_arr = paacw_fab.array();
1146 auto const& naacw_arr = naacw_fab.array();
1147 auto const& pracs_arr = pracs_fab.array();
1148 auto const& psacr_arr = psacr_fab.array();
1149 auto const& nsacr_arr = nsacr_fab.array();
1150 auto const& pgacr_arr = pgacr_fab.array();
1151 auto const& ngacr_arr = ngacr_fab.array();
1152 auto const& pgacs_arr = pgacs_fab.array();
1153 auto const& pseml_arr = pseml_fab.array();
1154 auto const& nseml_arr = nseml_fab.array();
1155 auto const& pgeml_arr = pgeml_fab.array();
1156 auto const& ngeml_arr = ngeml_fab.array();
1157 auto const& psevp_arr = psevp_fab.array();
1158 auto const& pgevp_arr = pgevp_fab.array();
1159 auto const& ncauto_arr = ncauto_fab.array();
1160 auto const& ncaccr_arr = ncaccr_fab.array();
1161 auto const& nrauto_arr = nrauto_fab.array();
1162 auto const& nraccr_arr = nraccr_fab.array();
1163 auto const& nrevp_arr = nrevp_fab.array();
1164 auto const& ncact_arr = ncact_fab.array();
1165 auto const& act_ratio_arr = act_ratio_fab.array();
1166 auto const& act_fraction_arr = act_fraction_fab.array();
1167 auto const& act_raw_arr = act_raw_fab.array();
1168 auto const& act_cap_arr = act_cap_fab.array();
1169 auto const& nccol_arr = nccol_fab.array();
1170 auto const& nrcol_arr = nrcol_fab.array();
1171 auto const& qrs_tmp_arr = qrs_tmp_fab.array();
1172 auto const& ncr_tmp_arr = ncr_tmp_fab.array();
1173 auto const& avedia_arr = avedia_fab.array();
1176 auto const& work1c_arr = work1c_fab.array();
1177 auto const& fallc_arr = fallc_fab.array();
1178 auto const& fall_arr = fall_fab.array();
1179 auto const& delqi_arr = delqi_fab.array();
1182 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1183 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
1184 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
1185 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
1186 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
1187 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1188 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1189 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1190 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1191 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1194 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k),
Real(0.0));
1195 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k),
Real(0.0));
1205 nn_arr(i,j,k) = amrex::min(amrex::max(nn_arr(i,j,k),
wdm6_literal(1.0e8)),
1211 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1217 const int wdm6_loops = std::max(
1218 static_cast<int>(std::round(dt_advance /
Real(120.0))), 1);
1219 const Real dtcld = dt_advance /
static_cast<Real>(wdm6_loops);
1263 const int diag_k =
klo;
1273 auto const& lmask_arr =
m_lmask->const_array(mfi);
1274 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1275 qcr_arr(i,j,k) = (lmask_arr(i,j,0) == 0) ? qc0_loc : qc1_loc;
1279 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1280 qcr_arr(i,j,k) = qc1_loc;
1288 : Array4<const Real>{};
1289 const Real inflow_share =
Real(1) /
static_cast<Real>(wdm6_loops);
1291 for (
int loop = 0; loop < wdm6_loops; ++loop) {
1293 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1295 const Real fac = inflow_share / (den_arr(i,j,
khi) * delz_arr(i,j,
khi));
1302 sed_arr(i,j,
khi+1,n) += inflow_arr(i,j,
khi+1,n) * inflow_share;
1310 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1311 denfac_arr(i,j,k) = std::sqrt(
Real(den0) / den_arr(i,j,k));
1324 const Real xai = -dldti /
Real(rv);
1328 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1329 const Real tr = ttp / t_arr(i,j,k);
1332 Real qsw =
Real(
psat) * std::exp(std::log(tr) * xa) * std::exp(xb * (
Real(1.0) - tr));
1333 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
1334 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
1335 qsw = amrex::max(qsw,
Real(qmin));
1336 qsatw_arr(i,j,k) = qsw;
1337 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsw,
Real(qmin));
1340 Real qsi = (t_arr(i,j,k) < ttp)
1341 ?
Real(
psat) * std::exp(std::log(tr) * xai) * std::exp(xbi * (
Real(1.0) - tr))
1342 :
Real(
psat) * std::exp(std::log(tr) * xa) * std::exp(xb * (
Real(1.0) - tr));
1343 qsi = amrex::min(qsi,
wdm6_literal(0.99) * p_arr(i,j,k));
1344 qsi =
Real(ep2) * qsi / (p_arr(i,j,k) - qsi);
1345 qsi = amrex::max(qsi,
Real(qmin));
1346 qsati_arr(i,j,k) = qsi;
1347 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsi,
Real(qmin));
1356 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1357 praut_arr(i,j,k) =
Real(0.0);
1358 pracw_arr(i,j,k) =
Real(0.0);
1359 prevp_arr(i,j,k) =
Real(0.0);
1360 pidep_arr(i,j,k) =
Real(0.0);
1361 psdep_arr(i,j,k) =
Real(0.0);
1362 pgdep_arr(i,j,k) =
Real(0.0);
1363 pigen_arr(i,j,k) =
Real(0.0);
1364 psaut_arr(i,j,k) =
Real(0.0);
1365 pgaut_arr(i,j,k) =
Real(0.0);
1366 pcact_arr(i,j,k) =
Real(0.0);
1367 pcond_arr(i,j,k) =
Real(0.0);
1368 praci_arr(i,j,k) =
Real(0.0);
1369 piacr_arr(i,j,k) =
Real(0.0);
1370 niacr_arr(i,j,k) =
Real(0.0);
1371 psaci_arr(i,j,k) =
Real(0.0);
1372 pgaci_arr(i,j,k) =
Real(0.0);
1373 psacw_arr(i,j,k) =
Real(0.0);
1374 nsacw_arr(i,j,k) =
Real(0.0);
1375 pgacw_arr(i,j,k) =
Real(0.0);
1376 ngacw_arr(i,j,k) =
Real(0.0);
1377 paacw_arr(i,j,k) =
Real(0.0);
1378 naacw_arr(i,j,k) =
Real(0.0);
1379 pracs_arr(i,j,k) =
Real(0.0);
1380 psacr_arr(i,j,k) =
Real(0.0);
1381 nsacr_arr(i,j,k) =
Real(0.0);
1382 pgacr_arr(i,j,k) =
Real(0.0);
1383 ngacr_arr(i,j,k) =
Real(0.0);
1384 pgacs_arr(i,j,k) =
Real(0.0);
1385 pseml_arr(i,j,k) =
Real(0.0);
1386 nseml_arr(i,j,k) =
Real(0.0);
1387 pgeml_arr(i,j,k) =
Real(0.0);
1388 ngeml_arr(i,j,k) =
Real(0.0);
1389 psevp_arr(i,j,k) =
Real(0.0);
1390 pgevp_arr(i,j,k) =
Real(0.0);
1391 ncauto_arr(i,j,k) =
Real(0.0);
1392 ncaccr_arr(i,j,k) =
Real(0.0);
1393 nrauto_arr(i,j,k) =
Real(0.0);
1394 nraccr_arr(i,j,k) =
Real(0.0);
1395 nrevp_arr(i,j,k) =
Real(0.0);
1396 ncact_arr(i,j,k) =
Real(0.0);
1397 act_ratio_arr(i,j,k) =
Real(0.0);
1398 act_fraction_arr(i,j,k) =
Real(0.0);
1399 act_raw_arr(i,j,k) =
Real(0.0);
1400 act_cap_arr(i,j,k) =
Real(0.0);
1401 nccol_arr(i,j,k) =
Real(0.0);
1402 nrcol_arr(i,j,k) =
Real(0.0);
1412 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1413 if (qc_arr(i,j,k) <=
Real(qmin) || nc_arr(i,j,k) <=
Real(1.e1)) {
1414 rslopec_arr(i,j,k) = rslopecmax_loc;
1415 rslopec2_arr(i,j,k) = rslopec2max_loc;
1416 rslopec3_arr(i,j,k) = rslopec3max_loc;
1419 nc_arr(i,j,k), pidnc_loc);
1420 rslopec2_arr(i,j,k) = rslopec_arr(i,j,k) * rslopec_arr(i,j,k);
1421 rslopec3_arr(i,j,k) = rslopec2_arr(i,j,k) * rslopec_arr(i,j,k);
1431 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1432 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
1433 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
1434 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
1436 wdm6_slope_rain_cell(qr_arr(i,j,k), nr_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1438 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
1439 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1440 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1442 wdm6_slope_snow_cell(qs_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k), t_arr(i,j,k),
1445 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
1447 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
1451 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
1452 slope_bvtg_loc, pvtg_loc,
1453 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
1455 rslope_arr(i,j,k,0) = rain_rslope;
1456 rslope_arr(i,j,k,1) = snow_rslope;
1457 rslope_arr(i,j,k,2) = graup_rslope;
1458 rslopeb_arr(i,j,k,0) = rain_rslopeb;
1459 rslopeb_arr(i,j,k,1) = snow_rslopeb;
1460 rslopeb_arr(i,j,k,2) = graup_rslopeb;
1461 rslope2_arr(i,j,k,0) = rain_rslope2;
1462 rslope2_arr(i,j,k,1) = snow_rslope2;
1463 rslope2_arr(i,j,k,2) = graup_rslope2;
1464 rslope3_arr(i,j,k,0) = rain_rslope3;
1465 rslope3_arr(i,j,k,1) = snow_rslope3;
1466 rslope3_arr(i,j,k,2) = graup_rslope3;
1467 work1_arr(i,j,k,0) = rain_vt;
1468 work1_arr(i,j,k,1) = snow_vt;
1469 work1_arr(i,j,k,2) = graup_vt;
1470 workn_arr(i,j,k) = rain_vtn;
1477 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1478 mstep_arr(i,j,k) = 1;
1479 numdt_arr(i,j,k) = 1;
1480 sr_arr(i,j,k) =
Real(0.0);
1481 fall_arr(i,j,k,0) =
Real(0.0);
1482 fall_arr(i,j,k,1) =
Real(0.0);
1483 fall_arr(i,j,k,2) =
Real(0.0);
1485 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1488 for (
int kk =
khi; kk >=
klo; --kk) {
1489 work1_arr(i,j,kk,0) = work1_arr(i,j,kk,0) / delz_arr(i,j,kk);
1490 workn_arr(i,j,kk) = workn_arr(i,j,kk) / delz_arr(i,j,kk);
1491 numdt_loc = amrex::max(
static_cast<int>(amrex::max(work1_arr(i,j,kk,0),
1492 workn_arr(i,j,kk)) * dtcld +
Real(0.5)),
1494 if (numdt_loc >= mstep_loc) {
1495 mstep_loc = numdt_loc;
1498 mstep_arr(i,j,k) = mstep_loc;
1499 numdt_arr(i,j,k) = numdt_loc;
1501 ReduceOps<ReduceOpMax> reduce_op;
1502 ReduceData<int> reduce_data(reduce_op);
1503 reduce_op.eval(box2d, reduce_data,
1504 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) -> GpuTuple<int> {
1505 return {mstep_arr(i,j,k)};
1507 int mstepmax = amrex::get<0>(reduce_data.value());
1508 amrex::ignore_unused(mstepmax);
1515 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1516 amrex::ignore_unused(k);
1517 const int col_mstep = mstep_arr(i,j,
klo);
1522 [&](
int kk) {
return den_arr(i,j,kk) * qr_arr(i,j,kk) * delz_arr(i,j,kk); });
1524 [&](
int kk) {
return den_arr(i,j,kk) * nr_arr(i,j,kk) * delz_arr(i,j,kk); });
1526 for (
int n = 1; n <= mstepmax; ++n) {
1527 if (n > col_mstep) {
1531 const int kk_top =
khi;
1532 const Real top_flux_qr = den_arr(i,j,kk_top) * qr_arr(i,j,kk_top)
1533 * work1_arr(i,j,kk_top,0) /
static_cast<Real>(col_mstep);
1534 const Real top_flux_nr = nr_arr(i,j,kk_top)
1535 * workn_arr(i,j,kk_top) /
static_cast<Real>(col_mstep);
1537 if (kk_top ==
klo) { fall_arr(i,j,
klo,0) += top_flux_qr; }
1539 qr_arr(i,j,kk_top) = amrex::max(
1540 qr_arr(i,j,kk_top) - top_flux_qr * dtcld / den_arr(i,j,kk_top),
1542 nr_arr(i,j,kk_top) = amrex::max(
1543 nr_arr(i,j,kk_top) - top_flux_nr * dtcld,
1546 Real flux_qr_above = top_flux_qr;
1547 Real flux_nr_above = top_flux_nr;
1548 for (
int kk =
khi - 1; kk >=
klo; --kk) {
1549 const Real flux_qr = den_arr(i,j,kk) * qr_arr(i,j,kk)
1550 * work1_arr(i,j,kk,0) /
static_cast<Real>(col_mstep);
1551 const Real flux_nr = nr_arr(i,j,kk)
1552 * workn_arr(i,j,kk) /
static_cast<Real>(col_mstep);
1553 if (kk ==
klo) { fall_arr(i,j,
klo,0) += flux_qr; }
1555 const Real dqr_self = amrex::min(
1556 flux_qr * dtcld / den_arr(i,j,kk),
1558 const Real dqr_from_above = amrex::min(
1559 flux_qr_above * delz_arr(i,j,kk+1) / delz_arr(i,j,kk)
1560 * dtcld / den_arr(i,j,kk),
1562 const Real dnr_self = amrex::min(
1565 const Real dnr_from_above = amrex::min(
1566 flux_nr_above * delz_arr(i,j,kk+1) / delz_arr(i,j,kk)
1570 qr_arr(i,j,kk) = amrex::max(
1571 qr_arr(i,j,kk) - dqr_self + dqr_from_above,
1573 nr_arr(i,j,kk) = amrex::max(
1574 nr_arr(i,j,kk) - dnr_self + dnr_from_above,
1577 flux_qr_above = flux_qr;
1578 flux_nr_above = flux_nr;
1581 for (
int kk =
klo; kk <=
khi; ++kk) {
1582 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3;
1583 Real rain_vt, rain_vtn;
1585 qr_arr(i,j,kk), nr_arr(i,j,kk),
1586 den_arr(i,j,kk), denfac_arr(i,j,kk),
1588 rslopermax_loc, rsloperbmax_loc,
1589 rsloper2max_loc, rsloper3max_loc,
1590 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1591 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1593 rslope_arr(i,j,kk,0) = rain_rslope;
1594 rslopeb_arr(i,j,kk,0) = rain_rslopeb;
1595 rslope2_arr(i,j,kk,0) = rain_rslope2;
1596 rslope3_arr(i,j,kk,0) = rain_rslope3;
1597 work1_arr(i,j,kk,0) = rain_vt / delz_arr(i,j,kk);
1598 workn_arr(i,j,kk) = rain_vtn / delz_arr(i,j,kk);
1603 [&](
int kk) {
return den_arr(i,j,kk) * qr_arr(i,j,kk) * delz_arr(i,j,kk); });
1605 [&](
int kk) {
return den_arr(i,j,kk) * nr_arr(i,j,kk) * delz_arr(i,j,kk); });
1613 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1614 amrex::ignore_unused(k);
1615 const int km =
khi -
klo + 1;
1637 for (
int kk = 0; kk < km; ++kk) {
1638 const int k3 =
klo + kk;
1639 dz_col(kk) = delz_arr(i,j,k3);
1640 den_col(kk) = den_arr(i,j,k3);
1641 denfac_col(kk) = denfac_arr(i,j,k3);
1642 tk_col(kk) = t_arr(i,j,k3);
1643 rq_col(kk) = den_col(kk) * qs_arr(i,j,k3);
1644 rq2_col(kk) = den_col(kk) * qg_arr(i,j,k3);
1647 ? (work1_arr(i,j,k3,1) * qs_arr(i,j,k3) + work1_arr(i,j,k3,2) * qg_arr(i,j,k3)) /
qsum
1653 [&](
int kk) {
return den_arr(i,j,kk) * qs_arr(i,j,kk) * delz_arr(i,j,kk); });
1655 [&](
int kk) {
return den_arr(i,j,kk) * qg_arr(i,j,kk) * delz_arr(i,j,kk); });
1660 km, &delqrs2, &delqrs3, dtcld, 1,
1662 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
Real(
bvts), pvts_loc,
1663 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc, slope_bvtg_loc, pvtg_loc,
1664 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1666 for (
int kk = 0; kk < km; ++kk) {
1667 const int k3 =
klo + kk;
1668 qs_arr(i,j,k3) = amrex::max(
rq_col(kk) / den_col(kk),
Real(0.0));
1669 qg_arr(i,j,k3) = amrex::max(
rq2_col(kk) / den_col(kk),
Real(0.0));
1672 [&](
int kk) {
return den_arr(i,j,kk) * qs_arr(i,j,kk) * delz_arr(i,j,kk); });
1674 [&](
int kk) {
return den_arr(i,j,kk) * qg_arr(i,j,kk) * delz_arr(i,j,kk); });
1676 fall_arr(i,j,
klo,1) = delqrs2 / dz_col(0) / dtcld;
1677 fall_arr(i,j,
klo,2) = delqrs3 / dz_col(0) / dtcld;
1687 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1688 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
1689 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
1690 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
1691 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
1696 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1697 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
1698 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
1699 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
1702 wdm6_slope_rain_cell(qrs_tmp_arr(i,j,k,0), ncr_tmp_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1704 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
1705 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1706 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1708 wdm6_slope_snow_cell(qrs_tmp_arr(i,j,k,1), den_arr(i,j,k), denfac_arr(i,j,k), t_arr(i,j,k),
1711 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
1713 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
1715 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
1717 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
1718 slope_bvtg_loc, pvtg_loc,
1719 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
1722 rslope_arr(i,j,k,0) = rain_rslope;
1723 rslope_arr(i,j,k,1) = snow_rslope;
1724 rslope_arr(i,j,k,2) = graup_rslope;
1725 rslopeb_arr(i,j,k,0) = rain_rslopeb;
1726 rslopeb_arr(i,j,k,1) = snow_rslopeb;
1727 rslopeb_arr(i,j,k,2) = graup_rslopeb;
1728 rslope2_arr(i,j,k,0) = rain_rslope2;
1729 rslope2_arr(i,j,k,1) = snow_rslope2;
1730 rslope2_arr(i,j,k,2) = graup_rslope2;
1731 rslope3_arr(i,j,k,0) = rain_rslope3;
1732 rslope3_arr(i,j,k,1) = snow_rslope3;
1733 rslope3_arr(i,j,k,2) = graup_rslope3;
1734 work1_arr(i,j,k,0) = rain_vt;
1735 work1_arr(i,j,k,1) = snow_vt;
1736 work1_arr(i,j,k,2) = graup_vt;
1737 workn_arr(i,j,k) = rain_vtn;
1748 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1750 if (t_arr(i,j,k) > t0c) {
1751 const Real supcol = t0c - t_arr(i,j,k);
1759 den_arr(i,j,k),
Real(den0));
1762 if (qs_arr(i,j,k) >
Real(0.0)) {
1763 const Real coeres_s = rslope2_arr(i,j,k,1) *
1764 std::sqrt(rslope_arr(i,j,k,1) * rslopeb_arr(i,j,k,1));
1767 (t0c - t_arr(i,j,k)) * pi_wdm6_loc *
Real(0.5) *
n0sfac *
1768 (precs1_loc * rslope2_arr(i,j,k,1) +
1769 precs2_loc *
work2 * coeres_s) / den_arr(i,j,k);
1771 psmlt = amrex::min(amrex::max(
psmlt * dtcld, -qs_arr(i,j,k)),
1777 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k) - sfac *
psmlt,
Real(0.0));
1780 qs_arr(i,j,k) +=
psmlt;
1781 qr_arr(i,j,k) -=
psmlt;
1782 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) *
psmlt;
1786 if (qg_arr(i,j,k) >
Real(0.0)) {
1787 const Real coeres_g = rslope2_arr(i,j,k,2) *
1788 std::sqrt(rslope_arr(i,j,k,2) * rslopeb_arr(i,j,k,2));
1791 (t0c - t_arr(i,j,k)) *
1792 (precg1_loc * rslope2_arr(i,j,k,2) +
1793 precg2_loc *
work2 * coeres_g) / den_arr(i,j,k);
1795 pgmlt = amrex::min(amrex::max(
pgmlt * dtcld, -qg_arr(i,j,k)),
1799 const Real gfac = rslope_arr(i,j,k,2) * n0g_loc /
1801 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k) - gfac *
pgmlt,
Real(0.0));
1804 qg_arr(i,j,k) +=
pgmlt;
1805 qr_arr(i,j,k) -=
pgmlt;
1806 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) *
pgmlt;
1835 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1837 if (qi_arr(i,j,k) >
Real(0.0)) {
1838 const Real xni_safe = amrex::max(xni_arr(i,j,k),
Real(1.0e-30));
1839 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) / xni_safe;
1840 const Real diameter = amrex::max(amrex::min(dicon_loc * std::sqrt(xmi), dimax_loc),
1844 work1c_arr(i,j,k) =
work1c;
1848 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1849 amrex::ignore_unused(k);
1850 const int km =
khi -
klo + 1;
1874 for (
int kk = 0; kk < km; ++kk) {
1875 const int k3 =
klo + kk;
1876 dz_col(kk) = delz_arr(i,j,k3);
1877 den_col(kk) = den_arr(i,j,k3);
1878 denfac_col(kk) = denfac_arr(i,j,k3);
1879 tk_col(kk) = t_arr(i,j,k3);
1881 rq_col(kk) = den_col(kk) * qi_arr(i,j,k3);
1882 rq2_col(kk) = den_col(kk) * qi_arr(i,j,k3);
1887 [&](
int kk) {
return den_arr(i,j,kk) * qi_arr(i,j,kk) * delz_arr(i,j,kk); });
1907 km, &delqi_col, &delqi2_col, dtcld, 0,
1909 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
Real(
bvts), pvts_loc,
1910 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc, slope_bvtg_loc, pvtg_loc,
1911 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1914 for (
int kk = 0; kk < km; ++kk) {
1915 const int k3 =
klo + kk;
1916 qi_arr(i,j,k3) = amrex::max(
rq_col(kk) / den_col(kk),
Real(0.0));
1919 [&](
int kk) {
return den_arr(i,j,kk) * qi_arr(i,j,kk) * delz_arr(i,j,kk); });
1925 fallc_arr(i,j,
klo) = delqi_col / dz_col(0) / dtcld;
1926 delqi_arr(i,j,
klo) = delqi_col;
1936 const bool reaches_ground = (
klo ==
m_geom.Domain().smallEnd(2));
1937 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) noexcept
1939 if (!reaches_ground) {
return; }
1944 const Real fall_c = fallc_arr(i,j,
klo);
1955 graupel_arr(i,j,
klo) += fallsum_qg * conv;
1956 precip_arr(i,j,
klo) += fallsum * conv;
1959 if (fallsum >
Real(0.0)) {
1960 sr_arr(i,j,
klo) = (fallsum_qsi + fallsum_qg)
1997 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1998 const Real supcol = t0c - t_arr(i,j,k);
2000 if (supcol <
Real(0.0))
xlf = xlf0;
2003 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
2004 const Real qim = qi_arr(i,j,k);
2006 qc_arr(i,j,k) += qim;
2007 if (qim >
Real(qmin)) {
2008 nc_arr(i,j,k) += xni_arr(i,j,k);
2010 t_arr(i,j,k) -=
xlf / cpm_arr(i,j,k) * qim;
2011 qi_arr(i,j,k) =
Real(0.0);
2023 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
2024 const Real qc_old = qc_arr(i,j,k);
2026 qi_arr(i,j,k) += qc_old;
2028 if (nc_arr(i,j,k) >
Real(0.0)) {
2029 nc_arr(i,j,k) =
Real(0.0);
2032 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * qc_old;
2033 qc_arr(i,j,k) =
Real(0.0);
2048 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
2049 const Real supcolt = amrex::min(supcol,
Real(70.0));
2050 const Real expterm = std::exp(pfrz2_loc * supcolt) -
Real(1.0);
2055 const Real rs3 = rslopec3_arr(i,j,k);
2065 Real pfrzdtc = pi_wdm6_loc * pi_wdm6_loc * pfrz1_loc * expterm
2066 * denr / den_arr(i,j,k) * nc_arr(i,j,k) * rs3 * rs3
2067 /
Real(18.0) * dtcld;
2068 pfrzdtc = amrex::min(pfrzdtc, qc_arr(i,j,k));
2072 Real nfrzdtc = pi_wdm6_loc * pfrz1_loc * expterm
2073 * nc_arr(i,j,k) * rs3
2074 /
Real(6.0) * dtcld;
2075 nfrzdtc = amrex::min(nfrzdtc, nc_arr(i,j,k));
2079 nc_arr(i,j,k) -= nfrzdtc;
2083 qi_arr(i,j,k) += pfrzdtc;
2084 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * pfrzdtc;
2085 qc_arr(i,j,k) -= pfrzdtc;
2097 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
2098 const Real supcolt = amrex::min(supcol,
Real(70.0));
2099 const Real expterm = std::exp(pfrz2_loc * supcolt) -
Real(1.0);
2102 const Real rs3 = rslope3_arr(i,j,k,0);
2107 Real pfrzdtr =
Real(140.0) * (pi_wdm6_loc * pi_wdm6_loc)
2108 * pfrz1_loc * nr_arr(i,j,k)
2109 * denr / den_arr(i,j,k)
2110 * expterm * rs3 * rs3 * dtcld;
2111 pfrzdtr = amrex::min(pfrzdtr, qr_arr(i,j,k));
2116 Real nfrzdtr =
Real(4.0) * pi_wdm6_loc * pfrz1_loc
2117 * nr_arr(i,j,k) * expterm * rs3 * dtcld;
2118 nfrzdtr = amrex::min(nfrzdtr, nr_arr(i,j,k));
2119 nr_arr(i,j,k) -= nfrzdtr;
2123 qg_arr(i,j,k) += pfrzdtr;
2124 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * pfrzdtr;
2125 qr_arr(i,j,k) -= pfrzdtr;
2134 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2135 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k),
Real(0.0));
2136 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k),
Real(0.0));
2146 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2147 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
2148 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
2149 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
2150 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
2154 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2155 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
2156 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
2157 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
2160 wdm6_slope_rain_cell(qrs_tmp_arr(i,j,k,0), ncr_tmp_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
2162 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
2163 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
2164 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
2166 wdm6_slope_snow_cell(qrs_tmp_arr(i,j,k,1), den_arr(i,j,k), denfac_arr(i,j,k), t_arr(i,j,k),
2169 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
2171 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
2173 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
2175 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
2176 slope_bvtg_loc, pvtg_loc,
2177 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
2180 rslope_arr(i,j,k,0) = rain_rslope;
2181 rslope_arr(i,j,k,1) = snow_rslope;
2182 rslope_arr(i,j,k,2) = graup_rslope;
2183 rslopeb_arr(i,j,k,0) = rain_rslopeb;
2184 rslopeb_arr(i,j,k,1) = snow_rslopeb;
2185 rslopeb_arr(i,j,k,2) = graup_rslopeb;
2186 rslope2_arr(i,j,k,0) = rain_rslope2;
2187 rslope2_arr(i,j,k,1) = snow_rslope2;
2188 rslope2_arr(i,j,k,2) = graup_rslope2;
2189 rslope3_arr(i,j,k,0) = rain_rslope3;
2190 rslope3_arr(i,j,k,1) = snow_rslope3;
2191 rslope3_arr(i,j,k,2) = graup_rslope3;
2192 work1_arr(i,j,k,0) = rain_vt;
2193 work1_arr(i,j,k,1) = snow_vt;
2194 work1_arr(i,j,k,2) = graup_vt;
2195 workn_arr(i,j,k) = rain_vtn;
2200 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2202 avedia_arr(i,j,k,1) = rslope_arr(i,j,k,0) * cbrt24;
2206 const Real qci_for_lamdac = qc_arr(i,j,k);
2207 const Real nc_for_lamdac = nc_arr(i,j,k);
2209 if (qci_for_lamdac <=
Real(qmin) || nc_for_lamdac <=
Real(
ncmin)) {
2210 rslopec_arr(i,j,k) = rslopecmax_loc;
2211 rslopec2_arr(i,j,k) = rslopec2max_loc;
2212 rslopec3_arr(i,j,k) = rslopec3max_loc;
2221 nc_for_lamdac, pidnc_loc);
2222 rslopec_arr(i,j,k) = rslc;
2223 rslopec2_arr(i,j,k) = rslc * rslc;
2224 rslopec3_arr(i,j,k) = rslopec2_arr(i,j,k) * rslc;
2228 avedia_arr(i,j,k,0) = rslopec_arr(i,j,k);
2235 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2237 if (i == diag_i && j == diag_j && k == diag_k) {
2239 work1_arr(i,j,k,0) =
wdm6_diffac(xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
2240 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
2241 if (i == diag_i && j == diag_j && k == diag_k) {
2243 if (i == diag_i && j == diag_j && k == diag_k) {
2245 work1_arr(i,j,k,1) =
wdm6_diffac(
Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
2246 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
2247 if (i == diag_i && j == diag_j && k == diag_k) {
2250 work2_arr(i,j,k) =
wdm6_venfac(p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
2256 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2257 const Real supsat = amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsatw_arr(i,j,k);
2258 const Real satdt = supsat / dtcld;
2260 * (
wdm6_literal(1.0e20/16.0) * rslopec2_arr(i,j,k) * rslopec2_arr(i,j,k)
2264 if (qc_arr(i,j,k) > qcr_arr(i,j,k) && nc_arr(i,j,k) >
Real(
ncmin)) {
2274 praut_arr(i,j,k) = qck1_loc * std::pow(qc_arr(i,j,k),
wdm6_literal(7.0/3.0))
2276 praut_arr(i,j,k) = amrex::min(praut_arr(i,j,k), qc_arr(i,j,k) / dtcld);
2278 nrauto_arr(i,j,k) =
Real(3.5e9) * den_arr(i,j,k) * praut_arr(i,j,k);
2279 if (qr_arr(i,j,k) > lenconcr) {
2280 nrauto_arr(i,j,k) = nr_arr(i,j,k) / qr_arr(i,j,k) * praut_arr(i,j,k);
2282 nrauto_arr(i,j,k) = amrex::min(nrauto_arr(i,j,k), nc_arr(i,j,k) / dtcld);
2285 if (qr_arr(i,j,k) >= lenconcr) {
2286 if (avedia_arr(i,j,k,1) >=
Real(
di100)) {
2287 nraccr_arr(i,j,k) = amrex::min(
2288 Real(
ncrk1) * nc_arr(i,j,k) * nr_arr(i,j,k)
2289 * (rslopec3_arr(i,j,k) +
Real(24.0) * rslope3_arr(i,j,k,0)),
2290 nc_arr(i,j,k) / dtcld);
2291 pracw_arr(i,j,k) = amrex::min(
2292 pi_wdm6_loc /
Real(6.0) * (
Real(denr) / den_arr(i,j,k))
2293 *
Real(
ncrk1) * nc_arr(i,j,k) * nr_arr(i,j,k)
2294 * rslopec3_arr(i,j,k)
2295 * (
Real(2.0) * rslopec3_arr(i,j,k) +
Real(24.0) * rslope3_arr(i,j,k,0)),
2296 qc_arr(i,j,k) / dtcld);
2298 nraccr_arr(i,j,k) = amrex::min(
2299 Real(
ncrk2) * nc_arr(i,j,k) * nr_arr(i,j,k)
2300 * (
Real(2.0) * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k)
2301 +
Real(5040.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0)),
2302 nc_arr(i,j,k) / dtcld);
2303 pracw_arr(i,j,k) = amrex::min(
2304 pi_wdm6_loc /
Real(6.0) * (
Real(denr) / den_arr(i,j,k))
2305 *
Real(
ncrk2) * nc_arr(i,j,k) * nr_arr(i,j,k)
2306 * rslopec3_arr(i,j,k)
2307 * (
Real(6.0) * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k)
2308 +
Real(5040.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0)),
2309 qc_arr(i,j,k) / dtcld);
2313 if (avedia_arr(i,j,k,0) >=
Real(
di100)) {
2314 nccol_arr(i,j,k) =
Real(
ncrk1) * nc_arr(i,j,k) * nc_arr(i,j,k) * rslopec3_arr(i,j,k);
2316 nccol_arr(i,j,k) =
Real(2.0) *
Real(
ncrk2) * nc_arr(i,j,k) * nc_arr(i,j,k)
2317 * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k);
2320 if (qr_arr(i,j,k) >= lenconcr) {
2321 if (avedia_arr(i,j,k,1) <
Real(
di100)) {
2322 nrcol_arr(i,j,k) =
Real(5040.0) *
Real(
ncrk2) * nr_arr(i,j,k) * nr_arr(i,j,k)
2323 * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0);
2324 }
else if (avedia_arr(i,j,k,1) <
Real(
di600)) {
2325 nrcol_arr(i,j,k) =
Real(24.0) *
Real(
ncrk1) * nr_arr(i,j,k) * nr_arr(i,j,k)
2326 * rslope3_arr(i,j,k,0);
2327 }
else if (avedia_arr(i,j,k,1) <
Real(
di2000)) {
2329 nrcol_arr(i,j,k) =
Real(24.0) * std::exp(coecol) *
Real(
ncrk1)
2330 * nr_arr(i,j,k) * nr_arr(i,j,k) * rslope3_arr(i,j,k,0);
2332 nrcol_arr(i,j,k) =
Real(0.0);
2336 if (qr_arr(i,j,k) >
Real(0.0)) {
2337 const Real coeres = rslope_arr(i,j,k,0)
2338 * std::sqrt(rslope_arr(i,j,k,0) * rslopeb_arr(i,j,k,0));
2339 prevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0)) * nr_arr(i,j,k)
2340 * (precr1_loc * rslope_arr(i,j,k,0) + precr2_loc * work2_arr(i,j,k) * coeres)
2341 / work1_arr(i,j,k,0);
2342 if (prevp_arr(i,j,k) <
Real(0.0)) {
2343 prevp_arr(i,j,k) = amrex::max(prevp_arr(i,j,k), -qr_arr(i,j,k) / dtcld);
2344 prevp_arr(i,j,k) = amrex::max(prevp_arr(i,j,k), satdt /
Real(2.0));
2346 if (prevp_arr(i,j,k) == -qr_arr(i,j,k) / dtcld) {
2347 nn_arr(i,j,k) = nn_arr(i,j,k) + nr_arr(i,j,k);
2348 nr_arr(i,j,k) =
Real(0.0);
2350 }
else if (prevp_arr(i,j,k) ==
Real(0.0)) {
2353 prevp_arr(i,j,k) =
Real(0.0);
2355 prevp_arr(i,j,k) = amrex::min(prevp_arr(i,j,k), satdt /
Real(2.0));
2362 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2363 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2368 const Real supsat = amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsati_arr(i,j,k);
2369 amrex::ignore_unused(supsat);
2370 const Real satdt = supsat / dtcld;
2371 amrex::ignore_unused(satdt);
2373 const Real qi_val = qi_arr(i,j,k);
2374 if (!(supcol >
Real(0.0) && qi_val >
Real(qmin))) {
2378 Real temp = den_arr(i,j,k) * amrex::max(qi_val,
Real(qmin));
2379 temp = std::sqrt(std::sqrt(temp * temp * temp));
2380 xni_arr(i,j,k) = amrex::min(amrex::max(
Real(5.38e7) * temp,
Real(1.e3)),
Real(1.e6));
2387 const Real xni_safe = amrex::max(xni_arr(i,j,k),
Real(1.0e-30));
2388 const Real xmi = den_arr(i,j,k) * qi_val / xni_safe;
2400 const Real vt2r = pvtr_loc * rslopeb_arr(i,j,k,0) * denfac_arr(i,j,k);
2401 const Real vt2s = pvts_loc * rslopeb_arr(i,j,k,1) * denfac_arr(i,j,k);
2402 const Real vt2g = pvtg_loc * rslopeb_arr(i,j,k,2) * denfac_arr(i,j,k);
2417 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
2421 const Real acrfac =
Real(6.0) * rslope2_arr(i,j,k,0)
2422 +
Real(4.0) * diameter * rslope_arr(i,j,k,0)
2423 + diameter * diameter;
2424 praci_arr(i,j,k) = pi_wdm6_loc * qi_val * nr_arr(i,j,k)
2425 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
2426 praci_arr(i,j,k) *= std::pow(
2427 amrex::min(amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_val),
Real(1.0)),
2429 praci_arr(i,j,k) = amrex::min(praci_arr(i,j,k), qi_val / dtcld);
2432 * nr_arr(i,j,k) *
Real(denr) * xni_arr(i,j,k) * denfac_arr(i,j,k)
2433 * g7pbr_loc * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2434 * rslopeb_arr(i,j,k,0) / (
Real(24.0) * den_arr(i,j,k));
2435 piacr_arr(i,j,k) *= std::pow(
2436 amrex::min(amrex::max(
Real(0.0), qi_val / qr_arr(i,j,k)),
Real(1.0)),
2438 piacr_arr(i,j,k) = amrex::min(piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2442 niacr_arr(i,j,k) = pi_wdm6_loc *
Real(
WDM6::avtr) * nr_arr(i,j,k)
2443 * xni_arr(i,j,k) * denfac_arr(i,j,k) * g4pbr_loc
2444 * rslope2_arr(i,j,k,0) * rslopeb_arr(i,j,k,0) /
Real(4.0);
2445 niacr_arr(i,j,k) *= std::pow(
2446 amrex::min(amrex::max(
Real(0.0), qi_val / qr_arr(i,j,k)),
Real(1.0)),
2448 niacr_arr(i,j,k) = amrex::min(niacr_arr(i,j,k), nr_arr(i,j,k) / dtcld);
2452 const Real acrfac =
Real(2.0) * rslope3_arr(i,j,k,1)
2453 +
Real(2.0) * diameter * rslope2_arr(i,j,k,1)
2454 + diameter * diameter * rslope_arr(i,j,k,1);
2455 psaci_arr(i,j,k) = pi_wdm6_loc * qi_val * eacrs *
Real(
n0s) *
n0sfac
2456 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
2457 psaci_arr(i,j,k) = amrex::min(psaci_arr(i,j,k), qi_val / dtcld);
2467 const Real acrfac =
Real(2.0) * rslope3_arr(i,j,k,2)
2468 +
Real(2.0) * diameter * rslope2_arr(i,j,k,2)
2469 + diameter * diameter * rslope_arr(i,j,k,2);
2470 pgaci_arr(i,j,k) = pi_wdm6_loc * egi * qi_val * n0g_loc
2471 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
2472 pgaci_arr(i,j,k) = amrex::min(pgaci_arr(i,j,k), qi_val / dtcld);
2478 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2479 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2484 const Real qs_val = qs_arr(i,j,k);
2485 const Real qg_val = qg_arr(i,j,k);
2486 const Real qc_val = qc_arr(i,j,k);
2487 const Real nc_val = nc_arr(i,j,k);
2514 constexpr
Real tiny_qc = std::numeric_limits<Real>::min();
2515 const Real qc_div = amrex::max(qc_val, tiny_qc);
2516 const Real ratio_s = (qc_val >
Real(0.0))
2517 ? amrex::min(amrex::max(
Real(0.0), qs_val / qc_div),
Real(1.0))
2526 const Real ratio_g = (qc_val >
Real(0.0))
2527 ? amrex::min(amrex::max(
Real(0.0), qg_val / qc_div),
Real(1.0))
2531 psacw_arr(i,j,k) = amrex::min(
2532 pacrc_loc *
n0sfac * rslope3_arr(i,j,k,1) * rslopeb_arr(i,j,k,1)
2533 * ratio_s * ratio_s * qc_val * denfac_arr(i,j,k),
2537 nsacw_arr(i,j,k) = amrex::min(
2538 pacrc_loc *
n0sfac * rslope3_arr(i,j,k,1) * rslopeb_arr(i,j,k,1)
2539 * ratio_s * ratio_s * nc_val * denfac_arr(i,j,k),
2543 pgacw_arr(i,j,k) = amrex::min(
2544 pacrg_loc * rslope3_arr(i,j,k,2) * rslopeb_arr(i,j,k,2)
2545 * qc_val * ratio_g * ratio_g * denfac_arr(i,j,k),
2549 ngacw_arr(i,j,k) = amrex::min(
2550 pacrg_loc * rslope3_arr(i,j,k,2) * rslopeb_arr(i,j,k,2)
2551 * nc_val * ratio_g * ratio_g * denfac_arr(i,j,k),
2557 paacw_arr(i,j,k) = (qs_val * psacw_arr(i,j,k) + qg_val * pgacw_arr(i,j,k)) /
qsum;
2558 naacw_arr(i,j,k) = (qs_val * nsacw_arr(i,j,k) + qg_val * ngacw_arr(i,j,k)) /
qsum;
2564 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2565 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2570 const Real qr_val = qr_arr(i,j,k);
2571 const Real qs_val = qs_arr(i,j,k);
2572 const Real qg_val = qg_arr(i,j,k);
2573 const Real nr_val = nr_arr(i,j,k);
2574 const Real vt2r = pvtr_loc * rslopeb_arr(i,j,k,0) * denfac_arr(i,j,k);
2575 const Real vt2s = pvts_loc * rslopeb_arr(i,j,k,1) * denfac_arr(i,j,k);
2576 const Real vt2g = pvtg_loc * rslopeb_arr(i,j,k,2) * denfac_arr(i,j,k);
2579 ? (vt2s * qs_val + vt2g * qg_val) /
qsum
2583 if (supcol >
Real(0.0)) {
2585 Real(5.0) * rslope3_arr(i,j,k,1) * rslope3_arr(i,j,k,1)
2586 +
Real(4.0) * rslope3_arr(i,j,k,1) * rslope2_arr(i,j,k,1)
2587 * rslope_arr(i,j,k,0)
2588 +
Real(1.5) * rslope2_arr(i,j,k,1) * rslope2_arr(i,j,k,1)
2589 * rslope2_arr(i,j,k,0);
2590 pracs_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val *
Real(
n0s)
2591 *
n0sfac * std::abs(vt2r - vt2ave)
2592 * (
Real(
dens) / den_arr(i,j,k)) * acrfac;
2593 const Real ratio = amrex::min(
2594 amrex::max(
Real(0.0), qr_val / qs_val),
Real(1.0));
2595 pracs_arr(i,j,k) *= ratio * ratio;
2596 pracs_arr(i,j,k) = amrex::min(pracs_arr(i,j,k), qs_val / dtcld);
2600 Real(30.0) * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2601 * rslope_arr(i,j,k,1)
2602 +
Real(10.0) * rslope2_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2603 * rslope2_arr(i,j,k,1)
2604 +
Real(2.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,1);
2605 psacr_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val *
Real(
n0s)
2606 *
n0sfac * std::abs(vt2ave - vt2r)
2607 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2608 const Real ratio = amrex::min(
2609 amrex::max(
Real(0.0), qs_val / qr_val),
Real(1.0));
2610 psacr_arr(i,j,k) *= ratio * ratio;
2611 psacr_arr(i,j,k) = amrex::min(psacr_arr(i,j,k), qr_val / dtcld);
2616 Real(1.5) * rslope2_arr(i,j,k,0) * rslope_arr(i,j,k,1)
2617 + rslope_arr(i,j,k,0) * rslope2_arr(i,j,k,1)
2618 +
Real(0.5) * rslope3_arr(i,j,k,1);
2619 nsacr_arr(i,j,k) = pi_wdm6_loc * nr_val *
Real(
n0s) *
n0sfac
2620 * std::abs(vt2ave - vt2r) * acrfac;
2621 const Real ratio = amrex::min(
2622 amrex::max(
Real(0.0), qs_val / qr_val),
Real(1.0));
2623 nsacr_arr(i,j,k) *= ratio * ratio;
2624 nsacr_arr(i,j,k) = amrex::min(nsacr_arr(i,j,k), nr_val / dtcld);
2629 Real(30.0) * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2630 * rslope_arr(i,j,k,2)
2631 +
Real(10.0) * rslope2_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2632 * rslope2_arr(i,j,k,2)
2633 +
Real(2.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,2);
2634 pgacr_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val * n0g_loc
2635 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
2637 const Real ratio = amrex::min(
2638 amrex::max(
Real(0.0), qg_val / qr_val),
Real(1.0));
2639 pgacr_arr(i,j,k) *= ratio * ratio;
2640 pgacr_arr(i,j,k) = amrex::min(pgacr_arr(i,j,k), qr_val / dtcld);
2645 Real(1.5) * rslope2_arr(i,j,k,0) * rslope_arr(i,j,k,2)
2646 + rslope_arr(i,j,k,0) * rslope2_arr(i,j,k,2)
2647 +
Real(0.5) * rslope3_arr(i,j,k,2);
2648 ngacr_arr(i,j,k) = pi_wdm6_loc * nr_val * n0g_loc
2649 * std::abs(vt2ave - vt2r) * acrfac;
2650 const Real ratio = amrex::min(
2651 amrex::max(
Real(0.0), qg_val / qr_val),
Real(1.0));
2652 ngacr_arr(i,j,k) *= ratio * ratio;
2653 ngacr_arr(i,j,k) = amrex::min(ngacr_arr(i,j,k), nr_val / dtcld);
2657 pgacs_arr(i,j,k) =
Real(0.0);
2660 if (supcol <=
Real(0.0)) {
2662 if (qs_val >
Real(0.0)) {
2663 pseml_arr(i,j,k) = amrex::min(
2666 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2672 nseml_arr(i,j,k) = -sfac * pseml_arr(i,j,k);
2675 if (qg_val >
Real(0.0)) {
2676 pgeml_arr(i,j,k) = amrex::min(
2679 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2684 const Real gfac = rslope_arr(i,j,k,2) * n0g_loc / qg_val;
2685 ngeml_arr(i,j,k) = -gfac * pgeml_arr(i,j,k);
2692 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2693 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2694 if (supcol <=
Real(0.0)) {
2703 amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsati_arr(i,j,k);
2704 const Real satdt = supsat / dtcld;
2707 const Real qi_val = qi_arr(i,j,k);
2708 const Real qs_val = qs_arr(i,j,k);
2709 const Real qg_val = qg_arr(i,j,k);
2710 const Real xni = xni_arr(i,j,k);
2711 const Real xni_safe = amrex::max(
xni,
Real(1.0e-30));
2712 const Real xmi = den_arr(i,j,k) * qi_val / xni_safe;
2713 const Real diameter = amrex::min(
2715 const Real rhi = rhi_arr(i,j,k);
2716 const Real work1i = work1_arr(i,j,k,1);
2718 if (qi_val >
Real(0.0) && ifsat != 1) {
2719 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2721 Real supice = satdt - prevp_arr(i,j,k);
2722 if (pidep_arr(i,j,k) <
Real(0.0)) {
2723 pidep_arr(i,j,k) = amrex::max(
2724 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2726 pidep_arr(i,j,k) = amrex::max(
2727 pidep_arr(i,j,k), -qi_val / dtcld);
2729 pidep_arr(i,j,k) = amrex::min(
2730 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2733 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2734 >= std::abs(satdt)) {
2739 if (qs_val >
Real(0.0) && ifsat != 1) {
2740 const Real coeres_s = rslope2_arr(i,j,k,1)
2741 * std::sqrt(rslope_arr(i,j,k,1) * rslopeb_arr(i,j,k,1));
2743 * (precs1_loc * rslope2_arr(i,j,k,1)
2744 + precs2_loc * work2_arr(i,j,k) * coeres_s)
2746 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2747 if (psdep_arr(i,j,k) <
Real(0.0)) {
2748 psdep_arr(i,j,k) = amrex::max(
2749 psdep_arr(i,j,k), -qs_val / dtcld);
2750 psdep_arr(i,j,k) = amrex::max(
2751 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2754 psdep_arr(i,j,k) = amrex::min(
2755 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2758 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2759 + psdep_arr(i,j,k)) >= std::abs(satdt)) {
2764 if (qg_val >
Real(0.0) && ifsat != 1) {
2765 const Real coeres_g = rslope2_arr(i,j,k,2)
2766 * std::sqrt(rslope_arr(i,j,k,2) * rslopeb_arr(i,j,k,2));
2767 pgdep_arr(i,j,k) = (
rhi -
Real(1.0))
2768 * (precg1_loc * rslope2_arr(i,j,k,2)
2769 + precg2_loc * work2_arr(i,j,k) * coeres_g)
2771 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k)
2773 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2774 pgdep_arr(i,j,k) = amrex::max(
2775 pgdep_arr(i,j,k), -qg_val / dtcld);
2776 pgdep_arr(i,j,k) = amrex::max(
2777 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2780 pgdep_arr(i,j,k) = amrex::min(
2781 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2784 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2785 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2786 >= std::abs(satdt)) {
2791 if (supsat >
Real(0.0) && ifsat != 1) {
2792 const Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k)
2793 - psdep_arr(i,j,k) - pgdep_arr(i,j,k);
2796 const Real pigen_raw = amrex::max(
2798 (roqi0 / den_arr(i,j,k) - amrex::max(qi_val,
Real(0.0))) / dtcld);
2799 pigen_arr(i,j,k) = amrex::min(
2800 amrex::min(pigen_raw, satdt), supice);
2807 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2808 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2810 if (qi_arr(i,j,k) >
Real(0.0)) {
2811 const Real qimax = roqimax_loc / den_arr(i,j,k);
2812 psaut_arr(i,j,k) = amrex::max(
2813 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2816 if (qs_arr(i,j,k) >
Real(0.0)) {
2829 pgaut_arr(i,j,k) = amrex::min(
2832 qs_arr(i,j,k) / dtcld);
2838 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2839 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2840 if (supcol <
Real(0.0)) {
2846 if (qs_arr(i,j,k) >
Real(0.0)
2847 && rhw_arr(i,j,k) <
Real(1.0)) {
2848 const Real coeres = rslope2_arr(i,j,k,1)
2849 * std::sqrt(rslope_arr(i,j,k,1)
2850 * rslopeb_arr(i,j,k,1));
2851 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2853 * (precs1_loc * rslope2_arr(i,j,k,1)
2854 + precs2_loc * work2_arr(i,j,k) * coeres)
2855 / work1_arr(i,j,k,0);
2856 psevp_arr(i,j,k) = amrex::min(
2857 amrex::max(psevp_arr(i,j,k),
2858 -qs_arr(i,j,k) / dtcld),
2862 if (qg_arr(i,j,k) >
Real(0.0)
2863 && rhw_arr(i,j,k) <
Real(1.0)) {
2864 const Real coeres = rslope2_arr(i,j,k,2)
2865 * std::sqrt(rslope_arr(i,j,k,2)
2866 * rslopeb_arr(i,j,k,2));
2867 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2868 * (precg1_loc * rslope2_arr(i,j,k,2)
2869 + precg2_loc * work2_arr(i,j,k) * coeres)
2870 / work1_arr(i,j,k,0);
2871 pgevp_arr(i,j,k) = amrex::min(
2872 amrex::max(pgevp_arr(i,j,k),
2873 -qg_arr(i,j,k) / dtcld),
2881 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2893 (qr_arr(i,j,k) <
wdm6_literal(1.0e-4)) ? one_l : zero_l;
2895 if (t_arr(i,j,k) <= t0c_l) {
2896 Real value, source, factor,
xlf, xlwork2;
2898 value = amrex::max(qmin_l, qc_arr(i,j,k));
2899 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2900 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2901 if (source > value) {
2902 factor = value / source;
2903 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2904 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2905 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2908 value = amrex::max(qmin_l, qi_arr(i,j,k));
2909 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2910 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2911 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2912 if (source > value) {
2913 factor = value / source;
2914 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2915 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2916 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2917 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2918 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2919 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2922 value = amrex::max(qmin_l, qr_arr(i,j,k));
2923 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2924 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2925 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2926 if (source > value) {
2927 factor = value / source;
2928 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2929 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2930 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2931 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2932 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2933 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2936 value = amrex::max(qmin_l, qs_arr(i,j,k));
2937 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2938 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2939 + piacr_arr(i,j,k) * delta3
2940 + praci_arr(i,j,k) * delta3
2941 - pracs_arr(i,j,k) * (one_l - delta2)
2942 + psacr_arr(i,j,k) * delta2
2943 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2944 if (source > value) {
2945 factor = value / source;
2946 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2947 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2948 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2949 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2950 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2951 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2952 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2953 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2954 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2955 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2958 value = amrex::max(qmin_l, qg_arr(i,j,k));
2959 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2960 + piacr_arr(i,j,k) * (one_l - delta3)
2961 + praci_arr(i,j,k) * (one_l - delta3)
2962 + psacr_arr(i,j,k) * (one_l - delta2)
2963 + pracs_arr(i,j,k) * (one_l - delta2)
2964 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2965 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2966 if (source > value) {
2967 factor = value / source;
2968 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2969 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2970 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2971 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2972 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2973 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2974 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2975 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2976 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2977 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2980 value = amrex::max(ncmin_l, nc_arr(i,j,k));
2981 source = (nrauto_arr(i,j,k) + nccol_arr(i,j,k)
2982 + nraccr_arr(i,j,k) + naacw_arr(i,j,k)
2983 + naacw_arr(i,j,k)) * dtcld;
2984 if (source > value) {
2985 factor = value / source;
2986 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2987 nccol_arr(i,j,k) = nccol_arr(i,j,k) * factor;
2988 nraccr_arr(i,j,k) = nraccr_arr(i,j,k) * factor;
2989 naacw_arr(i,j,k) = naacw_arr(i,j,k) * factor;
2992 value = amrex::max(nrmin_l, nr_arr(i,j,k));
2993 source = (-nrauto_arr(i,j,k) + nrcol_arr(i,j,k)
2994 + niacr_arr(i,j,k) + nsacr_arr(i,j,k)
2995 + ngacr_arr(i,j,k)) * dtcld;
2996 if (source > value) {
2997 factor = value / source;
2998 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2999 nrcol_arr(i,j,k) = nrcol_arr(i,j,k) * factor;
3000 niacr_arr(i,j,k) = niacr_arr(i,j,k) * factor;
3001 nsacr_arr(i,j,k) = nsacr_arr(i,j,k) * factor;
3002 ngacr_arr(i,j,k) = ngacr_arr(i,j,k) * factor;
3005 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
3006 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
3007 + pidep_arr(i,j,k));
3008 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
3009 qc_arr(i,j,k) = amrex::max(
3010 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
3011 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
3014 qr_arr(i,j,k) = amrex::max(
3015 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
3016 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
3017 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
3020 qi_arr(i,j,k) = amrex::max(
3021 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
3022 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
3023 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
3026 qs_arr(i,j,k) = amrex::max(
3027 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
3028 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
3029 + piacr_arr(i,j,k) * delta3
3030 + praci_arr(i,j,k) * delta3
3031 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
3032 - pracs_arr(i,j,k) * (one_l - delta2)
3033 + psacr_arr(i,j,k) * delta2) * dtcld,
3035 qg_arr(i,j,k) = amrex::max(
3036 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
3037 + piacr_arr(i,j,k) * (one_l - delta3)
3038 + praci_arr(i,j,k) * (one_l - delta3)
3039 + psacr_arr(i,j,k) * (one_l - delta2)
3040 + pracs_arr(i,j,k) * (one_l - delta2)
3041 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
3042 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
3045 nc_arr(i,j,k) = amrex::max(
3046 nc_arr(i,j,k) + (-nrauto_arr(i,j,k) - nccol_arr(i,j,k)
3047 - nraccr_arr(i,j,k) - naacw_arr(i,j,k)
3048 - naacw_arr(i,j,k)) * dtcld,
3050 nr_arr(i,j,k) = amrex::max(
3051 nr_arr(i,j,k) + (nrauto_arr(i,j,k) - nrcol_arr(i,j,k)
3052 - niacr_arr(i,j,k) - nsacr_arr(i,j,k)
3053 - ngacr_arr(i,j,k)) * dtcld,
3056 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
3057 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
3058 - xl_arr(i,j,k) * prevp_arr(i,j,k)
3059 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
3060 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
3061 + psacr_arr(i,j,k));
3062 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
3064 Real value, source, factor,
xlf, xlwork2;
3066 value = amrex::max(qmin_l, qc_arr(i,j,k));
3067 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
3068 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
3069 if (source > value) {
3070 factor = value / source;
3071 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
3072 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
3073 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
3076 value = amrex::max(qmin_l, qr_arr(i,j,k));
3077 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
3078 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
3079 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
3080 - prevp_arr(i,j,k)) * dtcld;
3081 if (source > value) {
3082 factor = value / source;
3083 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
3084 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
3085 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
3086 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
3087 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
3088 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
3091 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
3092 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
3093 - psevp_arr(i,j,k)) * dtcld;
3094 if (source > value) {
3095 factor = value / source;
3096 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
3097 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
3098 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
3101 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
3102 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
3103 + pgeml_arr(i,j,k)) * dtcld;
3104 if (source > value) {
3105 factor = value / source;
3106 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
3107 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
3108 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
3111 value = amrex::max(ncmin_l, nc_arr(i,j,k));
3112 source = (nrauto_arr(i,j,k) + nccol_arr(i,j,k)
3113 + nraccr_arr(i,j,k) + naacw_arr(i,j,k)
3114 + naacw_arr(i,j,k)) * dtcld;
3115 if (source > value) {
3116 factor = value / source;
3117 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
3118 nccol_arr(i,j,k) = nccol_arr(i,j,k) * factor;
3119 nraccr_arr(i,j,k) = nraccr_arr(i,j,k) * factor;
3120 naacw_arr(i,j,k) = naacw_arr(i,j,k) * factor;
3123 value = amrex::max(nrmin_l, nr_arr(i,j,k));
3124 source = (-nrauto_arr(i,j,k) + nrcol_arr(i,j,k)
3125 - nseml_arr(i,j,k) - ngeml_arr(i,j,k)) * dtcld;
3126 if (source > value) {
3127 factor = value / source;
3128 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
3129 nrcol_arr(i,j,k) = nrcol_arr(i,j,k) * factor;
3130 nseml_arr(i,j,k) = nseml_arr(i,j,k) * factor;
3131 ngeml_arr(i,j,k) = ngeml_arr(i,j,k) * factor;
3134 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
3135 + pgevp_arr(i,j,k));
3136 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
3137 qc_arr(i,j,k) = amrex::max(
3138 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
3139 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
3142 qr_arr(i,j,k) = amrex::max(
3143 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
3144 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
3145 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
3146 - pgeml_arr(i,j,k)) * dtcld,
3148 qs_arr(i,j,k) = amrex::max(
3149 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
3150 + pseml_arr(i,j,k)) * dtcld,
3152 qg_arr(i,j,k) = amrex::max(
3153 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
3154 + pgeml_arr(i,j,k)) * dtcld,
3156 nc_arr(i,j,k) = amrex::max(
3157 nc_arr(i,j,k) + (-nrauto_arr(i,j,k) - nccol_arr(i,j,k)
3158 - nraccr_arr(i,j,k) - naacw_arr(i,j,k)
3159 - naacw_arr(i,j,k)) * dtcld,
3161 nr_arr(i,j,k) = amrex::max(
3162 nr_arr(i,j,k) + (nrauto_arr(i,j,k) - nrcol_arr(i,j,k)
3163 + nseml_arr(i,j,k) + ngeml_arr(i,j,k))
3167 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
3170 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
3171 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
3183 const Real xb = xa + hvap / (
Real(rv) * ttp);
3185 const Real xai = -dldti /
Real(rv);
3186 const Real xbi = xai + hsub / (
Real(rv) * ttp);
3188 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3189 const Real tr = ttp / t_arr(i,j,k);
3191 * std::exp(xb * (
Real(1.) - tr));
3192 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
3193 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
3194 qsw = amrex::max(qsw,
Real(qmin));
3195 qsatw_arr(i,j,k) = qsw;
3198 if (t_arr(i,j,k) < ttp) {
3199 qsi =
Real(
psat) * std::exp(std::log(tr) * xai)
3200 * std::exp(xbi * (
Real(1.) - tr));
3202 qsi =
Real(
psat) * std::exp(std::log(tr) * xa)
3203 * std::exp(xb * (
Real(1.) - tr));
3205 qsi = amrex::min(qsi,
wdm6_literal(0.99) * p_arr(i,j,k));
3206 qsi =
Real(ep2) * qsi / (p_arr(i,j,k) - qsi);
3207 qsi = amrex::max(qsi,
Real(qmin));
3208 qsati_arr(i,j,k) = qsi;
3210 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsw,
Real(qmin));
3217 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3218 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
3219 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
3220 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
3221 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
3224 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3225 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
3226 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
3227 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
3230 den_arr(i,j,k), denfac_arr(i,j,k),
3232 rslopermax_loc, rsloperbmax_loc,
3233 rsloper2max_loc, rsloper3max_loc,
3234 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
3235 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
3237 wdm6_slope_snow_cell(qrs_tmp_arr(i,j,k,1), den_arr(i,j,k), denfac_arr(i,j,k),
3240 rslopesmax_loc, rslopesbmax_loc,
3241 rslopes2max_loc, rslopes3max_loc,
3243 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3,
3244 snow_vt, snow_n0sfac);
3245 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
3247 rslopegmax_loc, rslopegbmax_loc,
3248 rslopeg2max_loc, rslopeg3max_loc,
3249 slope_bvtg_loc, pvtg_loc,
3250 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3,
3253 rslope_arr(i,j,k,0) = rain_rslope;
3254 rslope_arr(i,j,k,1) = snow_rslope;
3255 rslope_arr(i,j,k,2) = graup_rslope;
3256 rslopeb_arr(i,j,k,0) = rain_rslopeb;
3257 rslopeb_arr(i,j,k,1) = snow_rslopeb;
3258 rslopeb_arr(i,j,k,2) = graup_rslopeb;
3259 rslope2_arr(i,j,k,0) = rain_rslope2;
3260 rslope2_arr(i,j,k,1) = snow_rslope2;
3261 rslope2_arr(i,j,k,2) = graup_rslope2;
3262 rslope3_arr(i,j,k,0) = rain_rslope3;
3263 rslope3_arr(i,j,k,1) = snow_rslope3;
3264 rslope3_arr(i,j,k,2) = graup_rslope3;
3265 work1_arr(i,j,k,0) = rain_vt;
3266 work1_arr(i,j,k,1) = snow_vt;
3267 work1_arr(i,j,k,2) = graup_vt;
3268 workn_arr(i,j,k) = rain_vtn;
3270 avedia_arr(i,j,k,1) = rslope_arr(i,j,k,0) * g16a_cbrt24;
3271 if (avedia_arr(i,j,k,1) <=
Real(
di82)) {
3272 nc_arr(i,j,k) += nr_arr(i,j,k);
3273 nr_arr(i,j,k) =
Real(0.0);
3274 qc_arr(i,j,k) += qr_arr(i,j,k);
3275 qr_arr(i,j,k) =
Real(0.0);
3281 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3282 if (rhw_arr(i,j,k) >
Real(1.0)) {
3284 const Real fraction = amrex::min(
Real(1.0),
3285 std::exp(std::log(ratio) *
Real(
actk)));
3286 Real ncact_raw = (nn_arr(i,j,k) + nc_arr(i,j,k)) * fraction - nc_arr(i,j,k);
3287 Real ncact = amrex::max(
Real(0.0), ncact_raw);
3289 const Real ncact_cap = amrex::max(nn_arr(i,j,k),
Real(0.0)) / dtcld;
3290 ncact = amrex::min(ncact, ncact_cap);
3292 const Real pcact = amrex::min(
3293 Real(4.0) * pi_wdm6_loc *
Real(denr)
3294 * actr_um * actr_um * actr_um * ncact
3295 / (
Real(3.0) * den_arr(i,j,k)),
3296 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
3298 ncact_arr(i,j,k) = ncact;
3299 act_ratio_arr(i,j,k) = ratio;
3300 act_fraction_arr(i,j,k) = fraction;
3301 act_raw_arr(i,j,k) = ncact_raw;
3302 act_cap_arr(i,j,k) = ncact_cap;
3303 pcact_arr(i,j,k) = pcact;
3305 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k) + pcact * dtcld,
Real(0.0));
3306 nn_arr(i,j,k) = amrex::max(nn_arr(i,j,k) - ncact * dtcld,
Real(0.0));
3307 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k) + ncact * dtcld,
Real(0.0));
3308 t_arr(i,j,k) += pcact * xl_arr(i,j,k) / cpm_arr(i,j,k) * dtcld;
3311 const Real tr = ttp / t_arr(i,j,k);
3313 * std::exp(xb * (
Real(1.0) - tr));
3314 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
3315 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
3316 qsw = amrex::max(qsw,
Real(qmin));
3317 qsatw_arr(i,j,k) = qsw;
3320 t_arr(i,j,k),
qv_arr(i,j,k), qsw, xl_arr(i,j,k), cpm_arr(i,j,k),
3322 work2_arr(i,j,k) = qc_arr(i,j,k) + work1_arr(i,j,k,0);
3325 amrex::max(work1_arr(i,j,k,0) / dtcld,
Real(0.0)),
3326 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
3327 if (qc_arr(i,j,k) >
Real(0.0) && work1_arr(i,j,k,0) <
Real(0.0)) {
3328 pcond = amrex::max(work1_arr(i,j,k,0), -qc_arr(i,j,k)) / dtcld;
3330 pcond_arr(i,j,k) =
pcond;
3332 if (
pcond == -qc_arr(i,j,k) / dtcld) {
3333 nn_arr(i,j,k) += nc_arr(i,j,k);
3334 nc_arr(i,j,k) =
Real(0.0);
3338 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k) +
pcond * dtcld,
Real(0.0));
3339 t_arr(i,j,k) +=
pcond * xl_arr(i,j,k) / cpm_arr(i,j,k) * dtcld;
3343 const Real g17_pidnc = pi_wdm6_loc *
Real(denr) /
Real(6.0);
3344 const Real g17_pidnr =
Real(4.0) * pi_wdm6_loc *
Real(denr);
3347 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3348 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
3349 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
3352 Real lamdr = std::exp(std::log(
3353 (g17_pidnr * nr_arr(i,j,k)) / (den_arr(i,j,k) * qr_arr(i,j,k))
3357 nr_arr(i,j,k) = den_arr(i,j,k) * qr_arr(i,j,k)
3358 * std::pow(lamdr,
Real(3.0)) / g17_pidnr;
3361 nr_arr(i,j,k) = den_arr(i,j,k) * qr_arr(i,j,k)
3362 * std::pow(lamdr,
Real(3.0)) / g17_pidnr;
3366 if (qc_arr(i,j,k) >=
Real(qmin) && nc_arr(i,j,k) >=
Real(
ncmin)) {
3367 Real lamdc = std::exp(std::log(
3368 (g17_pidnc * nc_arr(i,j,k)) / (den_arr(i,j,k) * qc_arr(i,j,k))
3372 nc_arr(i,j,k) = den_arr(i,j,k) * qc_arr(i,j,k)
3373 * std::pow(lamdc,
Real(3.0)) / g17_pidnc;
3376 nc_arr(i,j,k) = den_arr(i,j,k) * qc_arr(i,j,k)
3377 * std::pow(lamdc,
Real(3.0)) / g17_pidnc;
3399 const bool use_anelastic_reference_pressure =
3401 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3403 t_arr(i,j,k), p_arr(i,j,k), configured_rdOcp,
3404 use_anelastic_reference_pressure);
3408 #ifdef ERF_USE_WDM6_FORT
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_diffac(Real a, Real b, Real c, Real d, Real e, Real rv_arg)
Definition: ERF_AdvanceWDM6.cpp:64
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_xka(Real x, Real y)
Definition: ERF_AdvanceWDM6.cpp:59
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_venfac(Real a, Real b, Real c, Real den0_arg)
Definition: ERF_AdvanceWDM6.cpp:71
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wdm6_nislfv_rain_plm6_column(int km, Real *precip1, Real *precip2, Real dt, int iter, Real pidn0s, Real pidn0g, Real qcrmin, Real alpha, Real n0smax, Real n0s, Real t0c, Real rslopesmax, Real rslopesbmax, Real rslopes2max, Real rslopes3max, Real bvts, Real pvts, Real rslopegmax, Real rslopegbmax, Real rslopeg2max, Real rslopeg3max, Real bvtg, Real pvtg, Array4< Real > const &sed_cell, Array4< Real > const &sed_node, int i_s, int j_s, int klo_s)
Definition: ERF_AdvanceWDM6.cpp:281
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_xlcal(Real x, Real xlv0_arg, Real xlv1_arg, Real t0c_arg)
Definition: ERF_AdvanceWDM6.cpp:35
constexpr amrex::Real wdm6_slope_t0c
Definition: ERF_AdvanceWDM6.cpp:199
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wdm6_slope_rain_cell(Real qr, Real nr, Real den, Real denfac, Real qcrmin_arg, Real nrmin_arg, Real rslopermax_arg, Real rsloperbmax_arg, Real rsloper2max_arg, Real rsloper3max_arg, Real bvtr_arg, Real pvtr_arg, Real pvtrn_arg, Real pidnr_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt, Real &vtn)
Definition: ERF_AdvanceWDM6.cpp:141
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wdm6_slope_snow_cell(Real qs, Real den, Real denfac, Real t, Real pidn0s_arg, Real alpha_arg, Real n0smax_arg, Real n0s_arg, Real t0c_arg, Real qcrmin_arg, Real rslopesmax_arg, Real rslopesbmax_arg, Real rslopes2max_arg, Real rslopes3max_arg, Real bvts_arg, Real pvts_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt, Real &n0sfac)
Definition: ERF_AdvanceWDM6.cpp:218
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_cpmcal(Real x, Real qmin_arg, Real cpd_arg, Real cpv_arg)
Definition: ERF_AdvanceWDM6.cpp:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_xni_exact(Real qi, Real den, Real qmin_arg)
Definition: ERF_AdvanceWDM6.cpp:134
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_default_real_pow(double base, double exponent)
Definition: ERF_AdvanceWDM6.cpp:40
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wdm6_slope_graup_cell(Real qg, Real den, Real denfac, Real pidn0g_arg, Real qcrmin_arg, Real rslopegmax_arg, Real rslopegbmax_arg, Real rslopeg2max_arg, Real rslopeg3max_arg, Real bvtg_arg, Real pvtg_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt)
Definition: ERF_AdvanceWDM6.cpp:248
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_conden(Real a, Real b, Real c, Real d, Real e, Real qmin_arg, Real rv_arg)
Definition: ERF_AdvanceWDM6.cpp:80
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_rslopec_exact(Real qc, Real den, Real nc, Real pidnc_arg)
Definition: ERF_AdvanceWDM6.cpp:123
constexpr amrex::Real R_v
Definition: ERF_Constants.H:50
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:51
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:72
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:53
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:52
constexpr amrex::Real R_d
Definition: ERF_Constants.H:49
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
const int khi
Definition: ERF_InitCustomPert_Bubble.H:25
const int klo
Definition: ERF_InitCustomPert_KE.H:9
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:222
constexpr amrex::Real lat_vap
Definition: ERF_MicrophysicsConstants.H:113
constexpr amrex::Real lsub
Definition: ERF_MicrophysicsConstants.H:111
constexpr amrex::Real rhoh2o
Definition: ERF_MicrophysicsConstants.H:42
constexpr amrex::Real lat_ice
Definition: ERF_MicrophysicsConstants.H:114
constexpr amrex::Real rhos
Definition: ERF_MicrophysicsConstants.H:40
Arena * Arena_Used
Definition: ERF_Morrison_Advance_F.H:23
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);})
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void sedimentation_add_column_sums(const amrex::Array4< amrex::Real > &sed, int n, int i, int j, int klo, int khi, amrex::Real sign, F &&w) noexcept
Definition: ERF_SedimentationFlux.H:74
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
constexpr amrex::Real wdm6_literal(double d)
Definition: ERF_WDM6.H:98
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real wdm6_theta_from_temperature_and_pressure(const amrex::Real temperature, const amrex::Real pressure, const amrex::Real configured_rdOcp, const bool use_anelastic_reference_pressure) noexcept
Definition: ERF_WDM6.H:83
void mp_wdm6_run_c(double *t, double *qv, double *qc, double *qi, double *qr, double *qs, double *qg, double *nn, double *nc, double *nr, double *den, double *p, double *delz, double delt, double g, double cpd, double cpv, double rd, double rv, double t0c, double ep1, double ep2, double qmin, double xls, double xlv0, double xlf0, double den0, double denr, double cliq, double cice, double psat, double ccn0, double *xland, double *rain, double *rainncv, double *sr, double *snow, double *snowncv, double *graupel, double *graupelncv, double *rainonly, double *snowonly, int ims, int ime, int jms, int jme, int kms, int kme, int its, int ite, int jts, int jte, int kts, int kte, int microphysics_debug, int diag_i_dbg, int diag_j_dbg)
void mp_wdm6_init_c(double den0, double denr, double dens, double cl, double cpv, double ccn0, int hail_opt)
bool boxes_span_domain() const
True when every box spans the domain in z (required by the Fortran bridges)
Definition: ERF_MicrophysicsColumns.H:44
bool m_use_anelastic_reference_pressure
Definition: ERF_NullMoist.H:191
amrex::Real m_precs2
Definition: ERF_WDM6.H:336
static constexpr amrex::Real ncmin
Definition: ERF_WDM6.H:195
static constexpr amrex::Real qcrmin
Definition: ERF_WDM6.H:194
amrex::Real m_pidn0g
Definition: ERF_WDM6.H:340
amrex::Real m_precr2
Definition: ERF_WDM6.H:332
bool m_hail_opt
Definition: ERF_WDM6.H:319
static constexpr amrex::Real nrmin
Definition: ERF_WDM6.H:196
amrex::Real m_pvtrn
Definition: ERF_WDM6.H:331
amrex::Real m_rslopecmax
Definition: ERF_WDM6.H:341
static constexpr amrex::Real lamdarmax
Definition: ERF_WDM6.H:185
amrex::Real m_pidn0s
Definition: ERF_WDM6.H:337
amrex::Real m_qc1
Definition: ERF_WDM6.H:326
static constexpr amrex::Real di100
Definition: ERF_WDM6.H:208
amrex::Real m_pvts
Definition: ERF_WDM6.H:336
static constexpr amrex::Real pfrz1
Definition: ERF_WDM6.H:192
amrex::Real m_rslopec3max
Definition: ERF_WDM6.H:341
static constexpr amrex::Real dicon
Definition: ERF_WDM6.H:190
amrex::Real m_pvtr
Definition: ERF_WDM6.H:331
amrex::Real m_rslopegmax
Definition: ERF_WDM6.H:342
static constexpr amrex::Real bvtr
Definition: ERF_WDM6.H:176
amrex::Real m_rslopesmax
Definition: ERF_WDM6.H:342
amrex::Real m_pvtg
Definition: ERF_WDM6.H:340
static constexpr amrex::Real lamdacmax
Definition: ERF_WDM6.H:188
static constexpr amrex::Real alpha_wdm6
Definition: ERF_WDM6.H:202
amrex::Real m_pi_wdm6
Definition: ERF_WDM6.H:325
amrex::Real m_rslopes2max
Definition: ERF_WDM6.H:344
amrex::Real m_rslopegbmax
Definition: ERF_WDM6.H:343
amrex::Real m_rslopes3max
Definition: ERF_WDM6.H:345
amrex::Real m_qck1
Definition: ERF_WDM6.H:326
amrex::Real m_rdOcp
Definition: ERF_WDM6.H:300
static constexpr amrex::Real qs0
Definition: ERF_WDM6.H:199
amrex::Real m_rslopeg2max
Definition: ERF_WDM6.H:344
static constexpr amrex::Real n0s
Definition: ERF_WDM6.H:201
amrex::Real m_rslopesbmax
Definition: ERF_WDM6.H:343
amrex::Geometry m_geom
Definition: ERF_WDM6.H:293
static constexpr amrex::Real di2000
Definition: ERF_WDM6.H:210
amrex::Real m_precg1
Definition: ERF_WDM6.H:340
amrex::Real m_rsloperbmax
Definition: ERF_WDM6.H:343
amrex::Real m_precr1
Definition: ERF_WDM6.H:332
static constexpr amrex::Real di82
Definition: ERF_WDM6.H:211
amrex::Real m_g7pbr
Definition: ERF_WDM6.H:329
static constexpr amrex::Real actr
Definition: ERF_WDM6.H:205
static constexpr amrex::Real lamdarmin
Definition: ERF_WDM6.H:186
static constexpr amrex::Real lamdacmin
Definition: ERF_WDM6.H:189
amrex::Real m_ccn0
Definition: ERF_WDM6.H:296
amrex::Real m_pidnc
Definition: ERF_WDM6.H:326
amrex::Real m_qc0
Definition: ERF_WDM6.H:326
amrex::Real m_bvtg
Definition: ERF_WDM6.H:320
amrex::Real m_rsloper3max
Definition: ERF_WDM6.H:345
amrex::Real m_rslopeg3max
Definition: ERF_WDM6.H:345
amrex::Real m_pidnr
Definition: ERF_WDM6.H:333
amrex::Real m_g4pbr
Definition: ERF_WDM6.H:329
static constexpr amrex::Real bvts
Definition: ERF_WDM6.H:184
amrex::Real m_n0g
Definition: ERF_WDM6.H:320
static constexpr amrex::Real di600
Definition: ERF_WDM6.H:209
amrex::Real m_precg2
Definition: ERF_WDM6.H:340
amrex::Real m_rslopermax
Definition: ERF_WDM6.H:342
static constexpr amrex::Real ncrk2
Definition: ERF_WDM6.H:207
amrex::Real m_xlv1
Definition: ERF_WDM6.H:325
amrex::Real m_pacrg
Definition: ERF_WDM6.H:340
static constexpr amrex::Real ncrk1
Definition: ERF_WDM6.H:206
static constexpr amrex::Real avtr
Definition: ERF_WDM6.H:175
amrex::Real m_pacrc
Definition: ERF_WDM6.H:337
amrex::Real m_roqimax
Definition: ERF_WDM6.H:332
static constexpr amrex::Real dimax
Definition: ERF_WDM6.H:191
static constexpr amrex::Real actk
Definition: ERF_WDM6.H:204
static constexpr amrex::Real pfrz2
Definition: ERF_WDM6.H:193
amrex::Real m_precs1
Definition: ERF_WDM6.H:336
static constexpr amrex::Real satmax
Definition: ERF_WDM6.H:203
static constexpr amrex::Real n0smax
Definition: ERF_WDM6.H:200
amrex::Real m_rsloper2max
Definition: ERF_WDM6.H:344
amrex::Real m_rslopec2max
Definition: ERF_WDM6.H:341
@ xlf
Definition: ERF_AdvanceMorrison.cpp:159
@ qr
Definition: ERF_WDM6.H:30
@ qv
Definition: ERF_WDM6.H:27
@ qc
Definition: ERF_WDM6.H:28
@ qi
Definition: ERF_WDM6.H:29
@ rain_accum
Definition: ERF_WDM6.H:36
@ pres
Definition: ERF_WDM6.H:26
@ nr
Definition: ERF_WDM6.H:35
@ graupel_accum
Definition: ERF_WDM6.H:38
@ qg
Definition: ERF_WDM6.H:32
@ theta
Definition: ERF_WDM6.H:24
@ qs
Definition: ERF_WDM6.H:31
@ nc
Definition: ERF_WDM6.H:34
@ precip_accum
Definition: ERF_WDM6.H:39
@ nn
Definition: ERF_WDM6.H:33
@ rho
Definition: ERF_WDM6.H:23
@ tabs
Definition: ERF_WDM6.H:25
@ snow_accum
Definition: ERF_WDM6.H:37
@ tk
Definition: ERF_AdvanceWDM6.cpp:273
@ work_col
Definition: ERF_AdvanceWDM6.cpp:273
@ den
Definition: ERF_AdvanceWDM6.cpp:273
@ denfac
Definition: ERF_AdvanceWDM6.cpp:273
@ rq2_col
Definition: ERF_AdvanceWDM6.cpp:273
@ rq_col
Definition: ERF_AdvanceWDM6.cpp:273
@ NumComps
Definition: ERF_AdvanceWDM6.cpp:273
@ dz
Definition: ERF_AdvanceWDM6.cpp:273
@ NumComps
Definition: ERF_AdvanceWDM6.cpp:277
@ qr
Definition: ERF_WDM6.H:112
@ qs
Definition: ERF_WDM6.H:112
@ nr
Definition: ERF_WDM6.H:112
@ NumComps
Definition: ERF_WDM6.H:112
@ qg
Definition: ERF_WDM6.H:112
@ qi
Definition: ERF_WDM6.H:112
@ fall_s
Definition: ERF_WSM6.H:368
@ n0sfac
Definition: ERF_WSM6.H:354
@ work2
Definition: ERF_WSM6.H:347
@ pcond
Definition: ERF_WSM6.H:317
@ qsum
Definition: ERF_WSM6.H:344
@ psmlt
Definition: ERF_WSM6.H:338
@ fall_g
Definition: ERF_WSM6.H:368
@ work1c
Definition: ERF_WSM6.H:307
@ pgmlt
Definition: ERF_WSM6.H:339
@ rhi
Definition: ERF_WSM6.H:360
@ fall_r
Definition: ERF_WSM6.H:368
@ xni
Definition: ERF_WSM6.H:349
real(c_double), parameter cice
Definition: ERF_module_model_constants.F90:30
real(c_double), parameter g
Definition: ERF_module_model_constants.F90:19
real(c_double), parameter cliq
Definition: ERF_module_model_constants.F90:29
real(c_double), parameter xlv0
Definition: ERF_module_model_constants.F90:51
real(c_double), parameter cpv
Definition: ERF_module_model_constants.F90:26
real(c_double), parameter xls
Definition: ERF_module_model_constants.F90:56
real(c_double), parameter psat
Definition: ERF_module_model_constants.F90:31
real(kind=kind_phys), parameter, private dens
Definition: ERF_module_mp_wdm6.F90:61