659 #ifdef ERF_USE_WDM6_FORT
660 static int call_count = 0;
662 [[maybe_unused]]
const bool first_call = (call_count == 1);
665 static bool wdm6_inited =
false;
667 constexpr
double den0 = 1.28;
668 constexpr
double denr =
static_cast<double>(
rhoh2o);
669 constexpr
double dens =
static_cast<double>(
rhos);
670 constexpr
double cl =
static_cast<double>(
Cp_l);
671 constexpr
double cpv =
static_cast<double>(
Cp_v);
672 const double ccn0 =
static_cast<double>(
m_ccn0);
682 amrex::Print() <<
"WDM6 Fortran bridge initialized\n";
687 int microphysics_debug = 0;
688 std::vector<int> micro_diag_target_column;
690 amrex::ParmParse
pp(
"erf");
691 pp.queryAdd(
"microphysics_debug", microphysics_debug);
692 pp.queryarr(
"micro_diag_target_column", micro_diag_target_column);
694 microphysics_debug = std::max(0, std::min(2, microphysics_debug));
695 #ifdef ERF_USE_WDM6_FORT
696 bool use_wdm6_cpp_answer =
false;
698 amrex::ParmParse
pp(
"erf");
699 pp.queryAdd(
"use_wdm6_cpp_answer", use_wdm6_cpp_answer);
701 const bool run_wdm6_fort = !use_wdm6_cpp_answer;
705 [[maybe_unused]] constexpr
double g =
static_cast<double>(
CONST_GRAV);
706 constexpr
double cpd =
static_cast<double>(
Cp_d);
707 constexpr
double cpv =
static_cast<double>(
Cp_v);
708 [[maybe_unused]] constexpr
double rd =
static_cast<double>(
R_d);
709 constexpr
double rv =
static_cast<double>(
R_v);
710 constexpr
double t0c = 273.15;
711 [[maybe_unused]] constexpr
double ep1 =
static_cast<double>(
R_v /
R_d -
one);
712 constexpr
double ep2 =
static_cast<double>(
R_d /
R_v);
713 constexpr
double qmin = 1.0e-12;
714 constexpr
double xls =
static_cast<double>(
lsub);
715 constexpr
double xlv0 =
static_cast<double>(
lat_vap);
716 constexpr
double xlf0 =
static_cast<double>(
lat_ice);
717 constexpr
double den0 = 1.28;
718 constexpr
double denr =
static_cast<double>(
rhoh2o);
719 constexpr
double dens =
static_cast<double>(
rhos);
720 constexpr
double cliq =
static_cast<double>(
Cp_l);
721 constexpr
double cice = 2106.0;
722 constexpr
double psat = 610.78;
725 amrex::ignore_unused(
g, rd, ep1);
726 [[maybe_unused]]
const double ccn0 =
static_cast<double>(
m_ccn0);
729 const Box box = mfi.tilebox();
730 const Box fab_box = mfi.fabbox();
749 const int ilo = box.smallEnd(0);
750 const int ihi = box.bigEnd(0);
751 const int jlo = box.smallEnd(1);
752 const int jhi = box.bigEnd(1);
753 const int klo = box.smallEnd(2);
754 const int khi = box.bigEnd(2);
756 [[maybe_unused]]
const int imlo = fab_box.smallEnd(0);
757 [[maybe_unused]]
const int imhi = fab_box.bigEnd(0);
758 [[maybe_unused]]
const int jmlo = fab_box.smallEnd(1);
759 [[maybe_unused]]
const int jmhi = fab_box.bigEnd(1);
760 [[maybe_unused]]
const int kmlo = fab_box.smallEnd(2);
761 [[maybe_unused]]
const int kmhi = fab_box.bigEnd(2);
762 const bool has_target_override = (micro_diag_target_column.size() == 2);
763 const int diag_i = has_target_override ? micro_diag_target_column[0] : ilo;
764 const int diag_j = has_target_override ? micro_diag_target_column[1] : jlo;
768 #if defined(ERF_USE_WDM6_FORT) && defined(AMREX_USE_GPU)
769 Arena*
Arena_Used = run_wdm6_fort ? The_Pinned_Arena() : The_Async_Arena();
774 #ifdef ERF_USE_WDM6_FORT
786 auto const& delz_arr = delz_fab.array();
787 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
788 delz_arr(i,j,k) = dz_val;
792 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
793 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
794 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
795 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
796 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
808 box2d.makeSlab(2, klo);
809 Box fab_box2d(fab_box);
810 fab_box2d.makeSlab(2, klo);
822 FArrayBox xland_fab(fab_box2d, 1,
Arena_Used);
823 auto const& xland_arr = xland_fab.array();
825 auto const& lmask_arr =
m_lmask->const_array(mfi);
826 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
827 xland_arr(i,j,k) = (lmask_arr(i,j,0) == 0) ?
Real(2.0) :
Real(1.0);
831 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
832 xland_arr(i,j,k) =
Real(1.0);
840 FArrayBox rainacc_fab(fab_box2d, 1,
Arena_Used);
841 FArrayBox rainncv_fab(fab_box2d, 1,
Arena_Used);
843 FArrayBox snowacc_fab(fab_box2d, 1,
Arena_Used);
844 FArrayBox snowncv_fab(fab_box2d, 1,
Arena_Used);
845 FArrayBox graupacc_fab(fab_box2d, 1,
Arena_Used);
846 FArrayBox graupelncv_fab(fab_box2d, 1,
Arena_Used);
848 auto const& rainacc_arr = rainacc_fab.array();
849 auto const& rainncv_arr = rainncv_fab.array();
850 auto const& sr_arr = sr_fab.array();
851 auto const& snowacc_arr = snowacc_fab.array();
852 auto const& snowncv_arr = snowncv_fab.array();
853 auto const& graupacc_arr = graupacc_fab.array();
854 auto const& graupelncv_arr = graupelncv_fab.array();
858 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
859 rainacc_arr(i,j,k) =
Real(0.0);
860 rainncv_arr(i,j,k) =
Real(0.0);
861 sr_arr(i,j,k) =
Real(0.0);
862 snowacc_arr(i,j,k) =
Real(0.0);
863 snowncv_arr(i,j,k) =
Real(0.0);
864 graupacc_arr(i,j,k) =
Real(0.0);
865 graupelncv_arr(i,j,k) =
Real(0.0);
875 Gpu::streamSynchronize();
880 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
881 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
882 nn_arr.dataPtr(), nc_arr.dataPtr(), nr_arr.dataPtr(),
883 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
884 static_cast<double>(dt_advance),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
886 ccn0, xland_arr.dataPtr(),
887 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
888 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
889 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
890 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
891 ilo, ihi, jlo, jhi, klo,
khi,
892 microphysics_debug, diag_i, diag_j);
903 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
908 theta_arr(i,j,k) = t_arr(i,j,k) / exner;
914 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
915 rain_arr(i,j,k) += rainacc_arr(i,j,k);
916 snow_arr(i,j,k) += snowacc_arr(i,j,k);
917 graup_arr(i,j,k) += graupacc_arr(i,j,k);
936 FArrayBox rslopec2_fab(fab_box,1,
Arena_Used);
937 FArrayBox rslopec3_fab(fab_box,1,
Arena_Used);
951 Box box2d(IntVect(ilo,jlo,klo), IntVect(ihi,jhi,klo));
963 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1009 FArrayBox act_ratio_fab(fab_box,1,
Arena_Used);
1010 FArrayBox act_fraction_fab(fab_box,1,
Arena_Used);
1011 FArrayBox act_raw_fab(fab_box,1,
Arena_Used);
1012 FArrayBox act_cap_fab(fab_box,1,
Arena_Used);
1017 FArrayBox qrs_tmp_fab(fab_box,3,
Arena_Used);
1018 FArrayBox ncr_tmp_fab(fab_box,1,
Arena_Used);
1028 auto const& delz_arr = delz_fab.array();
1029 auto const& denfac_arr = denfac_fab.array();
1030 auto const& xni_arr = xni_fab.array();
1031 auto const& rslopec_arr = rslopec_fab.array();
1032 auto const& rslopec2_arr = rslopec2_fab.array();
1033 auto const& rslopec3_arr = rslopec3_fab.array();
1034 auto const& rslope_arr = rslope_fab.array();
1035 auto const& rslopeb_arr = rslopeb_fab.array();
1036 auto const& rslope2_arr = rslope2_fab.array();
1037 auto const& rslope3_arr = rslope3_fab.array();
1038 auto const& work1_arr = work1_fab.array();
1039 auto const& workn_arr = workn_fab.array();
1040 auto const& work2_arr = work2_fab.array();
1041 auto const& mstep_arr = mstep_fab.array();
1042 auto const& numdt_arr = numdt_fab.array();
1043 auto const& sr_arr = sr_fab.array();
1044 auto const& cpm_arr = cpm_fab.array();
1045 auto const& xl_arr = xl_fab.array();
1046 auto const& qsatw_arr = qsatw_fab.array();
1047 auto const& qsati_arr = qsati_fab.array();
1048 auto const& rhw_arr = rhw_fab.array();
1049 auto const& rhi_arr = rhi_fab.array();
1050 auto const& qcr_arr = qcr_fab.array();
1051 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1052 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1053 auto const& praut_arr = praut_fab.array();
1054 auto const& pracw_arr = pracw_fab.array();
1055 auto const& prevp_arr = prevp_fab.array();
1056 auto const& pidep_arr = pidep_fab.array();
1057 auto const& psdep_arr = psdep_fab.array();
1058 auto const& pgdep_arr = pgdep_fab.array();
1059 auto const& pigen_arr = pigen_fab.array();
1060 auto const& psaut_arr = psaut_fab.array();
1061 auto const& pgaut_arr = pgaut_fab.array();
1062 auto const& pcact_arr = pcact_fab.array();
1063 auto const& pcond_arr = pcond_fab.array();
1064 auto const& praci_arr = praci_fab.array();
1065 auto const& piacr_arr = piacr_fab.array();
1066 auto const& niacr_arr = niacr_fab.array();
1067 auto const& psaci_arr = psaci_fab.array();
1068 auto const& pgaci_arr = pgaci_fab.array();
1069 auto const& psacw_arr = psacw_fab.array();
1070 auto const& nsacw_arr = nsacw_fab.array();
1071 auto const& pgacw_arr = pgacw_fab.array();
1072 auto const& ngacw_arr = ngacw_fab.array();
1073 auto const& paacw_arr = paacw_fab.array();
1074 auto const& naacw_arr = naacw_fab.array();
1075 auto const& pracs_arr = pracs_fab.array();
1076 auto const& psacr_arr = psacr_fab.array();
1077 auto const& nsacr_arr = nsacr_fab.array();
1078 auto const& pgacr_arr = pgacr_fab.array();
1079 auto const& ngacr_arr = ngacr_fab.array();
1080 auto const& pgacs_arr = pgacs_fab.array();
1081 auto const& pseml_arr = pseml_fab.array();
1082 auto const& nseml_arr = nseml_fab.array();
1083 auto const& pgeml_arr = pgeml_fab.array();
1084 auto const& ngeml_arr = ngeml_fab.array();
1085 auto const& psevp_arr = psevp_fab.array();
1086 auto const& pgevp_arr = pgevp_fab.array();
1087 auto const& ncauto_arr = ncauto_fab.array();
1088 auto const& ncaccr_arr = ncaccr_fab.array();
1089 auto const& nrauto_arr = nrauto_fab.array();
1090 auto const& nraccr_arr = nraccr_fab.array();
1091 auto const& nrevp_arr = nrevp_fab.array();
1092 auto const& ncact_arr = ncact_fab.array();
1093 auto const& act_ratio_arr = act_ratio_fab.array();
1094 auto const& act_fraction_arr = act_fraction_fab.array();
1095 auto const& act_raw_arr = act_raw_fab.array();
1096 auto const& act_cap_arr = act_cap_fab.array();
1097 auto const& nccol_arr = nccol_fab.array();
1098 auto const& nrcol_arr = nrcol_fab.array();
1099 auto const& qrs_tmp_arr = qrs_tmp_fab.array();
1100 auto const& ncr_tmp_arr = ncr_tmp_fab.array();
1101 auto const& avedia_arr = avedia_fab.array();
1104 auto const& work1c_arr = work1c_fab.array();
1105 auto const& fallc_arr = fallc_fab.array();
1106 auto const& delqi_arr = delqi_fab.array();
1109 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1110 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
1111 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
1112 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
1113 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
1114 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1115 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1116 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1117 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1118 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1121 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k),
Real(0.0));
1122 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k),
Real(0.0));
1132 nn_arr(i,j,k) = amrex::min(amrex::max(nn_arr(i,j,k),
wdm6_literal(1.0e8)),
1138 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1144 const int wdm6_loops = std::max(
1145 static_cast<int>(std::round(dt_advance /
Real(120.0))), 1);
1146 const Real dtcld = dt_advance /
static_cast<Real>(wdm6_loops);
1190 const int diag_k = klo;
1200 auto const& lmask_arr =
m_lmask->const_array(mfi);
1201 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1202 qcr_arr(i,j,k) = (lmask_arr(i,j,0) == 0) ? qc0_loc : qc1_loc;
1206 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1207 qcr_arr(i,j,k) = qc1_loc;
1211 for (
int loop = 0; loop < wdm6_loops; ++loop) {
1216 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1217 denfac_arr(i,j,k) = std::sqrt(
Real(den0) / den_arr(i,j,k));
1230 const Real xai = -dldti /
Real(rv);
1234 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1235 const Real tr = ttp / t_arr(i,j,k);
1238 Real qsw =
Real(
psat) * std::exp(std::log(tr) * xa) * std::exp(xb * (
Real(1.0) - tr));
1239 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
1240 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
1241 qsw = amrex::max(qsw,
Real(qmin));
1242 qsatw_arr(i,j,k) = qsw;
1243 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsw,
Real(qmin));
1246 Real qsi = (t_arr(i,j,k) < ttp)
1247 ?
Real(
psat) * std::exp(std::log(tr) * xai) * std::exp(xbi * (
Real(1.0) - tr))
1248 :
Real(
psat) * std::exp(std::log(tr) * xa) * std::exp(xb * (
Real(1.0) - tr));
1249 qsi = amrex::min(qsi,
wdm6_literal(0.99) * p_arr(i,j,k));
1250 qsi =
Real(ep2) * qsi / (p_arr(i,j,k) - qsi);
1251 qsi = amrex::max(qsi,
Real(qmin));
1252 qsati_arr(i,j,k) = qsi;
1253 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsi,
Real(qmin));
1262 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1263 praut_arr(i,j,k) =
Real(0.0);
1264 pracw_arr(i,j,k) =
Real(0.0);
1265 prevp_arr(i,j,k) =
Real(0.0);
1266 pidep_arr(i,j,k) =
Real(0.0);
1267 psdep_arr(i,j,k) =
Real(0.0);
1268 pgdep_arr(i,j,k) =
Real(0.0);
1269 pigen_arr(i,j,k) =
Real(0.0);
1270 psaut_arr(i,j,k) =
Real(0.0);
1271 pgaut_arr(i,j,k) =
Real(0.0);
1272 pcact_arr(i,j,k) =
Real(0.0);
1273 pcond_arr(i,j,k) =
Real(0.0);
1274 praci_arr(i,j,k) =
Real(0.0);
1275 piacr_arr(i,j,k) =
Real(0.0);
1276 niacr_arr(i,j,k) =
Real(0.0);
1277 psaci_arr(i,j,k) =
Real(0.0);
1278 pgaci_arr(i,j,k) =
Real(0.0);
1279 psacw_arr(i,j,k) =
Real(0.0);
1280 nsacw_arr(i,j,k) =
Real(0.0);
1281 pgacw_arr(i,j,k) =
Real(0.0);
1282 ngacw_arr(i,j,k) =
Real(0.0);
1283 paacw_arr(i,j,k) =
Real(0.0);
1284 naacw_arr(i,j,k) =
Real(0.0);
1285 pracs_arr(i,j,k) =
Real(0.0);
1286 psacr_arr(i,j,k) =
Real(0.0);
1287 nsacr_arr(i,j,k) =
Real(0.0);
1288 pgacr_arr(i,j,k) =
Real(0.0);
1289 ngacr_arr(i,j,k) =
Real(0.0);
1290 pgacs_arr(i,j,k) =
Real(0.0);
1291 pseml_arr(i,j,k) =
Real(0.0);
1292 nseml_arr(i,j,k) =
Real(0.0);
1293 pgeml_arr(i,j,k) =
Real(0.0);
1294 ngeml_arr(i,j,k) =
Real(0.0);
1295 psevp_arr(i,j,k) =
Real(0.0);
1296 pgevp_arr(i,j,k) =
Real(0.0);
1297 ncauto_arr(i,j,k) =
Real(0.0);
1298 ncaccr_arr(i,j,k) =
Real(0.0);
1299 nrauto_arr(i,j,k) =
Real(0.0);
1300 nraccr_arr(i,j,k) =
Real(0.0);
1301 nrevp_arr(i,j,k) =
Real(0.0);
1302 ncact_arr(i,j,k) =
Real(0.0);
1303 act_ratio_arr(i,j,k) =
Real(0.0);
1304 act_fraction_arr(i,j,k) =
Real(0.0);
1305 act_raw_arr(i,j,k) =
Real(0.0);
1306 act_cap_arr(i,j,k) =
Real(0.0);
1307 nccol_arr(i,j,k) =
Real(0.0);
1308 nrcol_arr(i,j,k) =
Real(0.0);
1318 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1319 if (qc_arr(i,j,k) <=
Real(qmin) || nc_arr(i,j,k) <=
Real(1.e1)) {
1320 rslopec_arr(i,j,k) = rslopecmax_loc;
1321 rslopec2_arr(i,j,k) = rslopec2max_loc;
1322 rslopec3_arr(i,j,k) = rslopec3max_loc;
1325 nc_arr(i,j,k), pidnc_loc);
1326 rslopec2_arr(i,j,k) = rslopec_arr(i,j,k) * rslopec_arr(i,j,k);
1327 rslopec3_arr(i,j,k) = rslopec2_arr(i,j,k) * rslopec_arr(i,j,k);
1337 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1338 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
1339 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
1340 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
1342 wdm6_slope_rain_cell(qr_arr(i,j,k), nr_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1344 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
1345 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1346 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1348 wdm6_slope_snow_cell(qs_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k), t_arr(i,j,k),
1351 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
1353 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
1357 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
1358 slope_bvtg_loc, pvtg_loc,
1359 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
1361 rslope_arr(i,j,k,0) = rain_rslope;
1362 rslope_arr(i,j,k,1) = snow_rslope;
1363 rslope_arr(i,j,k,2) = graup_rslope;
1364 rslopeb_arr(i,j,k,0) = rain_rslopeb;
1365 rslopeb_arr(i,j,k,1) = snow_rslopeb;
1366 rslopeb_arr(i,j,k,2) = graup_rslopeb;
1367 rslope2_arr(i,j,k,0) = rain_rslope2;
1368 rslope2_arr(i,j,k,1) = snow_rslope2;
1369 rslope2_arr(i,j,k,2) = graup_rslope2;
1370 rslope3_arr(i,j,k,0) = rain_rslope3;
1371 rslope3_arr(i,j,k,1) = snow_rslope3;
1372 rslope3_arr(i,j,k,2) = graup_rslope3;
1373 work1_arr(i,j,k,0) = rain_vt;
1374 work1_arr(i,j,k,1) = snow_vt;
1375 work1_arr(i,j,k,2) = graup_vt;
1376 workn_arr(i,j,k) = rain_vtn;
1383 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1384 mstep_arr(i,j,k) = 1;
1385 numdt_arr(i,j,k) = 1;
1386 sr_arr(i,j,k) =
Real(0.0);
1388 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1391 for (
int kk =
khi; kk >= klo; --kk) {
1392 work1_arr(i,j,kk,0) = work1_arr(i,j,kk,0) / delz_arr(i,j,kk);
1393 workn_arr(i,j,kk) = workn_arr(i,j,kk) / delz_arr(i,j,kk);
1394 numdt_loc = amrex::max(
static_cast<int>(amrex::max(work1_arr(i,j,kk,0),
1395 workn_arr(i,j,kk)) * dtcld +
Real(0.5)),
1397 if (numdt_loc >= mstep_loc) {
1398 mstep_loc = numdt_loc;
1401 mstep_arr(i,j,k) = mstep_loc;
1402 numdt_arr(i,j,k) = numdt_loc;
1404 ReduceOps<ReduceOpMax> reduce_op;
1405 ReduceData<int> reduce_data(reduce_op);
1406 reduce_op.eval(box2d, reduce_data,
1407 [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) -> GpuTuple<int> {
1408 return {mstep_arr(i,j,k)};
1410 int mstepmax = amrex::get<0>(reduce_data.value());
1411 amrex::ignore_unused(mstepmax);
1418 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1419 amrex::ignore_unused(k);
1420 const int col_mstep = mstep_arr(i,j,klo);
1421 for (
int n = 1; n <= mstepmax; ++n) {
1422 if (n > col_mstep) {
1426 const int kk_top =
khi;
1427 const Real top_flux_qr = den_arr(i,j,kk_top) * qr_arr(i,j,kk_top)
1428 * work1_arr(i,j,kk_top,0) /
static_cast<Real>(col_mstep);
1429 const Real top_flux_nr = nr_arr(i,j,kk_top)
1430 * workn_arr(i,j,kk_top) /
static_cast<Real>(col_mstep);
1432 qr_arr(i,j,kk_top) = amrex::max(
1433 qr_arr(i,j,kk_top) - top_flux_qr * dtcld / den_arr(i,j,kk_top),
1435 nr_arr(i,j,kk_top) = amrex::max(
1436 nr_arr(i,j,kk_top) - top_flux_nr * dtcld,
1439 Real flux_qr_above = top_flux_qr;
1440 Real flux_nr_above = top_flux_nr;
1441 for (
int kk =
khi - 1; kk >= klo; --kk) {
1442 const Real flux_qr = den_arr(i,j,kk) * qr_arr(i,j,kk)
1443 * work1_arr(i,j,kk,0) /
static_cast<Real>(col_mstep);
1444 const Real flux_nr = nr_arr(i,j,kk)
1445 * workn_arr(i,j,kk) /
static_cast<Real>(col_mstep);
1447 const Real dqr_self = amrex::min(
1448 flux_qr * dtcld / den_arr(i,j,kk),
1450 const Real dqr_from_above = amrex::min(
1451 flux_qr_above * delz_arr(i,j,kk+1) / delz_arr(i,j,kk)
1452 * dtcld / den_arr(i,j,kk),
1454 const Real dnr_self = amrex::min(
1457 const Real dnr_from_above = amrex::min(
1458 flux_nr_above * delz_arr(i,j,kk+1) / delz_arr(i,j,kk)
1462 qr_arr(i,j,kk) = amrex::max(
1463 qr_arr(i,j,kk) - dqr_self + dqr_from_above,
1465 nr_arr(i,j,kk) = amrex::max(
1466 nr_arr(i,j,kk) - dnr_self + dnr_from_above,
1469 flux_qr_above = flux_qr;
1470 flux_nr_above = flux_nr;
1473 for (
int kk = klo; kk <=
khi; ++kk) {
1474 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3;
1475 Real rain_vt, rain_vtn;
1477 qr_arr(i,j,kk), nr_arr(i,j,kk),
1478 den_arr(i,j,kk), denfac_arr(i,j,kk),
1480 rslopermax_loc, rsloperbmax_loc,
1481 rsloper2max_loc, rsloper3max_loc,
1482 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1483 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1485 rslope_arr(i,j,kk,0) = rain_rslope;
1486 rslopeb_arr(i,j,kk,0) = rain_rslopeb;
1487 rslope2_arr(i,j,kk,0) = rain_rslope2;
1488 rslope3_arr(i,j,kk,0) = rain_rslope3;
1489 work1_arr(i,j,kk,0) = rain_vt / delz_arr(i,j,kk);
1490 workn_arr(i,j,kk) = rain_vtn / delz_arr(i,j,kk);
1500 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1501 amrex::ignore_unused(k);
1502 const int km =
khi - klo + 1;
1524 for (
int kk = 0; kk < km; ++kk) {
1525 const int k3 = klo + kk;
1526 dz_col(kk) = delz_arr(i,j,k3);
1527 den_col(kk) = den_arr(i,j,k3);
1528 denfac_col(kk) = denfac_arr(i,j,k3);
1529 tk_col(kk) = t_arr(i,j,k3);
1530 rq_col(kk) = den_col(kk) * qs_arr(i,j,k3);
1531 rq2_col(kk) = den_col(kk) * qg_arr(i,j,k3);
1534 ? (work1_arr(i,j,k3,1) * qs_arr(i,j,k3) + work1_arr(i,j,k3,2) * qg_arr(i,j,k3)) /
qsum
1541 km, &delqrs2, &delqrs3, dtcld, 1,
1543 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
Real(
bvts), pvts_loc,
1544 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc, slope_bvtg_loc, pvtg_loc,
1545 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1547 for (
int kk = 0; kk < km; ++kk) {
1548 const int k3 = klo + kk;
1549 qs_arr(i,j,k3) = amrex::max(
rq_col(kk) / den_col(kk),
Real(0.0));
1550 qg_arr(i,j,k3) = amrex::max(
rq2_col(kk) / den_col(kk),
Real(0.0));
1553 work1_arr(i,j,klo,1) = delqrs2 / dz_col(0) / dtcld;
1554 work1_arr(i,j,klo,2) = delqrs3 / dz_col(0) / dtcld;
1564 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1565 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
1566 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
1567 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
1568 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
1573 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1574 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
1575 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
1576 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
1579 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),
1581 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
1582 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
1583 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
1585 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),
1588 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
1590 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
1592 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
1594 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
1595 slope_bvtg_loc, pvtg_loc,
1596 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
1599 rslope_arr(i,j,k,0) = rain_rslope;
1600 rslope_arr(i,j,k,1) = snow_rslope;
1601 rslope_arr(i,j,k,2) = graup_rslope;
1602 rslopeb_arr(i,j,k,0) = rain_rslopeb;
1603 rslopeb_arr(i,j,k,1) = snow_rslopeb;
1604 rslopeb_arr(i,j,k,2) = graup_rslopeb;
1605 rslope2_arr(i,j,k,0) = rain_rslope2;
1606 rslope2_arr(i,j,k,1) = snow_rslope2;
1607 rslope2_arr(i,j,k,2) = graup_rslope2;
1608 rslope3_arr(i,j,k,0) = rain_rslope3;
1609 rslope3_arr(i,j,k,1) = snow_rslope3;
1610 rslope3_arr(i,j,k,2) = graup_rslope3;
1611 work1_arr(i,j,k,0) = rain_vt;
1612 work1_arr(i,j,k,1) = snow_vt;
1613 work1_arr(i,j,k,2) = graup_vt;
1614 workn_arr(i,j,k) = rain_vtn;
1625 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1627 if (t_arr(i,j,k) > t0c) {
1628 const Real supcol = t0c - t_arr(i,j,k);
1636 den_arr(i,j,k),
Real(den0));
1639 if (qs_arr(i,j,k) >
Real(0.0)) {
1640 const Real coeres_s = rslope2_arr(i,j,k,1) *
1641 std::sqrt(rslope_arr(i,j,k,1) * rslopeb_arr(i,j,k,1));
1644 (t0c - t_arr(i,j,k)) * pi_wdm6_loc *
Real(0.5) *
n0sfac *
1645 (precs1_loc * rslope2_arr(i,j,k,1) +
1646 precs2_loc *
work2 * coeres_s) / den_arr(i,j,k);
1648 psmlt = amrex::min(amrex::max(
psmlt * dtcld, -qs_arr(i,j,k)),
1654 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k) - sfac *
psmlt,
Real(0.0));
1657 qs_arr(i,j,k) +=
psmlt;
1658 qr_arr(i,j,k) -=
psmlt;
1659 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) *
psmlt;
1663 if (qg_arr(i,j,k) >
Real(0.0)) {
1664 const Real coeres_g = rslope2_arr(i,j,k,2) *
1665 std::sqrt(rslope_arr(i,j,k,2) * rslopeb_arr(i,j,k,2));
1668 (t0c - t_arr(i,j,k)) *
1669 (precg1_loc * rslope2_arr(i,j,k,2) +
1670 precg2_loc *
work2 * coeres_g) / den_arr(i,j,k);
1672 pgmlt = amrex::min(amrex::max(
pgmlt * dtcld, -qg_arr(i,j,k)),
1676 const Real gfac = rslope_arr(i,j,k,2) * n0g_loc /
1678 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k) - gfac *
pgmlt,
Real(0.0));
1681 qg_arr(i,j,k) +=
pgmlt;
1682 qr_arr(i,j,k) -=
pgmlt;
1683 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) *
pgmlt;
1712 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1714 if (qi_arr(i,j,k) >
Real(0.0)) {
1715 const Real xni_safe = amrex::max(xni_arr(i,j,k),
Real(1.0e-30));
1716 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) / xni_safe;
1717 const Real diameter = amrex::max(amrex::min(dicon_loc * std::sqrt(xmi), dimax_loc),
1721 work1c_arr(i,j,k) =
work1c;
1725 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1726 amrex::ignore_unused(k);
1727 const int km =
khi - klo + 1;
1751 for (
int kk = 0; kk < km; ++kk) {
1752 const int k3 = klo + kk;
1753 dz_col(kk) = delz_arr(i,j,k3);
1754 den_col(kk) = den_arr(i,j,k3);
1755 denfac_col(kk) = denfac_arr(i,j,k3);
1756 tk_col(kk) = t_arr(i,j,k3);
1758 rq_col(kk) = den_col(kk) * qi_arr(i,j,k3);
1759 rq2_col(kk) = den_col(kk) * qi_arr(i,j,k3);
1780 km, &delqi_col, &delqi2_col, dtcld, 0,
1782 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
Real(
bvts), pvts_loc,
1783 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc, slope_bvtg_loc, pvtg_loc,
1784 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1787 for (
int kk = 0; kk < km; ++kk) {
1788 const int k3 = klo + kk;
1789 qi_arr(i,j,k3) = amrex::max(
rq_col(kk) / den_col(kk),
Real(0.0));
1796 fallc_arr(i,j,klo) = delqi_col / dz_col(0) / dtcld;
1797 delqi_arr(i,j,klo) = delqi_col;
1806 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) noexcept
1811 const Real fall_c = fallc_arr(i,j,klo);
1819 if (fallsum >
Real(0.0)) {
1820 rain_arr(i,j,klo) += fallsum * conv;
1823 if (fallsum_qsi >
Real(0.0)) {
1824 snow_arr(i,j,klo) += fallsum_qsi * conv;
1827 if (fallsum_qg >
Real(0.0)) {
1828 graup_arr(i,j,klo) += fallsum_qg * conv;
1831 if (fallsum >
Real(0.0)) {
1832 sr_arr(i,j,klo) = (snow_arr(i,j,klo) + graup_arr(i,j,klo))
1869 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1870 const Real supcol = t0c - t_arr(i,j,k);
1872 if (supcol <
Real(0.0))
xlf = xlf0;
1875 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
1876 const Real qim = qi_arr(i,j,k);
1878 qc_arr(i,j,k) += qim;
1879 if (qim >
Real(qmin)) {
1880 nc_arr(i,j,k) += xni_arr(i,j,k);
1882 t_arr(i,j,k) -=
xlf / cpm_arr(i,j,k) * qim;
1883 qi_arr(i,j,k) =
Real(0.0);
1895 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
1896 const Real qc_old = qc_arr(i,j,k);
1898 qi_arr(i,j,k) += qc_old;
1900 if (nc_arr(i,j,k) >
Real(0.0)) {
1901 nc_arr(i,j,k) =
Real(0.0);
1904 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * qc_old;
1905 qc_arr(i,j,k) =
Real(0.0);
1920 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
1921 const Real supcolt = amrex::min(supcol,
Real(70.0));
1922 const Real expterm = std::exp(pfrz2_loc * supcolt) -
Real(1.0);
1927 const Real rs3 = rslopec3_arr(i,j,k);
1937 Real pfrzdtc = pi_wdm6_loc * pi_wdm6_loc * pfrz1_loc * expterm
1938 * denr / den_arr(i,j,k) * nc_arr(i,j,k) * rs3 * rs3
1939 /
Real(18.0) * dtcld;
1940 pfrzdtc = amrex::min(pfrzdtc, qc_arr(i,j,k));
1944 Real nfrzdtc = pi_wdm6_loc * pfrz1_loc * expterm
1945 * nc_arr(i,j,k) * rs3
1946 /
Real(6.0) * dtcld;
1947 nfrzdtc = amrex::min(nfrzdtc, nc_arr(i,j,k));
1951 nc_arr(i,j,k) -= nfrzdtc;
1955 qi_arr(i,j,k) += pfrzdtc;
1956 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * pfrzdtc;
1957 qc_arr(i,j,k) -= pfrzdtc;
1969 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
1970 const Real supcolt = amrex::min(supcol,
Real(70.0));
1971 const Real expterm = std::exp(pfrz2_loc * supcolt) -
Real(1.0);
1974 const Real rs3 = rslope3_arr(i,j,k,0);
1979 Real pfrzdtr =
Real(140.0) * (pi_wdm6_loc * pi_wdm6_loc)
1980 * pfrz1_loc * nr_arr(i,j,k)
1981 * denr / den_arr(i,j,k)
1982 * expterm * rs3 * rs3 * dtcld;
1983 pfrzdtr = amrex::min(pfrzdtr, qr_arr(i,j,k));
1988 Real nfrzdtr =
Real(4.0) * pi_wdm6_loc * pfrz1_loc
1989 * nr_arr(i,j,k) * expterm * rs3 * dtcld;
1990 nfrzdtr = amrex::min(nfrzdtr, nr_arr(i,j,k));
1991 nr_arr(i,j,k) -= nfrzdtr;
1995 qg_arr(i,j,k) += pfrzdtr;
1996 t_arr(i,j,k) +=
xlf / cpm_arr(i,j,k) * pfrzdtr;
1997 qr_arr(i,j,k) -= pfrzdtr;
2006 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2007 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k),
Real(0.0));
2008 nr_arr(i,j,k) = amrex::max(nr_arr(i,j,k),
Real(0.0));
2018 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2019 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
2020 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
2021 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
2022 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
2026 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2027 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
2028 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
2029 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
2032 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),
2034 rslopermax_loc, rsloperbmax_loc, rsloper2max_loc, rsloper3max_loc,
2035 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
2036 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
2038 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),
2041 rslopesmax_loc, rslopesbmax_loc, rslopes2max_loc, rslopes3max_loc,
2043 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt,
2045 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
2047 rslopegmax_loc, rslopegbmax_loc, rslopeg2max_loc, rslopeg3max_loc,
2048 slope_bvtg_loc, pvtg_loc,
2049 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt);
2052 rslope_arr(i,j,k,0) = rain_rslope;
2053 rslope_arr(i,j,k,1) = snow_rslope;
2054 rslope_arr(i,j,k,2) = graup_rslope;
2055 rslopeb_arr(i,j,k,0) = rain_rslopeb;
2056 rslopeb_arr(i,j,k,1) = snow_rslopeb;
2057 rslopeb_arr(i,j,k,2) = graup_rslopeb;
2058 rslope2_arr(i,j,k,0) = rain_rslope2;
2059 rslope2_arr(i,j,k,1) = snow_rslope2;
2060 rslope2_arr(i,j,k,2) = graup_rslope2;
2061 rslope3_arr(i,j,k,0) = rain_rslope3;
2062 rslope3_arr(i,j,k,1) = snow_rslope3;
2063 rslope3_arr(i,j,k,2) = graup_rslope3;
2064 work1_arr(i,j,k,0) = rain_vt;
2065 work1_arr(i,j,k,1) = snow_vt;
2066 work1_arr(i,j,k,2) = graup_vt;
2067 workn_arr(i,j,k) = rain_vtn;
2072 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2074 avedia_arr(i,j,k,1) = rslope_arr(i,j,k,0) * cbrt24;
2078 const Real qci_for_lamdac = qc_arr(i,j,k);
2079 const Real nc_for_lamdac = nc_arr(i,j,k);
2081 if (qci_for_lamdac <=
Real(qmin) || nc_for_lamdac <=
Real(
ncmin)) {
2082 rslopec_arr(i,j,k) = rslopecmax_loc;
2083 rslopec2_arr(i,j,k) = rslopec2max_loc;
2084 rslopec3_arr(i,j,k) = rslopec3max_loc;
2093 nc_for_lamdac, pidnc_loc);
2094 rslopec_arr(i,j,k) = rslc;
2095 rslopec2_arr(i,j,k) = rslc * rslc;
2096 rslopec3_arr(i,j,k) = rslopec2_arr(i,j,k) * rslc;
2100 avedia_arr(i,j,k,0) = rslopec_arr(i,j,k);
2107 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2109 if (i == diag_i && j == diag_j && k == diag_k) {
2111 work1_arr(i,j,k,0) =
wdm6_diffac(xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
2112 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
2113 if (i == diag_i && j == diag_j && k == diag_k) {
2115 if (i == diag_i && j == diag_j && k == diag_k) {
2117 work1_arr(i,j,k,1) =
wdm6_diffac(
Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
2118 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
2119 if (i == diag_i && j == diag_j && k == diag_k) {
2122 work2_arr(i,j,k) =
wdm6_venfac(p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
2128 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2129 const Real supsat = amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsatw_arr(i,j,k);
2130 const Real satdt = supsat / dtcld;
2132 * (
wdm6_literal(1.0e20/16.0) * rslopec2_arr(i,j,k) * rslopec2_arr(i,j,k)
2136 if (qc_arr(i,j,k) > qcr_arr(i,j,k) && nc_arr(i,j,k) >
Real(
ncmin)) {
2146 praut_arr(i,j,k) = qck1_loc * std::pow(qc_arr(i,j,k),
wdm6_literal(7.0/3.0))
2148 praut_arr(i,j,k) = amrex::min(praut_arr(i,j,k), qc_arr(i,j,k) / dtcld);
2150 nrauto_arr(i,j,k) =
Real(3.5e9) * den_arr(i,j,k) * praut_arr(i,j,k);
2151 if (qr_arr(i,j,k) > lenconcr) {
2152 nrauto_arr(i,j,k) = nr_arr(i,j,k) / qr_arr(i,j,k) * praut_arr(i,j,k);
2154 nrauto_arr(i,j,k) = amrex::min(nrauto_arr(i,j,k), nc_arr(i,j,k) / dtcld);
2157 if (qr_arr(i,j,k) >= lenconcr) {
2158 if (avedia_arr(i,j,k,1) >=
Real(
di100)) {
2159 nraccr_arr(i,j,k) = amrex::min(
2160 Real(
ncrk1) * nc_arr(i,j,k) * nr_arr(i,j,k)
2161 * (rslopec3_arr(i,j,k) +
Real(24.0) * rslope3_arr(i,j,k,0)),
2162 nc_arr(i,j,k) / dtcld);
2163 pracw_arr(i,j,k) = amrex::min(
2164 pi_wdm6_loc /
Real(6.0) * (
Real(denr) / den_arr(i,j,k))
2165 *
Real(
ncrk1) * nc_arr(i,j,k) * nr_arr(i,j,k)
2166 * rslopec3_arr(i,j,k)
2167 * (
Real(2.0) * rslopec3_arr(i,j,k) +
Real(24.0) * rslope3_arr(i,j,k,0)),
2168 qc_arr(i,j,k) / dtcld);
2170 nraccr_arr(i,j,k) = amrex::min(
2171 Real(
ncrk2) * nc_arr(i,j,k) * nr_arr(i,j,k)
2172 * (
Real(2.0) * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k)
2173 +
Real(5040.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0)),
2174 nc_arr(i,j,k) / dtcld);
2175 pracw_arr(i,j,k) = amrex::min(
2176 pi_wdm6_loc /
Real(6.0) * (
Real(denr) / den_arr(i,j,k))
2177 *
Real(
ncrk2) * nc_arr(i,j,k) * nr_arr(i,j,k)
2178 * rslopec3_arr(i,j,k)
2179 * (
Real(6.0) * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k)
2180 +
Real(5040.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0)),
2181 qc_arr(i,j,k) / dtcld);
2185 if (avedia_arr(i,j,k,0) >=
Real(
di100)) {
2186 nccol_arr(i,j,k) =
Real(
ncrk1) * nc_arr(i,j,k) * nc_arr(i,j,k) * rslopec3_arr(i,j,k);
2188 nccol_arr(i,j,k) =
Real(2.0) *
Real(
ncrk2) * nc_arr(i,j,k) * nc_arr(i,j,k)
2189 * rslopec3_arr(i,j,k) * rslopec3_arr(i,j,k);
2192 if (qr_arr(i,j,k) >= lenconcr) {
2193 if (avedia_arr(i,j,k,1) <
Real(
di100)) {
2194 nrcol_arr(i,j,k) =
Real(5040.0) *
Real(
ncrk2) * nr_arr(i,j,k) * nr_arr(i,j,k)
2195 * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,0);
2196 }
else if (avedia_arr(i,j,k,1) <
Real(
di600)) {
2197 nrcol_arr(i,j,k) =
Real(24.0) *
Real(
ncrk1) * nr_arr(i,j,k) * nr_arr(i,j,k)
2198 * rslope3_arr(i,j,k,0);
2199 }
else if (avedia_arr(i,j,k,1) <
Real(
di2000)) {
2201 nrcol_arr(i,j,k) =
Real(24.0) * std::exp(coecol) *
Real(
ncrk1)
2202 * nr_arr(i,j,k) * nr_arr(i,j,k) * rslope3_arr(i,j,k,0);
2204 nrcol_arr(i,j,k) =
Real(0.0);
2208 if (qr_arr(i,j,k) >
Real(0.0)) {
2209 const Real coeres = rslope_arr(i,j,k,0)
2210 * std::sqrt(rslope_arr(i,j,k,0) * rslopeb_arr(i,j,k,0));
2211 prevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0)) * nr_arr(i,j,k)
2212 * (precr1_loc * rslope_arr(i,j,k,0) + precr2_loc * work2_arr(i,j,k) * coeres)
2213 / work1_arr(i,j,k,0);
2214 if (prevp_arr(i,j,k) <
Real(0.0)) {
2215 prevp_arr(i,j,k) = amrex::max(prevp_arr(i,j,k), -qr_arr(i,j,k) / dtcld);
2216 prevp_arr(i,j,k) = amrex::max(prevp_arr(i,j,k), satdt /
Real(2.0));
2218 if (prevp_arr(i,j,k) == -qr_arr(i,j,k) / dtcld) {
2219 nn_arr(i,j,k) = nn_arr(i,j,k) + nr_arr(i,j,k);
2220 nr_arr(i,j,k) =
Real(0.0);
2222 }
else if (prevp_arr(i,j,k) ==
Real(0.0)) {
2225 prevp_arr(i,j,k) =
Real(0.0);
2227 prevp_arr(i,j,k) = amrex::min(prevp_arr(i,j,k), satdt /
Real(2.0));
2234 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2235 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2240 const Real supsat = amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsati_arr(i,j,k);
2241 amrex::ignore_unused(supsat);
2242 const Real satdt = supsat / dtcld;
2243 amrex::ignore_unused(satdt);
2245 const Real qi_val = qi_arr(i,j,k);
2246 if (!(supcol >
Real(0.0) && qi_val >
Real(qmin))) {
2250 Real temp = den_arr(i,j,k) * amrex::max(qi_val,
Real(qmin));
2251 temp = std::sqrt(std::sqrt(temp * temp * temp));
2252 xni_arr(i,j,k) = amrex::min(amrex::max(
Real(5.38e7) * temp,
Real(1.e3)),
Real(1.e6));
2259 const Real xni_safe = amrex::max(xni_arr(i,j,k),
Real(1.0e-30));
2260 const Real xmi = den_arr(i,j,k) * qi_val / xni_safe;
2272 const Real vt2r = pvtr_loc * rslopeb_arr(i,j,k,0) * denfac_arr(i,j,k);
2273 const Real vt2s = pvts_loc * rslopeb_arr(i,j,k,1) * denfac_arr(i,j,k);
2274 const Real vt2g = pvtg_loc * rslopeb_arr(i,j,k,2) * denfac_arr(i,j,k);
2289 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
2293 const Real acrfac =
Real(6.0) * rslope2_arr(i,j,k,0)
2294 +
Real(4.0) * diameter * rslope_arr(i,j,k,0)
2295 + diameter * diameter;
2296 praci_arr(i,j,k) = pi_wdm6_loc * qi_val * nr_arr(i,j,k)
2297 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
2298 praci_arr(i,j,k) *= std::pow(
2299 amrex::min(amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_val),
Real(1.0)),
2301 praci_arr(i,j,k) = amrex::min(praci_arr(i,j,k), qi_val / dtcld);
2304 * nr_arr(i,j,k) *
Real(denr) * xni_arr(i,j,k) * denfac_arr(i,j,k)
2305 * g7pbr_loc * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2306 * rslopeb_arr(i,j,k,0) / (
Real(24.0) * den_arr(i,j,k));
2307 piacr_arr(i,j,k) *= std::pow(
2308 amrex::min(amrex::max(
Real(0.0), qi_val / qr_arr(i,j,k)),
Real(1.0)),
2310 piacr_arr(i,j,k) = amrex::min(piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2314 niacr_arr(i,j,k) = pi_wdm6_loc *
Real(
WDM6::avtr) * nr_arr(i,j,k)
2315 * xni_arr(i,j,k) * denfac_arr(i,j,k) * g4pbr_loc
2316 * rslope2_arr(i,j,k,0) * rslopeb_arr(i,j,k,0) /
Real(4.0);
2317 niacr_arr(i,j,k) *= std::pow(
2318 amrex::min(amrex::max(
Real(0.0), qi_val / qr_arr(i,j,k)),
Real(1.0)),
2320 niacr_arr(i,j,k) = amrex::min(niacr_arr(i,j,k), nr_arr(i,j,k) / dtcld);
2324 const Real acrfac =
Real(2.0) * rslope3_arr(i,j,k,1)
2325 +
Real(2.0) * diameter * rslope2_arr(i,j,k,1)
2326 + diameter * diameter * rslope_arr(i,j,k,1);
2327 psaci_arr(i,j,k) = pi_wdm6_loc * qi_val * eacrs *
Real(
n0s) *
n0sfac
2328 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
2329 psaci_arr(i,j,k) = amrex::min(psaci_arr(i,j,k), qi_val / dtcld);
2339 const Real acrfac =
Real(2.0) * rslope3_arr(i,j,k,2)
2340 +
Real(2.0) * diameter * rslope2_arr(i,j,k,2)
2341 + diameter * diameter * rslope_arr(i,j,k,2);
2342 pgaci_arr(i,j,k) = pi_wdm6_loc * egi * qi_val * n0g_loc
2343 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
2344 pgaci_arr(i,j,k) = amrex::min(pgaci_arr(i,j,k), qi_val / dtcld);
2350 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2351 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2356 const Real qs_val = qs_arr(i,j,k);
2357 const Real qg_val = qg_arr(i,j,k);
2358 const Real qc_val = qc_arr(i,j,k);
2359 const Real nc_val = nc_arr(i,j,k);
2382 const Real ratio_s = (qc_val >
Real(0.0))
2383 ? amrex::min(amrex::max(
Real(0.0), qs_val / qc_val),
Real(1.0))
2392 const Real ratio_g = (qc_val >
Real(0.0))
2393 ? amrex::min(amrex::max(
Real(0.0), qg_val / qc_val),
Real(1.0))
2397 psacw_arr(i,j,k) = amrex::min(
2398 pacrc_loc *
n0sfac * rslope3_arr(i,j,k,1) * rslopeb_arr(i,j,k,1)
2399 * ratio_s * ratio_s * qc_val * denfac_arr(i,j,k),
2403 nsacw_arr(i,j,k) = amrex::min(
2404 pacrc_loc *
n0sfac * rslope3_arr(i,j,k,1) * rslopeb_arr(i,j,k,1)
2405 * ratio_s * ratio_s * nc_val * denfac_arr(i,j,k),
2409 pgacw_arr(i,j,k) = amrex::min(
2410 pacrg_loc * rslope3_arr(i,j,k,2) * rslopeb_arr(i,j,k,2)
2411 * qc_val * ratio_g * ratio_g * denfac_arr(i,j,k),
2415 ngacw_arr(i,j,k) = amrex::min(
2416 pacrg_loc * rslope3_arr(i,j,k,2) * rslopeb_arr(i,j,k,2)
2417 * nc_val * ratio_g * ratio_g * denfac_arr(i,j,k),
2423 paacw_arr(i,j,k) = (qs_val * psacw_arr(i,j,k) + qg_val * pgacw_arr(i,j,k)) /
qsum;
2424 naacw_arr(i,j,k) = (qs_val * nsacw_arr(i,j,k) + qg_val * ngacw_arr(i,j,k)) /
qsum;
2430 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2431 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2436 const Real qr_val = qr_arr(i,j,k);
2437 const Real qs_val = qs_arr(i,j,k);
2438 const Real qg_val = qg_arr(i,j,k);
2439 const Real nr_val = nr_arr(i,j,k);
2440 const Real vt2r = pvtr_loc * rslopeb_arr(i,j,k,0) * denfac_arr(i,j,k);
2441 const Real vt2s = pvts_loc * rslopeb_arr(i,j,k,1) * denfac_arr(i,j,k);
2442 const Real vt2g = pvtg_loc * rslopeb_arr(i,j,k,2) * denfac_arr(i,j,k);
2445 ? (vt2s * qs_val + vt2g * qg_val) /
qsum
2449 if (supcol >
Real(0.0)) {
2451 Real(5.0) * rslope3_arr(i,j,k,1) * rslope3_arr(i,j,k,1)
2452 +
Real(4.0) * rslope3_arr(i,j,k,1) * rslope2_arr(i,j,k,1)
2453 * rslope_arr(i,j,k,0)
2454 +
Real(1.5) * rslope2_arr(i,j,k,1) * rslope2_arr(i,j,k,1)
2455 * rslope2_arr(i,j,k,0);
2456 pracs_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val *
Real(
n0s)
2457 *
n0sfac * std::abs(vt2r - vt2ave)
2458 * (
Real(
dens) / den_arr(i,j,k)) * acrfac;
2459 const Real ratio = amrex::min(
2460 amrex::max(
Real(0.0), qr_val / qs_val),
Real(1.0));
2461 pracs_arr(i,j,k) *= ratio * ratio;
2462 pracs_arr(i,j,k) = amrex::min(pracs_arr(i,j,k), qs_val / dtcld);
2466 Real(30.0) * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2467 * rslope_arr(i,j,k,1)
2468 +
Real(10.0) * rslope2_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2469 * rslope2_arr(i,j,k,1)
2470 +
Real(2.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,1);
2471 psacr_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val *
Real(
n0s)
2472 *
n0sfac * std::abs(vt2ave - vt2r)
2473 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2474 const Real ratio = amrex::min(
2475 amrex::max(
Real(0.0), qs_val / qr_val),
Real(1.0));
2476 psacr_arr(i,j,k) *= ratio * ratio;
2477 psacr_arr(i,j,k) = amrex::min(psacr_arr(i,j,k), qr_val / dtcld);
2482 Real(1.5) * rslope2_arr(i,j,k,0) * rslope_arr(i,j,k,1)
2483 + rslope_arr(i,j,k,0) * rslope2_arr(i,j,k,1)
2484 +
Real(0.5) * rslope3_arr(i,j,k,1);
2485 nsacr_arr(i,j,k) = pi_wdm6_loc * nr_val *
Real(
n0s) *
n0sfac
2486 * std::abs(vt2ave - vt2r) * acrfac;
2487 const Real ratio = amrex::min(
2488 amrex::max(
Real(0.0), qs_val / qr_val),
Real(1.0));
2489 nsacr_arr(i,j,k) *= ratio * ratio;
2490 nsacr_arr(i,j,k) = amrex::min(nsacr_arr(i,j,k), nr_val / dtcld);
2495 Real(30.0) * rslope3_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2496 * rslope_arr(i,j,k,2)
2497 +
Real(10.0) * rslope2_arr(i,j,k,0) * rslope2_arr(i,j,k,0)
2498 * rslope2_arr(i,j,k,2)
2499 +
Real(2.0) * rslope3_arr(i,j,k,0) * rslope3_arr(i,j,k,2);
2500 pgacr_arr(i,j,k) = pi_wdm6_loc * pi_wdm6_loc * nr_val * n0g_loc
2501 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
2503 const Real ratio = amrex::min(
2504 amrex::max(
Real(0.0), qg_val / qr_val),
Real(1.0));
2505 pgacr_arr(i,j,k) *= ratio * ratio;
2506 pgacr_arr(i,j,k) = amrex::min(pgacr_arr(i,j,k), qr_val / dtcld);
2511 Real(1.5) * rslope2_arr(i,j,k,0) * rslope_arr(i,j,k,2)
2512 + rslope_arr(i,j,k,0) * rslope2_arr(i,j,k,2)
2513 +
Real(0.5) * rslope3_arr(i,j,k,2);
2514 ngacr_arr(i,j,k) = pi_wdm6_loc * nr_val * n0g_loc
2515 * std::abs(vt2ave - vt2r) * acrfac;
2516 const Real ratio = amrex::min(
2517 amrex::max(
Real(0.0), qg_val / qr_val),
Real(1.0));
2518 ngacr_arr(i,j,k) *= ratio * ratio;
2519 ngacr_arr(i,j,k) = amrex::min(ngacr_arr(i,j,k), nr_val / dtcld);
2523 pgacs_arr(i,j,k) =
Real(0.0);
2526 if (supcol <=
Real(0.0)) {
2528 if (qs_val >
Real(0.0)) {
2529 pseml_arr(i,j,k) = amrex::min(
2532 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2538 nseml_arr(i,j,k) = -sfac * pseml_arr(i,j,k);
2541 if (qg_val >
Real(0.0)) {
2542 pgeml_arr(i,j,k) = amrex::min(
2545 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2550 const Real gfac = rslope_arr(i,j,k,2) * n0g_loc / qg_val;
2551 ngeml_arr(i,j,k) = -gfac * pgeml_arr(i,j,k);
2558 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2559 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2560 if (supcol <=
Real(0.0)) {
2569 amrex::max(
qv_arr(i,j,k),
Real(qmin)) - qsati_arr(i,j,k);
2570 const Real satdt = supsat / dtcld;
2573 const Real qi_val = qi_arr(i,j,k);
2574 const Real qs_val = qs_arr(i,j,k);
2575 const Real qg_val = qg_arr(i,j,k);
2576 const Real xni = xni_arr(i,j,k);
2577 const Real xni_safe = amrex::max(
xni,
Real(1.0e-30));
2578 const Real xmi = den_arr(i,j,k) * qi_val / xni_safe;
2579 const Real diameter = amrex::min(
2581 const Real rhi = rhi_arr(i,j,k);
2582 const Real work1i = work1_arr(i,j,k,1);
2584 if (qi_val >
Real(0.0) && ifsat != 1) {
2585 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2587 Real supice = satdt - prevp_arr(i,j,k);
2588 if (pidep_arr(i,j,k) <
Real(0.0)) {
2589 pidep_arr(i,j,k) = amrex::max(
2590 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2592 pidep_arr(i,j,k) = amrex::max(
2593 pidep_arr(i,j,k), -qi_val / dtcld);
2595 pidep_arr(i,j,k) = amrex::min(
2596 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2599 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2600 >= std::abs(satdt)) {
2605 if (qs_val >
Real(0.0) && ifsat != 1) {
2606 const Real coeres_s = rslope2_arr(i,j,k,1)
2607 * std::sqrt(rslope_arr(i,j,k,1) * rslopeb_arr(i,j,k,1));
2609 * (precs1_loc * rslope2_arr(i,j,k,1)
2610 + precs2_loc * work2_arr(i,j,k) * coeres_s)
2612 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2613 if (psdep_arr(i,j,k) <
Real(0.0)) {
2614 psdep_arr(i,j,k) = amrex::max(
2615 psdep_arr(i,j,k), -qs_val / dtcld);
2616 psdep_arr(i,j,k) = amrex::max(
2617 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2620 psdep_arr(i,j,k) = amrex::min(
2621 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2624 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2625 + psdep_arr(i,j,k)) >= std::abs(satdt)) {
2630 if (qg_val >
Real(0.0) && ifsat != 1) {
2631 const Real coeres_g = rslope2_arr(i,j,k,2)
2632 * std::sqrt(rslope_arr(i,j,k,2) * rslopeb_arr(i,j,k,2));
2633 pgdep_arr(i,j,k) = (
rhi -
Real(1.0))
2634 * (precg1_loc * rslope2_arr(i,j,k,2)
2635 + precg2_loc * work2_arr(i,j,k) * coeres_g)
2637 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k)
2639 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2640 pgdep_arr(i,j,k) = amrex::max(
2641 pgdep_arr(i,j,k), -qg_val / dtcld);
2642 pgdep_arr(i,j,k) = amrex::max(
2643 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2646 pgdep_arr(i,j,k) = amrex::min(
2647 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2650 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2651 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2652 >= std::abs(satdt)) {
2657 if (supsat >
Real(0.0) && ifsat != 1) {
2658 const Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k)
2659 - psdep_arr(i,j,k) - pgdep_arr(i,j,k);
2662 const Real pigen_raw = amrex::max(
2664 (roqi0 / den_arr(i,j,k) - amrex::max(qi_val,
Real(0.0))) / dtcld);
2665 pigen_arr(i,j,k) = amrex::min(
2666 amrex::min(pigen_raw, satdt), supice);
2673 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2674 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2676 if (qi_arr(i,j,k) >
Real(0.0)) {
2677 const Real qimax = roqimax_loc / den_arr(i,j,k);
2678 psaut_arr(i,j,k) = amrex::max(
2679 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2682 if (qs_arr(i,j,k) >
Real(0.0)) {
2695 pgaut_arr(i,j,k) = amrex::min(
2698 qs_arr(i,j,k) / dtcld);
2704 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2705 const Real supcol =
Real(t0c) - t_arr(i,j,k);
2706 if (supcol <
Real(0.0)) {
2712 if (qs_arr(i,j,k) >
Real(0.0)
2713 && rhw_arr(i,j,k) <
Real(1.0)) {
2714 const Real coeres = rslope2_arr(i,j,k,1)
2715 * std::sqrt(rslope_arr(i,j,k,1)
2716 * rslopeb_arr(i,j,k,1));
2717 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2719 * (precs1_loc * rslope2_arr(i,j,k,1)
2720 + precs2_loc * work2_arr(i,j,k) * coeres)
2721 / work1_arr(i,j,k,0);
2722 psevp_arr(i,j,k) = amrex::min(
2723 amrex::max(psevp_arr(i,j,k),
2724 -qs_arr(i,j,k) / dtcld),
2728 if (qg_arr(i,j,k) >
Real(0.0)
2729 && rhw_arr(i,j,k) <
Real(1.0)) {
2730 const Real coeres = rslope2_arr(i,j,k,2)
2731 * std::sqrt(rslope_arr(i,j,k,2)
2732 * rslopeb_arr(i,j,k,2));
2733 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2734 * (precg1_loc * rslope2_arr(i,j,k,2)
2735 + precg2_loc * work2_arr(i,j,k) * coeres)
2736 / work1_arr(i,j,k,0);
2737 pgevp_arr(i,j,k) = amrex::min(
2738 amrex::max(pgevp_arr(i,j,k),
2739 -qg_arr(i,j,k) / dtcld),
2747 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2759 (qr_arr(i,j,k) <
wdm6_literal(1.0e-4)) ? one_l : zero_l;
2761 if (t_arr(i,j,k) <= t0c_l) {
2762 Real value, source, factor,
xlf, xlwork2;
2764 value = amrex::max(qmin_l, qc_arr(i,j,k));
2765 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2766 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2767 if (source > value) {
2768 factor = value / source;
2769 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2770 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2771 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2774 value = amrex::max(qmin_l, qi_arr(i,j,k));
2775 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2776 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2777 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2778 if (source > value) {
2779 factor = value / source;
2780 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2781 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2782 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2783 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2784 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2785 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2788 value = amrex::max(qmin_l, qr_arr(i,j,k));
2789 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2790 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2791 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2792 if (source > value) {
2793 factor = value / source;
2794 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2795 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2796 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2797 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2798 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2799 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2802 value = amrex::max(qmin_l, qs_arr(i,j,k));
2803 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2804 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2805 + piacr_arr(i,j,k) * delta3
2806 + praci_arr(i,j,k) * delta3
2807 - pracs_arr(i,j,k) * (one_l - delta2)
2808 + psacr_arr(i,j,k) * delta2
2809 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2810 if (source > value) {
2811 factor = value / source;
2812 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2813 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2814 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2815 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2816 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2817 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2818 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2819 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2820 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2821 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2824 value = amrex::max(qmin_l, qg_arr(i,j,k));
2825 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2826 + piacr_arr(i,j,k) * (one_l - delta3)
2827 + praci_arr(i,j,k) * (one_l - delta3)
2828 + psacr_arr(i,j,k) * (one_l - delta2)
2829 + pracs_arr(i,j,k) * (one_l - delta2)
2830 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2831 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2832 if (source > value) {
2833 factor = value / source;
2834 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2835 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2836 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2837 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2838 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2839 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2840 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2841 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2842 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2843 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2846 value = amrex::max(ncmin_l, nc_arr(i,j,k));
2847 source = (nrauto_arr(i,j,k) + nccol_arr(i,j,k)
2848 + nraccr_arr(i,j,k) + naacw_arr(i,j,k)
2849 + naacw_arr(i,j,k)) * dtcld;
2850 if (source > value) {
2851 factor = value / source;
2852 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2853 nccol_arr(i,j,k) = nccol_arr(i,j,k) * factor;
2854 nraccr_arr(i,j,k) = nraccr_arr(i,j,k) * factor;
2855 naacw_arr(i,j,k) = naacw_arr(i,j,k) * factor;
2858 value = amrex::max(nrmin_l, nr_arr(i,j,k));
2859 source = (-nrauto_arr(i,j,k) + nrcol_arr(i,j,k)
2860 + niacr_arr(i,j,k) + nsacr_arr(i,j,k)
2861 + ngacr_arr(i,j,k)) * dtcld;
2862 if (source > value) {
2863 factor = value / source;
2864 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2865 nrcol_arr(i,j,k) = nrcol_arr(i,j,k) * factor;
2866 niacr_arr(i,j,k) = niacr_arr(i,j,k) * factor;
2867 nsacr_arr(i,j,k) = nsacr_arr(i,j,k) * factor;
2868 ngacr_arr(i,j,k) = ngacr_arr(i,j,k) * factor;
2871 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2872 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2873 + pidep_arr(i,j,k));
2874 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2875 qc_arr(i,j,k) = amrex::max(
2876 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2877 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2880 qr_arr(i,j,k) = amrex::max(
2881 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2882 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2883 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2886 qi_arr(i,j,k) = amrex::max(
2887 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2888 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2889 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2892 qs_arr(i,j,k) = amrex::max(
2893 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2894 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2895 + piacr_arr(i,j,k) * delta3
2896 + praci_arr(i,j,k) * delta3
2897 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2898 - pracs_arr(i,j,k) * (one_l - delta2)
2899 + psacr_arr(i,j,k) * delta2) * dtcld,
2901 qg_arr(i,j,k) = amrex::max(
2902 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2903 + piacr_arr(i,j,k) * (one_l - delta3)
2904 + praci_arr(i,j,k) * (one_l - delta3)
2905 + psacr_arr(i,j,k) * (one_l - delta2)
2906 + pracs_arr(i,j,k) * (one_l - delta2)
2907 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2908 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2911 nc_arr(i,j,k) = amrex::max(
2912 nc_arr(i,j,k) + (-nrauto_arr(i,j,k) - nccol_arr(i,j,k)
2913 - nraccr_arr(i,j,k) - naacw_arr(i,j,k)
2914 - naacw_arr(i,j,k)) * dtcld,
2916 nr_arr(i,j,k) = amrex::max(
2917 nr_arr(i,j,k) + (nrauto_arr(i,j,k) - nrcol_arr(i,j,k)
2918 - niacr_arr(i,j,k) - nsacr_arr(i,j,k)
2919 - ngacr_arr(i,j,k)) * dtcld,
2922 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2923 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2924 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2925 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2926 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2927 + psacr_arr(i,j,k));
2928 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2930 Real value, source, factor,
xlf, xlwork2;
2932 value = amrex::max(qmin_l, qc_arr(i,j,k));
2933 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2934 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2935 if (source > value) {
2936 factor = value / source;
2937 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2938 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2939 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2942 value = amrex::max(qmin_l, qr_arr(i,j,k));
2943 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2944 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2945 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2946 - prevp_arr(i,j,k)) * dtcld;
2947 if (source > value) {
2948 factor = value / source;
2949 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2950 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2951 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2952 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2953 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2954 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2957 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2958 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2959 - psevp_arr(i,j,k)) * dtcld;
2960 if (source > value) {
2961 factor = value / source;
2962 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2963 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2964 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2967 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2968 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2969 + pgeml_arr(i,j,k)) * dtcld;
2970 if (source > value) {
2971 factor = value / source;
2972 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2973 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2974 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2977 value = amrex::max(ncmin_l, nc_arr(i,j,k));
2978 source = (nrauto_arr(i,j,k) + nccol_arr(i,j,k)
2979 + nraccr_arr(i,j,k) + naacw_arr(i,j,k)
2980 + naacw_arr(i,j,k)) * dtcld;
2981 if (source > value) {
2982 factor = value / source;
2983 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2984 nccol_arr(i,j,k) = nccol_arr(i,j,k) * factor;
2985 nraccr_arr(i,j,k) = nraccr_arr(i,j,k) * factor;
2986 naacw_arr(i,j,k) = naacw_arr(i,j,k) * factor;
2989 value = amrex::max(nrmin_l, nr_arr(i,j,k));
2990 source = (-nrauto_arr(i,j,k) + nrcol_arr(i,j,k)
2991 - nseml_arr(i,j,k) - ngeml_arr(i,j,k)) * dtcld;
2992 if (source > value) {
2993 factor = value / source;
2994 nrauto_arr(i,j,k) = nrauto_arr(i,j,k) * factor;
2995 nrcol_arr(i,j,k) = nrcol_arr(i,j,k) * factor;
2996 nseml_arr(i,j,k) = nseml_arr(i,j,k) * factor;
2997 ngeml_arr(i,j,k) = ngeml_arr(i,j,k) * factor;
3000 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
3001 + pgevp_arr(i,j,k));
3002 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
3003 qc_arr(i,j,k) = amrex::max(
3004 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
3005 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
3008 qr_arr(i,j,k) = amrex::max(
3009 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
3010 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
3011 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
3012 - pgeml_arr(i,j,k)) * dtcld,
3014 qs_arr(i,j,k) = amrex::max(
3015 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
3016 + pseml_arr(i,j,k)) * dtcld,
3018 qg_arr(i,j,k) = amrex::max(
3019 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
3020 + pgeml_arr(i,j,k)) * dtcld,
3022 nc_arr(i,j,k) = amrex::max(
3023 nc_arr(i,j,k) + (-nrauto_arr(i,j,k) - nccol_arr(i,j,k)
3024 - nraccr_arr(i,j,k) - naacw_arr(i,j,k)
3025 - naacw_arr(i,j,k)) * dtcld,
3027 nr_arr(i,j,k) = amrex::max(
3028 nr_arr(i,j,k) + (nrauto_arr(i,j,k) - nrcol_arr(i,j,k)
3029 + nseml_arr(i,j,k) + ngeml_arr(i,j,k))
3033 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
3036 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
3037 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
3049 const Real xb = xa + hvap / (
Real(rv) * ttp);
3051 const Real xai = -dldti /
Real(rv);
3052 const Real xbi = xai + hsub / (
Real(rv) * ttp);
3054 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3055 const Real tr = ttp / t_arr(i,j,k);
3057 * std::exp(xb * (
Real(1.) - tr));
3058 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
3059 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
3060 qsw = amrex::max(qsw,
Real(qmin));
3061 qsatw_arr(i,j,k) = qsw;
3064 if (t_arr(i,j,k) < ttp) {
3065 qsi =
Real(
psat) * std::exp(std::log(tr) * xai)
3066 * std::exp(xbi * (
Real(1.) - tr));
3068 qsi =
Real(
psat) * std::exp(std::log(tr) * xa)
3069 * std::exp(xb * (
Real(1.) - tr));
3071 qsi = amrex::min(qsi,
wdm6_literal(0.99) * p_arr(i,j,k));
3072 qsi =
Real(ep2) * qsi / (p_arr(i,j,k) - qsi);
3073 qsi = amrex::max(qsi,
Real(qmin));
3074 qsati_arr(i,j,k) = qsi;
3076 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k) / qsw,
Real(qmin));
3083 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3084 qrs_tmp_arr(i,j,k,0) = qr_arr(i,j,k);
3085 qrs_tmp_arr(i,j,k,1) = qs_arr(i,j,k);
3086 qrs_tmp_arr(i,j,k,2) = qg_arr(i,j,k);
3087 ncr_tmp_arr(i,j,k) = nr_arr(i,j,k);
3090 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3091 Real rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3, rain_vt, rain_vtn;
3092 Real snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3, snow_vt, snow_n0sfac;
3093 Real graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3, graup_vt;
3096 den_arr(i,j,k), denfac_arr(i,j,k),
3098 rslopermax_loc, rsloperbmax_loc,
3099 rsloper2max_loc, rsloper3max_loc,
3100 Real(
bvtr), pvtr_loc, pvtrn_loc, pidnr_loc,
3101 rain_rslope, rain_rslopeb, rain_rslope2, rain_rslope3,
3103 wdm6_slope_snow_cell(qrs_tmp_arr(i,j,k,1), den_arr(i,j,k), denfac_arr(i,j,k),
3106 rslopesmax_loc, rslopesbmax_loc,
3107 rslopes2max_loc, rslopes3max_loc,
3109 snow_rslope, snow_rslopeb, snow_rslope2, snow_rslope3,
3110 snow_vt, snow_n0sfac);
3111 wdm6_slope_graup_cell(qrs_tmp_arr(i,j,k,2), den_arr(i,j,k), denfac_arr(i,j,k),
3113 rslopegmax_loc, rslopegbmax_loc,
3114 rslopeg2max_loc, rslopeg3max_loc,
3115 slope_bvtg_loc, pvtg_loc,
3116 graup_rslope, graup_rslopeb, graup_rslope2, graup_rslope3,
3119 rslope_arr(i,j,k,0) = rain_rslope;
3120 rslope_arr(i,j,k,1) = snow_rslope;
3121 rslope_arr(i,j,k,2) = graup_rslope;
3122 rslopeb_arr(i,j,k,0) = rain_rslopeb;
3123 rslopeb_arr(i,j,k,1) = snow_rslopeb;
3124 rslopeb_arr(i,j,k,2) = graup_rslopeb;
3125 rslope2_arr(i,j,k,0) = rain_rslope2;
3126 rslope2_arr(i,j,k,1) = snow_rslope2;
3127 rslope2_arr(i,j,k,2) = graup_rslope2;
3128 rslope3_arr(i,j,k,0) = rain_rslope3;
3129 rslope3_arr(i,j,k,1) = snow_rslope3;
3130 rslope3_arr(i,j,k,2) = graup_rslope3;
3131 work1_arr(i,j,k,0) = rain_vt;
3132 work1_arr(i,j,k,1) = snow_vt;
3133 work1_arr(i,j,k,2) = graup_vt;
3134 workn_arr(i,j,k) = rain_vtn;
3136 avedia_arr(i,j,k,1) = rslope_arr(i,j,k,0) * g16a_cbrt24;
3137 if (avedia_arr(i,j,k,1) <=
Real(
di82)) {
3138 nc_arr(i,j,k) += nr_arr(i,j,k);
3139 nr_arr(i,j,k) =
Real(0.0);
3140 qc_arr(i,j,k) += qr_arr(i,j,k);
3141 qr_arr(i,j,k) =
Real(0.0);
3147 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3148 if (rhw_arr(i,j,k) >
Real(1.0)) {
3150 const Real fraction = amrex::min(
Real(1.0),
3151 std::exp(std::log(ratio) *
Real(
actk)));
3152 Real ncact_raw = (nn_arr(i,j,k) + nc_arr(i,j,k)) * fraction - nc_arr(i,j,k);
3153 Real ncact = amrex::max(
Real(0.0), ncact_raw);
3155 const Real ncact_cap = amrex::max(nn_arr(i,j,k),
Real(0.0)) / dtcld;
3156 ncact = amrex::min(ncact, ncact_cap);
3158 const Real pcact = amrex::min(
3159 Real(4.0) * pi_wdm6_loc *
Real(denr)
3160 * actr_um * actr_um * actr_um * ncact
3161 / (
Real(3.0) * den_arr(i,j,k)),
3162 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
3164 ncact_arr(i,j,k) = ncact;
3165 act_ratio_arr(i,j,k) = ratio;
3166 act_fraction_arr(i,j,k) = fraction;
3167 act_raw_arr(i,j,k) = ncact_raw;
3168 act_cap_arr(i,j,k) = ncact_cap;
3169 pcact_arr(i,j,k) = pcact;
3171 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k) + pcact * dtcld,
Real(0.0));
3172 nn_arr(i,j,k) = amrex::max(nn_arr(i,j,k) - ncact * dtcld,
Real(0.0));
3173 nc_arr(i,j,k) = amrex::max(nc_arr(i,j,k) + ncact * dtcld,
Real(0.0));
3174 t_arr(i,j,k) += pcact * xl_arr(i,j,k) / cpm_arr(i,j,k) * dtcld;
3177 const Real tr = ttp / t_arr(i,j,k);
3179 * std::exp(xb * (
Real(1.0) - tr));
3180 qsw = amrex::min(qsw,
wdm6_literal(0.99) * p_arr(i,j,k));
3181 qsw =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
3182 qsw = amrex::max(qsw,
Real(qmin));
3183 qsatw_arr(i,j,k) = qsw;
3186 t_arr(i,j,k),
qv_arr(i,j,k), qsw, xl_arr(i,j,k), cpm_arr(i,j,k),
3188 work2_arr(i,j,k) = qc_arr(i,j,k) + work1_arr(i,j,k,0);
3191 amrex::max(work1_arr(i,j,k,0) / dtcld,
Real(0.0)),
3192 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
3193 if (qc_arr(i,j,k) >
Real(0.0) && work1_arr(i,j,k,0) <
Real(0.0)) {
3194 pcond = amrex::max(work1_arr(i,j,k,0), -qc_arr(i,j,k)) / dtcld;
3196 pcond_arr(i,j,k) =
pcond;
3198 if (
pcond == -qc_arr(i,j,k) / dtcld) {
3199 nn_arr(i,j,k) += nc_arr(i,j,k);
3200 nc_arr(i,j,k) =
Real(0.0);
3204 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k) +
pcond * dtcld,
Real(0.0));
3205 t_arr(i,j,k) +=
pcond * xl_arr(i,j,k) / cpm_arr(i,j,k) * dtcld;
3209 const Real g17_pidnc = pi_wdm6_loc *
Real(denr) /
Real(6.0);
3210 const Real g17_pidnr =
Real(4.0) * pi_wdm6_loc *
Real(denr);
3213 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3214 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
3215 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
3218 Real lamdr = std::exp(std::log(
3219 (g17_pidnr * nr_arr(i,j,k)) / (den_arr(i,j,k) * qr_arr(i,j,k))
3223 nr_arr(i,j,k) = den_arr(i,j,k) * qr_arr(i,j,k)
3224 * std::pow(lamdr,
Real(3.0)) / g17_pidnr;
3227 nr_arr(i,j,k) = den_arr(i,j,k) * qr_arr(i,j,k)
3228 * std::pow(lamdr,
Real(3.0)) / g17_pidnr;
3232 if (qc_arr(i,j,k) >=
Real(qmin) && nc_arr(i,j,k) >=
Real(
ncmin)) {
3233 Real lamdc = std::exp(std::log(
3234 (g17_pidnc * nc_arr(i,j,k)) / (den_arr(i,j,k) * qc_arr(i,j,k))
3238 nc_arr(i,j,k) = den_arr(i,j,k) * qc_arr(i,j,k)
3239 * std::pow(lamdc,
Real(3.0)) / g17_pidnc;
3242 nc_arr(i,j,k) = den_arr(i,j,k) * qc_arr(i,j,k)
3243 * std::pow(lamdc,
Real(3.0)) / g17_pidnc;
3264 constexpr
Real p0_nat = 1.e5;
3266 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
3267 Real exner = std::pow(p_arr(i,j,k) / p0_nat, rdOcp_nat);
3268 w1_theta(i,j,k) = t_arr(i,j,k) / exner;
3272 #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:61
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_xka(Real x, Real y)
Definition: ERF_AdvanceWDM6.cpp:56
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_venfac(Real a, Real b, Real c, Real den0_arg)
Definition: ERF_AdvanceWDM6.cpp:68
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:278
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:32
constexpr amrex::Real wdm6_slope_t0c
Definition: ERF_AdvanceWDM6.cpp:196
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:138
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:215
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:26
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_xni_exact(Real qi, Real den, Real qmin_arg)
Definition: ERF_AdvanceWDM6.cpp:131
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_default_real_pow(double base, double exponent)
Definition: ERF_AdvanceWDM6.cpp:37
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:245
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:77
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wdm6_rslopec_exact(Real qc, Real den, Real nc, Real pidnc_arg)
Definition: ERF_AdvanceWDM6.cpp:120
constexpr amrex::Real R_v
Definition: ERF_Constants.H:48
constexpr amrex::Real lat_vap
Definition: ERF_Constants.H:128
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:49
constexpr amrex::Real lsub
Definition: ERF_Constants.H:111
constexpr amrex::Real rhoh2o
Definition: ERF_Constants.H:136
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real lat_ice
Definition: ERF_Constants.H:129
constexpr amrex::Real rhos
Definition: ERF_Constants.H:72
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:64
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:51
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:50
constexpr amrex::Real R_d
Definition: ERF_Constants.H:47
const Real rdOcp
Definition: ERF_InitCustomPert_ABL.H:72
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:210
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);})
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:45
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)
amrex::Real m_precs2
Definition: ERF_WDM6.H:258
static constexpr amrex::Real ncmin
Definition: ERF_WDM6.H:135
static constexpr amrex::Real qcrmin
Definition: ERF_WDM6.H:134
amrex::Real m_pidn0g
Definition: ERF_WDM6.H:262
amrex::Real m_precr2
Definition: ERF_WDM6.H:254
bool m_hail_opt
Definition: ERF_WDM6.H:241
amrex::iMultiFab * m_lmask
Definition: ERF_WDM6.H:233
static constexpr amrex::Real nrmin
Definition: ERF_WDM6.H:136
amrex::Real m_pvtrn
Definition: ERF_WDM6.H:253
amrex::Real m_rslopecmax
Definition: ERF_WDM6.H:263
static constexpr amrex::Real lamdarmax
Definition: ERF_WDM6.H:125
amrex::Real m_pidn0s
Definition: ERF_WDM6.H:259
amrex::Real m_qc1
Definition: ERF_WDM6.H:248
static constexpr amrex::Real di100
Definition: ERF_WDM6.H:148
amrex::Real m_pvts
Definition: ERF_WDM6.H:258
static constexpr amrex::Real pfrz1
Definition: ERF_WDM6.H:132
amrex::Real m_rslopec3max
Definition: ERF_WDM6.H:263
static constexpr amrex::Real dicon
Definition: ERF_WDM6.H:130
amrex::Real m_pvtr
Definition: ERF_WDM6.H:253
amrex::Real m_rslopegmax
Definition: ERF_WDM6.H:264
static constexpr amrex::Real bvtr
Definition: ERF_WDM6.H:116
amrex::Real m_rslopesmax
Definition: ERF_WDM6.H:264
amrex::Real m_pvtg
Definition: ERF_WDM6.H:262
amrex::Array< FabPtr, MicVar_WDM6::NumVars > mic_fab_vars
Definition: ERF_WDM6.H:235
static constexpr amrex::Real lamdacmax
Definition: ERF_WDM6.H:128
static constexpr amrex::Real alpha_wdm6
Definition: ERF_WDM6.H:142
amrex::Real m_pi_wdm6
Definition: ERF_WDM6.H:247
amrex::Real m_rslopes2max
Definition: ERF_WDM6.H:266
amrex::Real m_rslopegbmax
Definition: ERF_WDM6.H:265
amrex::Real m_rslopes3max
Definition: ERF_WDM6.H:267
amrex::Real m_qck1
Definition: ERF_WDM6.H:248
static constexpr amrex::Real qs0
Definition: ERF_WDM6.H:139
amrex::Real m_rslopeg2max
Definition: ERF_WDM6.H:266
static constexpr amrex::Real n0s
Definition: ERF_WDM6.H:141
amrex::Real m_rslopesbmax
Definition: ERF_WDM6.H:265
amrex::Geometry m_geom
Definition: ERF_WDM6.H:222
static constexpr amrex::Real di2000
Definition: ERF_WDM6.H:150
amrex::Real m_precg1
Definition: ERF_WDM6.H:262
amrex::Real m_rsloperbmax
Definition: ERF_WDM6.H:265
amrex::Real m_precr1
Definition: ERF_WDM6.H:254
static constexpr amrex::Real di82
Definition: ERF_WDM6.H:151
amrex::Real m_g7pbr
Definition: ERF_WDM6.H:251
static constexpr amrex::Real actr
Definition: ERF_WDM6.H:145
static constexpr amrex::Real lamdarmin
Definition: ERF_WDM6.H:126
static constexpr amrex::Real lamdacmin
Definition: ERF_WDM6.H:129
amrex::Real m_ccn0
Definition: ERF_WDM6.H:225
amrex::Real m_pidnc
Definition: ERF_WDM6.H:248
amrex::Real m_qc0
Definition: ERF_WDM6.H:248
amrex::Real m_bvtg
Definition: ERF_WDM6.H:242
amrex::Real m_rsloper3max
Definition: ERF_WDM6.H:267
amrex::Real m_rslopeg3max
Definition: ERF_WDM6.H:267
amrex::Real m_pidnr
Definition: ERF_WDM6.H:255
amrex::Real m_g4pbr
Definition: ERF_WDM6.H:251
static constexpr amrex::Real bvts
Definition: ERF_WDM6.H:124
amrex::Real m_n0g
Definition: ERF_WDM6.H:242
static constexpr amrex::Real di600
Definition: ERF_WDM6.H:149
amrex::Real m_precg2
Definition: ERF_WDM6.H:262
amrex::Real m_rslopermax
Definition: ERF_WDM6.H:264
amrex::MultiFab * m_z_phys_nd
Definition: ERF_WDM6.H:231
static constexpr amrex::Real ncrk2
Definition: ERF_WDM6.H:147
amrex::Real m_xlv1
Definition: ERF_WDM6.H:247
amrex::Real m_pacrg
Definition: ERF_WDM6.H:262
static constexpr amrex::Real ncrk1
Definition: ERF_WDM6.H:146
static constexpr amrex::Real avtr
Definition: ERF_WDM6.H:115
amrex::Real m_pacrc
Definition: ERF_WDM6.H:259
amrex::Real m_roqimax
Definition: ERF_WDM6.H:254
static constexpr amrex::Real dimax
Definition: ERF_WDM6.H:131
static constexpr amrex::Real actk
Definition: ERF_WDM6.H:144
static constexpr amrex::Real pfrz2
Definition: ERF_WDM6.H:133
amrex::Real m_precs1
Definition: ERF_WDM6.H:258
static constexpr amrex::Real satmax
Definition: ERF_WDM6.H:143
static constexpr amrex::Real n0smax
Definition: ERF_WDM6.H:140
amrex::Real m_rsloper2max
Definition: ERF_WDM6.H:266
amrex::Real m_rslopec2max
Definition: ERF_WDM6.H:263
@ xlf
Definition: ERF_AdvanceMorrison.cpp:157
@ qr
Definition: ERF_WDM6.H:28
@ qv
Definition: ERF_WDM6.H:25
@ qc
Definition: ERF_WDM6.H:26
@ qi
Definition: ERF_WDM6.H:27
@ graup_accum
Definition: ERF_WDM6.H:36
@ rain_accum
Definition: ERF_WDM6.H:34
@ pres
Definition: ERF_WDM6.H:24
@ nr
Definition: ERF_WDM6.H:33
@ qg
Definition: ERF_WDM6.H:30
@ theta
Definition: ERF_WDM6.H:22
@ qs
Definition: ERF_WDM6.H:29
@ nc
Definition: ERF_WDM6.H:32
@ nn
Definition: ERF_WDM6.H:31
@ rho
Definition: ERF_WDM6.H:21
@ tabs
Definition: ERF_WDM6.H:23
@ snow_accum
Definition: ERF_WDM6.H:35
@ tk
Definition: ERF_AdvanceWDM6.cpp:270
@ work_col
Definition: ERF_AdvanceWDM6.cpp:270
@ den
Definition: ERF_AdvanceWDM6.cpp:270
@ denfac
Definition: ERF_AdvanceWDM6.cpp:270
@ rq2_col
Definition: ERF_AdvanceWDM6.cpp:270
@ rq_col
Definition: ERF_AdvanceWDM6.cpp:270
@ NumComps
Definition: ERF_AdvanceWDM6.cpp:270
@ dz
Definition: ERF_AdvanceWDM6.cpp:270
@ NumComps
Definition: ERF_AdvanceWDM6.cpp:274
@ fall_s
Definition: ERF_WSM6.H:258
@ n0sfac
Definition: ERF_WSM6.H:244
@ work2
Definition: ERF_WSM6.H:237
@ pcond
Definition: ERF_WSM6.H:207
@ qsum
Definition: ERF_WSM6.H:234
@ psmlt
Definition: ERF_WSM6.H:228
@ fall_g
Definition: ERF_WSM6.H:258
@ work1c
Definition: ERF_WSM6.H:197
@ pgmlt
Definition: ERF_WSM6.H:229
@ rhi
Definition: ERF_WSM6.H:250
@ fall_r
Definition: ERF_WSM6.H:258
@ xni
Definition: ERF_WSM6.H:239
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 p0
Definition: ERF_module_model_constants.F90:40
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