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.queryAdd(
"microphysics_debug", microphysics_debug);
856 pp.queryAdd(
"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.queryAdd(
"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);
1865 const Real qsum = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k),
Real(1.0e-15));
1866 qsum_arr(i,j,k) =
qsum;
1868 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
1871 if (supcol >
Real(0.0) && qi_arr(i,j,k) >
Real(qmin)) {
1874 Real(2.0) * rslope3_r_arr(i,j,k)
1875 +
Real(2.0) * diameter * rslope2_r_arr(i,j,k)
1876 + diameter * diameter * rslope_r_arr(i,j,k);
1883 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
1884 praci_arr(i,j,k) *= std::pow(
1886 amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_arr(i,j,k)),
1889 praci_arr(i,j,k) = amrex::min(
1890 praci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1895 * rslope3_r_arr(i,j,k) * rslopeb_r_arr(i,j,k)
1896 /
Real(24.0) / den_arr(i,j,k);
1897 piacr_arr(i,j,k) *= std::pow(
1899 amrex::max(
Real(0.0), qi_arr(i,j,k) / qr_arr(i,j,k)),
1902 piacr_arr(i,j,k) = amrex::min(
1903 piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
1908 Real(2.0) * rslope3_s_arr(i,j,k)
1909 +
Real(2.0) * diameter * rslope2_s_arr(i,j,k)
1910 + diameter * diameter * rslope_s_arr(i,j,k);
1915 psaci_arr(i,j,k) =
Real(
pi) * qi_arr(i,j,k) * eacrs
1916 *
Real(
n0s) * n0sfac_arr(i,j,k)
1917 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
1918 psaci_arr(i,j,k) = amrex::min(
1919 psaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1923 const Real egi = std::exp(
Real(0.07) * (-supcol));
1925 Real(2.0) * rslope3_g_arr(i,j,k)
1926 +
Real(2.0) * diameter * rslope2_g_arr(i,j,k)
1927 + diameter * diameter * rslope_g_arr(i,j,k);
1928 pgaci_arr(i,j,k) =
Real(
pi) * egi * qi_arr(i,j,k)
1929 * n0g_loc * std::abs(vt2ave - vt2i) * acrfac
1931 pgaci_arr(i,j,k) = amrex::min(
1932 pgaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1936 if (qs_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1937 psacw_arr(i,j,k) = amrex::min(
1938 Real(
pacrc) * n0sfac_arr(i,j,k) * rslope3_s_arr(i,j,k)
1939 * rslopeb_s_arr(i,j,k)
1942 amrex::max(
Real(0.0), qs_arr(i,j,k) / qc_arr(i,j,k)),
1945 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1946 qc_arr(i,j,k) / dtcld);
1949 if (qg_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1950 pgacw_arr(i,j,k) = amrex::min(
1951 Real(
pacrg) * rslope3_g_arr(i,j,k) * rslopeb_g_arr(i,j,k)
1954 amrex::max(
Real(0.0), qg_arr(i,j,k) / qc_arr(i,j,k)),
1957 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1958 qc_arr(i,j,k) / dtcld);
1962 paacw_arr(i,j,k) = (qs_arr(i,j,k) * psacw_arr(i,j,k)
1963 + qg_arr(i,j,k) * pgacw_arr(i,j,k))
1968 if (supcol >
Real(0.0)) {
1970 Real(5.0) * rslope3_s_arr(i,j,k) * rslope3_s_arr(i,j,k)
1971 * rslope_r_arr(i,j,k)
1972 +
Real(2.0) * rslope3_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1973 * rslope2_r_arr(i,j,k)
1974 +
Real(0.5) * rslope2_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1975 * rslope3_r_arr(i,j,k);
1981 *
Real(
n0s) * n0sfac_arr(i,j,k)
1982 * std::abs(vt2r - vt2ave) * (
Real(
dens_snow) / den_arr(i,j,k))
1984 pracs_arr(i,j,k) *= std::pow(
1986 amrex::max(
Real(0.0), qr_arr(i,j,k) / qs_arr(i,j,k)),
1989 pracs_arr(i,j,k) = amrex::min(
1990 pracs_arr(i,j,k), qs_arr(i,j,k) / dtcld);
1995 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
1996 * rslope_s_arr(i,j,k)
1997 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
1998 * rslope2_s_arr(i,j,k)
1999 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2000 * rslope3_s_arr(i,j,k);
2002 *
Real(
n0s) * n0sfac_arr(i,j,k)
2003 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
2005 psacr_arr(i,j,k) *= std::pow(
2007 amrex::max(
Real(0.0), qs_arr(i,j,k) / qr_arr(i,j,k)),
2010 psacr_arr(i,j,k) = amrex::min(
2011 psacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2022 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
2023 * rslope_g_arr(i,j,k)
2024 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2025 * rslope2_g_arr(i,j,k)
2026 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2027 * rslope3_g_arr(i,j,k);
2029 * n0g_loc * std::abs(vt2ave - vt2r)
2030 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2031 pgacr_arr(i,j,k) *= std::pow(
2033 amrex::max(
Real(0.0), qg_arr(i,j,k) / qr_arr(i,j,k)),
2036 pgacr_arr(i,j,k) = amrex::min(
2037 pgacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2041 pgacs_arr(i,j,k) =
Real(0.0);
2044 if (supcol <=
Real(0.0)) {
2046 if (qs_arr(i,j,k) >
Real(0.0)) {
2051 pseml_arr(i,j,k) = amrex::min(
2054 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2055 -qs_arr(i,j,k) / dtcld),
2058 if (qg_arr(i,j,k) >
Real(0.0)) {
2059 pgeml_arr(i,j,k) = amrex::min(
2062 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2063 -qg_arr(i,j,k) / dtcld),
2068 if (supcol >
Real(0.0)) {
2069 if (qi_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2074 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2075 * (rhi_arr(i,j,k) -
Real(1.0))
2076 / workdiffi_arr(i,j,k);
2077 Real supice = satdt - prevp_arr(i,j,k);
2078 if (pidep_arr(i,j,k) <
Real(0.0)) {
2079 pidep_arr(i,j,k) = amrex::max(
2080 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2082 pidep_arr(i,j,k) = amrex::max(
2083 pidep_arr(i,j,k), -qi_arr(i,j,k) / dtcld);
2085 pidep_arr(i,j,k) = amrex::min(
2086 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2089 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2090 >= std::abs(satdt)) {
2095 if (qs_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2096 const Real coeres = rslope2_s_arr(i,j,k)
2097 * std::sqrt(rslope_s_arr(i,j,k)
2098 * rslopeb_s_arr(i,j,k));
2099 psdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2103 / workdiffi_arr(i,j,k);
2104 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2105 if (psdep_arr(i,j,k) <
Real(0.0)) {
2106 psdep_arr(i,j,k) = amrex::max(
2107 psdep_arr(i,j,k), -qs_arr(i,j,k) / dtcld);
2108 psdep_arr(i,j,k) = amrex::max(
2109 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2112 psdep_arr(i,j,k) = amrex::min(
2113 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2116 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2118 >= std::abs(satdt)) {
2123 if (qg_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2124 const Real coeres = rslope2_g_arr(i,j,k)
2125 * std::sqrt(rslope_g_arr(i,j,k)
2126 * rslopeb_g_arr(i,j,k));
2127 pgdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2130 / workdiffi_arr(i,j,k);
2131 Real supice = satdt - prevp_arr(i,j,k)
2132 - pidep_arr(i,j,k) - psdep_arr(i,j,k);
2133 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2134 pgdep_arr(i,j,k) = amrex::max(
2135 pgdep_arr(i,j,k), -qg_arr(i,j,k) / dtcld);
2136 pgdep_arr(i,j,k) = amrex::max(
2137 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2140 pgdep_arr(i,j,k) = amrex::min(
2141 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2144 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2145 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2146 >= std::abs(satdt)) {
2151 if (supsat >
Real(0.0) && ifsat != 1) {
2152 const Real supice = satdt - prevp_arr(i,j,k)
2156 const Real xni0 =
Real(1.0e3) * std::exp(
Real(0.1) * supcol);
2157 const Real roqi0 =
Real(4.92e-11) * std::pow(xni0,
Real(1.33));
2158 pigen_arr(i,j,k) = amrex::max(
2160 (roqi0 / den_arr(i,j,k)
2161 - amrex::max(qi_arr(i,j,k),
Real(0.0))) / dtcld);
2162 pigen_arr(i,j,k) = amrex::min(
2163 amrex::min(pigen_arr(i,j,k), satdt), supice);
2166 if (qi_arr(i,j,k) >
Real(0.0)) {
2172 psaut_arr(i,j,k) = amrex::max(
2173 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2176 if (qs_arr(i,j,k) >
Real(0.0)) {
2178 * std::exp(
Real(0.09) * (-supcol));
2179 pgaut_arr(i,j,k) = amrex::min(
2182 qs_arr(i,j,k) / dtcld);
2186 if (supcol <
Real(0.0)) {
2187 if (qs_arr(i,j,k) >
Real(0.0)
2188 && rhw_arr(i,j,k) <
Real(1.0)) {
2189 const Real coeres = rslope2_s_arr(i,j,k)
2190 * std::sqrt(rslope_s_arr(i,j,k)
2191 * rslopeb_s_arr(i,j,k));
2196 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2200 / workdiffw_arr(i,j,k);
2201 psevp_arr(i,j,k) = amrex::min(
2202 amrex::max(psevp_arr(i,j,k),
2203 -qs_arr(i,j,k) / dtcld),
2207 if (qg_arr(i,j,k) >
Real(0.0)
2208 && rhw_arr(i,j,k) <
Real(1.0)) {
2209 const Real coeres = rslope2_g_arr(i,j,k)
2210 * std::sqrt(rslope_g_arr(i,j,k)
2211 * rslopeb_g_arr(i,j,k));
2212 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2215 / workdiffw_arr(i,j,k);
2216 pgevp_arr(i,j,k) = amrex::min(
2217 amrex::max(pgevp_arr(i,j,k),
2218 -qg_arr(i,j,k) / dtcld),
2228 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2234 (qr_arr(i,j,k) <
Real(1.0e-4) && qs_arr(i,j,k) <
Real(1.0e-4))
2237 (qr_arr(i,j,k) <
Real(1.0e-4)) ?
Real(1.0) :
Real(0.0);
2239 if (t_arr(i,j,k) <= t0c_l) {
2240 Real value, source, factor,
xlf, xlwork2;
2242 value = amrex::max(qmin_l, qc_arr(i,j,k));
2243 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2244 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2246 if (source > value) {
2247 factor = value / source;
2248 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2249 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2250 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2253 value = amrex::max(qmin_l, qi_arr(i,j,k));
2254 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2255 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2256 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2257 if (source > value) {
2258 factor = value / source;
2259 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2260 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2261 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2262 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2263 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2264 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2267 value = amrex::max(qmin_l, qr_arr(i,j,k));
2268 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2269 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2270 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2271 if (source > value) {
2272 factor = value / source;
2273 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2274 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2275 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2276 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2277 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2278 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2281 value = amrex::max(qmin_l, qs_arr(i,j,k));
2282 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2283 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2284 + piacr_arr(i,j,k) * delta3
2285 + praci_arr(i,j,k) * delta3
2286 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2287 + psacr_arr(i,j,k) * delta2
2288 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2289 if (source > value) {
2290 factor = value / source;
2291 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2292 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2293 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2294 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2295 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2296 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2297 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2298 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2299 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2300 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2303 value = amrex::max(qmin_l, qg_arr(i,j,k));
2304 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2305 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2306 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2307 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2308 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2309 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2310 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2311 if (source > value) {
2312 factor = value / source;
2313 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2314 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2315 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2316 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2317 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2318 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2319 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2320 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2321 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2322 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2325 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2326 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2327 + pidep_arr(i,j,k));
2328 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2330 qc_arr(i,j,k) = amrex::max(
2331 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2332 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2335 qr_arr(i,j,k) = amrex::max(
2336 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2337 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2338 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2341 qi_arr(i,j,k) = amrex::max(
2342 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2343 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2344 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2347 qs_arr(i,j,k) = amrex::max(
2348 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2349 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2350 + piacr_arr(i,j,k) * delta3
2351 + praci_arr(i,j,k) * delta3
2352 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2353 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2354 + psacr_arr(i,j,k) * delta2) * dtcld,
2356 qg_arr(i,j,k) = amrex::max(
2357 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2358 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2359 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2360 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2361 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2362 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2363 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2367 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2368 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2369 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2370 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2371 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2372 + psacr_arr(i,j,k));
2373 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2375 Real value, source, factor,
xlf, xlwork2;
2377 value = amrex::max(qmin_l, qc_arr(i,j,k));
2378 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2379 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2381 if (source > value) {
2382 factor = value / source;
2383 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2384 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2385 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2388 value = amrex::max(qmin_l, qr_arr(i,j,k));
2389 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2390 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2391 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2392 - prevp_arr(i,j,k)) * dtcld;
2393 if (source > value) {
2394 factor = value / source;
2395 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2396 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2397 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2398 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2399 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2400 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2403 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2404 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2405 - psevp_arr(i,j,k)) * dtcld;
2406 if (source > value) {
2407 factor = value / source;
2408 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2409 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2410 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2413 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2414 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2415 + pgeml_arr(i,j,k)) * dtcld;
2416 if (source > value) {
2417 factor = value / source;
2418 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2419 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2420 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2423 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
2424 + pgevp_arr(i,j,k));
2425 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2427 qc_arr(i,j,k) = amrex::max(
2428 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2429 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2432 qr_arr(i,j,k) = amrex::max(
2433 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2434 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
2435 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
2436 - pgeml_arr(i,j,k)) * dtcld,
2438 qs_arr(i,j,k) = amrex::max(
2439 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
2440 + pseml_arr(i,j,k)) * dtcld,
2442 qg_arr(i,j,k) = amrex::max(
2443 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2444 + pgeml_arr(i,j,k)) * dtcld,
2447 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
2450 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
2451 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2459 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2465 Real tr = ttp / t_arr(i,j,k);
2467 * std::exp(xb * (
Real(1.0) - tr));
2468 qsw = amrex::min(qsw,
Real(0.99) * p_arr(i,j,k));
2469 qsatw_arr(i,j,k) =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
2470 qsatw_arr(i,j,k) = amrex::max(qsatw_arr(i,j,k),
Real(qmin));
2478 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2480 t_arr(i,j,k),
qv_arr(i,j,k), qsatw_arr(i,j,k),
2481 xl_arr(i,j,k), cpm_arr(i,j,k),
Real(qmin),
Real(rv));
2482 const Real work2loc = qc_arr(i,j,k) + workcond;
2483 static_cast<void>(work2loc);
2484 pcond_arr(i,j,k) = amrex::min(
2485 amrex::max(workcond / dtcld,
Real(0.0)),
2486 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
2487 if (qc_arr(i,j,k) >
Real(0.0) && workcond <
Real(0.0)) {
2488 pcond_arr(i,j,k) = amrex::max(workcond, -qc_arr(i,j,k)) / dtcld;
2490 qv_arr(i,j,k) =
qv_arr(i,j,k) - pcond_arr(i,j,k) * dtcld;
2491 qc_arr(i,j,k) = amrex::max(
2492 qc_arr(i,j,k) + pcond_arr(i,j,k) * dtcld,
2494 t_arr(i,j,k) = t_arr(i,j,k)
2495 + pcond_arr(i,j,k) * xl_arr(i,j,k)
2496 / cpm_arr(i,j,k) * dtcld;
2504 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2505 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
2506 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
2510 #ifdef ERF_USE_WSM6_FORT
2513 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
2514 rain_arr(i,j,klo) = rainacc_arr(i,j,0);
2515 snow_arr(i,j,klo) = snowacc_arr(i,j,0);
2516 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
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 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