899 int microphysics_debug = 0;
900 std::string micro_diag_mode =
"canonical";
901 std::vector<std::string> micro_diag_tags = {
"standing"};
902 std::vector<std::string> micro_diag_expr = {
"standing"};
903 std::vector<std::string> micro_diag_store = {
"standing"};
904 std::vector<int> micro_diag_target_column;
906 amrex::ParmParse
pp(
"erf");
907 pp.queryAdd(
"microphysics_debug", microphysics_debug);
908 pp.queryAdd(
"micro_diag_mode", micro_diag_mode);
909 pp.queryarr(
"micro_diag_tags", micro_diag_tags);
910 pp.queryarr(
"micro_diag_expr", micro_diag_expr);
911 pp.queryarr(
"micro_diag_store", micro_diag_store);
912 pp.queryarr(
"micro_diag_target_column", micro_diag_target_column);
914 microphysics_debug = std::max(0, std::min(2, microphysics_debug));
915 #ifdef ERF_USE_WSM6_FORT
916 const std::string micro_diag_mode_lower = [&]{ std::string m = micro_diag_mode; std::transform(m.begin(), m.end(), m.begin(), [](
unsigned char c){ return static_cast<char>(std::tolower(c)); });
return m; }();
917 const bool micro_diag_forensic = (micro_diag_mode_lower ==
"forensic" || micro_diag_mode_lower ==
"both");
918 const int microphysics_debug_bridge = micro_diag_forensic
920 : std::min(microphysics_debug, 1);
921 bool use_wsm6_cpp_answer =
false;
922 { amrex::ParmParse
pp(
"erf");
923 pp.queryAdd(
"use_wsm6_cpp_answer", use_wsm6_cpp_answer); }
924 bool run_wsm6_fort = !use_wsm6_cpp_answer;
929 "WSM6: the Fortran bridge (erf.use_wsm6_cpp_answer = false) requires every box to span "
930 "the domain in z (no grids split in z, and no refined levels short of the domain top or bottom)");
932 static bool wsm6_inited =
false;
936 constexpr
double den0 = 1.28;
937 constexpr
double denr =
static_cast<double>(
rhoh2o);
938 constexpr
double dens =
static_cast<double>(
rhos);
939 constexpr
double cl =
static_cast<double>(
Cp_l);
940 constexpr
double cpv =
static_cast<double>(
Cp_v);
941 constexpr
int hail_opt = 0;
947 constexpr
double g =
static_cast<double>(
CONST_GRAV);
948 constexpr
double cpd =
static_cast<double>(
Cp_d);
949 constexpr
double cpv =
static_cast<double>(
Cp_v);
950 constexpr
double rd =
static_cast<double>(
R_d);
951 constexpr
double rv =
static_cast<double>(
R_v);
952 constexpr
double t0c = 273.15;
953 constexpr
double ep1 =
static_cast<double>(
R_v /
R_d -
one);
954 amrex::ignore_unused(
g, rd, ep1);
955 constexpr
double ep2 =
static_cast<double>(
R_d /
R_v);
956 constexpr
double qmin = 1.0e-12;
957 constexpr
double xls =
static_cast<double>(
lsub);
958 constexpr
double xlv0 =
static_cast<double>(
lat_vap);
959 constexpr
double xlf0 =
static_cast<double>(
lat_ice);
960 constexpr
double den0 = 1.28;
961 constexpr
double denr =
static_cast<double>(
rhoh2o);
962 constexpr
double cliq =
static_cast<double>(
Cp_l);
963 constexpr
double cice = 2106.0;
964 constexpr
double psat = 610.78;
966 const Box box = mfi.tilebox();
967 const Box fab_box = mfi.fabbox();
982 auto const& sed_arr =
m_sed.
down->array(mfi);
984 const int ilo = box.smallEnd(0);
985 const int ihi = box.bigEnd(0);
986 const int jlo = box.smallEnd(1);
987 const int jhi = box.bigEnd(1);
988 const int klo = box.smallEnd(2);
989 const int khi = box.bigEnd(2);
990 const bool has_target_override = (micro_diag_target_column.size() == 2);
991 const int diag_i = has_target_override ? micro_diag_target_column[0] : ilo;
992 const int diag_j = has_target_override ? micro_diag_target_column[1] : jlo;
994 const int imlo = fab_box.smallEnd(0);
995 const int imhi = fab_box.bigEnd(0);
996 const int jmlo = fab_box.smallEnd(1);
997 const int jmhi = fab_box.bigEnd(1);
998 const int kmlo = fab_box.smallEnd(2);
999 const int kmhi = fab_box.bigEnd(2);
1000 amrex::ignore_unused(ihi, jhi, diag_i, diag_j, imlo, imhi, jmlo, jmhi, kmlo, kmhi);
1002 #if defined(ERF_USE_WSM6_FORT) && defined(AMREX_USE_GPU)
1003 Arena*
Arena_Used = (run_wsm6_fort) ? The_Pinned_Arena() : The_Async_Arena();
1010 auto const& delz_arr = delz_fab.array();
1011 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1012 delz_arr(i,j,k) = dz_val;
1016 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1017 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
1018 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
1019 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
1020 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
1024 box2d.makeSlab(2, 0);
1025 Box fab_box2d(fab_box);
1026 fab_box2d.makeSlab(2, 0);
1031 FArrayBox rainncv_fab(fab_box2d, 1,
Arena_Used);
1033 FArrayBox snowncv_fab(fab_box2d, 1,
Arena_Used);
1034 FArrayBox graupelncv_fab(fab_box2d, 1,
Arena_Used);
1035 FArrayBox rainacc_fab(fab_box2d, 1,
Arena_Used);
1036 FArrayBox snowacc_fab(fab_box2d, 1,
Arena_Used);
1037 FArrayBox graupacc_fab(fab_box2d, 1,
Arena_Used);
1038 FArrayBox rainonly_fab(fab_box2d, 1,
Arena_Used);
1039 FArrayBox snowonly_fab(fab_box2d, 1,
Arena_Used);
1041 auto const& rainncv_arr = rainncv_fab.array();
1042 auto const& sr_arr = sr_fab.array();
1043 auto const& snowncv_arr = snowncv_fab.array();
1044 auto const& graupelncv_arr = graupelncv_fab.array();
1045 auto const& rainacc_arr = rainacc_fab.array();
1046 auto const& snowacc_arr = snowacc_fab.array();
1047 auto const& graupacc_arr = graupacc_fab.array();
1048 auto const& rainonly_arr = rainonly_fab.array();
1049 auto const& snowonly_arr = snowonly_fab.array();
1050 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1051 rainncv_arr(i,j,k) =
Real(0.0);
1052 sr_arr(i,j,k) =
Real(0.0);
1053 snowncv_arr(i,j,k) =
Real(0.0);
1054 graupelncv_arr(i,j,k) =
Real(0.0);
1055 rainacc_arr(i,j,k) =
Real(0.0);
1056 snowacc_arr(i,j,k) =
Real(0.0);
1057 graupacc_arr(i,j,k) =
Real(0.0);
1058 rainonly_arr(i,j,k) =
Real(0.0);
1059 snowonly_arr(i,j,k) =
Real(0.0);
1066 #ifdef ERF_USE_WSM6_FORT
1067 if (run_wsm6_fort) {
1070 Gpu::streamSynchronize();
1073 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
1074 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
1075 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
1076 static_cast<double>(
dt),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
1078 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
1079 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
1080 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
1081 rainonly_arr.dataPtr(), snowonly_arr.dataPtr(),
1082 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
1083 ilo, ihi, jlo, jhi,
klo,
khi, microphysics_debug_bridge, diag_i, diag_j);
1094 FArrayBox tstepsnow_fab(box2d,1,
Arena_Used);
1095 FArrayBox tstepgraup_fab(box2d,1,
Arena_Used);
1096 auto const& delqrs1_arr = delqrs1_fab.array();
1097 auto const& delqrs2_arr = delqrs2_fab.array();
1098 auto const& delqrs3_arr = delqrs3_fab.array();
1099 auto const& delqi_arr = delqi_fab.array();
1100 auto const& tstepsnow_arr = tstepsnow_fab.array();
1101 auto const& tstepgraup_arr = tstepgraup_fab.array();
1103 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1104 delqrs1_arr(i,j,k) =
Real(0.0);
1105 delqrs2_arr(i,j,k) =
Real(0.0);
1106 delqrs3_arr(i,j,k) =
Real(0.0);
1107 delqi_arr(i,j,k) =
Real(0.0);
1108 tstepsnow_arr(i,j,k) =
Real(0.0);
1109 tstepgraup_arr(i,j,k) =
Real(0.0);
1118 FArrayBox qrs_tmp_r_fab(fab_box,1,
Arena_Used); FArrayBox qrs_tmp_s_fab(fab_box,1,
Arena_Used);
1119 FArrayBox qrs_tmp_g_fab(fab_box,1,
Arena_Used);
1121 FArrayBox rslope_g_fab(fab_box,1,
Arena_Used);
1122 FArrayBox rslope2_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope2_s_fab(fab_box,1,
Arena_Used);
1123 FArrayBox rslope2_g_fab(fab_box,1,
Arena_Used);
1124 FArrayBox rslope3_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope3_s_fab(fab_box,1,
Arena_Used);
1125 FArrayBox rslope3_g_fab(fab_box,1,
Arena_Used);
1126 FArrayBox rslopeb_r_fab(fab_box,1,
Arena_Used); FArrayBox rslopeb_s_fab(fab_box,1,
Arena_Used);
1127 FArrayBox rslopeb_g_fab(fab_box,1,
Arena_Used);
1129 FArrayBox work1_g_fab(fab_box,1,
Arena_Used);
1131 FArrayBox workdiffi_fab(fab_box,1,
Arena_Used);
1139 FArrayBox nislfv_r_diag_fab(fab_box,6,
Arena_Used);
1140 FArrayBox nislfv_sg_diag_fab(fab_box,6,
Arena_Used);
1142 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1162 auto const& denfac_arr = denfac_fab.array();
1163 auto const& xni_arr = xni_fab.array();
1164 auto const& cpm_arr = cpm_fab.array();
1165 auto const& xl_arr = xl_fab.array();
1166 auto const& qsatw_arr = qsatw_fab.array();
1167 auto const& qsati_arr = qsati_fab.array();
1168 auto const& rhw_arr = rhw_fab.array();
1169 auto const& rhi_arr = rhi_fab.array();
1170 auto const& den_tmp_arr = den_tmp_fab.array();
1171 auto const& delz_tmp_arr = delz_tmp_fab.array();
1172 auto const& n0sfac_arr = n0sfac_fab.array();
1173 auto const& qrs_tmp_r_arr = qrs_tmp_r_fab.array();
1174 auto const& qrs_tmp_s_arr = qrs_tmp_s_fab.array();
1175 auto const& qrs_tmp_g_arr = qrs_tmp_g_fab.array();
1176 auto const& rslope_r_arr = rslope_r_fab.array();
1177 auto const& rslope_s_arr = rslope_s_fab.array();
1178 auto const& rslope_g_arr = rslope_g_fab.array();
1179 auto const& rslope2_r_arr = rslope2_r_fab.array();
1180 auto const& rslope2_s_arr = rslope2_s_fab.array();
1181 auto const& rslope2_g_arr = rslope2_g_fab.array();
1182 auto const& rslope3_r_arr = rslope3_r_fab.array();
1183 auto const& rslope3_s_arr = rslope3_s_fab.array();
1184 auto const& rslope3_g_arr = rslope3_g_fab.array();
1185 auto const& rslopeb_r_arr = rslopeb_r_fab.array();
1186 auto const& rslopeb_s_arr = rslopeb_s_fab.array();
1187 auto const& rslopeb_g_arr = rslopeb_g_fab.array();
1188 auto const& work1_r_arr = work1_r_fab.array();
1189 auto const& work1_s_arr = work1_s_fab.array();
1190 auto const& work1_g_arr = work1_g_fab.array();
1191 auto const& work2_arr = work2_fab.array();
1192 auto const& workdiffw_arr = workdiffw_fab.array();
1193 auto const& workdiffi_arr = workdiffi_fab.array();
1194 auto const& workr_arr = workr_fab.array();
1195 auto const& worka_arr = worka_fab.array();
1196 auto const& work1c_arr = work1c_fab.array();
1197 auto const& denqrs1_arr = denqrs1_fab.array();
1198 auto const& denqrs2_arr = denqrs2_fab.array();
1199 auto const& denqrs3_arr = denqrs3_fab.array();
1200 auto const& denqci_arr = denqci_fab.array();
1201 auto const& fall_r_arr = fall_r_fab.array();
1202 auto const& fall_s_arr = fall_s_fab.array();
1203 auto const& fall_g_arr = fall_g_fab.array();
1204 auto const& fallc_arr = fallc_fab.array();
1205 auto const& qsum_arr = qsum_fab.array();
1206 auto const& nislfv_r_diag_arr = nislfv_r_diag_fab.array();
1207 auto const& nislfv_sg_diag_arr = nislfv_sg_diag_fab.array();
1208 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1209 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1211 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1212 work1c_arr(i,j,k) =
Real(0.0);
1214 ParallelFor(fab_box, nislfv_r_diag_fab.nComp(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
1215 nislfv_r_diag_arr(i,j,k,n) =
Real(0.0);
1216 nislfv_sg_diag_arr(i,j,k,n) =
Real(0.0);
1218 auto const& praut_arr = praut_fab.array();
1219 auto const& pracw_arr = pracw_fab.array();
1220 auto const& prevp_arr = prevp_fab.array();
1221 auto const& psdep_arr = psdep_fab.array();
1222 auto const& pgdep_arr = pgdep_fab.array();
1223 auto const& psaut_arr = psaut_fab.array();
1224 auto const& pgaut_arr = pgaut_fab.array();
1225 auto const& praci_arr = praci_fab.array();
1226 auto const& piacr_arr = piacr_fab.array();
1227 auto const& psaci_arr = psaci_fab.array();
1228 auto const& psacw_arr = psacw_fab.array();
1229 auto const& pgacw_arr = pgacw_fab.array();
1230 auto const& pgaci_arr = pgaci_fab.array();
1231 auto const& paacw_arr = paacw_fab.array();
1232 auto const& pracs_arr = pracs_fab.array();
1233 auto const& psacr_arr = psacr_fab.array();
1234 auto const& pgacr_arr = pgacr_fab.array();
1235 auto const& pgacs_arr = pgacs_fab.array();
1236 auto const& pigen_arr = pigen_fab.array();
1237 auto const& pidep_arr = pidep_fab.array();
1238 auto const& pcond_arr = pcond_fab.array();
1239 auto const& psmlt_arr = psmlt_fab.array();
1240 auto const& pgmlt_arr = pgmlt_fab.array();
1241 auto const& pseml_arr = pseml_fab.array();
1242 auto const& pgeml_arr = pgeml_fab.array();
1243 auto const& psevp_arr = psevp_fab.array();
1244 auto const& pgevp_arr = pgevp_fab.array();
1245 auto const& pimlt_arr = pimlt_fab.array();
1246 auto const& pihmf_arr = pihmf_fab.array();
1247 auto const& pihtf_arr = pihtf_fab.array();
1248 auto const& pgfrz_arr = pgfrz_fab.array();
1252 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1253 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1254 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1255 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1256 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1257 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1258 den_tmp_arr(i,j,k) = den_arr(i,j,k);
1259 delz_tmp_arr(i,j,k) = delz_arr(i,j,k);
1264 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1270 const int wsm6_loops = std::max(
1271 static_cast<int>(std::round(
dt /
dtcldcr)), 1);
1272 const Real dtcld =
dt /
static_cast<Real>(wsm6_loops);
1294 : Array4<const Real>{};
1295 const Real inflow_share =
Real(1) /
static_cast<Real>(wsm6_loops);
1297 for (
int loop = 0; loop < wsm6_loops; ++loop) {
1299 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1301 const Real fac = inflow_share / (den_arr(i,j,
khi) * delz_arr(i,j,
khi));
1307 sed_arr(i,j,
khi+1,n) += inflow_arr(i,j,
khi+1,n) * inflow_share;
1312 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1313 const Real invden =
Real(1.0) / den_arr(i,j,k);
1314 denfac_arr(i,j,k) = std::sqrt(invden *
Real(den0));
1323 const Real xai = -dldti /
Real(rv);
1325 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1326 const Real tr = ttp / t_arr(i,j,k);
1327 Real qsw =
Real(
psat)*std::exp(std::log(tr)*xa)*std::exp(xb*(
Real(1.0)-tr));
1328 qsw = amrex::min(qsw,
Real(0.99)*p_arr(i,j,k));
1329 qsw =
Real(ep2)*qsw / (p_arr(i,j,k) - qsw);
1330 qsw = amrex::max(qsw,
Real(qmin));
1331 qsatw_arr(i,j,k) = qsw;
1332 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsw,
Real(qmin));
1333 Real qsi = (t_arr(i,j,k) < ttp)
1334 ?
Real(
psat)*std::exp(std::log(tr)*xai)*std::exp(xbi*(
Real(1.0)-tr))
1335 :
Real(
psat)*std::exp(std::log(tr)*xa )*std::exp(xb *(
Real(1.0)-tr));
1336 qsi = amrex::min(qsi,
Real(0.99)*p_arr(i,j,k));
1337 qsi =
Real(ep2)*qsi / (p_arr(i,j,k) - qsi);
1338 qsi = amrex::max(qsi,
Real(qmin));
1339 qsati_arr(i,j,k) = qsi;
1340 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsi,
Real(qmin));
1348 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1349 prevp_arr(i,j,k) =
Real(0.0); psdep_arr(i,j,k) =
Real(0.0);
1350 pgdep_arr(i,j,k) =
Real(0.0); praut_arr(i,j,k) =
Real(0.0);
1351 psaut_arr(i,j,k) =
Real(0.0); pgaut_arr(i,j,k) =
Real(0.0);
1352 pracw_arr(i,j,k) =
Real(0.0); praci_arr(i,j,k) =
Real(0.0);
1353 piacr_arr(i,j,k) =
Real(0.0); psaci_arr(i,j,k) =
Real(0.0);
1354 psacw_arr(i,j,k) =
Real(0.0); pracs_arr(i,j,k) =
Real(0.0);
1355 psacr_arr(i,j,k) =
Real(0.0); pgacw_arr(i,j,k) =
Real(0.0);
1356 paacw_arr(i,j,k) =
Real(0.0); pgaci_arr(i,j,k) =
Real(0.0);
1357 pgacr_arr(i,j,k) =
Real(0.0); pgacs_arr(i,j,k) =
Real(0.0);
1358 pigen_arr(i,j,k) =
Real(0.0); pidep_arr(i,j,k) =
Real(0.0);
1359 pcond_arr(i,j,k) =
Real(0.0); psmlt_arr(i,j,k) =
Real(0.0);
1360 pgmlt_arr(i,j,k) =
Real(0.0); pseml_arr(i,j,k) =
Real(0.0);
1361 pgeml_arr(i,j,k) =
Real(0.0); psevp_arr(i,j,k) =
Real(0.0);
1362 pgevp_arr(i,j,k) =
Real(0.0);
1363 fall_r_arr(i,j,k) =
Real(0.0); fall_s_arr(i,j,k) =
Real(0.0);
1364 fall_g_arr(i,j,k) =
Real(0.0); fallc_arr(i,j,k) =
Real(0.0);
1372 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1373 const Real tmp = den_arr(i,j,k)*amrex::max(qi_arr(i,j,k),
Real(qmin));
1374 xni_arr(i,j,k) = amrex::min(
1403 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1404 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1405 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1406 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1409 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1410 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1412 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1413 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1414 work1_r_arr(i,j,k));
1416 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1419 rslopesmax_loc, rslopesbmax_loc,
1420 rslopes2max_loc, rslopes3max_loc,
1422 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1423 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1424 work1_s_arr(i,j,k), dummy_n0sfac);
1426 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1428 rslopegmax_loc, rslopegbmax_loc,
1429 rslopeg2max_loc, rslopeg3max_loc,
1431 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1432 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1433 work1_g_arr(i,j,k));
1434 n0sfac_arr(i,j,k) = dummy_n0sfac;
1437 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1438 const int km_local =
khi -
klo + 1;
1440 constexpr
Real qsum_min =
Real(1.0e-15);
1476 for (
int k =
klo; k <=
khi; ++k) {
1477 const int kk = k -
klo;
1478 den_col(kk) = den_arr(i,j,k);
1479 denfac_col(kk) = denfac_arr(i,j,k);
1480 t_col(kk) = t_arr(i,j,k);
1481 dz_col(kk) = delz_tmp_arr(i,j,k);
1483 qsum_col(kk) = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k), qsum_min);
1485 worka_col(kk) = (work1_s_arr(i,j,k) * qs_arr(i,j,k)
1486 + work1_g_arr(i,j,k) * qg_arr(i,j,k))
1494 if (qr_arr(i,j,k) <=
Real(0.0)) {
1502 [&](
int k) {
return den_arr(i,j,k) * qr_arr(i,j,k) * delz_arr(i,j,k); });
1504 [&](
int k) {
return den_arr(i,j,k) * qs_arr(i,j,k) * delz_arr(i,j,k); });
1506 [&](
int k) {
return den_arr(i,j,k) * qg_arr(i,j,k) * delz_arr(i,j,k); });
1513 &delqrs1_col, dtcld, 1,
1514 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1516 for (
int k =
klo; k <=
khi; ++k) {
1517 const int kk = k -
klo;
1518 nislfv_r_diag_arr(i,j,k,0) = amrex::max(
denqrs1_col(kk) / den_col(kk),
Real(0.0));
1520 nislfv_r_diag_arr(i,j,k,2) =
workr_col(kk);
1522 nislfv_r_diag_arr(i,j,k,4) = den_col(kk);
1523 nislfv_r_diag_arr(i,j,k,5) = denfac_col(kk);
1532 &delqrs2_col, &delqrs3_col, dtcld, 1,
1533 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1535 for (
int k =
klo; k <=
khi; ++k) {
1536 const int kk = k -
klo;
1537 nislfv_sg_diag_arr(i,j,k,0) = amrex::max(
denqrs2_col(kk) / den_col(kk),
Real(0.0));
1538 nislfv_sg_diag_arr(i,j,k,1) = amrex::max(
denqrs3_col(kk) / den_col(kk),
Real(0.0));
1546 for (
int k =
klo; k <=
khi; ++k) {
1547 const int kk = k -
klo;
1563 [&](
int k) {
return den_arr(i,j,k) * qr_arr(i,j,k) * delz_arr(i,j,k); });
1565 [&](
int k) {
return den_arr(i,j,k) * qs_arr(i,j,k) * delz_arr(i,j,k); });
1567 [&](
int k) {
return den_arr(i,j,k) * qg_arr(i,j,k) * delz_arr(i,j,k); });
1570 delqrs1_arr(i,j,0) = delqrs1_col / delz_arr(i,j,
klo) / dtcld;
1571 delqrs2_arr(i,j,0) = delqrs2_col / delz_arr(i,j,
klo) / dtcld;
1572 delqrs3_arr(i,j,0) = delqrs3_col / delz_arr(i,j,
klo) / dtcld;
1573 fall_r_arr(i,j,
klo) = delqrs1_arr(i,j,0);
1574 fall_s_arr(i,j,
klo) = delqrs2_arr(i,j,0);
1575 fall_g_arr(i,j,
klo) = delqrs3_arr(i,j,0);
1580 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1581 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1582 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1583 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1586 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1587 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1589 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1590 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1591 work1_r_arr(i,j,k));
1593 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1596 rslopesmax_loc, rslopesbmax_loc,
1597 rslopes2max_loc, rslopes3max_loc,
1599 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1600 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1601 work1_s_arr(i,j,k), dummy_n0sfac);
1603 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1605 rslopegmax_loc, rslopegbmax_loc,
1606 rslopeg2max_loc, rslopeg3max_loc,
1608 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1609 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1610 work1_g_arr(i,j,k));
1614 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1615 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1616 n0sfac_arr(i,j,k) = amrex::max(
1621 if (t_arr(i,j,k) >
Real(t0c)) {
1624 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1626 if (qs_arr(i,j,k) >
Real(0.0)) {
1628 rslope2_s_arr(i,j,k) *
1629 std::sqrt(rslope_s_arr(i,j,k) * rslopeb_s_arr(i,j,k));
1632 (
Real(t0c) - t_arr(i,j,k)) * pi_wsm6_loc *
Real(0.5) *
1637 psmlt_arr(i,j,k) = amrex::min(
1638 amrex::max(psmlt_arr(i,j,k) * dtcld,
1641 qs_arr(i,j,k) = qs_arr(i,j,k) + psmlt_arr(i,j,k);
1642 qr_arr(i,j,k) = qr_arr(i,j,k) - psmlt_arr(i,j,k);
1643 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * psmlt_arr(i,j,k);
1646 if (qg_arr(i,j,k) >
Real(0.0)) {
1648 rslope2_g_arr(i,j,k) *
1649 std::sqrt(rslope_g_arr(i,j,k) * rslopeb_g_arr(i,j,k));
1652 (
Real(t0c) - t_arr(i,j,k)) *
1656 pgmlt_arr(i,j,k) = amrex::min(
1657 amrex::max(pgmlt_arr(i,j,k) * dtcld,
1660 qg_arr(i,j,k) = qg_arr(i,j,k) + pgmlt_arr(i,j,k);
1661 qr_arr(i,j,k) = qr_arr(i,j,k) - pgmlt_arr(i,j,k);
1662 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pgmlt_arr(i,j,k);
1668 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1669 if (qi_arr(i,j,k) <=
Real(0.0)) {
1670 work1c_arr(i,j,k) =
Real(0.0);
1672 const Real tmp = den_arr(i,j,k) *
1673 amrex::max(qi_arr(i,j,k),
Real(qmin));
1675 amrex::max(
Real(5.38e7) *
1679 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1680 const Real diameter = amrex::max(
1683 work1c_arr(i,j,k) =
Real(1.49e4) *
1684 std::exp(std::log(diameter) *
Real(1.31));
1686 denqci_arr(i,j,k) = den_arr(i,j,k) * qi_arr(i,j,k);
1689 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1690 const int km_local =
khi -
klo + 1;
1711 for (
int k =
klo; k <=
khi; ++k) {
1712 const int kk = k -
klo;
1713 den_col(kk) = den_arr(i,j,k);
1714 denfac_col(kk) = denfac_arr(i,j,k);
1715 t_col(kk) = t_arr(i,j,k);
1716 dz_col(kk) = delz_tmp_arr(i,j,k);
1723 [&](
int k) {
return den_arr(i,j,k) * qi_arr(i,j,k) * delz_arr(i,j,k); });
1729 &delqi_col, dtcld, 0,
1730 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1732 for (
int k =
klo; k <=
khi; ++k) {
1733 const int kk = k -
klo;
1736 qi_arr(i,j,k) = amrex::max(
1740 [&](
int k) {
return den_arr(i,j,k) * qi_arr(i,j,k) * delz_arr(i,j,k); });
1742 delqi_arr(i,j,0) = delqi_col / delz_arr(i,j,
klo) / dtcld;
1743 fallc_arr(i,j,
klo) = delqi_arr(i,j,0);
1747 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1748 const Real fallsum =
1749 fall_r_arr(i,j,
klo) + fall_s_arr(i,j,
klo) +
1750 fall_g_arr(i,j,
klo) + fallc_arr(i,j,
klo);
1751 const Real fallsum_qsi = fall_s_arr(i,j,
klo) + fallc_arr(i,j,
klo);
1752 const Real fallsum_qg = fall_g_arr(i,j,
klo);
1755 if (fallsum >
Real(0.0)) {
1756 rainncv_arr(i,j,0) += fallsum *
precip;
1757 rainacc_arr(i,j,0) += fallsum *
precip;
1759 if (fallsum_qsi >
Real(0.0)) {
1760 tstepsnow_arr(i,j,0) += fallsum_qsi *
precip;
1761 snowncv_arr(i,j,0) += fallsum_qsi *
precip;
1762 snowacc_arr(i,j,0) += fallsum_qsi *
precip;
1764 if (fallsum_qg >
Real(0.0)) {
1765 tstepgraup_arr(i,j,0) += fallsum_qg *
precip;
1766 graupelncv_arr(i,j,0) += fallsum_qg *
precip;
1767 graupacc_arr(i,j,0) += fallsum_qg *
precip;
1769 rainonly_arr(i,j,0) += fall_r_arr(i,j,
klo) *
precip;
1770 snowonly_arr(i,j,0) += fall_s_arr(i,j,
klo) *
precip;
1771 if (fallsum >
Real(0.0)) {
1773 (snowncv_arr(i,j,0) + graupelncv_arr(i,j,0)) /
1774 (rainncv_arr(i,j,0) +
Real(1.0e-12));
1778 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
1785 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1786 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1790 pimlt_arr(i,j,k) =
Real(0.0);
1791 pihmf_arr(i,j,k) =
Real(0.0);
1792 pihtf_arr(i,j,k) =
Real(0.0);
1793 pgfrz_arr(i,j,k) =
Real(0.0);
1795 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
1796 pimlt_arr(i,j,k) = qi_arr(i,j,k);
1797 qc_arr(i,j,k) = qc_arr(i,j,k) + qi_arr(i,j,k);
1798 t_arr(i,j,k) = t_arr(i,j,k) -
xlf / cpm_arr(i,j,k) * qi_arr(i,j,k);
1799 qi_arr(i,j,k) =
Real(0.0);
1802 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
1803 pihmf_arr(i,j,k) = qc_arr(i,j,k);
1804 qi_arr(i,j,k) = qi_arr(i,j,k) + qc_arr(i,j,k);
1805 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * qc_arr(i,j,k);
1806 qc_arr(i,j,k) =
Real(0.0);
1809 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
1810 const Real supcolt = amrex::min(supcol,
Real(50.0));
1811 const Real pfrzdtc = amrex::min(
1815 qc_arr(i,j,k) * qc_arr(i,j,k) * dtcld,
1817 pihtf_arr(i,j,k) = pfrzdtc;
1818 qi_arr(i,j,k) = qi_arr(i,j,k) + pfrzdtc;
1819 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtc;
1820 qc_arr(i,j,k) = qc_arr(i,j,k) - pfrzdtc;
1823 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
1824 Real temp = rslope3_r_arr(i,j,k);
1825 temp = temp * temp * rslope_r_arr(i,j,k);
1826 const Real supcolt = amrex::min(supcol,
Real(50.0));
1827 const Real pfrzdtr = amrex::min(
1829 Real(denr) / den_arr(i,j,k) *
1833 pgfrz_arr(i,j,k) = pfrzdtr;
1834 qg_arr(i,j,k) = qg_arr(i,j,k) + pfrzdtr;
1835 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtr;
1836 qr_arr(i,j,k) = qr_arr(i,j,k) - pfrzdtr;
1844 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1845 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1846 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1847 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1850 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1851 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1853 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1854 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1855 work1_r_arr(i,j,k));
1857 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1860 rslopesmax_loc, rslopesbmax_loc,
1861 rslopes2max_loc, rslopes3max_loc,
1863 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1864 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1865 work1_s_arr(i,j,k), dummy_n0sfac);
1867 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1869 rslopegmax_loc, rslopegbmax_loc,
1870 rslopeg2max_loc, rslopeg3max_loc,
1872 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1873 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1874 work1_g_arr(i,j,k));
1875 n0sfac_arr(i,j,k) = dummy_n0sfac;
1882 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1884 xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
1885 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
1887 Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
1888 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
1890 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1895 const Real dtcld_l = dtcld;
1898 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1899 Real supsat = amrex::max(
qv_arr(i,j,k), qmin_l)
1901 Real satdt = supsat / dtcld_l;
1903 if (qc_arr(i,j,k) >
Real(
qc0)) {
1904 praut_arr(i,j,k) = amrex::min(
1906 qc_arr(i,j,k)/dtcld_l);
1909 if (qr_arr(i,j,k) > qcrmin_l && qc_arr(i,j,k) > qmin_l) {
1910 pracw_arr(i,j,k) = amrex::min(
1912 *rslopeb_r_arr(i,j,k)
1913 *qc_arr(i,j,k)*denfac_arr(i,j,k),
1914 qc_arr(i,j,k)/dtcld_l);
1917 if (qr_arr(i,j,k) >
Real(0.0)) {
1918 Real coeres = rslope2_r_arr(i,j,k)*std::sqrt(
1919 rslope_r_arr(i,j,k)*rslopeb_r_arr(i,j,k));
1920 Real rate = (rhw_arr(i,j,k)-
Real(1.0))
1923 / workdiffw_arr(i,j,k);
1924 if (rate <
Real(0.0)) {
1925 rate = amrex::max(rate, -qr_arr(i,j,k)/dtcld_l);
1926 rate = amrex::max(rate, satdt/
Real(2.0));
1928 rate = amrex::min(rate, satdt/
Real(2.0));
1930 prevp_arr(i,j,k) = rate;
1936 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1937 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1938 n0sfac_arr(i,j,k) = amrex::max(
1945 const Real satdt = supsat / dtcld;
1948 const Real tmp = den_arr(i,j,k)
1949 * amrex::max(qi_arr(i,j,k),
Real(qmin));
1951 xni_arr(i,j,k) = amrex::min(
1952 amrex::max(
Real(5.38e7) * temp,
Real(1.0e3)),
1955 const Real xni = xni_arr(i,j,k);
1956 const Real eacrs = std::exp(
Real(0.07) * (-supcol));
1958 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1959 const Real diameter = amrex::min(
1961 const Real vt2i =
Real(1.49e4) * std::pow(diameter,
Real(1.31));
1963 * denfac_arr(i,j,k);
1965 * denfac_arr(i,j,k);
1967 * denfac_arr(i,j,k);
1971 const Real qsum = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k),
Real(1.0e-15));
1972 qsum_arr(i,j,k) =
qsum;
1974 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
1977 if (supcol >
Real(0.0) && qi_arr(i,j,k) >
Real(qmin)) {
1980 Real(2.0) * rslope3_r_arr(i,j,k)
1981 +
Real(2.0) * diameter * rslope2_r_arr(i,j,k)
1982 + diameter * diameter * rslope_r_arr(i,j,k);
1989 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
1990 praci_arr(i,j,k) *= std::pow(
1992 amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_arr(i,j,k)),
1995 praci_arr(i,j,k) = amrex::min(
1996 praci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
2001 * rslope3_r_arr(i,j,k) * rslopeb_r_arr(i,j,k)
2002 /
Real(24.0) / den_arr(i,j,k);
2003 piacr_arr(i,j,k) *= std::pow(
2005 amrex::max(
Real(0.0), qi_arr(i,j,k) / qr_arr(i,j,k)),
2008 piacr_arr(i,j,k) = amrex::min(
2009 piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2014 Real(2.0) * rslope3_s_arr(i,j,k)
2015 +
Real(2.0) * diameter * rslope2_s_arr(i,j,k)
2016 + diameter * diameter * rslope_s_arr(i,j,k);
2021 psaci_arr(i,j,k) =
Real(
pi) * qi_arr(i,j,k) * eacrs
2022 *
Real(
n0s) * n0sfac_arr(i,j,k)
2023 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
2024 psaci_arr(i,j,k) = amrex::min(
2025 psaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
2029 const Real egi = std::exp(
Real(0.07) * (-supcol));
2031 Real(2.0) * rslope3_g_arr(i,j,k)
2032 +
Real(2.0) * diameter * rslope2_g_arr(i,j,k)
2033 + diameter * diameter * rslope_g_arr(i,j,k);
2034 pgaci_arr(i,j,k) =
Real(
pi) * egi * qi_arr(i,j,k)
2035 * n0g_loc * std::abs(vt2ave - vt2i) * acrfac
2037 pgaci_arr(i,j,k) = amrex::min(
2038 pgaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
2042 if (qs_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
2043 psacw_arr(i,j,k) = amrex::min(
2044 Real(
pacrc) * n0sfac_arr(i,j,k) * rslope3_s_arr(i,j,k)
2045 * rslopeb_s_arr(i,j,k)
2048 amrex::max(
Real(0.0), qs_arr(i,j,k) / qc_arr(i,j,k)),
2051 * qc_arr(i,j,k) * denfac_arr(i,j,k),
2052 qc_arr(i,j,k) / dtcld);
2055 if (qg_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
2056 pgacw_arr(i,j,k) = amrex::min(
2057 Real(
pacrg) * rslope3_g_arr(i,j,k) * rslopeb_g_arr(i,j,k)
2060 amrex::max(
Real(0.0), qg_arr(i,j,k) / qc_arr(i,j,k)),
2063 * qc_arr(i,j,k) * denfac_arr(i,j,k),
2064 qc_arr(i,j,k) / dtcld);
2068 paacw_arr(i,j,k) = (qs_arr(i,j,k) * psacw_arr(i,j,k)
2069 + qg_arr(i,j,k) * pgacw_arr(i,j,k))
2074 if (supcol >
Real(0.0)) {
2076 Real(5.0) * rslope3_s_arr(i,j,k) * rslope3_s_arr(i,j,k)
2077 * rslope_r_arr(i,j,k)
2078 +
Real(2.0) * rslope3_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
2079 * rslope2_r_arr(i,j,k)
2080 +
Real(0.5) * rslope2_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
2081 * rslope3_r_arr(i,j,k);
2087 *
Real(
n0s) * n0sfac_arr(i,j,k)
2088 * std::abs(vt2r - vt2ave) * (
Real(
dens_snow) / den_arr(i,j,k))
2090 pracs_arr(i,j,k) *= std::pow(
2092 amrex::max(
Real(0.0), qr_arr(i,j,k) / qs_arr(i,j,k)),
2095 pracs_arr(i,j,k) = amrex::min(
2096 pracs_arr(i,j,k), qs_arr(i,j,k) / dtcld);
2101 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
2102 * rslope_s_arr(i,j,k)
2103 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2104 * rslope2_s_arr(i,j,k)
2105 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2106 * rslope3_s_arr(i,j,k);
2108 *
Real(
n0s) * n0sfac_arr(i,j,k)
2109 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
2111 psacr_arr(i,j,k) *= std::pow(
2113 amrex::max(
Real(0.0), qs_arr(i,j,k) / qr_arr(i,j,k)),
2116 psacr_arr(i,j,k) = amrex::min(
2117 psacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2128 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
2129 * rslope_g_arr(i,j,k)
2130 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2131 * rslope2_g_arr(i,j,k)
2132 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2133 * rslope3_g_arr(i,j,k);
2135 * n0g_loc * std::abs(vt2ave - vt2r)
2136 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2137 pgacr_arr(i,j,k) *= std::pow(
2139 amrex::max(
Real(0.0), qg_arr(i,j,k) / qr_arr(i,j,k)),
2142 pgacr_arr(i,j,k) = amrex::min(
2143 pgacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2147 pgacs_arr(i,j,k) =
Real(0.0);
2150 if (supcol <=
Real(0.0)) {
2152 if (qs_arr(i,j,k) >
Real(0.0)) {
2157 pseml_arr(i,j,k) = amrex::min(
2160 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2161 -qs_arr(i,j,k) / dtcld),
2164 if (qg_arr(i,j,k) >
Real(0.0)) {
2165 pgeml_arr(i,j,k) = amrex::min(
2168 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2169 -qg_arr(i,j,k) / dtcld),
2174 if (supcol >
Real(0.0)) {
2175 if (qi_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2180 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2181 * (rhi_arr(i,j,k) -
Real(1.0))
2182 / workdiffi_arr(i,j,k);
2183 Real supice = satdt - prevp_arr(i,j,k);
2184 if (pidep_arr(i,j,k) <
Real(0.0)) {
2185 pidep_arr(i,j,k) = amrex::max(
2186 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2188 pidep_arr(i,j,k) = amrex::max(
2189 pidep_arr(i,j,k), -qi_arr(i,j,k) / dtcld);
2191 pidep_arr(i,j,k) = amrex::min(
2192 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2195 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2196 >= std::abs(satdt)) {
2201 if (qs_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2202 const Real coeres = rslope2_s_arr(i,j,k)
2203 * std::sqrt(rslope_s_arr(i,j,k)
2204 * rslopeb_s_arr(i,j,k));
2205 psdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2209 / workdiffi_arr(i,j,k);
2210 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2211 if (psdep_arr(i,j,k) <
Real(0.0)) {
2212 psdep_arr(i,j,k) = amrex::max(
2213 psdep_arr(i,j,k), -qs_arr(i,j,k) / dtcld);
2214 psdep_arr(i,j,k) = amrex::max(
2215 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2218 psdep_arr(i,j,k) = amrex::min(
2219 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2222 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2224 >= std::abs(satdt)) {
2229 if (qg_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2230 const Real coeres = rslope2_g_arr(i,j,k)
2231 * std::sqrt(rslope_g_arr(i,j,k)
2232 * rslopeb_g_arr(i,j,k));
2233 pgdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2236 / workdiffi_arr(i,j,k);
2237 Real supice = satdt - prevp_arr(i,j,k)
2238 - pidep_arr(i,j,k) - psdep_arr(i,j,k);
2239 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2240 pgdep_arr(i,j,k) = amrex::max(
2241 pgdep_arr(i,j,k), -qg_arr(i,j,k) / dtcld);
2242 pgdep_arr(i,j,k) = amrex::max(
2243 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2246 pgdep_arr(i,j,k) = amrex::min(
2247 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2250 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2251 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2252 >= std::abs(satdt)) {
2257 if (supsat >
Real(0.0) && ifsat != 1) {
2258 const Real supice = satdt - prevp_arr(i,j,k)
2262 const Real xni0 =
Real(1.0e3) * std::exp(
Real(0.1) * supcol);
2263 const Real roqi0 =
Real(4.92e-11) * std::pow(xni0,
Real(1.33));
2264 pigen_arr(i,j,k) = amrex::max(
2266 (roqi0 / den_arr(i,j,k)
2267 - amrex::max(qi_arr(i,j,k),
Real(0.0))) / dtcld);
2268 pigen_arr(i,j,k) = amrex::min(
2269 amrex::min(pigen_arr(i,j,k), satdt), supice);
2272 if (qi_arr(i,j,k) >
Real(0.0)) {
2278 psaut_arr(i,j,k) = amrex::max(
2279 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2282 if (qs_arr(i,j,k) >
Real(0.0)) {
2284 * std::exp(
Real(0.09) * (-supcol));
2285 pgaut_arr(i,j,k) = amrex::min(
2288 qs_arr(i,j,k) / dtcld);
2292 if (supcol <
Real(0.0)) {
2293 if (qs_arr(i,j,k) >
Real(0.0)
2294 && rhw_arr(i,j,k) <
Real(1.0)) {
2295 const Real coeres = rslope2_s_arr(i,j,k)
2296 * std::sqrt(rslope_s_arr(i,j,k)
2297 * rslopeb_s_arr(i,j,k));
2302 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2306 / workdiffw_arr(i,j,k);
2307 psevp_arr(i,j,k) = amrex::min(
2308 amrex::max(psevp_arr(i,j,k),
2309 -qs_arr(i,j,k) / dtcld),
2313 if (qg_arr(i,j,k) >
Real(0.0)
2314 && rhw_arr(i,j,k) <
Real(1.0)) {
2315 const Real coeres = rslope2_g_arr(i,j,k)
2316 * std::sqrt(rslope_g_arr(i,j,k)
2317 * rslopeb_g_arr(i,j,k));
2318 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2321 / workdiffw_arr(i,j,k);
2322 pgevp_arr(i,j,k) = amrex::min(
2323 amrex::max(pgevp_arr(i,j,k),
2324 -qg_arr(i,j,k) / dtcld),
2334 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2340 (qr_arr(i,j,k) <
Real(1.0e-4) && qs_arr(i,j,k) <
Real(1.0e-4))
2343 (qr_arr(i,j,k) <
Real(1.0e-4)) ?
Real(1.0) :
Real(0.0);
2345 if (t_arr(i,j,k) <= t0c_l) {
2346 Real value, source, factor,
xlf, xlwork2;
2348 value = amrex::max(qmin_l, qc_arr(i,j,k));
2349 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2350 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2352 if (source > value) {
2353 factor = value / source;
2354 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2355 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2356 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2359 value = amrex::max(qmin_l, qi_arr(i,j,k));
2360 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2361 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2362 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2363 if (source > value) {
2364 factor = value / source;
2365 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2366 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2367 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2368 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2369 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2370 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2373 value = amrex::max(qmin_l, qr_arr(i,j,k));
2374 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2375 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2376 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2377 if (source > value) {
2378 factor = value / source;
2379 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2380 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2381 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2382 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2383 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2384 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2387 value = amrex::max(qmin_l, qs_arr(i,j,k));
2388 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2389 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2390 + piacr_arr(i,j,k) * delta3
2391 + praci_arr(i,j,k) * delta3
2392 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2393 + psacr_arr(i,j,k) * delta2
2394 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2395 if (source > value) {
2396 factor = value / source;
2397 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2398 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2399 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2400 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2401 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2402 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2403 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2404 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2405 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2406 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2409 value = amrex::max(qmin_l, qg_arr(i,j,k));
2410 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2411 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2412 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2413 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2414 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2415 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2416 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2417 if (source > value) {
2418 factor = value / source;
2419 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2420 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2421 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2422 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2423 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2424 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2425 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2426 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2427 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2428 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2431 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2432 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2433 + pidep_arr(i,j,k));
2434 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2436 qc_arr(i,j,k) = amrex::max(
2437 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2438 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2441 qr_arr(i,j,k) = amrex::max(
2442 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2443 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2444 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2447 qi_arr(i,j,k) = amrex::max(
2448 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2449 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2450 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2453 qs_arr(i,j,k) = amrex::max(
2454 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2455 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2456 + piacr_arr(i,j,k) * delta3
2457 + praci_arr(i,j,k) * delta3
2458 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2459 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2460 + psacr_arr(i,j,k) * delta2) * dtcld,
2462 qg_arr(i,j,k) = amrex::max(
2463 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2464 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2465 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2466 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2467 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2468 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2469 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2473 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2474 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2475 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2476 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2477 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2478 + psacr_arr(i,j,k));
2479 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2481 Real value, source, factor,
xlf, xlwork2;
2483 value = amrex::max(qmin_l, qc_arr(i,j,k));
2484 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2485 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2487 if (source > value) {
2488 factor = value / source;
2489 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2490 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2491 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2494 value = amrex::max(qmin_l, qr_arr(i,j,k));
2495 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2496 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2497 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2498 - prevp_arr(i,j,k)) * dtcld;
2499 if (source > value) {
2500 factor = value / source;
2501 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2502 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2503 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2504 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2505 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2506 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2509 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2510 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2511 - psevp_arr(i,j,k)) * dtcld;
2512 if (source > value) {
2513 factor = value / source;
2514 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2515 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2516 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2519 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2520 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2521 + pgeml_arr(i,j,k)) * dtcld;
2522 if (source > value) {
2523 factor = value / source;
2524 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2525 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2526 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2529 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
2530 + pgevp_arr(i,j,k));
2531 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2533 qc_arr(i,j,k) = amrex::max(
2534 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2535 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2538 qr_arr(i,j,k) = amrex::max(
2539 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2540 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
2541 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
2542 - pgeml_arr(i,j,k)) * dtcld,
2544 qs_arr(i,j,k) = amrex::max(
2545 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
2546 + pseml_arr(i,j,k)) * dtcld,
2548 qg_arr(i,j,k) = amrex::max(
2549 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2550 + pgeml_arr(i,j,k)) * dtcld,
2553 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
2556 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
2557 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2565 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2571 Real tr = ttp / t_arr(i,j,k);
2573 * std::exp(xb * (
Real(1.0) - tr));
2574 qsw = amrex::min(qsw,
Real(0.99) * p_arr(i,j,k));
2575 qsatw_arr(i,j,k) =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
2576 qsatw_arr(i,j,k) = amrex::max(qsatw_arr(i,j,k),
Real(qmin));
2584 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2586 t_arr(i,j,k),
qv_arr(i,j,k), qsatw_arr(i,j,k),
2587 xl_arr(i,j,k), cpm_arr(i,j,k),
Real(qmin),
Real(rv));
2588 const Real work2loc = qc_arr(i,j,k) + workcond;
2589 static_cast<void>(work2loc);
2590 pcond_arr(i,j,k) = amrex::min(
2591 amrex::max(workcond / dtcld,
Real(0.0)),
2592 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
2593 if (qc_arr(i,j,k) >
Real(0.0) && workcond <
Real(0.0)) {
2594 pcond_arr(i,j,k) = amrex::max(workcond, -qc_arr(i,j,k)) / dtcld;
2596 qv_arr(i,j,k) =
qv_arr(i,j,k) - pcond_arr(i,j,k) * dtcld;
2597 qc_arr(i,j,k) = amrex::max(
2598 qc_arr(i,j,k) + pcond_arr(i,j,k) * dtcld,
2600 t_arr(i,j,k) = t_arr(i,j,k)
2601 + pcond_arr(i,j,k) * xl_arr(i,j,k)
2602 / cpm_arr(i,j,k) * dtcld;
2611 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2612 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
2613 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
2617 #ifdef ERF_USE_WSM6_FORT
2621 if (
klo ==
m_geom.Domain().smallEnd(2)) {
2622 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
2623 rain_arr(i,j,
klo) += rainonly_arr(i,j,0);
2624 snow_arr(i,j,
klo) += snowonly_arr(i,j,0);
2625 graupel_arr(i,j,
klo) += graupacc_arr(i,j,0);
2626 precip_arr(i,j,
klo) += rainacc_arr(i,j,0);
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_xka(Real x, Real y)
Definition: ERF_AdvanceWSM6.cpp:46
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_conden(Real a, Real b, Real c, Real d, Real e, Real qmin_arg, Real rv_arg)
Definition: ERF_AdvanceWSM6.cpp:66
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_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_AdvanceWSM6.cpp:172
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_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_AdvanceWSM6.cpp:202
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_slope_rain_cell(Real qr, Real den, Real denfac, Real pidn0r_arg, Real qcrmin_arg, Real rslopermax_arg, Real rsloperbmax_arg, Real rsloper2max_arg, Real rsloper3max_arg, Real bvtr_arg, Real pvtr_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt)
Definition: ERF_AdvanceWSM6.cpp:147
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_nislfv_rain_plm_scratch(int km, int ww_comp, int rq_comp, Real *precip, Real dt, int iter, Array4< Real > const &sed_cell, Array4< Real > const &sed_node, int i_s, int j_s, int klo_s)
Definition: ERF_AdvanceWSM6.cpp:226
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_xlcal(Real x, Real xlv0_arg, Real xlv1_arg, Real t0c_arg)
Definition: ERF_AdvanceWSM6.cpp:31
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_venfac(Real a, Real b, Real c, Real den0_arg)
Definition: ERF_AdvanceWSM6.cpp:58
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_cpmcal(Real x, Real qmin_arg, Real cpd_arg, Real cpv_arg)
Definition: ERF_AdvanceWSM6.cpp:25
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_nislfv_rain_plm6_scratch(int km, int ww_comp, int rq_comp, int rq2_comp, Real *precip1, Real *precip2, Real dt, int iter, Array4< Real > const &sed_cell, Array4< Real > const &sed_node, int i_s, int j_s, int klo_s)
Definition: ERF_AdvanceWSM6.cpp:508
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_diffac(Real a, Real b, Real c, Real d, Real e, Real rv_arg)
Definition: ERF_AdvanceWSM6.cpp:51
constexpr amrex::Real R_v
Definition: ERF_Constants.H:50
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:51
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:72
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:53
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:52
constexpr amrex::Real R_d
Definition: ERF_Constants.H:49
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
const int khi
Definition: ERF_InitCustomPert_Bubble.H:25
const int klo
Definition: ERF_InitCustomPert_KE.H:9
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:222
constexpr amrex::Real lat_vap
Definition: ERF_MicrophysicsConstants.H:113
constexpr amrex::Real lsub
Definition: ERF_MicrophysicsConstants.H:111
constexpr amrex::Real rhoh2o
Definition: ERF_MicrophysicsConstants.H:42
constexpr amrex::Real lat_ice
Definition: ERF_MicrophysicsConstants.H:114
constexpr amrex::Real rhos
Definition: ERF_MicrophysicsConstants.H:40
Arena * Arena_Used
Definition: ERF_Morrison_Advance_F.H:23
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void sedimentation_add_column_sums(const amrex::Array4< amrex::Real > &sed, int n, int i, int j, int klo, int khi, amrex::Real sign, F &&w) noexcept
Definition: ERF_SedimentationFlux.H:74
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
void mp_wsm6_init_c(double den0, double denr, double dens, double cl, double cpv, int hail_opt)
void mp_wsm6_run_c(double *t, double *qv, double *qc, double *qi, double *qr, double *qs, double *qg, 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 *rain, double *rainncv, double *sr, double *snow, double *snowncv, double *graupel, double *graupelncv, double *rainonly, double *snowonly, int ims, int ime, int jms, int jme, int kms, int kme, int its, int ite, int jts, int jte, int kts, int kte, int microphysics_debug, int diag_i_dbg, int diag_j_dbg)
bool boxes_span_domain() const
True when every box spans the domain in z (required by the Fortran bridges)
Definition: ERF_MicrophysicsColumns.H:44
amrex::Real m_roqimax
Definition: ERF_WSM6.H:276
amrex::Real m_rslopesbmax
Definition: ERF_WSM6.H:285
static constexpr amrex::Real avtr
Definition: ERF_WSM6.H:147
static constexpr amrex::Real dicon
Definition: ERF_WSM6.H:157
amrex::Real m_rslopes2max
Definition: ERF_WSM6.H:286
amrex::Real m_rsloper2max
Definition: ERF_WSM6.H:286
static constexpr amrex::Real qcrmin
Definition: ERF_WSM6.H:161
amrex::Real m_rslopermax
Definition: ERF_WSM6.H:284
amrex::Real m_pacrc
Definition: ERF_WSM6.H:280
static constexpr amrex::Real pfrz1
Definition: ERF_WSM6.H:159
amrex::Real m_rsloperbmax
Definition: ERF_WSM6.H:285
amrex::Real m_pi_wsm6
Definition: ERF_WSM6.H:271
static constexpr amrex::Real n0smax
Definition: ERF_WSM6.H:165
bool m_do_cond
Definition: ERF_WSM6.H:248
amrex::Real m_pidn0s
Definition: ERF_WSM6.H:280
static constexpr amrex::Real dimax
Definition: ERF_WSM6.H:158
static constexpr amrex::Real pfrz2
Definition: ERF_WSM6.H:160
static constexpr amrex::Real alpha_wsm6
Definition: ERF_WSM6.H:167
amrex::Real m_pvtg
Definition: ERF_WSM6.H:283
amrex::Real m_qck1
Definition: ERF_WSM6.H:272
amrex::Real m_precg2
Definition: ERF_WSM6.H:283
amrex::Real m_precg1
Definition: ERF_WSM6.H:283
amrex::Real m_rsloper3max
Definition: ERF_WSM6.H:287
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:166
amrex::Real m_precr2
Definition: ERF_WSM6.H:276
static constexpr amrex::Real n0r
Definition: ERF_WSM6.H:146
amrex::Real m_n0g
Definition: ERF_WSM6.H:266
amrex::Real m_pidn0g
Definition: ERF_WSM6.H:283
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:163
static constexpr amrex::Real dtcldcr
Definition: ERF_WSM6.H:145
amrex::Real m_rslopegmax
Definition: ERF_WSM6.H:284
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:154
amrex::Real m_g6pbr
Definition: ERF_WSM6.H:274
amrex::Real m_pacrg
Definition: ERF_WSM6.H:283
amrex::Real m_precs2
Definition: ERF_WSM6.H:279
amrex::Real m_rslopeg3max
Definition: ERF_WSM6.H:287
amrex::Real m_pvts
Definition: ERF_WSM6.H:279
amrex::Real m_rslopegbmax
Definition: ERF_WSM6.H:285
static constexpr amrex::Real qs0
Definition: ERF_WSM6.H:164
amrex::Geometry m_geom
Definition: ERF_WSM6.H:243
amrex::Real m_precs1
Definition: ERF_WSM6.H:279
amrex::Real dt
Definition: ERF_WSM6.H:244
static constexpr amrex::Real xncr
Definition: ERF_WSM6.H:151
static constexpr amrex::Real bvtr
Definition: ERF_WSM6.H:148
amrex::Real m_rslopesmax
Definition: ERF_WSM6.H:284
amrex::Real m_qc0
Definition: ERF_WSM6.H:272
amrex::Real m_bvtg
Definition: ERF_WSM6.H:266
amrex::Real m_pvtr
Definition: ERF_WSM6.H:275
amrex::Real m_pacrr
Definition: ERF_WSM6.H:275
amrex::Real m_precr1
Definition: ERF_WSM6.H:276
amrex::Real m_pidn0r
Definition: ERF_WSM6.H:280
amrex::Real m_rslopes3max
Definition: ERF_WSM6.H:287
amrex::Real m_xlv1
Definition: ERF_WSM6.H:271
amrex::Real m_rslopeg2max
Definition: ERF_WSM6.H:286
@ xlf
Definition: ERF_AdvanceMorrison.cpp:159
@ precip_accum
Definition: ERF_WSM6.H:36
@ qr
Definition: ERF_WSM6.H:30
@ qi
Definition: ERF_WSM6.H:29
@ graupel_accum
Definition: ERF_WSM6.H:35
@ qs
Definition: ERF_WSM6.H:31
@ qv
Definition: ERF_WSM6.H:27
@ qc
Definition: ERF_WSM6.H:28
@ rain_accum
Definition: ERF_WSM6.H:33
@ snow_accum
Definition: ERF_WSM6.H:34
@ rho
Definition: ERF_WSM6.H:23
@ qg
Definition: ERF_WSM6.H:32
@ pres
Definition: ERF_WSM6.H:26
@ tabs
Definition: ERF_WSM6.H:25
@ precip
Definition: ERF_SLM.H:133
@ qsum
Definition: ERF_WSM6.H:344
@ xni
Definition: ERF_WSM6.H:349
@ NumComps
Definition: ERF_AdvanceWSM6.cpp:128
@ workr_col
Definition: ERF_AdvanceWSM6.cpp:120
@ tmp
Definition: ERF_AdvanceWSM6.cpp:116
@ denqrs2_col
Definition: ERF_AdvanceWSM6.cpp:123
@ qsum_col
Definition: ERF_AdvanceWSM6.cpp:125
@ denqci_col
Definition: ERF_AdvanceWSM6.cpp:127
@ denqrs1_col
Definition: ERF_AdvanceWSM6.cpp:122
@ worka_col
Definition: ERF_AdvanceWSM6.cpp:121
@ denqrs3_col
Definition: ERF_AdvanceWSM6.cpp:124
@ den
Definition: ERF_AdvanceWSM6.cpp:111
@ dz
Definition: ERF_AdvanceWSM6.cpp:106
@ tk
Definition: ERF_AdvanceWSM6.cpp:113
@ denfac
Definition: ERF_AdvanceWSM6.cpp:112
@ work1c_col
Definition: ERF_AdvanceWSM6.cpp:126
@ NumComps
Definition: ERF_AdvanceWSM6.cpp:142
@ qs
Definition: ERF_WSM6.H:125
@ qr
Definition: ERF_WSM6.H:125
@ qg
Definition: ERF_WSM6.H:125
@ NumComps
Definition: ERF_WSM6.H:125
@ qi
Definition: ERF_WSM6.H:125
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(c_double), parameter, private pi
Definition: ERF_module_mp_morr_two_moment.F90:100
real(kind=kind_phys), save pacrc
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save precs1
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pacrr
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save precr2
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pvtr
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save precr1
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pvtg
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save g6pbr
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), parameter, private dens
Definition: ERF_module_mp_wdm6.F90:61
real(kind=kind_phys), save roqimax
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save qck1
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save qc0
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pvts
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save precs2
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pacrg
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save precg1
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save precg2
Definition: ERF_module_mp_wdm6.F90:100