661 #ifdef ERF_USE_WDM6_FORT
662 static int call_count = 0;
664 [[maybe_unused]]
const bool first_call = (call_count == 1);
667 static bool wdm6_inited =
false;
669 constexpr
double den0 = 1.28;
670 constexpr
double denr =
static_cast<double>(
rhoh2o);
671 constexpr
double dens =
static_cast<double>(
rhos);
672 constexpr
double cl =
static_cast<double>(
Cp_l);
673 constexpr
double cpv =
static_cast<double>(
Cp_v);
674 const double ccn0 =
static_cast<double>(
m_ccn0);
684 amrex::Print() <<
"WDM6 Fortran bridge initialized\n";
689 int microphysics_debug = 0;
690 std::vector<int> micro_diag_target_column;
692 amrex::ParmParse
pp(
"erf");
693 pp.queryAdd(
"microphysics_debug", microphysics_debug);
694 pp.queryarr(
"micro_diag_target_column", micro_diag_target_column);
696 microphysics_debug = std::max(0, std::min(2, microphysics_debug));
697 #ifdef ERF_USE_WDM6_FORT
698 bool use_wdm6_cpp_answer =
false;
700 amrex::ParmParse
pp(
"erf");
701 pp.queryAdd(
"use_wdm6_cpp_answer", use_wdm6_cpp_answer);
703 const bool run_wdm6_fort = !use_wdm6_cpp_answer;
707 [[maybe_unused]] constexpr
double g =
static_cast<double>(
CONST_GRAV);
708 constexpr
double cpd =
static_cast<double>(
Cp_d);
709 constexpr
double cpv =
static_cast<double>(
Cp_v);
710 [[maybe_unused]] constexpr
double rd =
static_cast<double>(
R_d);
711 constexpr
double rv =
static_cast<double>(
R_v);
712 constexpr
double t0c = 273.15;
713 [[maybe_unused]] constexpr
double ep1 =
static_cast<double>(
R_v /
R_d -
one);
714 constexpr
double ep2 =
static_cast<double>(
R_d /
R_v);
715 constexpr
double qmin = 1.0e-12;
716 constexpr
double xls =
static_cast<double>(
lsub);
717 constexpr
double xlv0 =
static_cast<double>(
lat_vap);
718 constexpr
double xlf0 =
static_cast<double>(
lat_ice);
719 constexpr
double den0 = 1.28;
720 constexpr
double denr =
static_cast<double>(
rhoh2o);
721 constexpr
double dens =
static_cast<double>(
rhos);
722 constexpr
double cliq =
static_cast<double>(
Cp_l);
723 constexpr
double cice = 2106.0;
724 constexpr
double psat = 610.78;
727 amrex::ignore_unused(
g, rd, ep1);
728 [[maybe_unused]]
const double ccn0 =
static_cast<double>(
m_ccn0);
731 const Box box = mfi.tilebox();
732 const Box fab_box = mfi.fabbox();
751 const int ilo = box.smallEnd(0);
752 const int ihi = box.bigEnd(0);
753 const int jlo = box.smallEnd(1);
754 const int jhi = box.bigEnd(1);
755 const int klo = box.smallEnd(2);
756 const int khi = box.bigEnd(2);
758 [[maybe_unused]]
const int imlo = fab_box.smallEnd(0);
759 [[maybe_unused]]
const int imhi = fab_box.bigEnd(0);
760 [[maybe_unused]]
const int jmlo = fab_box.smallEnd(1);
761 [[maybe_unused]]
const int jmhi = fab_box.bigEnd(1);
762 [[maybe_unused]]
const int kmlo = fab_box.smallEnd(2);
763 [[maybe_unused]]
const int kmhi = fab_box.bigEnd(2);
764 const bool has_target_override = (micro_diag_target_column.size() == 2);
765 const int diag_i = has_target_override ? micro_diag_target_column[0] : ilo;
766 const int diag_j = has_target_override ? micro_diag_target_column[1] : jlo;
770 #if defined(ERF_USE_WDM6_FORT) && defined(AMREX_USE_GPU)
771 Arena*
Arena_Used = run_wdm6_fort ? The_Pinned_Arena() : The_Async_Arena();
776 #ifdef ERF_USE_WDM6_FORT
788 auto const& delz_arr = delz_fab.array();
789 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
790 delz_arr(i,j,k) = dz_val;
794 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
795 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
796 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
797 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
798 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
810 box2d.makeSlab(2,
klo);
811 Box fab_box2d(fab_box);
812 fab_box2d.makeSlab(2,
klo);
824 FArrayBox xland_fab(fab_box2d, 1,
Arena_Used);
825 auto const& xland_arr = xland_fab.array();
827 auto const& lmask_arr =
m_lmask->const_array(mfi);
828 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
829 xland_arr(i,j,k) = (lmask_arr(i,j,0) == 0) ?
Real(2.0) :
Real(1.0);
833 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
834 xland_arr(i,j,k) =
Real(1.0);
842 FArrayBox rainacc_fab(fab_box2d, 1,
Arena_Used);
843 FArrayBox rainncv_fab(fab_box2d, 1,
Arena_Used);
845 FArrayBox snowacc_fab(fab_box2d, 1,
Arena_Used);
846 FArrayBox snowncv_fab(fab_box2d, 1,
Arena_Used);
847 FArrayBox graupacc_fab(fab_box2d, 1,
Arena_Used);
848 FArrayBox graupelncv_fab(fab_box2d, 1,
Arena_Used);
850 auto const& rainacc_arr = rainacc_fab.array();
851 auto const& rainncv_arr = rainncv_fab.array();
852 auto const& sr_arr = sr_fab.array();
853 auto const& snowacc_arr = snowacc_fab.array();
854 auto const& snowncv_arr = snowncv_fab.array();
855 auto const& graupacc_arr = graupacc_fab.array();
856 auto const& graupelncv_arr = graupelncv_fab.array();
860 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
861 rainacc_arr(i,j,k) =
Real(0.0);
862 rainncv_arr(i,j,k) =
Real(0.0);
863 sr_arr(i,j,k) =
Real(0.0);
864 snowacc_arr(i,j,k) =
Real(0.0);
865 snowncv_arr(i,j,k) =
Real(0.0);
866 graupacc_arr(i,j,k) =
Real(0.0);
867 graupelncv_arr(i,j,k) =
Real(0.0);
877 Gpu::streamSynchronize();
882 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
883 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
884 nn_arr.dataPtr(), nc_arr.dataPtr(), nr_arr.dataPtr(),
885 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
886 static_cast<double>(dt_advance),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
888 ccn0, xland_arr.dataPtr(),
889 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
890 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
891 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
892 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
893 ilo, ihi, jlo, jhi,
klo,
khi,
894 microphysics_debug, diag_i, diag_j);
903 const bool use_anelastic_reference_pressure =
905 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
910 t_arr(i,j,k), p_arr(i,j,k), configured_rdOcp,
911 use_anelastic_reference_pressure);
917 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
918 rain_arr(i,j,k) += rainacc_arr(i,j,k);
919 snow_arr(i,j,k) += snowacc_arr(i,j,k);
920 graup_arr(i,j,k) += graupacc_arr(i,j,k);
939 FArrayBox rslopec2_fab(fab_box,1,
Arena_Used);
940 FArrayBox rslopec3_fab(fab_box,1,
Arena_Used);
954 Box box2d(IntVect(ilo,jlo,
klo), IntVect(ihi,jhi,
klo));
966 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1012 FArrayBox act_ratio_fab(fab_box,1,
Arena_Used);
1013 FArrayBox act_fraction_fab(fab_box,1,
Arena_Used);
1014 FArrayBox act_raw_fab(fab_box,1,
Arena_Used);
1015 FArrayBox act_cap_fab(fab_box,1,
Arena_Used);
1020 FArrayBox qrs_tmp_fab(fab_box,3,
Arena_Used);
1021 FArrayBox ncr_tmp_fab(fab_box,1,
Arena_Used);
1031 auto const& delz_arr = delz_fab.array();
1032 auto const& denfac_arr = denfac_fab.array();
1033 auto const& xni_arr = xni_fab.array();
1034 auto const& rslopec_arr = rslopec_fab.array();
1035 auto const& rslopec2_arr = rslopec2_fab.array();
1036 auto const& rslopec3_arr = rslopec3_fab.array();
1037 auto const& rslope_arr = rslope_fab.array();
1038 auto const& rslopeb_arr = rslopeb_fab.array();
1039 auto const& rslope2_arr = rslope2_fab.array();
1040 auto const& rslope3_arr = rslope3_fab.array();
1041 auto const& work1_arr = work1_fab.array();
1042 auto const& workn_arr = workn_fab.array();
1043 auto const& work2_arr = work2_fab.array();
1044 auto const& mstep_arr = mstep_fab.array();
1045 auto const& numdt_arr = numdt_fab.array();
1046 auto const& sr_arr = sr_fab.array();
1047 auto const& cpm_arr = cpm_fab.array();
1048 auto const& xl_arr = xl_fab.array();
1049 auto const& qsatw_arr = qsatw_fab.array();
1050 auto const& qsati_arr = qsati_fab.array();
1051 auto const& rhw_arr = rhw_fab.array();
1052 auto const& rhi_arr = rhi_fab.array();
1053 auto const& qcr_arr = qcr_fab.array();
1054 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1055 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1056 auto const& praut_arr = praut_fab.array();
1057 auto const& pracw_arr = pracw_fab.array();
1058 auto const& prevp_arr = prevp_fab.array();
1059 auto const& pidep_arr = pidep_fab.array();
1060 auto const& psdep_arr = psdep_fab.array();
1061 auto const& pgdep_arr = pgdep_fab.array();
1062 auto const& pigen_arr = pigen_fab.array();
1063 auto const& psaut_arr = psaut_fab.array();
1064 auto const& pgaut_arr = pgaut_fab.array();
1065 auto const& pcact_arr = pcact_fab.array();
1066 auto const& pcond_arr = pcond_fab.array();
1067 auto const& praci_arr = praci_fab.array();
1068 auto const& piacr_arr = piacr_fab.array();
1069 auto const& niacr_arr = niacr_fab.array();
1070 auto const& psaci_arr = psaci_fab.array();
1071 auto const& pgaci_arr = pgaci_fab.array();
1072 auto const& psacw_arr = psacw_fab.array();
1073 auto const& nsacw_arr = nsacw_fab.array();
1074 auto const& pgacw_arr = pgacw_fab.array();
1075 auto const& ngacw_arr = ngacw_fab.array();
1076 auto const& paacw_arr = paacw_fab.array();
1077 auto const& naacw_arr = naacw_fab.array();
1078 auto const& pracs_arr = pracs_fab.array();
1079 auto const& psacr_arr = psacr_fab.array();
1080 auto const& nsacr_arr = nsacr_fab.array();
1081 auto const& pgacr_arr = pgacr_fab.array();
1082 auto const& ngacr_arr = ngacr_fab.array();
1083 auto const& pgacs_arr = pgacs_fab.array();
1084 auto const& pseml_arr = pseml_fab.array();
1085 auto const& nseml_arr = nseml_fab.array();
1086 auto const& pgeml_arr = pgeml_fab.array();
1087 auto const& ngeml_arr = ngeml_fab.array();
1088 auto const& psevp_arr = psevp_fab.array();
1089 auto const& pgevp_arr = pgevp_fab.array();
1090 auto const& ncauto_arr = ncauto_fab.array();
1091 auto const& ncaccr_arr = ncaccr_fab.array();
1092 auto const& nrauto_arr = nrauto_fab.array();
1093 auto const& nraccr_arr = nraccr_fab.array();
1094 auto const& nrevp_arr = nrevp_fab.array();
1095 auto const& ncact_arr = ncact_fab.array();
1096 auto const& act_ratio_arr = act_ratio_fab.array();
1097 auto const& act_fraction_arr = act_fraction_fab.array();
1098 auto const& act_raw_arr = act_raw_fab.array();
1099 auto const& act_cap_arr = act_cap_fab.array();
1100 auto const& nccol_arr = nccol_fab.array();
1101 auto const& nrcol_arr = nrcol_fab.array();
1102 auto const& qrs_tmp_arr = qrs_tmp_fab.array();
1103 auto const& ncr_tmp_arr = ncr_tmp_fab.array();
1104 auto const& avedia_arr = avedia_fab.array();
1107 auto const& work1c_arr = work1c_fab.array();
1108 auto const& fallc_arr = fallc_fab.array();
1109 auto const& delqi_arr = delqi_fab.array();
1112 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1113 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
1114 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
1115 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
1116 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
1117 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1118 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1119 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1120 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1121 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1124 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k),
Real(0.0));
1125 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k),
Real(0.0));
1135 nn_arr(i,j,k) = amrex::min(amrex::max(nn_arr(i,j,k),
wdm6_literal(1.0e8)),
1141 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1147 const int wdm6_loops = std::max(
1148 static_cast<int>(std::round(dt_advance /
Real(120.0))), 1);
1149 const Real dtcld = dt_advance /
static_cast<Real>(wdm6_loops);
1193 const int diag_k =
klo;
1203 auto const& lmask_arr =
m_lmask->const_array(mfi);
1204 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1205 qcr_arr(i,j,k) = (lmask_arr(i,j,0) == 0) ? qc0_loc : qc1_loc;
1209 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1210 qcr_arr(i,j,k) = qc1_loc;
1214 for (
int loop = 0; loop < wdm6_loops; ++loop) {
1219 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1220 denfac_arr(i,j,k) = std::sqrt(
Real(den0) / den_arr(i,j,k));
1233 const Real xai = -dldti /
Real(rv);
1237 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1238 const Real tr = ttp / t_arr(i,j,k);
1241 Real qsw =
Real(
psat) * std::exp(std::log(tr) * xa) * std::exp(xb * (
Real(1.0) - tr));
1242 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
1243 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
1244 qsw = amrex::max(qsw,
Real(qmin));
1245 qsatw_arr(i,j,k) = qsw;
1246 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsw,
Real(qmin));
1249 Real qsi = (t_arr(i,j,k) < ttp)
1250 ?
Real(
psat) * std::exp(std::log(tr) * xai) * std::exp(xbi * (
Real(1.0) - tr))
1251 :
Real(
psat) * std::exp(std::log(tr) * xa) * std::exp(xb * (
Real(1.0) - tr));
1252 qsi = amrex::min(qsi,
wdm6_literal(0.99) * p_arr(i,j,k));
1253 qsi =
Real(ep2) * qsi / (p_arr(i,j,k) - qsi);
1254 qsi = amrex::max(qsi,
Real(qmin));
1255 qsati_arr(i,j,k) = qsi;
1256 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsi,
Real(qmin));
1265 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1266 praut_arr(i,j,k) =
Real(0.0);
1267 pracw_arr(i,j,k) =
Real(0.0);
1268 prevp_arr(i,j,k) =
Real(0.0);
1269 pidep_arr(i,j,k) =
Real(0.0);
1270 psdep_arr(i,j,k) =
Real(0.0);
1271 pgdep_arr(i,j,k) =
Real(0.0);
1272 pigen_arr(i,j,k) =
Real(0.0);
1273 psaut_arr(i,j,k) =
Real(0.0);
1274 pgaut_arr(i,j,k) =
Real(0.0);
1275 pcact_arr(i,j,k) =
Real(0.0);
1276 pcond_arr(i,j,k) =
Real(0.0);
1277 praci_arr(i,j,k) =
Real(0.0);
1278 piacr_arr(i,j,k) =
Real(0.0);
1279 niacr_arr(i,j,k) =
Real(0.0);
1280 psaci_arr(i,j,k) =
Real(0.0);
1281 pgaci_arr(i,j,k) =
Real(0.0);
1282 psacw_arr(i,j,k) =
Real(0.0);
1283 nsacw_arr(i,j,k) =
Real(0.0);
1284 pgacw_arr(i,j,k) =
Real(0.0);
1285 ngacw_arr(i,j,k) =
Real(0.0);
1286 paacw_arr(i,j,k) =
Real(0.0);
1287 naacw_arr(i,j,k) =
Real(0.0);
1288 pracs_arr(i,j,k) =
Real(0.0);
1289 psacr_arr(i,j,k) =
Real(0.0);
1290 nsacr_arr(i,j,k) =
Real(0.0);
1291 pgacr_arr(i,j,k) =
Real(0.0);
1292 ngacr_arr(i,j,k) =
Real(0.0);
1293 pgacs_arr(i,j,k) =
Real(0.0);
1294 pseml_arr(i,j,k) =
Real(0.0);
1295 nseml_arr(i,j,k) =
Real(0.0);
1296 pgeml_arr(i,j,k) =
Real(0.0);
1297 ngeml_arr(i,j,k) =
Real(0.0);
1298 psevp_arr(i,j,k) =
Real(0.0);
1299 pgevp_arr(i,j,k) =
Real(0.0);
1300 ncauto_arr(i,j,k) =
Real(0.0);
1301 ncaccr_arr(i,j,k) =
Real(0.0);
1302 nrauto_arr(i,j,k) =
Real(0.0);
1303 nraccr_arr(i,j,k) =
Real(0.0);
1304 nrevp_arr(i,j,k) =
Real(0.0);
1305 ncact_arr(i,j,k) =
Real(0.0);
1306 act_ratio_arr(i,j,k) =
Real(0.0);
1307 act_fraction_arr(i,j,k) =
Real(0.0);
1308 act_raw_arr(i,j,k) =
Real(0.0);
1309 act_cap_arr(i,j,k) =
Real(0.0);
1310 nccol_arr(i,j,k) =
Real(0.0);
1311 nrcol_arr(i,j,k) =
Real(0.0);
1321 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1322 if (qc_arr(i,j,k) <=
Real(qmin) || nc_arr(i,j,k) <=
Real(1.e1)) {
1323 rslopec_arr(i,j,k) = rslopecmax_loc;
1324 rslopec2_arr(i,j,k) = rslopec2max_loc;
1325 rslopec3_arr(i,j,k) = rslopec3max_loc;
1328 nc_arr(i,j,k), pidnc_loc);
1329 rslopec2_arr(i,j,k) = rslopec_arr(i,j,k) * rslopec_arr(i,j,k);
1330 rslopec3_arr(i,j,k) = rslopec2_arr(i,j,k) * rslopec_arr(i,j,k);
1340 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1341 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
1342 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
1343 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
1345 wdm6_slope_rain_cell(qr_arr(i,j,k), nr_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1347 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
1348 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1349 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1351 wdm6_slope_snow_cell(qs_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k), t_arr(i,j,k),
1354 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
1356 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
1360 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
1361 slope_bvtg_loc, pvtg_loc,
1362 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
1364 rslope_arr(i,j,k,0) = rain_rslope;
1365 rslope_arr(i,j,k,1) = snow_rslope;
1366 rslope_arr(i,j,k,2) = graup_rslope;
1367 rslopeb_arr(i,j,k,0) = rain_rslopeb;
1368 rslopeb_arr(i,j,k,1) = snow_rslopeb;
1369 rslopeb_arr(i,j,k,2) = graup_rslopeb;
1370 rslope2_arr(i,j,k,0) = rain_rslope2;
1371 rslope2_arr(i,j,k,1) = snow_rslope2;
1372 rslope2_arr(i,j,k,2) = graup_rslope2;
1373 rslope3_arr(i,j,k,0) = rain_rslope3;
1374 rslope3_arr(i,j,k,1) = snow_rslope3;
1375 rslope3_arr(i,j,k,2) = graup_rslope3;
1376 work1_arr(i,j,k,0) = rain_vt;
1377 work1_arr(i,j,k,1) = snow_vt;
1378 work1_arr(i,j,k,2) = graup_vt;
1379 workn_arr(i,j,k) = rain_vtn;
1386 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1387 mstep_arr(i,j,k) = 1;
1388 numdt_arr(i,j,k) = 1;
1389 sr_arr(i,j,k) =
Real(0.0);
1391 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1394 for (
int kk =
khi; kk >=
klo; --kk) {
1395 work1_arr(i,j,kk,0) = work1_arr(i,j,kk,0) / delz_arr(i,j,kk);
1396 workn_arr(i,j,kk) = workn_arr(i,j,kk) / delz_arr(i,j,kk);
1397 numdt_loc = amrex::max(
static_cast<int>(amrex::max(work1_arr(i,j,kk,0),
1398 workn_arr(i,j,kk)) * dtcld +
Real(0.5)),
1400 if (numdt_loc >= mstep_loc) {
1401 mstep_loc = numdt_loc;
1404 mstep_arr(i,j,k) = mstep_loc;
1405 numdt_arr(i,j,k) = numdt_loc;
1407 ReduceOps<ReduceOpMax> reduce_op;
1408 ReduceData<int> reduce_data(reduce_op);
1409 reduce_op.eval(box2d, reduce_data,
1410 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) -> GpuTuple<int> {
1411 return {mstep_arr(i,j,k)};
1413 int mstepmax = amrex::get<0>(reduce_data.value());
1414 amrex::ignore_unused(mstepmax);
1421 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1422 amrex::ignore_unused(k);
1423 const int col_mstep = mstep_arr(i,j,
klo);
1424 for (
int n = 1; n <= mstepmax; ++n) {
1425 if (n > col_mstep) {
1429 const int kk_top =
khi;
1430 const Real top_flux_qr = den_arr(i,j,kk_top) * qr_arr(i,j,kk_top)
1431 * work1_arr(i,j,kk_top,0) /
static_cast<Real>(col_mstep);
1432 const Real top_flux_nr = nr_arr(i,j,kk_top)
1433 * workn_arr(i,j,kk_top) /
static_cast<Real>(col_mstep);
1435 qr_arr(i,j,kk_top) = amrex::max(
1436 qr_arr(i,j,kk_top) - top_flux_qr * dtcld / den_arr(i,j,kk_top),
1438 nr_arr(i,j,kk_top) = amrex::max(
1439 nr_arr(i,j,kk_top) - top_flux_nr * dtcld,
1442 Real flux_qr_above = top_flux_qr;
1443 Real flux_nr_above = top_flux_nr;
1444 for (
int kk =
khi - 1; kk >=
klo; --kk) {
1445 const Real flux_qr = den_arr(i,j,kk) * qr_arr(i,j,kk)
1446 * work1_arr(i,j,kk,0) /
static_cast<Real>(col_mstep);
1447 const Real flux_nr = nr_arr(i,j,kk)
1448 * workn_arr(i,j,kk) /
static_cast<Real>(col_mstep);
1450 const Real dqr_self = amrex::min(
1451 flux_qr * dtcld / den_arr(i,j,kk),
1453 const Real dqr_from_above = amrex::min(
1454 flux_qr_above * delz_arr(i,j,kk+1) / delz_arr(i,j,kk)
1455 * dtcld / den_arr(i,j,kk),
1457 const Real dnr_self = amrex::min(
1460 const Real dnr_from_above = amrex::min(
1461 flux_nr_above * delz_arr(i,j,kk+1) / delz_arr(i,j,kk)
1465 qr_arr(i,j,kk) = amrex::max(
1466 qr_arr(i,j,kk) - dqr_self + dqr_from_above,
1468 nr_arr(i,j,kk) = amrex::max(
1469 nr_arr(i,j,kk) - dnr_self + dnr_from_above,
1472 flux_qr_above = flux_qr;
1473 flux_nr_above = flux_nr;
1476 for (
int kk =
klo; kk <=
khi; ++kk) {
1477 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3;
1478 Real rain_vt, rain_vtn;
1480 qr_arr(i,j,kk), nr_arr(i,j,kk),
1481 den_arr(i,j,kk), denfac_arr(i,j,kk),
1483 rslopermax_loc, rsloperbmax_loc,
1484 rsloper2max_loc, rsloper3max_loc,
1485 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1486 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1488 rslope_arr(i,j,kk,0) = rain_rslope;
1489 rslopeb_arr(i,j,kk,0) = rain_rslopeb;
1490 rslope2_arr(i,j,kk,0) = rain_rslope2;
1491 rslope3_arr(i,j,kk,0) = rain_rslope3;
1492 work1_arr(i,j,kk,0) = rain_vt / delz_arr(i,j,kk);
1493 workn_arr(i,j,kk) = rain_vtn / delz_arr(i,j,kk);
1503 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1504 amrex::ignore_unused(k);
1505 const int km =
khi -
klo + 1;
1527 for (
int kk = 0; kk < km; ++kk) {
1528 const int k3 =
klo + kk;
1529 dz_col(kk) = delz_arr(i,j,k3);
1530 den_col(kk) = den_arr(i,j,k3);
1531 denfac_col(kk) = denfac_arr(i,j,k3);
1532 tk_col(kk) = t_arr(i,j,k3);
1533 rq_col(kk) = den_col(kk) * qs_arr(i,j,k3);
1534 rq2_col(kk) = den_col(kk) * qg_arr(i,j,k3);
1537 ? (work1_arr(i,j,k3,1) * qs_arr(i,j,k3) + work1_arr(i,j,k3,2) * qg_arr(i,j,k3)) /
qsum
1544 km, &delqrs2, &delqrs3, dtcld, 1,
1546 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
Real(
bvts), pvts_loc,
1547 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc, slope_bvtg_loc, pvtg_loc,
1548 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1550 for (
int kk = 0; kk < km; ++kk) {
1551 const int k3 =
klo + kk;
1552 qs_arr(i,j,k3) = amrex::max(
rq_col(kk) / den_col(kk),
Real(0.0));
1553 qg_arr(i,j,k3) = amrex::max(
rq2_col(kk) / den_col(kk),
Real(0.0));
1556 work1_arr(i,j,
klo,1) = delqrs2 / dz_col(0) / dtcld;
1557 work1_arr(i,j,
klo,2) = delqrs3 / dz_col(0) / dtcld;
1567 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1568 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
1569 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
1570 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
1571 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
1576 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1577 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
1578 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
1579 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
1582 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),
1584 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
1585 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1586 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1588 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),
1591 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
1593 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
1595 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
1597 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
1598 slope_bvtg_loc, pvtg_loc,
1599 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
1602 rslope_arr(i,j,k,0) = rain_rslope;
1603 rslope_arr(i,j,k,1) = snow_rslope;
1604 rslope_arr(i,j,k,2) = graup_rslope;
1605 rslopeb_arr(i,j,k,0) = rain_rslopeb;
1606 rslopeb_arr(i,j,k,1) = snow_rslopeb;
1607 rslopeb_arr(i,j,k,2) = graup_rslopeb;
1608 rslope2_arr(i,j,k,0) = rain_rslope2;
1609 rslope2_arr(i,j,k,1) = snow_rslope2;
1610 rslope2_arr(i,j,k,2) = graup_rslope2;
1611 rslope3_arr(i,j,k,0) = rain_rslope3;
1612 rslope3_arr(i,j,k,1) = snow_rslope3;
1613 rslope3_arr(i,j,k,2) = graup_rslope3;
1614 work1_arr(i,j,k,0) = rain_vt;
1615 work1_arr(i,j,k,1) = snow_vt;
1616 work1_arr(i,j,k,2) = graup_vt;
1617 workn_arr(i,j,k) = rain_vtn;
1628 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1630 if (t_arr(i,j,k) > t0c) {
1631 const Real supcol = t0c - t_arr(i,j,k);
1639 den_arr(i,j,k),
Real(den0));
1642 if (qs_arr(i,j,k) >
Real(0.0)) {
1643 const Real coeres_s = rslope2_arr(i,j,k,1) *
1644 std::sqrt(rslope_arr(i,j,k,1) * rslopeb_arr(i,j,k,1));
1647 (t0c - t_arr(i,j,k)) * pi_wdm6_loc *
Real(0.5) *
n0sfac *
1648 (precs1_loc * rslope2_arr(i,j,k,1) +
1649 precs2_loc *
work2 * coeres_s) / den_arr(i,j,k);
1651 psmlt = amrex::min(amrex::max(
psmlt * dtcld, -qs_arr(i,j,k)),
1657 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k) - sfac *
psmlt,
Real(0.0));
1660 qs_arr(i,j,k) +=
psmlt;
1661 qr_arr(i,j,k) -=
psmlt;
1662 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) *
psmlt;
1666 if (qg_arr(i,j,k) >
Real(0.0)) {
1667 const Real coeres_g = rslope2_arr(i,j,k,2) *
1668 std::sqrt(rslope_arr(i,j,k,2) * rslopeb_arr(i,j,k,2));
1671 (t0c - t_arr(i,j,k)) *
1672 (precg1_loc * rslope2_arr(i,j,k,2) +
1673 precg2_loc *
work2 * coeres_g) / den_arr(i,j,k);
1675 pgmlt = amrex::min(amrex::max(
pgmlt * dtcld, -qg_arr(i,j,k)),
1679 const Real gfac = rslope_arr(i,j,k,2) * n0g_loc /
1681 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k) - gfac *
pgmlt,
Real(0.0));
1684 qg_arr(i,j,k) +=
pgmlt;
1685 qr_arr(i,j,k) -=
pgmlt;
1686 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) *
pgmlt;
1715 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1717 if (qi_arr(i,j,k) >
Real(0.0)) {
1718 const Real xni_safe = amrex::max(xni_arr(i,j,k),
Real(1.0e-30));
1719 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) / xni_safe;
1720 const Real diameter = amrex::max(amrex::min(dicon_loc * std::sqrt(xmi), dimax_loc),
1724 work1c_arr(i,j,k) =
work1c;
1728 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1729 amrex::ignore_unused(k);
1730 const int km =
khi -
klo + 1;
1754 for (
int kk = 0; kk < km; ++kk) {
1755 const int k3 =
klo + kk;
1756 dz_col(kk) = delz_arr(i,j,k3);
1757 den_col(kk) = den_arr(i,j,k3);
1758 denfac_col(kk) = denfac_arr(i,j,k3);
1759 tk_col(kk) = t_arr(i,j,k3);
1761 rq_col(kk) = den_col(kk) * qi_arr(i,j,k3);
1762 rq2_col(kk) = den_col(kk) * qi_arr(i,j,k3);
1783 km, &delqi_col, &delqi2_col, dtcld, 0,
1785 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
Real(
bvts), pvts_loc,
1786 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc, slope_bvtg_loc, pvtg_loc,
1787 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1790 for (
int kk = 0; kk < km; ++kk) {
1791 const int k3 =
klo + kk;
1792 qi_arr(i,j,k3) = amrex::max(
rq_col(kk) / den_col(kk),
Real(0.0));
1799 fallc_arr(i,j,
klo) = delqi_col / dz_col(0) / dtcld;
1800 delqi_arr(i,j,
klo) = delqi_col;
1809 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) noexcept
1814 const Real fall_c = fallc_arr(i,j,
klo);
1822 if (fallsum >
Real(0.0)) {
1823 rain_arr(i,j,
klo) += fallsum * conv;
1826 if (fallsum_qsi >
Real(0.0)) {
1827 snow_arr(i,j,
klo) += fallsum_qsi * conv;
1830 if (fallsum_qg >
Real(0.0)) {
1831 graup_arr(i,j,
klo) += fallsum_qg * conv;
1834 if (fallsum >
Real(0.0)) {
1835 sr_arr(i,j,
klo) = (snow_arr(i,j,
klo) + graup_arr(i,j,
klo))
1872 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1873 const Real supcol = t0c - t_arr(i,j,k);
1875 if (supcol <
Real(0.0))
xlf = xlf0;
1878 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
1879 const Real qim = qi_arr(i,j,k);
1881 qc_arr(i,j,k) += qim;
1882 if (qim >
Real(qmin)) {
1883 nc_arr(i,j,k) += xni_arr(i,j,k);
1885 t_arr(i,j,k) -=
xlf / cpm_arr(i,j,k) * qim;
1886 qi_arr(i,j,k) =
Real(0.0);
1898 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
1899 const Real qc_old = qc_arr(i,j,k);
1901 qi_arr(i,j,k) += qc_old;
1903 if (nc_arr(i,j,k) >
Real(0.0)) {
1904 nc_arr(i,j,k) =
Real(0.0);
1907 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * qc_old;
1908 qc_arr(i,j,k) =
Real(0.0);
1923 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
1924 const Real supcolt = amrex::min(supcol,
Real(70.0));
1925 const Real expterm = std::exp(pfrz2_loc * supcolt) -
Real(1.0);
1930 const Real rs3 = rslopec3_arr(i,j,k);
1940 Real pfrzdtc = pi_wdm6_loc * pi_wdm6_loc * pfrz1_loc * expterm
1941 * denr / den_arr(i,j,k) * nc_arr(i,j,k) * rs3 * rs3
1942 /
Real(18.0) * dtcld;
1943 pfrzdtc = amrex::min(pfrzdtc, qc_arr(i,j,k));
1947 Real nfrzdtc = pi_wdm6_loc * pfrz1_loc * expterm
1948 * nc_arr(i,j,k) * rs3
1949 /
Real(6.0) * dtcld;
1950 nfrzdtc = amrex::min(nfrzdtc, nc_arr(i,j,k));
1954 nc_arr(i,j,k) -= nfrzdtc;
1958 qi_arr(i,j,k) += pfrzdtc;
1959 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * pfrzdtc;
1960 qc_arr(i,j,k) -= pfrzdtc;
1972 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
1973 const Real supcolt = amrex::min(supcol,
Real(70.0));
1974 const Real expterm = std::exp(pfrz2_loc * supcolt) -
Real(1.0);
1977 const Real rs3 = rslope3_arr(i,j,k,0);
1982 Real pfrzdtr =
Real(140.0) * (pi_wdm6_loc * pi_wdm6_loc)
1983 * pfrz1_loc * nr_arr(i,j,k)
1984 * denr / den_arr(i,j,k)
1985 * expterm * rs3 * rs3 * dtcld;
1986 pfrzdtr = amrex::min(pfrzdtr, qr_arr(i,j,k));
1991 Real nfrzdtr =
Real(4.0) * pi_wdm6_loc * pfrz1_loc
1992 * nr_arr(i,j,k) * expterm * rs3 * dtcld;
1993 nfrzdtr = amrex::min(nfrzdtr, nr_arr(i,j,k));
1994 nr_arr(i,j,k) -= nfrzdtr;
1998 qg_arr(i,j,k) += pfrzdtr;
1999 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * pfrzdtr;
2000 qr_arr(i,j,k) -= pfrzdtr;
2009 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2010 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k),
Real(0.0));
2011 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k),
Real(0.0));
2021 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2022 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
2023 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
2024 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
2025 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
2029 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2030 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
2031 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
2032 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
2035 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),
2037 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
2038 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
2039 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
2041 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),
2044 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
2046 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
2048 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
2050 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
2051 slope_bvtg_loc, pvtg_loc,
2052 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
2055 rslope_arr(i,j,k,0) = rain_rslope;
2056 rslope_arr(i,j,k,1) = snow_rslope;
2057 rslope_arr(i,j,k,2) = graup_rslope;
2058 rslopeb_arr(i,j,k,0) = rain_rslopeb;
2059 rslopeb_arr(i,j,k,1) = snow_rslopeb;
2060 rslopeb_arr(i,j,k,2) = graup_rslopeb;
2061 rslope2_arr(i,j,k,0) = rain_rslope2;
2062 rslope2_arr(i,j,k,1) = snow_rslope2;
2063 rslope2_arr(i,j,k,2) = graup_rslope2;
2064 rslope3_arr(i,j,k,0) = rain_rslope3;
2065 rslope3_arr(i,j,k,1) = snow_rslope3;
2066 rslope3_arr(i,j,k,2) = graup_rslope3;
2067 work1_arr(i,j,k,0) = rain_vt;
2068 work1_arr(i,j,k,1) = snow_vt;
2069 work1_arr(i,j,k,2) = graup_vt;
2070 workn_arr(i,j,k) = rain_vtn;
2075 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2077 avedia_arr(i,j,k,1) = rslope_arr(i,j,k,0) * cbrt24;
2081 const Real qci_for_lamdac = qc_arr(i,j,k);
2082 const Real nc_for_lamdac = nc_arr(i,j,k);
2084 if (qci_for_lamdac <=
Real(qmin) || nc_for_lamdac <=
Real(
ncmin)) {
2085 rslopec_arr(i,j,k) = rslopecmax_loc;
2086 rslopec2_arr(i,j,k) = rslopec2max_loc;
2087 rslopec3_arr(i,j,k) = rslopec3max_loc;
2096 nc_for_lamdac, pidnc_loc);
2097 rslopec_arr(i,j,k) = rslc;
2098 rslopec2_arr(i,j,k) = rslc * rslc;
2099 rslopec3_arr(i,j,k) = rslopec2_arr(i,j,k) * rslc;
2103 avedia_arr(i,j,k,0) = rslopec_arr(i,j,k);
2110 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2112 if (i == diag_i && j == diag_j && k == diag_k) {
2114 work1_arr(i,j,k,0) =
wdm6_diffac(xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
2115 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
2116 if (i == diag_i && j == diag_j && k == diag_k) {
2118 if (i == diag_i && j == diag_j && k == diag_k) {
2120 work1_arr(i,j,k,1) =
wdm6_diffac(
Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
2121 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
2122 if (i == diag_i && j == diag_j && k == diag_k) {
2125 work2_arr(i,j,k) =
wdm6_venfac(p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
2131 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2132 const Real supsat = amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsatw_arr(i,j,k);
2133 const Real satdt = supsat / dtcld;
2135 * (
wdm6_literal(1.0e20/16.0) * rslopec2_arr(i,j,k) * rslopec2_arr(i,j,k)
2139 if (qc_arr(i,j,k) > qcr_arr(i,j,k) && nc_arr(i,j,k) >
Real(
ncmin)) {
2149 praut_arr(i,j,k) = qck1_loc * std::pow(qc_arr(i,j,k),
wdm6_literal(7.0/3.0))
2151 praut_arr(i,j,k) = amrex::min(praut_arr(i,j,k), qc_arr(i,j,k) / dtcld);
2153 nrauto_arr(i,j,k) =
Real(3.5e9) * den_arr(i,j,k) * praut_arr(i,j,k);
2154 if (qr_arr(i,j,k) > lenconcr) {
2155 nrauto_arr(i,j,k) = nr_arr(i,j,k) / qr_arr(i,j,k) * praut_arr(i,j,k);
2157 nrauto_arr(i,j,k) = amrex::min(nrauto_arr(i,j,k), nc_arr(i,j,k) / dtcld);
2160 if (qr_arr(i,j,k) >= lenconcr) {
2161 if (avedia_arr(i,j,k,1) >=
Real(
di100)) {
2162 nraccr_arr(i,j,k) = amrex::min(
2163 Real(
ncrk1) * nc_arr(i,j,k) * nr_arr(i,j,k)
2164 * (rslopec3_arr(i,j,k) +
Real(24.0) * rslope3_arr(i,j,k,0)),
2165 nc_arr(i,j,k) / dtcld);
2166 pracw_arr(i,j,k) = amrex::min(
2167 pi_wdm6_loc /
Real(6.0) * (
Real(denr) / den_arr(i,j,k))
2168 *
Real(
ncrk1) * nc_arr(i,j,k) * nr_arr(i,j,k)
2169 * rslopec3_arr(i,j,k)
2170 * (
Real(2.0) * rslopec3_arr(i,j,k) +
Real(24.0) * rslope3_arr(i,j,k,0)),
2171 qc_arr(i,j,k) / dtcld);
2173 nraccr_arr(i,j,k) = amrex::min(
2174 Real(
ncrk2) * nc_arr(i,j,k) * nr_arr(i,j,k)
2175 * (
Real(2.0) * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k)
2176 +
Real(5040.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0)),
2177 nc_arr(i,j,k) / dtcld);
2178 pracw_arr(i,j,k) = amrex::min(
2179 pi_wdm6_loc /
Real(6.0) * (
Real(denr) / den_arr(i,j,k))
2180 *
Real(
ncrk2) * nc_arr(i,j,k) * nr_arr(i,j,k)
2181 * rslopec3_arr(i,j,k)
2182 * (
Real(6.0) * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k)
2183 +
Real(5040.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0)),
2184 qc_arr(i,j,k) / dtcld);
2188 if (avedia_arr(i,j,k,0) >=
Real(
di100)) {
2189 nccol_arr(i,j,k) =
Real(
ncrk1) * nc_arr(i,j,k) * nc_arr(i,j,k) * rslopec3_arr(i,j,k);
2191 nccol_arr(i,j,k) =
Real(2.0) *
Real(
ncrk2) * nc_arr(i,j,k) * nc_arr(i,j,k)
2192 * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k);
2195 if (qr_arr(i,j,k) >= lenconcr) {
2196 if (avedia_arr(i,j,k,1) <
Real(
di100)) {
2197 nrcol_arr(i,j,k) =
Real(5040.0) *
Real(
ncrk2) * nr_arr(i,j,k) * nr_arr(i,j,k)
2198 * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0);
2199 }
else if (avedia_arr(i,j,k,1) <
Real(
di600)) {
2200 nrcol_arr(i,j,k) =
Real(24.0) *
Real(
ncrk1) * nr_arr(i,j,k) * nr_arr(i,j,k)
2201 * rslope3_arr(i,j,k,0);
2202 }
else if (avedia_arr(i,j,k,1) <
Real(
di2000)) {
2204 nrcol_arr(i,j,k) =
Real(24.0) * std::exp(coecol) *
Real(
ncrk1)
2205 * nr_arr(i,j,k) * nr_arr(i,j,k) * rslope3_arr(i,j,k,0);
2207 nrcol_arr(i,j,k) =
Real(0.0);
2211 if (qr_arr(i,j,k) >
Real(0.0)) {
2212 const Real coeres = rslope_arr(i,j,k,0)
2213 * std::sqrt(rslope_arr(i,j,k,0) * rslopeb_arr(i,j,k,0));
2214 prevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0)) * nr_arr(i,j,k)
2215 * (precr1_loc * rslope_arr(i,j,k,0) + precr2_loc * work2_arr(i,j,k) * coeres)
2216 / work1_arr(i,j,k,0);
2217 if (prevp_arr(i,j,k) <
Real(0.0)) {
2218 prevp_arr(i,j,k) = amrex::max(prevp_arr(i,j,k), -qr_arr(i,j,k) / dtcld);
2219 prevp_arr(i,j,k) = amrex::max(prevp_arr(i,j,k), satdt /
Real(2.0));
2221 if (prevp_arr(i,j,k) == -qr_arr(i,j,k) / dtcld) {
2222 nn_arr(i,j,k) = nn_arr(i,j,k) + nr_arr(i,j,k);
2223 nr_arr(i,j,k) =
Real(0.0);
2225 }
else if (prevp_arr(i,j,k) ==
Real(0.0)) {
2228 prevp_arr(i,j,k) =
Real(0.0);
2230 prevp_arr(i,j,k) = amrex::min(prevp_arr(i,j,k), satdt /
Real(2.0));
2237 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2238 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2243 const Real supsat = amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsati_arr(i,j,k);
2244 amrex::ignore_unused(supsat);
2245 const Real satdt = supsat / dtcld;
2246 amrex::ignore_unused(satdt);
2248 const Real qi_val = qi_arr(i,j,k);
2249 if (!(supcol >
Real(0.0) && qi_val >
Real(qmin))) {
2253 Real temp = den_arr(i,j,k) * amrex::max(qi_val,
Real(qmin));
2254 temp = std::sqrt(std::sqrt(temp * temp * temp));
2255 xni_arr(i,j,k) = amrex::min(amrex::max(
Real(5.38e7) * temp,
Real(1.e3)),
Real(1.e6));
2262 const Real xni_safe = amrex::max(xni_arr(i,j,k),
Real(1.0e-30));
2263 const Real xmi = den_arr(i,j,k) * qi_val / xni_safe;
2275 const Real vt2r = pvtr_loc * rslopeb_arr(i,j,k,0) * denfac_arr(i,j,k);
2276 const Real vt2s = pvts_loc * rslopeb_arr(i,j,k,1) * denfac_arr(i,j,k);
2277 const Real vt2g = pvtg_loc * rslopeb_arr(i,j,k,2) * denfac_arr(i,j,k);
2292 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
2296 const Real acrfac =
Real(6.0) * rslope2_arr(i,j,k,0)
2297 +
Real(4.0) * diameter * rslope_arr(i,j,k,0)
2298 + diameter * diameter;
2299 praci_arr(i,j,k) = pi_wdm6_loc * qi_val * nr_arr(i,j,k)
2300 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
2301 praci_arr(i,j,k) *= std::pow(
2302 amrex::min(amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_val),
Real(1.0)),
2304 praci_arr(i,j,k) = amrex::min(praci_arr(i,j,k), qi_val / dtcld);
2307 * nr_arr(i,j,k) *
Real(denr) * xni_arr(i,j,k) * denfac_arr(i,j,k)
2308 * g7pbr_loc * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2309 * rslopeb_arr(i,j,k,0) / (
Real(24.0) * den_arr(i,j,k));
2310 piacr_arr(i,j,k) *= std::pow(
2311 amrex::min(amrex::max(
Real(0.0), qi_val / qr_arr(i,j,k)),
Real(1.0)),
2313 piacr_arr(i,j,k) = amrex::min(piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2317 niacr_arr(i,j,k) = pi_wdm6_loc *
Real(
WDM6::avtr) * nr_arr(i,j,k)
2318 * xni_arr(i,j,k) * denfac_arr(i,j,k) * g4pbr_loc
2319 * rslope2_arr(i,j,k,0) * rslopeb_arr(i,j,k,0) /
Real(4.0);
2320 niacr_arr(i,j,k) *= std::pow(
2321 amrex::min(amrex::max(
Real(0.0), qi_val / qr_arr(i,j,k)),
Real(1.0)),
2323 niacr_arr(i,j,k) = amrex::min(niacr_arr(i,j,k), nr_arr(i,j,k) / dtcld);
2327 const Real acrfac =
Real(2.0) * rslope3_arr(i,j,k,1)
2328 +
Real(2.0) * diameter * rslope2_arr(i,j,k,1)
2329 + diameter * diameter * rslope_arr(i,j,k,1);
2330 psaci_arr(i,j,k) = pi_wdm6_loc * qi_val * eacrs *
Real(
n0s) *
n0sfac
2331 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
2332 psaci_arr(i,j,k) = amrex::min(psaci_arr(i,j,k), qi_val / dtcld);
2342 const Real acrfac =
Real(2.0) * rslope3_arr(i,j,k,2)
2343 +
Real(2.0) * diameter * rslope2_arr(i,j,k,2)
2344 + diameter * diameter * rslope_arr(i,j,k,2);
2345 pgaci_arr(i,j,k) = pi_wdm6_loc * egi * qi_val * n0g_loc
2346 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
2347 pgaci_arr(i,j,k) = amrex::min(pgaci_arr(i,j,k), qi_val / dtcld);
2353 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2354 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2359 const Real qs_val = qs_arr(i,j,k);
2360 const Real qg_val = qg_arr(i,j,k);
2361 const Real qc_val = qc_arr(i,j,k);
2362 const Real nc_val = nc_arr(i,j,k);
2385 const Real ratio_s = (qc_val >
Real(0.0))
2386 ? amrex::min(amrex::max(
Real(0.0), qs_val / qc_val),
Real(1.0))
2395 const Real ratio_g = (qc_val >
Real(0.0))
2396 ? amrex::min(amrex::max(
Real(0.0), qg_val / qc_val),
Real(1.0))
2400 psacw_arr(i,j,k) = amrex::min(
2401 pacrc_loc *
n0sfac * rslope3_arr(i,j,k,1) * rslopeb_arr(i,j,k,1)
2402 * ratio_s * ratio_s * qc_val * denfac_arr(i,j,k),
2406 nsacw_arr(i,j,k) = amrex::min(
2407 pacrc_loc *
n0sfac * rslope3_arr(i,j,k,1) * rslopeb_arr(i,j,k,1)
2408 * ratio_s * ratio_s * nc_val * denfac_arr(i,j,k),
2412 pgacw_arr(i,j,k) = amrex::min(
2413 pacrg_loc * rslope3_arr(i,j,k,2) * rslopeb_arr(i,j,k,2)
2414 * qc_val * ratio_g * ratio_g * denfac_arr(i,j,k),
2418 ngacw_arr(i,j,k) = amrex::min(
2419 pacrg_loc * rslope3_arr(i,j,k,2) * rslopeb_arr(i,j,k,2)
2420 * nc_val * ratio_g * ratio_g * denfac_arr(i,j,k),
2426 paacw_arr(i,j,k) = (qs_val * psacw_arr(i,j,k) + qg_val * pgacw_arr(i,j,k)) /
qsum;
2427 naacw_arr(i,j,k) = (qs_val * nsacw_arr(i,j,k) + qg_val * ngacw_arr(i,j,k)) /
qsum;
2433 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2434 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2439 const Real qr_val = qr_arr(i,j,k);
2440 const Real qs_val = qs_arr(i,j,k);
2441 const Real qg_val = qg_arr(i,j,k);
2442 const Real nr_val = nr_arr(i,j,k);
2443 const Real vt2r = pvtr_loc * rslopeb_arr(i,j,k,0) * denfac_arr(i,j,k);
2444 const Real vt2s = pvts_loc * rslopeb_arr(i,j,k,1) * denfac_arr(i,j,k);
2445 const Real vt2g = pvtg_loc * rslopeb_arr(i,j,k,2) * denfac_arr(i,j,k);
2448 ? (vt2s * qs_val + vt2g * qg_val) /
qsum
2452 if (supcol >
Real(0.0)) {
2454 Real(5.0) * rslope3_arr(i,j,k,1) * rslope3_arr(i,j,k,1)
2455 +
Real(4.0) * rslope3_arr(i,j,k,1) * rslope2_arr(i,j,k,1)
2456 * rslope_arr(i,j,k,0)
2457 +
Real(1.5) * rslope2_arr(i,j,k,1) * rslope2_arr(i,j,k,1)
2458 * rslope2_arr(i,j,k,0);
2459 pracs_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val *
Real(
n0s)
2460 *
n0sfac * std::abs(vt2r - vt2ave)
2461 * (
Real(
dens) / den_arr(i,j,k)) * acrfac;
2462 const Real ratio = amrex::min(
2463 amrex::max(
Real(0.0), qr_val / qs_val),
Real(1.0));
2464 pracs_arr(i,j,k) *= ratio * ratio;
2465 pracs_arr(i,j,k) = amrex::min(pracs_arr(i,j,k), qs_val / dtcld);
2469 Real(30.0) * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2470 * rslope_arr(i,j,k,1)
2471 +
Real(10.0) * rslope2_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2472 * rslope2_arr(i,j,k,1)
2473 +
Real(2.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,1);
2474 psacr_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val *
Real(
n0s)
2475 *
n0sfac * std::abs(vt2ave - vt2r)
2476 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2477 const Real ratio = amrex::min(
2478 amrex::max(
Real(0.0), qs_val / qr_val),
Real(1.0));
2479 psacr_arr(i,j,k) *= ratio * ratio;
2480 psacr_arr(i,j,k) = amrex::min(psacr_arr(i,j,k), qr_val / dtcld);
2485 Real(1.5) * rslope2_arr(i,j,k,0) * rslope_arr(i,j,k,1)
2486 + rslope_arr(i,j,k,0) * rslope2_arr(i,j,k,1)
2487 +
Real(0.5) * rslope3_arr(i,j,k,1);
2488 nsacr_arr(i,j,k) = pi_wdm6_loc * nr_val *
Real(
n0s) *
n0sfac
2489 * std::abs(vt2ave - vt2r) * acrfac;
2490 const Real ratio = amrex::min(
2491 amrex::max(
Real(0.0), qs_val / qr_val),
Real(1.0));
2492 nsacr_arr(i,j,k) *= ratio * ratio;
2493 nsacr_arr(i,j,k) = amrex::min(nsacr_arr(i,j,k), nr_val / dtcld);
2498 Real(30.0) * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2499 * rslope_arr(i,j,k,2)
2500 +
Real(10.0) * rslope2_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2501 * rslope2_arr(i,j,k,2)
2502 +
Real(2.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,2);
2503 pgacr_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val * n0g_loc
2504 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
2506 const Real ratio = amrex::min(
2507 amrex::max(
Real(0.0), qg_val / qr_val),
Real(1.0));
2508 pgacr_arr(i,j,k) *= ratio * ratio;
2509 pgacr_arr(i,j,k) = amrex::min(pgacr_arr(i,j,k), qr_val / dtcld);
2514 Real(1.5) * rslope2_arr(i,j,k,0) * rslope_arr(i,j,k,2)
2515 + rslope_arr(i,j,k,0) * rslope2_arr(i,j,k,2)
2516 +
Real(0.5) * rslope3_arr(i,j,k,2);
2517 ngacr_arr(i,j,k) = pi_wdm6_loc * nr_val * n0g_loc
2518 * std::abs(vt2ave - vt2r) * acrfac;
2519 const Real ratio = amrex::min(
2520 amrex::max(
Real(0.0), qg_val / qr_val),
Real(1.0));
2521 ngacr_arr(i,j,k) *= ratio * ratio;
2522 ngacr_arr(i,j,k) = amrex::min(ngacr_arr(i,j,k), nr_val / dtcld);
2526 pgacs_arr(i,j,k) =
Real(0.0);
2529 if (supcol <=
Real(0.0)) {
2531 if (qs_val >
Real(0.0)) {
2532 pseml_arr(i,j,k) = amrex::min(
2535 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2541 nseml_arr(i,j,k) = -sfac * pseml_arr(i,j,k);
2544 if (qg_val >
Real(0.0)) {
2545 pgeml_arr(i,j,k) = amrex::min(
2548 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2553 const Real gfac = rslope_arr(i,j,k,2) * n0g_loc / qg_val;
2554 ngeml_arr(i,j,k) = -gfac * pgeml_arr(i,j,k);
2561 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2562 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2563 if (supcol <=
Real(0.0)) {
2572 amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsati_arr(i,j,k);
2573 const Real satdt = supsat / dtcld;
2576 const Real qi_val = qi_arr(i,j,k);
2577 const Real qs_val = qs_arr(i,j,k);
2578 const Real qg_val = qg_arr(i,j,k);
2579 const Real xni = xni_arr(i,j,k);
2580 const Real xni_safe = amrex::max(
xni,
Real(1.0e-30));
2581 const Real xmi = den_arr(i,j,k) * qi_val / xni_safe;
2582 const Real diameter = amrex::min(
2584 const Real rhi = rhi_arr(i,j,k);
2585 const Real work1i = work1_arr(i,j,k,1);
2587 if (qi_val >
Real(0.0) && ifsat != 1) {
2588 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2590 Real supice = satdt - prevp_arr(i,j,k);
2591 if (pidep_arr(i,j,k) <
Real(0.0)) {
2592 pidep_arr(i,j,k) = amrex::max(
2593 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2595 pidep_arr(i,j,k) = amrex::max(
2596 pidep_arr(i,j,k), -qi_val / dtcld);
2598 pidep_arr(i,j,k) = amrex::min(
2599 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2602 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2603 >= std::abs(satdt)) {
2608 if (qs_val >
Real(0.0) && ifsat != 1) {
2609 const Real coeres_s = rslope2_arr(i,j,k,1)
2610 * std::sqrt(rslope_arr(i,j,k,1) * rslopeb_arr(i,j,k,1));
2612 * (precs1_loc * rslope2_arr(i,j,k,1)
2613 + precs2_loc * work2_arr(i,j,k) * coeres_s)
2615 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2616 if (psdep_arr(i,j,k) <
Real(0.0)) {
2617 psdep_arr(i,j,k) = amrex::max(
2618 psdep_arr(i,j,k), -qs_val / dtcld);
2619 psdep_arr(i,j,k) = amrex::max(
2620 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2623 psdep_arr(i,j,k) = amrex::min(
2624 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2627 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2628 + psdep_arr(i,j,k)) >= std::abs(satdt)) {
2633 if (qg_val >
Real(0.0) && ifsat != 1) {
2634 const Real coeres_g = rslope2_arr(i,j,k,2)
2635 * std::sqrt(rslope_arr(i,j,k,2) * rslopeb_arr(i,j,k,2));
2636 pgdep_arr(i,j,k) = (
rhi -
Real(1.0))
2637 * (precg1_loc * rslope2_arr(i,j,k,2)
2638 + precg2_loc * work2_arr(i,j,k) * coeres_g)
2640 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k)
2642 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2643 pgdep_arr(i,j,k) = amrex::max(
2644 pgdep_arr(i,j,k), -qg_val / dtcld);
2645 pgdep_arr(i,j,k) = amrex::max(
2646 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2649 pgdep_arr(i,j,k) = amrex::min(
2650 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2653 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2654 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2655 >= std::abs(satdt)) {
2660 if (supsat >
Real(0.0) && ifsat != 1) {
2661 const Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k)
2662 - psdep_arr(i,j,k) - pgdep_arr(i,j,k);
2665 const Real pigen_raw = amrex::max(
2667 (roqi0 / den_arr(i,j,k) - amrex::max(qi_val,
Real(0.0))) / dtcld);
2668 pigen_arr(i,j,k) = amrex::min(
2669 amrex::min(pigen_raw, satdt), supice);
2676 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2677 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2679 if (qi_arr(i,j,k) >
Real(0.0)) {
2680 const Real qimax = roqimax_loc / den_arr(i,j,k);
2681 psaut_arr(i,j,k) = amrex::max(
2682 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2685 if (qs_arr(i,j,k) >
Real(0.0)) {
2698 pgaut_arr(i,j,k) = amrex::min(
2701 qs_arr(i,j,k) / dtcld);
2707 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2708 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2709 if (supcol <
Real(0.0)) {
2715 if (qs_arr(i,j,k) >
Real(0.0)
2716 && rhw_arr(i,j,k) <
Real(1.0)) {
2717 const Real coeres = rslope2_arr(i,j,k,1)
2718 * std::sqrt(rslope_arr(i,j,k,1)
2719 * rslopeb_arr(i,j,k,1));
2720 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2722 * (precs1_loc * rslope2_arr(i,j,k,1)
2723 + precs2_loc * work2_arr(i,j,k) * coeres)
2724 / work1_arr(i,j,k,0);
2725 psevp_arr(i,j,k) = amrex::min(
2726 amrex::max(psevp_arr(i,j,k),
2727 -qs_arr(i,j,k) / dtcld),
2731 if (qg_arr(i,j,k) >
Real(0.0)
2732 && rhw_arr(i,j,k) <
Real(1.0)) {
2733 const Real coeres = rslope2_arr(i,j,k,2)
2734 * std::sqrt(rslope_arr(i,j,k,2)
2735 * rslopeb_arr(i,j,k,2));
2736 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2737 * (precg1_loc * rslope2_arr(i,j,k,2)
2738 + precg2_loc * work2_arr(i,j,k) * coeres)
2739 / work1_arr(i,j,k,0);
2740 pgevp_arr(i,j,k) = amrex::min(
2741 amrex::max(pgevp_arr(i,j,k),
2742 -qg_arr(i,j,k) / dtcld),
2750 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2762 (qr_arr(i,j,k) <
wdm6_literal(1.0e-4)) ? one_l : zero_l;
2764 if (t_arr(i,j,k) <= t0c_l) {
2765 Real value, source, factor,
xlf, xlwork2;
2767 value = amrex::max(qmin_l, qc_arr(i,j,k));
2768 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2769 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2770 if (source > value) {
2771 factor = value / source;
2772 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2773 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2774 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2777 value = amrex::max(qmin_l, qi_arr(i,j,k));
2778 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2779 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2780 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2781 if (source > value) {
2782 factor = value / source;
2783 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2784 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2785 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2786 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2787 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2788 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2791 value = amrex::max(qmin_l, qr_arr(i,j,k));
2792 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2793 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2794 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2795 if (source > value) {
2796 factor = value / source;
2797 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2798 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2799 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2800 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2801 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2802 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2805 value = amrex::max(qmin_l, qs_arr(i,j,k));
2806 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2807 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2808 + piacr_arr(i,j,k) * delta3
2809 + praci_arr(i,j,k) * delta3
2810 - pracs_arr(i,j,k) * (one_l - delta2)
2811 + psacr_arr(i,j,k) * delta2
2812 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2813 if (source > value) {
2814 factor = value / source;
2815 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2816 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2817 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2818 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2819 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2820 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2821 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2822 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2823 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2824 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2827 value = amrex::max(qmin_l, qg_arr(i,j,k));
2828 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2829 + piacr_arr(i,j,k) * (one_l - delta3)
2830 + praci_arr(i,j,k) * (one_l - delta3)
2831 + psacr_arr(i,j,k) * (one_l - delta2)
2832 + pracs_arr(i,j,k) * (one_l - delta2)
2833 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2834 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2835 if (source > value) {
2836 factor = value / source;
2837 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2838 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2839 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2840 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2841 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2842 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2843 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2844 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2845 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2846 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2849 value = amrex::max(ncmin_l, nc_arr(i,j,k));
2850 source = (nrauto_arr(i,j,k) + nccol_arr(i,j,k)
2851 + nraccr_arr(i,j,k) + naacw_arr(i,j,k)
2852 + naacw_arr(i,j,k)) * dtcld;
2853 if (source > value) {
2854 factor = value / source;
2855 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2856 nccol_arr(i,j,k) = nccol_arr(i,j,k) * factor;
2857 nraccr_arr(i,j,k) = nraccr_arr(i,j,k) * factor;
2858 naacw_arr(i,j,k) = naacw_arr(i,j,k) * factor;
2861 value = amrex::max(nrmin_l, nr_arr(i,j,k));
2862 source = (-nrauto_arr(i,j,k) + nrcol_arr(i,j,k)
2863 + niacr_arr(i,j,k) + nsacr_arr(i,j,k)
2864 + ngacr_arr(i,j,k)) * dtcld;
2865 if (source > value) {
2866 factor = value / source;
2867 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2868 nrcol_arr(i,j,k) = nrcol_arr(i,j,k) * factor;
2869 niacr_arr(i,j,k) = niacr_arr(i,j,k) * factor;
2870 nsacr_arr(i,j,k) = nsacr_arr(i,j,k) * factor;
2871 ngacr_arr(i,j,k) = ngacr_arr(i,j,k) * factor;
2874 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2875 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2876 + pidep_arr(i,j,k));
2877 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2878 qc_arr(i,j,k) = amrex::max(
2879 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2880 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2883 qr_arr(i,j,k) = amrex::max(
2884 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2885 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2886 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2889 qi_arr(i,j,k) = amrex::max(
2890 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2891 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2892 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2895 qs_arr(i,j,k) = amrex::max(
2896 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2897 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2898 + piacr_arr(i,j,k) * delta3
2899 + praci_arr(i,j,k) * delta3
2900 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2901 - pracs_arr(i,j,k) * (one_l - delta2)
2902 + psacr_arr(i,j,k) * delta2) * dtcld,
2904 qg_arr(i,j,k) = amrex::max(
2905 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2906 + piacr_arr(i,j,k) * (one_l - delta3)
2907 + praci_arr(i,j,k) * (one_l - delta3)
2908 + psacr_arr(i,j,k) * (one_l - delta2)
2909 + pracs_arr(i,j,k) * (one_l - delta2)
2910 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2911 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2914 nc_arr(i,j,k) = amrex::max(
2915 nc_arr(i,j,k) + (-nrauto_arr(i,j,k) - nccol_arr(i,j,k)
2916 - nraccr_arr(i,j,k) - naacw_arr(i,j,k)
2917 - naacw_arr(i,j,k)) * dtcld,
2919 nr_arr(i,j,k) = amrex::max(
2920 nr_arr(i,j,k) + (nrauto_arr(i,j,k) - nrcol_arr(i,j,k)
2921 - niacr_arr(i,j,k) - nsacr_arr(i,j,k)
2922 - ngacr_arr(i,j,k)) * dtcld,
2925 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2926 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2927 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2928 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2929 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2930 + psacr_arr(i,j,k));
2931 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2933 Real value, source, factor,
xlf, xlwork2;
2935 value = amrex::max(qmin_l, qc_arr(i,j,k));
2936 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2937 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2938 if (source > value) {
2939 factor = value / source;
2940 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2941 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2942 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2945 value = amrex::max(qmin_l, qr_arr(i,j,k));
2946 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2947 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2948 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2949 - prevp_arr(i,j,k)) * dtcld;
2950 if (source > value) {
2951 factor = value / source;
2952 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2953 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2954 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2955 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2956 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2957 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2960 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2961 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2962 - psevp_arr(i,j,k)) * dtcld;
2963 if (source > value) {
2964 factor = value / source;
2965 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2966 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2967 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2970 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2971 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2972 + pgeml_arr(i,j,k)) * dtcld;
2973 if (source > value) {
2974 factor = value / source;
2975 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2976 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2977 pgeml_arr(i,j,k) = pgeml_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 - nseml_arr(i,j,k) - ngeml_arr(i,j,k)) * dtcld;
2995 if (source > value) {
2996 factor = value / source;
2997 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2998 nrcol_arr(i,j,k) = nrcol_arr(i,j,k) * factor;
2999 nseml_arr(i,j,k) = nseml_arr(i,j,k) * factor;
3000 ngeml_arr(i,j,k) = ngeml_arr(i,j,k) * factor;
3003 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
3004 + pgevp_arr(i,j,k));
3005 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
3006 qc_arr(i,j,k) = amrex::max(
3007 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
3008 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
3011 qr_arr(i,j,k) = amrex::max(
3012 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
3013 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
3014 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
3015 - pgeml_arr(i,j,k)) * dtcld,
3017 qs_arr(i,j,k) = amrex::max(
3018 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
3019 + pseml_arr(i,j,k)) * dtcld,
3021 qg_arr(i,j,k) = amrex::max(
3022 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
3023 + pgeml_arr(i,j,k)) * dtcld,
3025 nc_arr(i,j,k) = amrex::max(
3026 nc_arr(i,j,k) + (-nrauto_arr(i,j,k) - nccol_arr(i,j,k)
3027 - nraccr_arr(i,j,k) - naacw_arr(i,j,k)
3028 - naacw_arr(i,j,k)) * dtcld,
3030 nr_arr(i,j,k) = amrex::max(
3031 nr_arr(i,j,k) + (nrauto_arr(i,j,k) - nrcol_arr(i,j,k)
3032 + nseml_arr(i,j,k) + ngeml_arr(i,j,k))
3036 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
3039 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
3040 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
3052 const Real xb = xa + hvap / (
Real(rv) * ttp);
3054 const Real xai = -dldti /
Real(rv);
3055 const Real xbi = xai + hsub / (
Real(rv) * ttp);
3057 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3058 const Real tr = ttp / t_arr(i,j,k);
3060 * std::exp(xb * (
Real(1.) - tr));
3061 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
3062 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
3063 qsw = amrex::max(qsw,
Real(qmin));
3064 qsatw_arr(i,j,k) = qsw;
3067 if (t_arr(i,j,k) < ttp) {
3068 qsi =
Real(
psat) * std::exp(std::log(tr) * xai)
3069 * std::exp(xbi * (
Real(1.) - tr));
3071 qsi =
Real(
psat) * std::exp(std::log(tr) * xa)
3072 * std::exp(xb * (
Real(1.) - tr));
3074 qsi = amrex::min(qsi,
wdm6_literal(0.99) * p_arr(i,j,k));
3075 qsi =
Real(ep2) * qsi / (p_arr(i,j,k) - qsi);
3076 qsi = amrex::max(qsi,
Real(qmin));
3077 qsati_arr(i,j,k) = qsi;
3079 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsw,
Real(qmin));
3086 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3087 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
3088 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
3089 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
3090 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
3093 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3094 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
3095 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
3096 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
3099 den_arr(i,j,k), denfac_arr(i,j,k),
3101 rslopermax_loc, rsloperbmax_loc,
3102 rsloper2max_loc, rsloper3max_loc,
3103 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
3104 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
3106 wdm6_slope_snow_cell(qrs_tmp_arr(i,j,k,1), den_arr(i,j,k), denfac_arr(i,j,k),
3109 rslopesmax_loc, rslopesbmax_loc,
3110 rslopes2max_loc, rslopes3max_loc,
3112 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3,
3113 snow_vt, snow_n0sfac);
3114 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
3116 rslopegmax_loc, rslopegbmax_loc,
3117 rslopeg2max_loc, rslopeg3max_loc,
3118 slope_bvtg_loc, pvtg_loc,
3119 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3,
3122 rslope_arr(i,j,k,0) = rain_rslope;
3123 rslope_arr(i,j,k,1) = snow_rslope;
3124 rslope_arr(i,j,k,2) = graup_rslope;
3125 rslopeb_arr(i,j,k,0) = rain_rslopeb;
3126 rslopeb_arr(i,j,k,1) = snow_rslopeb;
3127 rslopeb_arr(i,j,k,2) = graup_rslopeb;
3128 rslope2_arr(i,j,k,0) = rain_rslope2;
3129 rslope2_arr(i,j,k,1) = snow_rslope2;
3130 rslope2_arr(i,j,k,2) = graup_rslope2;
3131 rslope3_arr(i,j,k,0) = rain_rslope3;
3132 rslope3_arr(i,j,k,1) = snow_rslope3;
3133 rslope3_arr(i,j,k,2) = graup_rslope3;
3134 work1_arr(i,j,k,0) = rain_vt;
3135 work1_arr(i,j,k,1) = snow_vt;
3136 work1_arr(i,j,k,2) = graup_vt;
3137 workn_arr(i,j,k) = rain_vtn;
3139 avedia_arr(i,j,k,1) = rslope_arr(i,j,k,0) * g16a_cbrt24;
3140 if (avedia_arr(i,j,k,1) <=
Real(
di82)) {
3141 nc_arr(i,j,k) += nr_arr(i,j,k);
3142 nr_arr(i,j,k) =
Real(0.0);
3143 qc_arr(i,j,k) += qr_arr(i,j,k);
3144 qr_arr(i,j,k) =
Real(0.0);
3150 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3151 if (rhw_arr(i,j,k) >
Real(1.0)) {
3153 const Real fraction = amrex::min(
Real(1.0),
3154 std::exp(std::log(ratio) *
Real(
actk)));
3155 Real ncact_raw = (nn_arr(i,j,k) + nc_arr(i,j,k)) * fraction - nc_arr(i,j,k);
3156 Real ncact = amrex::max(
Real(0.0), ncact_raw);
3158 const Real ncact_cap = amrex::max(nn_arr(i,j,k),
Real(0.0)) / dtcld;
3159 ncact = amrex::min(ncact, ncact_cap);
3161 const Real pcact = amrex::min(
3162 Real(4.0) * pi_wdm6_loc *
Real(denr)
3163 * actr_um * actr_um * actr_um * ncact
3164 / (
Real(3.0) * den_arr(i,j,k)),
3165 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
3167 ncact_arr(i,j,k) = ncact;
3168 act_ratio_arr(i,j,k) = ratio;
3169 act_fraction_arr(i,j,k) = fraction;
3170 act_raw_arr(i,j,k) = ncact_raw;
3171 act_cap_arr(i,j,k) = ncact_cap;
3172 pcact_arr(i,j,k) = pcact;
3174 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k) + pcact * dtcld,
Real(0.0));
3175 nn_arr(i,j,k) = amrex::max(nn_arr(i,j,k) - ncact * dtcld,
Real(0.0));
3176 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k) + ncact * dtcld,
Real(0.0));
3177 t_arr(i,j,k) += pcact * xl_arr(i,j,k) / cpm_arr(i,j,k) * dtcld;
3180 const Real tr = ttp / t_arr(i,j,k);
3182 * std::exp(xb * (
Real(1.0) - tr));
3183 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
3184 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
3185 qsw = amrex::max(qsw,
Real(qmin));
3186 qsatw_arr(i,j,k) = qsw;
3189 t_arr(i,j,k),
qv_arr(i,j,k), qsw, xl_arr(i,j,k), cpm_arr(i,j,k),
3191 work2_arr(i,j,k) = qc_arr(i,j,k) + work1_arr(i,j,k,0);
3194 amrex::max(work1_arr(i,j,k,0) / dtcld,
Real(0.0)),
3195 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
3196 if (qc_arr(i,j,k) >
Real(0.0) && work1_arr(i,j,k,0) <
Real(0.0)) {
3197 pcond = amrex::max(work1_arr(i,j,k,0), -qc_arr(i,j,k)) / dtcld;
3199 pcond_arr(i,j,k) =
pcond;
3201 if (
pcond == -qc_arr(i,j,k) / dtcld) {
3202 nn_arr(i,j,k) += nc_arr(i,j,k);
3203 nc_arr(i,j,k) =
Real(0.0);
3207 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k) +
pcond * dtcld,
Real(0.0));
3208 t_arr(i,j,k) +=
pcond * xl_arr(i,j,k) / cpm_arr(i,j,k) * dtcld;
3212 const Real g17_pidnc = pi_wdm6_loc *
Real(denr) /
Real(6.0);
3213 const Real g17_pidnr =
Real(4.0) * pi_wdm6_loc *
Real(denr);
3216 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3217 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
3218 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
3221 Real lamdr = std::exp(std::log(
3222 (g17_pidnr * nr_arr(i,j,k)) / (den_arr(i,j,k) * qr_arr(i,j,k))
3226 nr_arr(i,j,k) = den_arr(i,j,k) * qr_arr(i,j,k)
3227 * std::pow(lamdr,
Real(3.0)) / g17_pidnr;
3230 nr_arr(i,j,k) = den_arr(i,j,k) * qr_arr(i,j,k)
3231 * std::pow(lamdr,
Real(3.0)) / g17_pidnr;
3235 if (qc_arr(i,j,k) >=
Real(qmin) && nc_arr(i,j,k) >=
Real(
ncmin)) {
3236 Real lamdc = std::exp(std::log(
3237 (g17_pidnc * nc_arr(i,j,k)) / (den_arr(i,j,k) * qc_arr(i,j,k))
3241 nc_arr(i,j,k) = den_arr(i,j,k) * qc_arr(i,j,k)
3242 * std::pow(lamdc,
Real(3.0)) / g17_pidnc;
3245 nc_arr(i,j,k) = den_arr(i,j,k) * qc_arr(i,j,k)
3246 * std::pow(lamdc,
Real(3.0)) / g17_pidnc;
3268 const bool use_anelastic_reference_pressure =
3270 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3272 t_arr(i,j,k), p_arr(i,j,k), configured_rdOcp,
3273 use_anelastic_reference_pressure);
3277 #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:63
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_xka(Real x, Real y)
Definition: ERF_AdvanceWDM6.cpp:58
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_venfac(Real a, Real b, Real c, Real den0_arg)
Definition: ERF_AdvanceWDM6.cpp:70
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:280
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:34
constexpr amrex::Real wdm6_slope_t0c
Definition: ERF_AdvanceWDM6.cpp:198
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:140
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:217
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:28
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_xni_exact(Real qi, Real den, Real qmin_arg)
Definition: ERF_AdvanceWDM6.cpp:133
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_default_real_pow(double base, double exponent)
Definition: ERF_AdvanceWDM6.cpp:39
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:247
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:79
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_rslopec_exact(Real qc, Real den, Real nc, Real pidnc_arg)
Definition: ERF_AdvanceWDM6.cpp:122
constexpr amrex::Real R_v
Definition: ERF_Constants.H:35
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:36
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:56
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:38
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:37
constexpr amrex::Real R_d
Definition: ERF_Constants.H:34
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:210
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:30
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:96
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:81
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, 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 m_use_anelastic_reference_pressure
Definition: ERF_NullMoist.H:175
amrex::Real m_precs2
Definition: ERF_WDM6.H:315
static constexpr amrex::Real ncmin
Definition: ERF_WDM6.H:188
static constexpr amrex::Real qcrmin
Definition: ERF_WDM6.H:187
amrex::Real m_pidn0g
Definition: ERF_WDM6.H:319
amrex::Real m_precr2
Definition: ERF_WDM6.H:311
bool m_hail_opt
Definition: ERF_WDM6.H:298
amrex::iMultiFab * m_lmask
Definition: ERF_WDM6.H:290
static constexpr amrex::Real nrmin
Definition: ERF_WDM6.H:189
amrex::Real m_pvtrn
Definition: ERF_WDM6.H:310
amrex::Real m_rslopecmax
Definition: ERF_WDM6.H:320
static constexpr amrex::Real lamdarmax
Definition: ERF_WDM6.H:178
amrex::Real m_pidn0s
Definition: ERF_WDM6.H:316
amrex::Real m_qc1
Definition: ERF_WDM6.H:305
static constexpr amrex::Real di100
Definition: ERF_WDM6.H:201
amrex::Real m_pvts
Definition: ERF_WDM6.H:315
static constexpr amrex::Real pfrz1
Definition: ERF_WDM6.H:185
amrex::Real m_rslopec3max
Definition: ERF_WDM6.H:320
static constexpr amrex::Real dicon
Definition: ERF_WDM6.H:183
amrex::Real m_pvtr
Definition: ERF_WDM6.H:310
amrex::Real m_rslopegmax
Definition: ERF_WDM6.H:321
static constexpr amrex::Real bvtr
Definition: ERF_WDM6.H:169
amrex::Real m_rslopesmax
Definition: ERF_WDM6.H:321
amrex::Real m_pvtg
Definition: ERF_WDM6.H:319
amrex::Array< FabPtr, MicVar_WDM6::NumVars > mic_fab_vars
Definition: ERF_WDM6.H:292
static constexpr amrex::Real lamdacmax
Definition: ERF_WDM6.H:181
static constexpr amrex::Real alpha_wdm6
Definition: ERF_WDM6.H:195
amrex::Real m_pi_wdm6
Definition: ERF_WDM6.H:304
amrex::Real m_rslopes2max
Definition: ERF_WDM6.H:323
amrex::Real m_rslopegbmax
Definition: ERF_WDM6.H:322
amrex::Real m_rslopes3max
Definition: ERF_WDM6.H:324
amrex::Real m_qck1
Definition: ERF_WDM6.H:305
amrex::Real m_rdOcp
Definition: ERF_WDM6.H:285
static constexpr amrex::Real qs0
Definition: ERF_WDM6.H:192
amrex::Real m_rslopeg2max
Definition: ERF_WDM6.H:323
static constexpr amrex::Real n0s
Definition: ERF_WDM6.H:194
amrex::Real m_rslopesbmax
Definition: ERF_WDM6.H:322
amrex::Geometry m_geom
Definition: ERF_WDM6.H:278
static constexpr amrex::Real di2000
Definition: ERF_WDM6.H:203
amrex::Real m_precg1
Definition: ERF_WDM6.H:319
amrex::Real m_rsloperbmax
Definition: ERF_WDM6.H:322
amrex::Real m_precr1
Definition: ERF_WDM6.H:311
static constexpr amrex::Real di82
Definition: ERF_WDM6.H:204
amrex::Real m_g7pbr
Definition: ERF_WDM6.H:308
static constexpr amrex::Real actr
Definition: ERF_WDM6.H:198
static constexpr amrex::Real lamdarmin
Definition: ERF_WDM6.H:179
static constexpr amrex::Real lamdacmin
Definition: ERF_WDM6.H:182
amrex::Real m_ccn0
Definition: ERF_WDM6.H:281
amrex::Real m_pidnc
Definition: ERF_WDM6.H:305
amrex::Real m_qc0
Definition: ERF_WDM6.H:305
amrex::Real m_bvtg
Definition: ERF_WDM6.H:299
amrex::Real m_rsloper3max
Definition: ERF_WDM6.H:324
amrex::Real m_rslopeg3max
Definition: ERF_WDM6.H:324
amrex::Real m_pidnr
Definition: ERF_WDM6.H:312
amrex::Real m_g4pbr
Definition: ERF_WDM6.H:308
static constexpr amrex::Real bvts
Definition: ERF_WDM6.H:177
amrex::Real m_n0g
Definition: ERF_WDM6.H:299
static constexpr amrex::Real di600
Definition: ERF_WDM6.H:202
amrex::Real m_precg2
Definition: ERF_WDM6.H:319
amrex::Real m_rslopermax
Definition: ERF_WDM6.H:321
amrex::MultiFab * m_z_phys_nd
Definition: ERF_WDM6.H:288
static constexpr amrex::Real ncrk2
Definition: ERF_WDM6.H:200
amrex::Real m_xlv1
Definition: ERF_WDM6.H:304
amrex::Real m_pacrg
Definition: ERF_WDM6.H:319
static constexpr amrex::Real ncrk1
Definition: ERF_WDM6.H:199
static constexpr amrex::Real avtr
Definition: ERF_WDM6.H:168
amrex::Real m_pacrc
Definition: ERF_WDM6.H:316
amrex::Real m_roqimax
Definition: ERF_WDM6.H:311
static constexpr amrex::Real dimax
Definition: ERF_WDM6.H:184
static constexpr amrex::Real actk
Definition: ERF_WDM6.H:197
static constexpr amrex::Real pfrz2
Definition: ERF_WDM6.H:186
amrex::Real m_precs1
Definition: ERF_WDM6.H:315
static constexpr amrex::Real satmax
Definition: ERF_WDM6.H:196
static constexpr amrex::Real n0smax
Definition: ERF_WDM6.H:193
amrex::Real m_rsloper2max
Definition: ERF_WDM6.H:323
amrex::Real m_rslopec2max
Definition: ERF_WDM6.H:320
@ xlf
Definition: ERF_AdvanceMorrison.cpp:157
@ qr
Definition: ERF_WDM6.H:29
@ qv
Definition: ERF_WDM6.H:26
@ qc
Definition: ERF_WDM6.H:27
@ qi
Definition: ERF_WDM6.H:28
@ graup_accum
Definition: ERF_WDM6.H:37
@ rain_accum
Definition: ERF_WDM6.H:35
@ pres
Definition: ERF_WDM6.H:25
@ nr
Definition: ERF_WDM6.H:34
@ qg
Definition: ERF_WDM6.H:31
@ theta
Definition: ERF_WDM6.H:23
@ qs
Definition: ERF_WDM6.H:30
@ nc
Definition: ERF_WDM6.H:33
@ nn
Definition: ERF_WDM6.H:32
@ rho
Definition: ERF_WDM6.H:22
@ tabs
Definition: ERF_WDM6.H:24
@ snow_accum
Definition: ERF_WDM6.H:36
@ tk
Definition: ERF_AdvanceWDM6.cpp:272
@ work_col
Definition: ERF_AdvanceWDM6.cpp:272
@ den
Definition: ERF_AdvanceWDM6.cpp:272
@ denfac
Definition: ERF_AdvanceWDM6.cpp:272
@ rq2_col
Definition: ERF_AdvanceWDM6.cpp:272
@ rq_col
Definition: ERF_AdvanceWDM6.cpp:272
@ NumComps
Definition: ERF_AdvanceWDM6.cpp:272
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
@ NumComps
Definition: ERF_AdvanceWDM6.cpp:276
@ fall_s
Definition: ERF_WSM6.H:347
@ n0sfac
Definition: ERF_WSM6.H:333
@ work2
Definition: ERF_WSM6.H:326
@ pcond
Definition: ERF_WSM6.H:296
@ qsum
Definition: ERF_WSM6.H:323
@ psmlt
Definition: ERF_WSM6.H:317
@ fall_g
Definition: ERF_WSM6.H:347
@ work1c
Definition: ERF_WSM6.H:286
@ pgmlt
Definition: ERF_WSM6.H:318
@ rhi
Definition: ERF_WSM6.H:339
@ fall_r
Definition: ERF_WSM6.H:347
@ xni
Definition: ERF_WSM6.H:328
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