847 int microphysics_debug = 0;
848 std::string micro_diag_mode =
"canonical";
849 std::vector<std::string> micro_diag_tags = {
"standing"};
850 std::vector<std::string> micro_diag_expr = {
"standing"};
851 std::vector<std::string> micro_diag_store = {
"standing"};
852 std::vector<int> micro_diag_target_column;
854 amrex::ParmParse
pp(
"erf");
855 pp.query(
"microphysics_debug", microphysics_debug);
856 pp.query(
"micro_diag_mode", micro_diag_mode);
857 pp.queryarr(
"micro_diag_tags", micro_diag_tags);
858 pp.queryarr(
"micro_diag_expr", micro_diag_expr);
859 pp.queryarr(
"micro_diag_store", micro_diag_store);
860 pp.queryarr(
"micro_diag_target_column", micro_diag_target_column);
862 microphysics_debug = std::max(0, std::min(2, microphysics_debug));
863 #ifdef ERF_USE_WSM6_FORT
864 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; }();
865 const bool micro_diag_forensic = (micro_diag_mode_lower ==
"forensic" || micro_diag_mode_lower ==
"both");
866 const int microphysics_debug_bridge = micro_diag_forensic
868 : std::min(microphysics_debug, 1);
869 bool use_wsm6_cpp_answer =
false;
870 { amrex::ParmParse
pp(
"erf");
871 pp.query(
"use_wsm6_cpp_answer", use_wsm6_cpp_answer); }
872 bool run_wsm6_fort = !use_wsm6_cpp_answer;
874 static bool wsm6_inited =
false;
878 constexpr
double den0 = 1.28;
879 constexpr
double denr =
static_cast<double>(
rhoh2o);
880 constexpr
double dens =
static_cast<double>(
rhos);
881 constexpr
double cl =
static_cast<double>(
Cp_l);
882 constexpr
double cpv =
static_cast<double>(
Cp_v);
883 constexpr
int hail_opt = 0;
889 constexpr
double g =
static_cast<double>(
CONST_GRAV);
890 constexpr
double cpd =
static_cast<double>(
Cp_d);
891 constexpr
double cpv =
static_cast<double>(
Cp_v);
892 constexpr
double rd =
static_cast<double>(
R_d);
893 constexpr
double rv =
static_cast<double>(
R_v);
894 constexpr
double t0c = 273.15;
895 constexpr
double ep1 =
static_cast<double>(
R_v /
R_d -
one);
896 amrex::ignore_unused(
g, rd, ep1);
897 constexpr
double ep2 =
static_cast<double>(
R_d /
R_v);
898 constexpr
double qmin = 1.0e-12;
899 constexpr
double xls =
static_cast<double>(
lsub);
900 constexpr
double xlv0 =
static_cast<double>(
lat_vap);
901 constexpr
double xlf0 =
static_cast<double>(
lat_ice);
902 constexpr
double den0 = 1.28;
903 constexpr
double denr =
static_cast<double>(
rhoh2o);
904 constexpr
double cliq =
static_cast<double>(
Cp_l);
905 constexpr
double cice = 2106.0;
906 constexpr
double psat = 610.78;
908 const Box box = mfi.tilebox();
909 const Box fab_box = mfi.fabbox();
924 const int ilo = box.smallEnd(0);
925 const int ihi = box.bigEnd(0);
926 const int jlo = box.smallEnd(1);
927 const int jhi = box.bigEnd(1);
928 const int klo = box.smallEnd(2);
929 const int khi = box.bigEnd(2);
930 const bool has_target_override = (micro_diag_target_column.size() == 2);
931 const int diag_i = has_target_override ? micro_diag_target_column[0] : ilo;
932 const int diag_j = has_target_override ? micro_diag_target_column[1] : jlo;
934 const int imlo = fab_box.smallEnd(0);
935 const int imhi = fab_box.bigEnd(0);
936 const int jmlo = fab_box.smallEnd(1);
937 const int jmhi = fab_box.bigEnd(1);
938 const int kmlo = fab_box.smallEnd(2);
939 const int kmhi = fab_box.bigEnd(2);
940 amrex::ignore_unused(ihi, jhi, diag_i, diag_j, imlo, imhi, jmlo, jmhi, kmlo, kmhi);
942 #if defined(ERF_USE_WSM6_FORT) && defined(AMREX_USE_GPU)
943 Arena*
Arena_Used = (run_wsm6_fort) ? The_Pinned_Arena() : The_Async_Arena();
950 auto const& delz_arr = delz_fab.array();
951 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
952 delz_arr(i,j,k) = dz_val;
956 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
957 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
958 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
959 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
960 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
964 box2d.makeSlab(2, 0);
965 Box fab_box2d(fab_box);
966 fab_box2d.makeSlab(2, 0);
971 FArrayBox rainncv_fab(fab_box2d, 1,
Arena_Used);
973 FArrayBox snowncv_fab(fab_box2d, 1,
Arena_Used);
974 FArrayBox graupelncv_fab(fab_box2d, 1,
Arena_Used);
975 FArrayBox rainacc_fab(fab_box2d, 1,
Arena_Used);
976 FArrayBox snowacc_fab(fab_box2d, 1,
Arena_Used);
977 FArrayBox graupacc_fab(fab_box2d, 1,
Arena_Used);
979 auto const& rainncv_arr = rainncv_fab.array();
980 auto const& sr_arr = sr_fab.array();
981 auto const& snowncv_arr = snowncv_fab.array();
982 auto const& graupelncv_arr = graupelncv_fab.array();
983 auto const& rainacc_arr = rainacc_fab.array();
984 auto const& snowacc_arr = snowacc_fab.array();
985 auto const& graupacc_arr = graupacc_fab.array();
986 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
987 rainncv_arr(i,j,k) =
Real(0.0);
988 sr_arr(i,j,k) =
Real(0.0);
989 snowncv_arr(i,j,k) =
Real(0.0);
990 graupelncv_arr(i,j,k) =
Real(0.0);
991 rainacc_arr(i,j,k) =
Real(0.0);
992 snowacc_arr(i,j,k) =
Real(0.0);
993 graupacc_arr(i,j,k) =
Real(0.0);
995 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
996 rainacc_arr(i,j,0) = rain_arr(i,j,klo);
997 snowacc_arr(i,j,0) = snow_arr(i,j,klo);
998 graupacc_arr(i,j,0) = graup_arr(i,j,klo);
999 rainncv_arr(i,j,0) =
Real(0.0);
1000 sr_arr(i,j,0) =
Real(0.0);
1001 snowncv_arr(i,j,0) =
Real(0.0);
1002 graupelncv_arr(i,j,0) =
Real(0.0);
1005 #ifdef ERF_USE_WSM6_FORT
1006 if (run_wsm6_fort) {
1009 Gpu::streamSynchronize();
1012 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
1013 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
1014 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
1015 static_cast<double>(
dt),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
1017 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
1018 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
1019 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
1020 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
1021 ilo, ihi, jlo, jhi, klo,
khi, microphysics_debug_bridge, diag_i, diag_j);
1032 FArrayBox tstepsnow_fab(box2d,1,
Arena_Used);
1033 FArrayBox tstepgraup_fab(box2d,1,
Arena_Used);
1034 auto const& delqrs1_arr = delqrs1_fab.array();
1035 auto const& delqrs2_arr = delqrs2_fab.array();
1036 auto const& delqrs3_arr = delqrs3_fab.array();
1037 auto const& delqi_arr = delqi_fab.array();
1038 auto const& tstepsnow_arr = tstepsnow_fab.array();
1039 auto const& tstepgraup_arr = tstepgraup_fab.array();
1041 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1042 delqrs1_arr(i,j,k) =
Real(0.0);
1043 delqrs2_arr(i,j,k) =
Real(0.0);
1044 delqrs3_arr(i,j,k) =
Real(0.0);
1045 delqi_arr(i,j,k) =
Real(0.0);
1046 tstepsnow_arr(i,j,k) =
Real(0.0);
1047 tstepgraup_arr(i,j,k) =
Real(0.0);
1056 FArrayBox qrs_tmp_r_fab(fab_box,1,
Arena_Used); FArrayBox qrs_tmp_s_fab(fab_box,1,
Arena_Used);
1057 FArrayBox qrs_tmp_g_fab(fab_box,1,
Arena_Used);
1059 FArrayBox rslope_g_fab(fab_box,1,
Arena_Used);
1060 FArrayBox rslope2_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope2_s_fab(fab_box,1,
Arena_Used);
1061 FArrayBox rslope2_g_fab(fab_box,1,
Arena_Used);
1062 FArrayBox rslope3_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope3_s_fab(fab_box,1,
Arena_Used);
1063 FArrayBox rslope3_g_fab(fab_box,1,
Arena_Used);
1064 FArrayBox rslopeb_r_fab(fab_box,1,
Arena_Used); FArrayBox rslopeb_s_fab(fab_box,1,
Arena_Used);
1065 FArrayBox rslopeb_g_fab(fab_box,1,
Arena_Used);
1067 FArrayBox work1_g_fab(fab_box,1,
Arena_Used);
1069 FArrayBox workdiffi_fab(fab_box,1,
Arena_Used);
1077 FArrayBox nislfv_r_diag_fab(fab_box,6,
Arena_Used);
1078 FArrayBox nislfv_sg_diag_fab(fab_box,6,
Arena_Used);
1080 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1100 auto const& denfac_arr = denfac_fab.array();
1101 auto const& xni_arr = xni_fab.array();
1102 auto const& cpm_arr = cpm_fab.array();
1103 auto const& xl_arr = xl_fab.array();
1104 auto const& qsatw_arr = qsatw_fab.array();
1105 auto const& qsati_arr = qsati_fab.array();
1106 auto const& rhw_arr = rhw_fab.array();
1107 auto const& rhi_arr = rhi_fab.array();
1108 auto const& den_tmp_arr = den_tmp_fab.array();
1109 auto const& delz_tmp_arr = delz_tmp_fab.array();
1110 auto const& n0sfac_arr = n0sfac_fab.array();
1111 auto const& qrs_tmp_r_arr = qrs_tmp_r_fab.array();
1112 auto const& qrs_tmp_s_arr = qrs_tmp_s_fab.array();
1113 auto const& qrs_tmp_g_arr = qrs_tmp_g_fab.array();
1114 auto const& rslope_r_arr = rslope_r_fab.array();
1115 auto const& rslope_s_arr = rslope_s_fab.array();
1116 auto const& rslope_g_arr = rslope_g_fab.array();
1117 auto const& rslope2_r_arr = rslope2_r_fab.array();
1118 auto const& rslope2_s_arr = rslope2_s_fab.array();
1119 auto const& rslope2_g_arr = rslope2_g_fab.array();
1120 auto const& rslope3_r_arr = rslope3_r_fab.array();
1121 auto const& rslope3_s_arr = rslope3_s_fab.array();
1122 auto const& rslope3_g_arr = rslope3_g_fab.array();
1123 auto const& rslopeb_r_arr = rslopeb_r_fab.array();
1124 auto const& rslopeb_s_arr = rslopeb_s_fab.array();
1125 auto const& rslopeb_g_arr = rslopeb_g_fab.array();
1126 auto const& work1_r_arr = work1_r_fab.array();
1127 auto const& work1_s_arr = work1_s_fab.array();
1128 auto const& work1_g_arr = work1_g_fab.array();
1129 auto const& work2_arr = work2_fab.array();
1130 auto const& workdiffw_arr = workdiffw_fab.array();
1131 auto const& workdiffi_arr = workdiffi_fab.array();
1132 auto const& workr_arr = workr_fab.array();
1133 auto const& worka_arr = worka_fab.array();
1134 auto const& work1c_arr = work1c_fab.array();
1135 auto const& denqrs1_arr = denqrs1_fab.array();
1136 auto const& denqrs2_arr = denqrs2_fab.array();
1137 auto const& denqrs3_arr = denqrs3_fab.array();
1138 auto const& denqci_arr = denqci_fab.array();
1139 auto const& fall_r_arr = fall_r_fab.array();
1140 auto const& fall_s_arr = fall_s_fab.array();
1141 auto const& fall_g_arr = fall_g_fab.array();
1142 auto const& fallc_arr = fallc_fab.array();
1143 auto const& qsum_arr = qsum_fab.array();
1144 auto const& nislfv_r_diag_arr = nislfv_r_diag_fab.array();
1145 auto const& nislfv_sg_diag_arr = nislfv_sg_diag_fab.array();
1146 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1147 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1149 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1150 work1c_arr(i,j,k) =
Real(0.0);
1152 ParallelFor(fab_box, nislfv_r_diag_fab.nComp(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
1153 nislfv_r_diag_arr(i,j,k,n) =
Real(0.0);
1154 nislfv_sg_diag_arr(i,j,k,n) =
Real(0.0);
1156 auto const& praut_arr = praut_fab.array();
1157 auto const& pracw_arr = pracw_fab.array();
1158 auto const& prevp_arr = prevp_fab.array();
1159 auto const& psdep_arr = psdep_fab.array();
1160 auto const& pgdep_arr = pgdep_fab.array();
1161 auto const& psaut_arr = psaut_fab.array();
1162 auto const& pgaut_arr = pgaut_fab.array();
1163 auto const& praci_arr = praci_fab.array();
1164 auto const& piacr_arr = piacr_fab.array();
1165 auto const& psaci_arr = psaci_fab.array();
1166 auto const& psacw_arr = psacw_fab.array();
1167 auto const& pgacw_arr = pgacw_fab.array();
1168 auto const& pgaci_arr = pgaci_fab.array();
1169 auto const& paacw_arr = paacw_fab.array();
1170 auto const& pracs_arr = pracs_fab.array();
1171 auto const& psacr_arr = psacr_fab.array();
1172 auto const& pgacr_arr = pgacr_fab.array();
1173 auto const& pgacs_arr = pgacs_fab.array();
1174 auto const& pigen_arr = pigen_fab.array();
1175 auto const& pidep_arr = pidep_fab.array();
1176 auto const& pcond_arr = pcond_fab.array();
1177 auto const& psmlt_arr = psmlt_fab.array();
1178 auto const& pgmlt_arr = pgmlt_fab.array();
1179 auto const& pseml_arr = pseml_fab.array();
1180 auto const& pgeml_arr = pgeml_fab.array();
1181 auto const& psevp_arr = psevp_fab.array();
1182 auto const& pgevp_arr = pgevp_fab.array();
1183 auto const& pimlt_arr = pimlt_fab.array();
1184 auto const& pihmf_arr = pihmf_fab.array();
1185 auto const& pihtf_arr = pihtf_fab.array();
1186 auto const& pgfrz_arr = pgfrz_fab.array();
1190 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1191 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1192 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1193 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1194 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1195 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1196 den_tmp_arr(i,j,k) = den_arr(i,j,k);
1197 delz_tmp_arr(i,j,k) = delz_arr(i,j,k);
1202 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1208 const int wsm6_loops = std::max(
1209 static_cast<int>(std::round(
dt /
dtcldcr)), 1);
1210 const Real dtcld =
dt /
static_cast<Real>(wsm6_loops);
1228 for (
int loop = 0; loop < wsm6_loops; ++loop) {
1230 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1231 const Real invden =
Real(1.0) / den_arr(i,j,k);
1232 denfac_arr(i,j,k) = std::sqrt(invden *
Real(den0));
1241 const Real xai = -dldti /
Real(rv);
1243 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1244 const Real tr = ttp / t_arr(i,j,k);
1245 Real qsw =
Real(
psat)*std::exp(std::log(tr)*xa)*std::exp(xb*(
Real(1.0)-tr));
1246 qsw = amrex::min(qsw,
Real(0.99)*p_arr(i,j,k));
1247 qsw =
Real(ep2)*qsw / (p_arr(i,j,k) - qsw);
1248 qsw = amrex::max(qsw,
Real(qmin));
1249 qsatw_arr(i,j,k) = qsw;
1250 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsw,
Real(qmin));
1251 Real qsi = (t_arr(i,j,k) < ttp)
1252 ?
Real(
psat)*std::exp(std::log(tr)*xai)*std::exp(xbi*(
Real(1.0)-tr))
1253 :
Real(
psat)*std::exp(std::log(tr)*xa )*std::exp(xb *(
Real(1.0)-tr));
1254 qsi = amrex::min(qsi,
Real(0.99)*p_arr(i,j,k));
1255 qsi =
Real(ep2)*qsi / (p_arr(i,j,k) - qsi);
1256 qsi = amrex::max(qsi,
Real(qmin));
1257 qsati_arr(i,j,k) = qsi;
1258 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsi,
Real(qmin));
1266 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1267 prevp_arr(i,j,k) =
Real(0.0); psdep_arr(i,j,k) =
Real(0.0);
1268 pgdep_arr(i,j,k) =
Real(0.0); praut_arr(i,j,k) =
Real(0.0);
1269 psaut_arr(i,j,k) =
Real(0.0); pgaut_arr(i,j,k) =
Real(0.0);
1270 pracw_arr(i,j,k) =
Real(0.0); praci_arr(i,j,k) =
Real(0.0);
1271 piacr_arr(i,j,k) =
Real(0.0); psaci_arr(i,j,k) =
Real(0.0);
1272 psacw_arr(i,j,k) =
Real(0.0); pracs_arr(i,j,k) =
Real(0.0);
1273 psacr_arr(i,j,k) =
Real(0.0); pgacw_arr(i,j,k) =
Real(0.0);
1274 paacw_arr(i,j,k) =
Real(0.0); pgaci_arr(i,j,k) =
Real(0.0);
1275 pgacr_arr(i,j,k) =
Real(0.0); pgacs_arr(i,j,k) =
Real(0.0);
1276 pigen_arr(i,j,k) =
Real(0.0); pidep_arr(i,j,k) =
Real(0.0);
1277 pcond_arr(i,j,k) =
Real(0.0); psmlt_arr(i,j,k) =
Real(0.0);
1278 pgmlt_arr(i,j,k) =
Real(0.0); pseml_arr(i,j,k) =
Real(0.0);
1279 pgeml_arr(i,j,k) =
Real(0.0); psevp_arr(i,j,k) =
Real(0.0);
1280 pgevp_arr(i,j,k) =
Real(0.0);
1281 fall_r_arr(i,j,k) =
Real(0.0); fall_s_arr(i,j,k) =
Real(0.0);
1282 fall_g_arr(i,j,k) =
Real(0.0); fallc_arr(i,j,k) =
Real(0.0);
1290 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1291 const Real tmp = den_arr(i,j,k)*amrex::max(qi_arr(i,j,k),
Real(qmin));
1292 xni_arr(i,j,k) = amrex::min(
1321 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1322 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1323 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1324 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1327 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1328 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1330 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1331 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1332 work1_r_arr(i,j,k));
1334 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1337 rslopesmax_loc, rslopesbmax_loc,
1338 rslopes2max_loc, rslopes3max_loc,
1340 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1341 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1342 work1_s_arr(i,j,k), dummy_n0sfac);
1344 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1346 rslopegmax_loc, rslopegbmax_loc,
1347 rslopeg2max_loc, rslopeg3max_loc,
1349 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1350 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1351 work1_g_arr(i,j,k));
1352 n0sfac_arr(i,j,k) = dummy_n0sfac;
1355 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1356 const int km_local =
khi - klo + 1;
1358 constexpr
Real qsum_min =
Real(1.0e-15);
1394 for (
int k = klo; k <=
khi; ++k) {
1395 const int kk = k - klo;
1396 den_col(kk) = den_arr(i,j,k);
1397 denfac_col(kk) = denfac_arr(i,j,k);
1398 t_col(kk) = t_arr(i,j,k);
1399 dz_col(kk) = delz_tmp_arr(i,j,k);
1401 qsum_col(kk) = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k), qsum_min);
1403 worka_col(kk) = (work1_s_arr(i,j,k) * qs_arr(i,j,k)
1404 + work1_g_arr(i,j,k) * qg_arr(i,j,k))
1412 if (qr_arr(i,j,k) <=
Real(0.0)) {
1422 &delqrs1_col, dtcld, 1,
1423 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1425 for (
int k = klo; k <=
khi; ++k) {
1426 const int kk = k - klo;
1427 nislfv_r_diag_arr(i,j,k,0) = amrex::max(
denqrs1_col(kk) / den_col(kk),
Real(0.0));
1429 nislfv_r_diag_arr(i,j,k,2) =
workr_col(kk);
1431 nislfv_r_diag_arr(i,j,k,4) = den_col(kk);
1432 nislfv_r_diag_arr(i,j,k,5) = denfac_col(kk);
1441 &delqrs2_col, &delqrs3_col, dtcld, 1,
1442 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1444 for (
int k = klo; k <=
khi; ++k) {
1445 const int kk = k - klo;
1446 nislfv_sg_diag_arr(i,j,k,0) = amrex::max(
denqrs2_col(kk) / den_col(kk),
Real(0.0));
1447 nislfv_sg_diag_arr(i,j,k,1) = amrex::max(
denqrs3_col(kk) / den_col(kk),
Real(0.0));
1455 for (
int k = klo; k <=
khi; ++k) {
1456 const int kk = k - klo;
1472 delqrs1_arr(i,j,0) = delqrs1_col / delz_arr(i,j,klo) / dtcld;
1473 delqrs2_arr(i,j,0) = delqrs2_col / delz_arr(i,j,klo) / dtcld;
1474 delqrs3_arr(i,j,0) = delqrs3_col / delz_arr(i,j,klo) / dtcld;
1475 fall_r_arr(i,j,klo) = delqrs1_arr(i,j,0);
1476 fall_s_arr(i,j,klo) = delqrs2_arr(i,j,0);
1477 fall_g_arr(i,j,klo) = delqrs3_arr(i,j,0);
1482 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1483 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1484 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1485 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1488 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1489 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1491 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1492 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1493 work1_r_arr(i,j,k));
1495 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1498 rslopesmax_loc, rslopesbmax_loc,
1499 rslopes2max_loc, rslopes3max_loc,
1501 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1502 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1503 work1_s_arr(i,j,k), dummy_n0sfac);
1505 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1507 rslopegmax_loc, rslopegbmax_loc,
1508 rslopeg2max_loc, rslopeg3max_loc,
1510 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1511 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1512 work1_g_arr(i,j,k));
1516 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1517 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1518 n0sfac_arr(i,j,k) = amrex::max(
1523 if (t_arr(i,j,k) >
Real(t0c)) {
1526 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1528 if (qs_arr(i,j,k) >
Real(0.0)) {
1530 rslope2_s_arr(i,j,k) *
1531 std::sqrt(rslope_s_arr(i,j,k) * rslopeb_s_arr(i,j,k));
1534 (
Real(t0c) - t_arr(i,j,k)) * pi_wsm6_loc *
Real(0.5) *
1539 psmlt_arr(i,j,k) = amrex::min(
1540 amrex::max(psmlt_arr(i,j,k) * dtcld,
1543 qs_arr(i,j,k) = qs_arr(i,j,k) + psmlt_arr(i,j,k);
1544 qr_arr(i,j,k) = qr_arr(i,j,k) - psmlt_arr(i,j,k);
1545 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * psmlt_arr(i,j,k);
1548 if (qg_arr(i,j,k) >
Real(0.0)) {
1550 rslope2_g_arr(i,j,k) *
1551 std::sqrt(rslope_g_arr(i,j,k) * rslopeb_g_arr(i,j,k));
1554 (
Real(t0c) - t_arr(i,j,k)) *
1558 pgmlt_arr(i,j,k) = amrex::min(
1559 amrex::max(pgmlt_arr(i,j,k) * dtcld,
1562 qg_arr(i,j,k) = qg_arr(i,j,k) + pgmlt_arr(i,j,k);
1563 qr_arr(i,j,k) = qr_arr(i,j,k) - pgmlt_arr(i,j,k);
1564 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pgmlt_arr(i,j,k);
1570 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1571 if (qi_arr(i,j,k) <=
Real(0.0)) {
1572 work1c_arr(i,j,k) =
Real(0.0);
1574 const Real tmp = den_arr(i,j,k) *
1575 amrex::max(qi_arr(i,j,k),
Real(qmin));
1577 amrex::max(
Real(5.38e7) *
1581 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1582 const Real diameter = amrex::max(
1585 work1c_arr(i,j,k) =
Real(1.49e4) *
1586 std::exp(std::log(diameter) *
Real(1.31));
1588 denqci_arr(i,j,k) = den_arr(i,j,k) * qi_arr(i,j,k);
1591 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1592 const int km_local =
khi - klo + 1;
1613 for (
int k = klo; k <=
khi; ++k) {
1614 const int kk = k - klo;
1615 den_col(kk) = den_arr(i,j,k);
1616 denfac_col(kk) = denfac_arr(i,j,k);
1617 t_col(kk) = t_arr(i,j,k);
1618 dz_col(kk) = delz_tmp_arr(i,j,k);
1627 &delqi_col, dtcld, 0,
1628 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1630 for (
int k = klo; k <=
khi; ++k) {
1631 const int kk = k - klo;
1634 qi_arr(i,j,k) = amrex::max(
1638 delqi_arr(i,j,0) = delqi_col / delz_arr(i,j,klo) / dtcld;
1639 fallc_arr(i,j,klo) = delqi_arr(i,j,0);
1643 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1644 const Real fallsum =
1645 fall_r_arr(i,j,klo) + fall_s_arr(i,j,klo) +
1646 fall_g_arr(i,j,klo) + fallc_arr(i,j,klo);
1647 const Real fallsum_qsi = fall_s_arr(i,j,klo) + fallc_arr(i,j,klo);
1648 const Real fallsum_qg = fall_g_arr(i,j,klo);
1649 const Real precip = delz_arr(i,j,klo) / denr * dtcld *
Real(1000.0);
1651 if (fallsum >
Real(0.0)) {
1652 rainncv_arr(i,j,0) += fallsum * precip;
1653 rainacc_arr(i,j,0) += fallsum * precip;
1655 if (fallsum_qsi >
Real(0.0)) {
1656 tstepsnow_arr(i,j,0) += fallsum_qsi * precip;
1657 snowncv_arr(i,j,0) += fallsum_qsi * precip;
1658 snowacc_arr(i,j,0) += fallsum_qsi * precip;
1660 if (fallsum_qg >
Real(0.0)) {
1661 tstepgraup_arr(i,j,0) += fallsum_qg * precip;
1662 graupelncv_arr(i,j,0) += fallsum_qg * precip;
1663 graupacc_arr(i,j,0) += fallsum_qg * precip;
1665 if (fallsum >
Real(0.0)) {
1667 (snowncv_arr(i,j,0) + graupelncv_arr(i,j,0)) /
1668 (rainncv_arr(i,j,0) +
Real(1.0e-12));
1672 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
1679 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1680 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1684 pimlt_arr(i,j,k) =
Real(0.0);
1685 pihmf_arr(i,j,k) =
Real(0.0);
1686 pihtf_arr(i,j,k) =
Real(0.0);
1687 pgfrz_arr(i,j,k) =
Real(0.0);
1689 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
1690 pimlt_arr(i,j,k) = qi_arr(i,j,k);
1691 qc_arr(i,j,k) = qc_arr(i,j,k) + qi_arr(i,j,k);
1692 t_arr(i,j,k) = t_arr(i,j,k) -
xlf / cpm_arr(i,j,k) * qi_arr(i,j,k);
1693 qi_arr(i,j,k) =
Real(0.0);
1696 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
1697 pihmf_arr(i,j,k) = qc_arr(i,j,k);
1698 qi_arr(i,j,k) = qi_arr(i,j,k) + qc_arr(i,j,k);
1699 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * qc_arr(i,j,k);
1700 qc_arr(i,j,k) =
Real(0.0);
1703 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
1704 const Real supcolt = amrex::min(supcol,
Real(50.0));
1705 const Real pfrzdtc = amrex::min(
1709 qc_arr(i,j,k) * qc_arr(i,j,k) * dtcld,
1711 pihtf_arr(i,j,k) = pfrzdtc;
1712 qi_arr(i,j,k) = qi_arr(i,j,k) + pfrzdtc;
1713 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtc;
1714 qc_arr(i,j,k) = qc_arr(i,j,k) - pfrzdtc;
1717 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
1718 Real temp = rslope3_r_arr(i,j,k);
1719 temp = temp * temp * rslope_r_arr(i,j,k);
1720 const Real supcolt = amrex::min(supcol,
Real(50.0));
1721 const Real pfrzdtr = amrex::min(
1723 Real(denr) / den_arr(i,j,k) *
1727 pgfrz_arr(i,j,k) = pfrzdtr;
1728 qg_arr(i,j,k) = qg_arr(i,j,k) + pfrzdtr;
1729 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtr;
1730 qr_arr(i,j,k) = qr_arr(i,j,k) - pfrzdtr;
1738 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1739 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1740 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1741 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1744 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1745 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1747 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1748 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1749 work1_r_arr(i,j,k));
1751 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1754 rslopesmax_loc, rslopesbmax_loc,
1755 rslopes2max_loc, rslopes3max_loc,
1757 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1758 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1759 work1_s_arr(i,j,k), dummy_n0sfac);
1761 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1763 rslopegmax_loc, rslopegbmax_loc,
1764 rslopeg2max_loc, rslopeg3max_loc,
1766 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1767 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1768 work1_g_arr(i,j,k));
1769 n0sfac_arr(i,j,k) = dummy_n0sfac;
1776 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1778 xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
1779 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
1781 Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
1782 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
1784 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1789 const Real dtcld_l = dtcld;
1792 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1793 Real supsat = amrex::max(
qv_arr(i,j,k), qmin_l)
1795 Real satdt = supsat / dtcld_l;
1797 if (qc_arr(i,j,k) >
Real(
qc0)) {
1798 praut_arr(i,j,k) = amrex::min(
1800 qc_arr(i,j,k)/dtcld_l);
1803 if (qr_arr(i,j,k) > qcrmin_l && qc_arr(i,j,k) > qmin_l) {
1804 pracw_arr(i,j,k) = amrex::min(
1806 *rslopeb_r_arr(i,j,k)
1807 *qc_arr(i,j,k)*denfac_arr(i,j,k),
1808 qc_arr(i,j,k)/dtcld_l);
1811 if (qr_arr(i,j,k) >
Real(0.0)) {
1812 Real coeres = rslope2_r_arr(i,j,k)*std::sqrt(
1813 rslope_r_arr(i,j,k)*rslopeb_r_arr(i,j,k));
1814 Real rate = (rhw_arr(i,j,k)-
Real(1.0))
1817 / workdiffw_arr(i,j,k);
1818 if (rate <
Real(0.0)) {
1819 rate = amrex::max(rate, -qr_arr(i,j,k)/dtcld_l);
1820 rate = amrex::max(rate, satdt/
Real(2.0));
1822 rate = amrex::min(rate, satdt/
Real(2.0));
1824 prevp_arr(i,j,k) = rate;
1830 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1831 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1832 n0sfac_arr(i,j,k) = amrex::max(
1839 const Real satdt = supsat / dtcld;
1842 const Real tmp = den_arr(i,j,k)
1843 * amrex::max(qi_arr(i,j,k),
Real(qmin));
1845 xni_arr(i,j,k) = amrex::min(
1846 amrex::max(
Real(5.38e7) * temp,
Real(1.0e3)),
1849 const Real xni = xni_arr(i,j,k);
1850 const Real eacrs = std::exp(
Real(0.07) * (-supcol));
1852 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1853 const Real diameter = amrex::min(
1855 const Real vt2i =
Real(1.49e4) * std::pow(diameter,
Real(1.31));
1857 * denfac_arr(i,j,k);
1859 * denfac_arr(i,j,k);
1861 * denfac_arr(i,j,k);
1863 const Real qsum = amrex::max(qsum_arr(i,j,k),
Real(1.0e-15));
1865 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
1868 if (supcol >
Real(0.0) && qi_arr(i,j,k) >
Real(qmin)) {
1871 Real(2.0) * rslope3_r_arr(i,j,k)
1872 +
Real(2.0) * diameter * rslope2_r_arr(i,j,k)
1873 + diameter * diameter * rslope_r_arr(i,j,k);
1880 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
1881 praci_arr(i,j,k) *= std::pow(
1883 amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_arr(i,j,k)),
1886 praci_arr(i,j,k) = amrex::min(
1887 praci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1892 * rslope3_r_arr(i,j,k) * rslopeb_r_arr(i,j,k)
1893 /
Real(24.0) / den_arr(i,j,k);
1894 piacr_arr(i,j,k) *= std::pow(
1896 amrex::max(
Real(0.0), qi_arr(i,j,k) / qr_arr(i,j,k)),
1899 piacr_arr(i,j,k) = amrex::min(
1900 piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
1905 Real(2.0) * rslope3_s_arr(i,j,k)
1906 +
Real(2.0) * diameter * rslope2_s_arr(i,j,k)
1907 + diameter * diameter * rslope_s_arr(i,j,k);
1912 psaci_arr(i,j,k) =
Real(
pi) * qi_arr(i,j,k) * eacrs
1913 *
Real(
n0s) * n0sfac_arr(i,j,k)
1914 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
1915 psaci_arr(i,j,k) = amrex::min(
1916 psaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1920 const Real egi = std::exp(
Real(0.07) * (-supcol));
1922 Real(2.0) * rslope3_g_arr(i,j,k)
1923 +
Real(2.0) * diameter * rslope2_g_arr(i,j,k)
1924 + diameter * diameter * rslope_g_arr(i,j,k);
1925 pgaci_arr(i,j,k) =
Real(
pi) * egi * qi_arr(i,j,k)
1926 * n0g_loc * std::abs(vt2ave - vt2i) * acrfac
1928 pgaci_arr(i,j,k) = amrex::min(
1929 pgaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1933 if (qs_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1934 psacw_arr(i,j,k) = amrex::min(
1935 Real(
pacrc) * n0sfac_arr(i,j,k) * rslope3_s_arr(i,j,k)
1936 * rslopeb_s_arr(i,j,k)
1939 amrex::max(
Real(0.0), qs_arr(i,j,k) / qc_arr(i,j,k)),
1942 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1943 qc_arr(i,j,k) / dtcld);
1946 if (qg_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1947 pgacw_arr(i,j,k) = amrex::min(
1948 Real(
pacrg) * rslope3_g_arr(i,j,k) * rslopeb_g_arr(i,j,k)
1951 amrex::max(
Real(0.0), qg_arr(i,j,k) / qc_arr(i,j,k)),
1954 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1955 qc_arr(i,j,k) / dtcld);
1959 paacw_arr(i,j,k) = (qs_arr(i,j,k) * psacw_arr(i,j,k)
1960 + qg_arr(i,j,k) * pgacw_arr(i,j,k))
1965 if (supcol >
Real(0.0)) {
1967 Real(5.0) * rslope3_s_arr(i,j,k) * rslope3_s_arr(i,j,k)
1968 * rslope_r_arr(i,j,k)
1969 +
Real(2.0) * rslope3_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1970 * rslope2_r_arr(i,j,k)
1971 +
Real(0.5) * rslope2_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1972 * rslope3_r_arr(i,j,k);
1978 *
Real(
n0s) * n0sfac_arr(i,j,k)
1979 * std::abs(vt2r - vt2ave) * (
Real(
dens_snow) / den_arr(i,j,k))
1981 pracs_arr(i,j,k) *= std::pow(
1983 amrex::max(
Real(0.0), qr_arr(i,j,k) / qs_arr(i,j,k)),
1986 pracs_arr(i,j,k) = amrex::min(
1987 pracs_arr(i,j,k), qs_arr(i,j,k) / dtcld);
1992 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
1993 * rslope_s_arr(i,j,k)
1994 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
1995 * rslope2_s_arr(i,j,k)
1996 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
1997 * rslope3_s_arr(i,j,k);
1999 *
Real(
n0s) * n0sfac_arr(i,j,k)
2000 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
2002 psacr_arr(i,j,k) *= std::pow(
2004 amrex::max(
Real(0.0), qs_arr(i,j,k) / qr_arr(i,j,k)),
2007 psacr_arr(i,j,k) = amrex::min(
2008 psacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2013 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
2014 * rslope_g_arr(i,j,k)
2015 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2016 * rslope2_g_arr(i,j,k)
2017 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2018 * rslope3_g_arr(i,j,k);
2020 * n0g_loc * std::abs(vt2ave - vt2r)
2021 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2022 pgacr_arr(i,j,k) *= std::pow(
2024 amrex::max(
Real(0.0), qg_arr(i,j,k) / qr_arr(i,j,k)),
2027 pgacr_arr(i,j,k) = amrex::min(
2028 pgacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2033 pgacs_arr(i,j,k) =
Real(0.0);
2036 if (supcol <=
Real(0.0)) {
2038 if (qs_arr(i,j,k) >
Real(0.0)) {
2043 pseml_arr(i,j,k) = amrex::min(
2046 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2047 -qs_arr(i,j,k) / dtcld),
2050 if (qg_arr(i,j,k) >
Real(0.0)) {
2051 pgeml_arr(i,j,k) = amrex::min(
2054 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2055 -qg_arr(i,j,k) / dtcld),
2060 if (supcol >
Real(0.0)) {
2061 if (qi_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2066 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2067 * (rhi_arr(i,j,k) -
Real(1.0))
2068 / workdiffi_arr(i,j,k);
2069 Real supice = satdt - prevp_arr(i,j,k);
2070 if (pidep_arr(i,j,k) <
Real(0.0)) {
2071 pidep_arr(i,j,k) = amrex::max(
2072 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2074 pidep_arr(i,j,k) = amrex::max(
2075 pidep_arr(i,j,k), -qi_arr(i,j,k) / dtcld);
2077 pidep_arr(i,j,k) = amrex::min(
2078 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2081 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2082 >= std::abs(satdt)) {
2087 if (qs_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2088 const Real coeres = rslope2_s_arr(i,j,k)
2089 * std::sqrt(rslope_s_arr(i,j,k)
2090 * rslopeb_s_arr(i,j,k));
2091 psdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2095 / workdiffi_arr(i,j,k);
2096 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2097 if (psdep_arr(i,j,k) <
Real(0.0)) {
2098 psdep_arr(i,j,k) = amrex::max(
2099 psdep_arr(i,j,k), -qs_arr(i,j,k) / dtcld);
2100 psdep_arr(i,j,k) = amrex::max(
2101 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2104 psdep_arr(i,j,k) = amrex::min(
2105 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2108 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2110 >= std::abs(satdt)) {
2115 if (qg_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2116 const Real coeres = rslope2_g_arr(i,j,k)
2117 * std::sqrt(rslope_g_arr(i,j,k)
2118 * rslopeb_g_arr(i,j,k));
2119 pgdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2122 / workdiffi_arr(i,j,k);
2123 Real supice = satdt - prevp_arr(i,j,k)
2124 - pidep_arr(i,j,k) - psdep_arr(i,j,k);
2125 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2126 pgdep_arr(i,j,k) = amrex::max(
2127 pgdep_arr(i,j,k), -qg_arr(i,j,k) / dtcld);
2128 pgdep_arr(i,j,k) = amrex::max(
2129 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2132 pgdep_arr(i,j,k) = amrex::min(
2133 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2136 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2137 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2138 >= std::abs(satdt)) {
2143 if (supsat >
Real(0.0) && ifsat != 1) {
2144 const Real supice = satdt - prevp_arr(i,j,k)
2148 const Real xni0 =
Real(1.0e3) * std::exp(
Real(0.1) * supcol);
2149 const Real roqi0 =
Real(4.92e-11) * std::pow(xni0,
Real(1.33));
2150 pigen_arr(i,j,k) = amrex::max(
2152 (roqi0 / den_arr(i,j,k)
2153 - amrex::max(qi_arr(i,j,k),
Real(0.0))) / dtcld);
2154 pigen_arr(i,j,k) = amrex::min(
2155 amrex::min(pigen_arr(i,j,k), satdt), supice);
2158 if (qi_arr(i,j,k) >
Real(0.0)) {
2164 psaut_arr(i,j,k) = amrex::max(
2165 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2168 if (qs_arr(i,j,k) >
Real(0.0)) {
2170 * std::exp(
Real(0.09) * (-supcol));
2171 pgaut_arr(i,j,k) = amrex::min(
2174 qs_arr(i,j,k) / dtcld);
2178 if (supcol <
Real(0.0)) {
2179 if (qs_arr(i,j,k) >
Real(0.0)
2180 && rhw_arr(i,j,k) <
Real(1.0)) {
2181 const Real coeres = rslope2_s_arr(i,j,k)
2182 * std::sqrt(rslope_s_arr(i,j,k)
2183 * rslopeb_s_arr(i,j,k));
2188 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2192 / workdiffw_arr(i,j,k);
2193 psevp_arr(i,j,k) = amrex::min(
2194 amrex::max(psevp_arr(i,j,k),
2195 -qs_arr(i,j,k) / dtcld),
2199 if (qg_arr(i,j,k) >
Real(0.0)
2200 && rhw_arr(i,j,k) <
Real(1.0)) {
2201 const Real coeres = rslope2_g_arr(i,j,k)
2202 * std::sqrt(rslope_g_arr(i,j,k)
2203 * rslopeb_g_arr(i,j,k));
2204 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2207 / workdiffw_arr(i,j,k);
2208 pgevp_arr(i,j,k) = amrex::min(
2209 amrex::max(pgevp_arr(i,j,k),
2210 -qg_arr(i,j,k) / dtcld),
2220 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2226 (qr_arr(i,j,k) <
Real(1.0e-4) && qs_arr(i,j,k) <
Real(1.0e-4))
2229 (qr_arr(i,j,k) <
Real(1.0e-4)) ?
Real(1.0) :
Real(0.0);
2231 if (t_arr(i,j,k) <= t0c_l) {
2234 value = amrex::max(qmin_l, qc_arr(i,j,k));
2235 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2236 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2238 if (source >
value) {
2239 factor =
value / source;
2240 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2241 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2242 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2245 value = amrex::max(qmin_l, qi_arr(i,j,k));
2246 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2247 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2248 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2249 if (source >
value) {
2250 factor =
value / source;
2251 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2252 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2253 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2254 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2255 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2256 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2259 value = amrex::max(qmin_l, qr_arr(i,j,k));
2260 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2261 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2262 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2263 if (source >
value) {
2264 factor =
value / source;
2265 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2266 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2267 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2268 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2269 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2270 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2273 value = amrex::max(qmin_l, qs_arr(i,j,k));
2274 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2275 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2276 + piacr_arr(i,j,k) * delta3
2277 + praci_arr(i,j,k) * delta3
2278 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2279 + psacr_arr(i,j,k) * delta2
2280 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2281 if (source >
value) {
2282 factor =
value / source;
2283 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2284 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2285 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2286 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2287 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2288 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2289 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2290 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2291 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2292 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2295 value = amrex::max(qmin_l, qg_arr(i,j,k));
2296 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2297 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2298 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2299 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2300 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2301 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2302 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2303 if (source >
value) {
2304 factor =
value / source;
2305 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2306 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2307 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2308 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2309 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2310 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2311 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2312 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2313 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2314 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2317 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2318 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2319 + pidep_arr(i,j,k));
2320 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2322 qc_arr(i,j,k) = amrex::max(
2323 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2324 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2327 qr_arr(i,j,k) = amrex::max(
2328 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2329 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2330 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2333 qi_arr(i,j,k) = amrex::max(
2334 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2335 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2336 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2339 qs_arr(i,j,k) = amrex::max(
2340 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2341 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2342 + piacr_arr(i,j,k) * delta3
2343 + praci_arr(i,j,k) * delta3
2344 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2345 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2346 + psacr_arr(i,j,k) * delta2) * dtcld,
2348 qg_arr(i,j,k) = amrex::max(
2349 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2350 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2351 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2352 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2353 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2354 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2355 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2359 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2360 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2361 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2362 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2363 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2364 + psacr_arr(i,j,k));
2365 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2369 value = amrex::max(qmin_l, qc_arr(i,j,k));
2370 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2371 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2373 if (source >
value) {
2374 factor =
value / source;
2375 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2376 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2377 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2380 value = amrex::max(qmin_l, qr_arr(i,j,k));
2381 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2382 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2383 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2384 - prevp_arr(i,j,k)) * dtcld;
2385 if (source >
value) {
2386 factor =
value / source;
2387 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2388 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2389 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2390 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2391 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2392 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2395 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2396 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2397 - psevp_arr(i,j,k)) * dtcld;
2398 if (source >
value) {
2399 factor =
value / source;
2400 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2401 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2402 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2405 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2406 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2407 + pgeml_arr(i,j,k)) * dtcld;
2408 if (source >
value) {
2409 factor =
value / source;
2410 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2411 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2412 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2415 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
2416 + pgevp_arr(i,j,k));
2417 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2419 qc_arr(i,j,k) = amrex::max(
2420 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2421 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2424 qr_arr(i,j,k) = amrex::max(
2425 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2426 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
2427 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
2428 - pgeml_arr(i,j,k)) * dtcld,
2430 qs_arr(i,j,k) = amrex::max(
2431 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
2432 + pseml_arr(i,j,k)) * dtcld,
2434 qg_arr(i,j,k) = amrex::max(
2435 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2436 + pgeml_arr(i,j,k)) * dtcld,
2439 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
2442 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
2443 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2451 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2457 Real tr = ttp / t_arr(i,j,k);
2459 * std::exp(xb * (
Real(1.0) - tr));
2460 qsw = amrex::min(qsw,
Real(0.99) * p_arr(i,j,k));
2461 qsatw_arr(i,j,k) =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
2462 qsatw_arr(i,j,k) = amrex::max(qsatw_arr(i,j,k),
Real(qmin));
2470 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2472 t_arr(i,j,k),
qv_arr(i,j,k), qsatw_arr(i,j,k),
2473 xl_arr(i,j,k), cpm_arr(i,j,k),
Real(qmin),
Real(rv));
2474 const Real work2loc = qc_arr(i,j,k) + workcond;
2475 static_cast<void>(work2loc);
2476 pcond_arr(i,j,k) = amrex::min(
2477 amrex::max(workcond / dtcld,
Real(0.0)),
2478 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
2479 if (qc_arr(i,j,k) >
Real(0.0) && workcond <
Real(0.0)) {
2480 pcond_arr(i,j,k) = amrex::max(workcond, -qc_arr(i,j,k)) / dtcld;
2482 qv_arr(i,j,k) =
qv_arr(i,j,k) - pcond_arr(i,j,k) * dtcld;
2483 qc_arr(i,j,k) = amrex::max(
2484 qc_arr(i,j,k) + pcond_arr(i,j,k) * dtcld,
2486 t_arr(i,j,k) = t_arr(i,j,k)
2487 + pcond_arr(i,j,k) * xl_arr(i,j,k)
2488 / cpm_arr(i,j,k) * dtcld;
2496 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2497 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
2498 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
2502 #ifdef ERF_USE_WSM6_FORT
2505 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
2506 rain_arr(i,j,klo) = rainacc_arr(i,j,0);
2507 snow_arr(i,j,klo) = snowacc_arr(i,j,0);
2508 graup_arr(i,j,klo) = graupacc_arr(i,j,0);
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_xka(Real x, Real y)
Definition: ERF_AdvanceWSM6.cpp:44
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:64
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:170
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:200
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:145
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:224
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:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_venfac(Real a, Real b, Real c, Real den0_arg)
Definition: ERF_AdvanceWSM6.cpp:56
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:23
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:498
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:49
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
Real value
Definition: ERF_HurricaneDiagnostics.cpp:30
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
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, 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)
amrex::Real m_roqimax
Definition: ERF_WSM6.H:166
amrex::MultiFab * m_z_phys_nd
Definition: ERF_WSM6.H:148
amrex::Real m_rslopesbmax
Definition: ERF_WSM6.H:175
static constexpr amrex::Real avtr
Definition: ERF_WSM6.H:55
static constexpr amrex::Real dicon
Definition: ERF_WSM6.H:65
amrex::Real m_rslopes2max
Definition: ERF_WSM6.H:176
amrex::Real m_rsloper2max
Definition: ERF_WSM6.H:176
static constexpr amrex::Real qcrmin
Definition: ERF_WSM6.H:69
amrex::Real m_rslopermax
Definition: ERF_WSM6.H:174
amrex::Real m_pacrc
Definition: ERF_WSM6.H:170
static constexpr amrex::Real pfrz1
Definition: ERF_WSM6.H:67
amrex::Real m_rsloperbmax
Definition: ERF_WSM6.H:175
amrex::Real m_pi_wsm6
Definition: ERF_WSM6.H:161
static constexpr amrex::Real n0smax
Definition: ERF_WSM6.H:73
bool m_do_cond
Definition: ERF_WSM6.H:145
amrex::Real m_pidn0s
Definition: ERF_WSM6.H:170
static constexpr amrex::Real dimax
Definition: ERF_WSM6.H:66
static constexpr amrex::Real pfrz2
Definition: ERF_WSM6.H:68
static constexpr amrex::Real alpha_wsm6
Definition: ERF_WSM6.H:75
amrex::Real m_pvtg
Definition: ERF_WSM6.H:173
amrex::Real m_qck1
Definition: ERF_WSM6.H:162
amrex::Real m_precg2
Definition: ERF_WSM6.H:173
amrex::Real m_precg1
Definition: ERF_WSM6.H:173
amrex::Real m_rsloper3max
Definition: ERF_WSM6.H:177
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:74
amrex::Real m_precr2
Definition: ERF_WSM6.H:166
static constexpr amrex::Real n0r
Definition: ERF_WSM6.H:54
amrex::Real m_n0g
Definition: ERF_WSM6.H:156
amrex::Real m_pidn0g
Definition: ERF_WSM6.H:173
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:71
static constexpr amrex::Real dtcldcr
Definition: ERF_WSM6.H:53
amrex::Real m_rslopegmax
Definition: ERF_WSM6.H:174
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:62
amrex::Real m_g6pbr
Definition: ERF_WSM6.H:164
amrex::Real m_pacrg
Definition: ERF_WSM6.H:173
amrex::Real m_precs2
Definition: ERF_WSM6.H:169
amrex::Real m_rslopeg3max
Definition: ERF_WSM6.H:177
amrex::Real m_pvts
Definition: ERF_WSM6.H:169
amrex::Real m_rslopegbmax
Definition: ERF_WSM6.H:175
static constexpr amrex::Real qs0
Definition: ERF_WSM6.H:72
amrex::Geometry m_geom
Definition: ERF_WSM6.H:140
amrex::Real m_precs1
Definition: ERF_WSM6.H:169
amrex::Real dt
Definition: ERF_WSM6.H:141
static constexpr amrex::Real xncr
Definition: ERF_WSM6.H:59
static constexpr amrex::Real bvtr
Definition: ERF_WSM6.H:56
amrex::Real m_rslopesmax
Definition: ERF_WSM6.H:174
amrex::Real m_qc0
Definition: ERF_WSM6.H:162
amrex::Array< FabPtr, MicVar_WSM6::NumVars > mic_fab_vars
Definition: ERF_WSM6.H:151
amrex::Real m_bvtg
Definition: ERF_WSM6.H:156
amrex::Real m_pvtr
Definition: ERF_WSM6.H:165
amrex::Real m_pacrr
Definition: ERF_WSM6.H:165
amrex::Real m_precr1
Definition: ERF_WSM6.H:166
amrex::Real m_pidn0r
Definition: ERF_WSM6.H:170
amrex::Real m_rslopes3max
Definition: ERF_WSM6.H:177
amrex::Real m_xlv1
Definition: ERF_WSM6.H:161
amrex::Real m_rslopeg2max
Definition: ERF_WSM6.H:176
@ xlf
Definition: ERF_AdvanceMorrison.cpp:157
@ qr
Definition: ERF_WSM6.H:28
@ qi
Definition: ERF_WSM6.H:27
@ qs
Definition: ERF_WSM6.H:29
@ qv
Definition: ERF_WSM6.H:25
@ qc
Definition: ERF_WSM6.H:26
@ rain_accum
Definition: ERF_WSM6.H:31
@ snow_accum
Definition: ERF_WSM6.H:32
@ rho
Definition: ERF_WSM6.H:21
@ graup_accum
Definition: ERF_WSM6.H:33
@ qg
Definition: ERF_WSM6.H:30
@ pres
Definition: ERF_WSM6.H:24
@ tabs
Definition: ERF_WSM6.H:23
@ qsum
Definition: ERF_WSM6.H:234
@ xni
Definition: ERF_WSM6.H:239
@ NumComps
Definition: ERF_AdvanceWSM6.cpp:126
@ workr_col
Definition: ERF_AdvanceWSM6.cpp:118
@ tmp
Definition: ERF_AdvanceWSM6.cpp:114
@ denqrs2_col
Definition: ERF_AdvanceWSM6.cpp:121
@ qsum_col
Definition: ERF_AdvanceWSM6.cpp:123
@ denqci_col
Definition: ERF_AdvanceWSM6.cpp:125
@ denqrs1_col
Definition: ERF_AdvanceWSM6.cpp:120
@ worka_col
Definition: ERF_AdvanceWSM6.cpp:119
@ denqrs3_col
Definition: ERF_AdvanceWSM6.cpp:122
@ den
Definition: ERF_AdvanceWSM6.cpp:109
@ dz
Definition: ERF_AdvanceWSM6.cpp:104
@ tk
Definition: ERF_AdvanceWSM6.cpp:111
@ denfac
Definition: ERF_AdvanceWSM6.cpp:110
@ work1c_col
Definition: ERF_AdvanceWSM6.cpp:124
@ NumComps
Definition: ERF_AdvanceWSM6.cpp:140
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 precg2
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save precg1
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save roqimax
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), parameter, private dens
Definition: ERF_module_mp_wsm6.F90:39
real(kind=kind_phys), save g6pbr
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save precr2
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pacrr
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save qck1
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save precr1
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pacrg
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pvtg
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pvts
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save precs1
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pvtr
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save precs2
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pacrc
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save qc0
Definition: ERF_module_mp_wsm6.F90:46