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 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
1010 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
1011 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
1012 static_cast<double>(
dt),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
1014 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
1015 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
1016 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
1017 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
1018 ilo, ihi, jlo, jhi, klo,
khi, microphysics_debug_bridge, diag_i, diag_j);
1029 FArrayBox tstepsnow_fab(box2d,1,
Arena_Used);
1030 FArrayBox tstepgraup_fab(box2d,1,
Arena_Used);
1031 auto const& delqrs1_arr = delqrs1_fab.array();
1032 auto const& delqrs2_arr = delqrs2_fab.array();
1033 auto const& delqrs3_arr = delqrs3_fab.array();
1034 auto const& delqi_arr = delqi_fab.array();
1035 auto const& tstepsnow_arr = tstepsnow_fab.array();
1036 auto const& tstepgraup_arr = tstepgraup_fab.array();
1038 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1039 delqrs1_arr(i,j,k) =
Real(0.0);
1040 delqrs2_arr(i,j,k) =
Real(0.0);
1041 delqrs3_arr(i,j,k) =
Real(0.0);
1042 delqi_arr(i,j,k) =
Real(0.0);
1043 tstepsnow_arr(i,j,k) =
Real(0.0);
1044 tstepgraup_arr(i,j,k) =
Real(0.0);
1053 FArrayBox qrs_tmp_r_fab(fab_box,1,
Arena_Used); FArrayBox qrs_tmp_s_fab(fab_box,1,
Arena_Used);
1054 FArrayBox qrs_tmp_g_fab(fab_box,1,
Arena_Used);
1056 FArrayBox rslope_g_fab(fab_box,1,
Arena_Used);
1057 FArrayBox rslope2_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope2_s_fab(fab_box,1,
Arena_Used);
1058 FArrayBox rslope2_g_fab(fab_box,1,
Arena_Used);
1059 FArrayBox rslope3_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope3_s_fab(fab_box,1,
Arena_Used);
1060 FArrayBox rslope3_g_fab(fab_box,1,
Arena_Used);
1061 FArrayBox rslopeb_r_fab(fab_box,1,
Arena_Used); FArrayBox rslopeb_s_fab(fab_box,1,
Arena_Used);
1062 FArrayBox rslopeb_g_fab(fab_box,1,
Arena_Used);
1064 FArrayBox work1_g_fab(fab_box,1,
Arena_Used);
1066 FArrayBox workdiffi_fab(fab_box,1,
Arena_Used);
1074 FArrayBox nislfv_r_diag_fab(fab_box,6,
Arena_Used);
1075 FArrayBox nislfv_sg_diag_fab(fab_box,6,
Arena_Used);
1077 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1097 auto const& denfac_arr = denfac_fab.array();
1098 auto const& xni_arr = xni_fab.array();
1099 auto const& cpm_arr = cpm_fab.array();
1100 auto const& xl_arr = xl_fab.array();
1101 auto const& qsatw_arr = qsatw_fab.array();
1102 auto const& qsati_arr = qsati_fab.array();
1103 auto const& rhw_arr = rhw_fab.array();
1104 auto const& rhi_arr = rhi_fab.array();
1105 auto const& den_tmp_arr = den_tmp_fab.array();
1106 auto const& delz_tmp_arr = delz_tmp_fab.array();
1107 auto const& n0sfac_arr = n0sfac_fab.array();
1108 auto const& qrs_tmp_r_arr = qrs_tmp_r_fab.array();
1109 auto const& qrs_tmp_s_arr = qrs_tmp_s_fab.array();
1110 auto const& qrs_tmp_g_arr = qrs_tmp_g_fab.array();
1111 auto const& rslope_r_arr = rslope_r_fab.array();
1112 auto const& rslope_s_arr = rslope_s_fab.array();
1113 auto const& rslope_g_arr = rslope_g_fab.array();
1114 auto const& rslope2_r_arr = rslope2_r_fab.array();
1115 auto const& rslope2_s_arr = rslope2_s_fab.array();
1116 auto const& rslope2_g_arr = rslope2_g_fab.array();
1117 auto const& rslope3_r_arr = rslope3_r_fab.array();
1118 auto const& rslope3_s_arr = rslope3_s_fab.array();
1119 auto const& rslope3_g_arr = rslope3_g_fab.array();
1120 auto const& rslopeb_r_arr = rslopeb_r_fab.array();
1121 auto const& rslopeb_s_arr = rslopeb_s_fab.array();
1122 auto const& rslopeb_g_arr = rslopeb_g_fab.array();
1123 auto const& work1_r_arr = work1_r_fab.array();
1124 auto const& work1_s_arr = work1_s_fab.array();
1125 auto const& work1_g_arr = work1_g_fab.array();
1126 auto const& work2_arr = work2_fab.array();
1127 auto const& workdiffw_arr = workdiffw_fab.array();
1128 auto const& workdiffi_arr = workdiffi_fab.array();
1129 auto const& workr_arr = workr_fab.array();
1130 auto const& worka_arr = worka_fab.array();
1131 auto const& work1c_arr = work1c_fab.array();
1132 auto const& denqrs1_arr = denqrs1_fab.array();
1133 auto const& denqrs2_arr = denqrs2_fab.array();
1134 auto const& denqrs3_arr = denqrs3_fab.array();
1135 auto const& denqci_arr = denqci_fab.array();
1136 auto const& fall_r_arr = fall_r_fab.array();
1137 auto const& fall_s_arr = fall_s_fab.array();
1138 auto const& fall_g_arr = fall_g_fab.array();
1139 auto const& fallc_arr = fallc_fab.array();
1140 auto const& qsum_arr = qsum_fab.array();
1141 auto const& nislfv_r_diag_arr = nislfv_r_diag_fab.array();
1142 auto const& nislfv_sg_diag_arr = nislfv_sg_diag_fab.array();
1143 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1144 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1146 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1147 work1c_arr(i,j,k) =
Real(0.0);
1149 ParallelFor(fab_box, nislfv_r_diag_fab.nComp(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
1150 nislfv_r_diag_arr(i,j,k,n) =
Real(0.0);
1151 nislfv_sg_diag_arr(i,j,k,n) =
Real(0.0);
1153 auto const& praut_arr = praut_fab.array();
1154 auto const& pracw_arr = pracw_fab.array();
1155 auto const& prevp_arr = prevp_fab.array();
1156 auto const& psdep_arr = psdep_fab.array();
1157 auto const& pgdep_arr = pgdep_fab.array();
1158 auto const& psaut_arr = psaut_fab.array();
1159 auto const& pgaut_arr = pgaut_fab.array();
1160 auto const& praci_arr = praci_fab.array();
1161 auto const& piacr_arr = piacr_fab.array();
1162 auto const& psaci_arr = psaci_fab.array();
1163 auto const& psacw_arr = psacw_fab.array();
1164 auto const& pgacw_arr = pgacw_fab.array();
1165 auto const& pgaci_arr = pgaci_fab.array();
1166 auto const& paacw_arr = paacw_fab.array();
1167 auto const& pracs_arr = pracs_fab.array();
1168 auto const& psacr_arr = psacr_fab.array();
1169 auto const& pgacr_arr = pgacr_fab.array();
1170 auto const& pgacs_arr = pgacs_fab.array();
1171 auto const& pigen_arr = pigen_fab.array();
1172 auto const& pidep_arr = pidep_fab.array();
1173 auto const& pcond_arr = pcond_fab.array();
1174 auto const& psmlt_arr = psmlt_fab.array();
1175 auto const& pgmlt_arr = pgmlt_fab.array();
1176 auto const& pseml_arr = pseml_fab.array();
1177 auto const& pgeml_arr = pgeml_fab.array();
1178 auto const& psevp_arr = psevp_fab.array();
1179 auto const& pgevp_arr = pgevp_fab.array();
1180 auto const& pimlt_arr = pimlt_fab.array();
1181 auto const& pihmf_arr = pihmf_fab.array();
1182 auto const& pihtf_arr = pihtf_fab.array();
1183 auto const& pgfrz_arr = pgfrz_fab.array();
1187 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1188 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1189 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1190 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1191 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1192 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1193 den_tmp_arr(i,j,k) = den_arr(i,j,k);
1194 delz_tmp_arr(i,j,k) = delz_arr(i,j,k);
1199 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1205 const int wsm6_loops = std::max(
1206 static_cast<int>(std::round(
dt /
dtcldcr)), 1);
1207 const Real dtcld =
dt /
static_cast<Real>(wsm6_loops);
1225 for (
int loop = 0; loop < wsm6_loops; ++loop) {
1227 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1228 const Real invden =
Real(1.0) / den_arr(i,j,k);
1229 denfac_arr(i,j,k) = std::sqrt(invden *
Real(den0));
1238 const Real xai = -dldti /
Real(rv);
1240 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1241 const Real tr = ttp / t_arr(i,j,k);
1242 Real qsw =
Real(
psat)*std::exp(std::log(tr)*xa)*std::exp(xb*(
Real(1.0)-tr));
1243 qsw = amrex::min(qsw,
Real(0.99)*p_arr(i,j,k));
1244 qsw =
Real(ep2)*qsw / (p_arr(i,j,k) - qsw);
1245 qsw = amrex::max(qsw,
Real(qmin));
1246 qsatw_arr(i,j,k) = qsw;
1247 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsw,
Real(qmin));
1248 Real qsi = (t_arr(i,j,k) < ttp)
1249 ?
Real(
psat)*std::exp(std::log(tr)*xai)*std::exp(xbi*(
Real(1.0)-tr))
1250 :
Real(
psat)*std::exp(std::log(tr)*xa )*std::exp(xb *(
Real(1.0)-tr));
1251 qsi = amrex::min(qsi,
Real(0.99)*p_arr(i,j,k));
1252 qsi =
Real(ep2)*qsi / (p_arr(i,j,k) - qsi);
1253 qsi = amrex::max(qsi,
Real(qmin));
1254 qsati_arr(i,j,k) = qsi;
1255 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsi,
Real(qmin));
1263 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1264 prevp_arr(i,j,k) =
Real(0.0); psdep_arr(i,j,k) =
Real(0.0);
1265 pgdep_arr(i,j,k) =
Real(0.0); praut_arr(i,j,k) =
Real(0.0);
1266 psaut_arr(i,j,k) =
Real(0.0); pgaut_arr(i,j,k) =
Real(0.0);
1267 pracw_arr(i,j,k) =
Real(0.0); praci_arr(i,j,k) =
Real(0.0);
1268 piacr_arr(i,j,k) =
Real(0.0); psaci_arr(i,j,k) =
Real(0.0);
1269 psacw_arr(i,j,k) =
Real(0.0); pracs_arr(i,j,k) =
Real(0.0);
1270 psacr_arr(i,j,k) =
Real(0.0); pgacw_arr(i,j,k) =
Real(0.0);
1271 paacw_arr(i,j,k) =
Real(0.0); pgaci_arr(i,j,k) =
Real(0.0);
1272 pgacr_arr(i,j,k) =
Real(0.0); pgacs_arr(i,j,k) =
Real(0.0);
1273 pigen_arr(i,j,k) =
Real(0.0); pidep_arr(i,j,k) =
Real(0.0);
1274 pcond_arr(i,j,k) =
Real(0.0); psmlt_arr(i,j,k) =
Real(0.0);
1275 pgmlt_arr(i,j,k) =
Real(0.0); pseml_arr(i,j,k) =
Real(0.0);
1276 pgeml_arr(i,j,k) =
Real(0.0); psevp_arr(i,j,k) =
Real(0.0);
1277 pgevp_arr(i,j,k) =
Real(0.0);
1278 fall_r_arr(i,j,k) =
Real(0.0); fall_s_arr(i,j,k) =
Real(0.0);
1279 fall_g_arr(i,j,k) =
Real(0.0); fallc_arr(i,j,k) =
Real(0.0);
1287 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1288 const Real tmp = den_arr(i,j,k)*amrex::max(qi_arr(i,j,k),
Real(qmin));
1289 xni_arr(i,j,k) = amrex::min(
1318 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1319 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1320 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1321 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1324 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1325 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1327 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1328 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1329 work1_r_arr(i,j,k));
1331 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1334 rslopesmax_loc, rslopesbmax_loc,
1335 rslopes2max_loc, rslopes3max_loc,
1337 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1338 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1339 work1_s_arr(i,j,k), dummy_n0sfac);
1341 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1343 rslopegmax_loc, rslopegbmax_loc,
1344 rslopeg2max_loc, rslopeg3max_loc,
1346 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1347 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1348 work1_g_arr(i,j,k));
1349 n0sfac_arr(i,j,k) = dummy_n0sfac;
1352 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1353 const int km_local =
khi - klo + 1;
1355 constexpr
Real qsum_min =
Real(1.0e-15);
1391 for (
int k = klo; k <=
khi; ++k) {
1392 const int kk = k - klo;
1393 den_col(kk) = den_arr(i,j,k);
1394 denfac_col(kk) = denfac_arr(i,j,k);
1395 t_col(kk) = t_arr(i,j,k);
1396 dz_col(kk) = delz_tmp_arr(i,j,k);
1398 qsum_col(kk) = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k), qsum_min);
1400 worka_col(kk) = (work1_s_arr(i,j,k) * qs_arr(i,j,k)
1401 + work1_g_arr(i,j,k) * qg_arr(i,j,k))
1409 if (qr_arr(i,j,k) <=
Real(0.0)) {
1419 &delqrs1_col, dtcld, 1,
1420 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1422 for (
int k = klo; k <=
khi; ++k) {
1423 const int kk = k - klo;
1424 nislfv_r_diag_arr(i,j,k,0) = amrex::max(
denqrs1_col(kk) / den_col(kk),
Real(0.0));
1426 nislfv_r_diag_arr(i,j,k,2) =
workr_col(kk);
1428 nislfv_r_diag_arr(i,j,k,4) = den_col(kk);
1429 nislfv_r_diag_arr(i,j,k,5) = denfac_col(kk);
1438 &delqrs2_col, &delqrs3_col, dtcld, 1,
1439 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1441 for (
int k = klo; k <=
khi; ++k) {
1442 const int kk = k - klo;
1443 nislfv_sg_diag_arr(i,j,k,0) = amrex::max(
denqrs2_col(kk) / den_col(kk),
Real(0.0));
1444 nislfv_sg_diag_arr(i,j,k,1) = amrex::max(
denqrs3_col(kk) / den_col(kk),
Real(0.0));
1452 for (
int k = klo; k <=
khi; ++k) {
1453 const int kk = k - klo;
1469 delqrs1_arr(i,j,0) = delqrs1_col / delz_arr(i,j,klo) / dtcld;
1470 delqrs2_arr(i,j,0) = delqrs2_col / delz_arr(i,j,klo) / dtcld;
1471 delqrs3_arr(i,j,0) = delqrs3_col / delz_arr(i,j,klo) / dtcld;
1472 fall_r_arr(i,j,klo) = delqrs1_arr(i,j,0);
1473 fall_s_arr(i,j,klo) = delqrs2_arr(i,j,0);
1474 fall_g_arr(i,j,klo) = delqrs3_arr(i,j,0);
1479 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1480 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1481 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1482 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1485 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1486 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1488 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1489 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1490 work1_r_arr(i,j,k));
1492 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1495 rslopesmax_loc, rslopesbmax_loc,
1496 rslopes2max_loc, rslopes3max_loc,
1498 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1499 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1500 work1_s_arr(i,j,k), dummy_n0sfac);
1502 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1504 rslopegmax_loc, rslopegbmax_loc,
1505 rslopeg2max_loc, rslopeg3max_loc,
1507 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1508 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1509 work1_g_arr(i,j,k));
1513 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1514 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1515 n0sfac_arr(i,j,k) = amrex::max(
1520 if (t_arr(i,j,k) >
Real(t0c)) {
1523 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1525 if (qs_arr(i,j,k) >
Real(0.0)) {
1527 rslope2_s_arr(i,j,k) *
1528 std::sqrt(rslope_s_arr(i,j,k) * rslopeb_s_arr(i,j,k));
1531 (
Real(t0c) - t_arr(i,j,k)) * pi_wsm6_loc *
Real(0.5) *
1536 psmlt_arr(i,j,k) = amrex::min(
1537 amrex::max(psmlt_arr(i,j,k) * dtcld,
1540 qs_arr(i,j,k) = qs_arr(i,j,k) + psmlt_arr(i,j,k);
1541 qr_arr(i,j,k) = qr_arr(i,j,k) - psmlt_arr(i,j,k);
1542 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * psmlt_arr(i,j,k);
1545 if (qg_arr(i,j,k) >
Real(0.0)) {
1547 rslope2_g_arr(i,j,k) *
1548 std::sqrt(rslope_g_arr(i,j,k) * rslopeb_g_arr(i,j,k));
1551 (
Real(t0c) - t_arr(i,j,k)) *
1555 pgmlt_arr(i,j,k) = amrex::min(
1556 amrex::max(pgmlt_arr(i,j,k) * dtcld,
1559 qg_arr(i,j,k) = qg_arr(i,j,k) + pgmlt_arr(i,j,k);
1560 qr_arr(i,j,k) = qr_arr(i,j,k) - pgmlt_arr(i,j,k);
1561 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pgmlt_arr(i,j,k);
1567 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1568 if (qi_arr(i,j,k) <=
Real(0.0)) {
1569 work1c_arr(i,j,k) =
Real(0.0);
1571 const Real tmp = den_arr(i,j,k) *
1572 amrex::max(qi_arr(i,j,k),
Real(qmin));
1574 amrex::max(
Real(5.38e7) *
1578 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1579 const Real diameter = amrex::max(
1582 work1c_arr(i,j,k) =
Real(1.49e4) *
1583 std::exp(std::log(diameter) *
Real(1.31));
1585 denqci_arr(i,j,k) = den_arr(i,j,k) * qi_arr(i,j,k);
1588 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1589 const int km_local =
khi - klo + 1;
1610 for (
int k = klo; k <=
khi; ++k) {
1611 const int kk = k - klo;
1612 den_col(kk) = den_arr(i,j,k);
1613 denfac_col(kk) = denfac_arr(i,j,k);
1614 t_col(kk) = t_arr(i,j,k);
1615 dz_col(kk) = delz_tmp_arr(i,j,k);
1624 &delqi_col, dtcld, 0,
1625 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1627 for (
int k = klo; k <=
khi; ++k) {
1628 const int kk = k - klo;
1631 qi_arr(i,j,k) = amrex::max(
1635 delqi_arr(i,j,0) = delqi_col / delz_arr(i,j,klo) / dtcld;
1636 fallc_arr(i,j,klo) = delqi_arr(i,j,0);
1640 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1641 const Real fallsum =
1642 fall_r_arr(i,j,klo) + fall_s_arr(i,j,klo) +
1643 fall_g_arr(i,j,klo) + fallc_arr(i,j,klo);
1644 const Real fallsum_qsi = fall_s_arr(i,j,klo) + fallc_arr(i,j,klo);
1645 const Real fallsum_qg = fall_g_arr(i,j,klo);
1646 const Real precip = delz_arr(i,j,klo) / denr * dtcld *
Real(1000.0);
1648 if (fallsum >
Real(0.0)) {
1649 rainncv_arr(i,j,0) += fallsum * precip;
1650 rainacc_arr(i,j,0) += fallsum * precip;
1652 if (fallsum_qsi >
Real(0.0)) {
1653 tstepsnow_arr(i,j,0) += fallsum_qsi * precip;
1654 snowncv_arr(i,j,0) += fallsum_qsi * precip;
1655 snowacc_arr(i,j,0) += fallsum_qsi * precip;
1657 if (fallsum_qg >
Real(0.0)) {
1658 tstepgraup_arr(i,j,0) += fallsum_qg * precip;
1659 graupelncv_arr(i,j,0) += fallsum_qg * precip;
1660 graupacc_arr(i,j,0) += fallsum_qg * precip;
1662 if (fallsum >
Real(0.0)) {
1664 (snowncv_arr(i,j,0) + graupelncv_arr(i,j,0)) /
1665 (rainncv_arr(i,j,0) +
Real(1.0e-12));
1669 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
1676 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1677 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1681 pimlt_arr(i,j,k) =
Real(0.0);
1682 pihmf_arr(i,j,k) =
Real(0.0);
1683 pihtf_arr(i,j,k) =
Real(0.0);
1684 pgfrz_arr(i,j,k) =
Real(0.0);
1686 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
1687 pimlt_arr(i,j,k) = qi_arr(i,j,k);
1688 qc_arr(i,j,k) = qc_arr(i,j,k) + qi_arr(i,j,k);
1689 t_arr(i,j,k) = t_arr(i,j,k) -
xlf / cpm_arr(i,j,k) * qi_arr(i,j,k);
1690 qi_arr(i,j,k) =
Real(0.0);
1693 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
1694 pihmf_arr(i,j,k) = qc_arr(i,j,k);
1695 qi_arr(i,j,k) = qi_arr(i,j,k) + qc_arr(i,j,k);
1696 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * qc_arr(i,j,k);
1697 qc_arr(i,j,k) =
Real(0.0);
1700 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
1701 const Real supcolt = amrex::min(supcol,
Real(50.0));
1702 const Real pfrzdtc = amrex::min(
1706 qc_arr(i,j,k) * qc_arr(i,j,k) * dtcld,
1708 pihtf_arr(i,j,k) = pfrzdtc;
1709 qi_arr(i,j,k) = qi_arr(i,j,k) + pfrzdtc;
1710 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtc;
1711 qc_arr(i,j,k) = qc_arr(i,j,k) - pfrzdtc;
1714 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
1715 Real temp = rslope3_r_arr(i,j,k);
1716 temp = temp * temp * rslope_r_arr(i,j,k);
1717 const Real supcolt = amrex::min(supcol,
Real(50.0));
1718 const Real pfrzdtr = amrex::min(
1720 Real(denr) / den_arr(i,j,k) *
1724 pgfrz_arr(i,j,k) = pfrzdtr;
1725 qg_arr(i,j,k) = qg_arr(i,j,k) + pfrzdtr;
1726 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtr;
1727 qr_arr(i,j,k) = qr_arr(i,j,k) - pfrzdtr;
1735 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1736 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1737 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1738 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1741 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1742 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1744 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1745 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1746 work1_r_arr(i,j,k));
1748 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1751 rslopesmax_loc, rslopesbmax_loc,
1752 rslopes2max_loc, rslopes3max_loc,
1754 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1755 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1756 work1_s_arr(i,j,k), dummy_n0sfac);
1758 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1760 rslopegmax_loc, rslopegbmax_loc,
1761 rslopeg2max_loc, rslopeg3max_loc,
1763 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1764 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1765 work1_g_arr(i,j,k));
1766 n0sfac_arr(i,j,k) = dummy_n0sfac;
1773 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1775 xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
1776 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
1778 Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
1779 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
1781 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1786 const Real dtcld_l = dtcld;
1789 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1790 Real supsat = amrex::max(
qv_arr(i,j,k), qmin_l)
1792 Real satdt = supsat / dtcld_l;
1794 if (qc_arr(i,j,k) >
Real(
qc0)) {
1795 praut_arr(i,j,k) = amrex::min(
1797 qc_arr(i,j,k)/dtcld_l);
1800 if (qr_arr(i,j,k) > qcrmin_l && qc_arr(i,j,k) > qmin_l) {
1801 pracw_arr(i,j,k) = amrex::min(
1803 *rslopeb_r_arr(i,j,k)
1804 *qc_arr(i,j,k)*denfac_arr(i,j,k),
1805 qc_arr(i,j,k)/dtcld_l);
1808 if (qr_arr(i,j,k) >
Real(0.0)) {
1809 Real coeres = rslope2_r_arr(i,j,k)*std::sqrt(
1810 rslope_r_arr(i,j,k)*rslopeb_r_arr(i,j,k));
1811 Real rate = (rhw_arr(i,j,k)-
Real(1.0))
1814 / workdiffw_arr(i,j,k);
1815 if (rate <
Real(0.0)) {
1816 rate = amrex::max(rate, -qr_arr(i,j,k)/dtcld_l);
1817 rate = amrex::max(rate, satdt/
Real(2.0));
1819 rate = amrex::min(rate, satdt/
Real(2.0));
1821 prevp_arr(i,j,k) = rate;
1827 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1828 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1829 n0sfac_arr(i,j,k) = amrex::max(
1836 const Real satdt = supsat / dtcld;
1839 const Real tmp = den_arr(i,j,k)
1840 * amrex::max(qi_arr(i,j,k),
Real(qmin));
1842 xni_arr(i,j,k) = amrex::min(
1843 amrex::max(
Real(5.38e7) * temp,
Real(1.0e3)),
1846 const Real xni = xni_arr(i,j,k);
1847 const Real eacrs = std::exp(
Real(0.07) * (-supcol));
1849 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1850 const Real diameter = amrex::min(
1852 const Real vt2i =
Real(1.49e4) * std::pow(diameter,
Real(1.31));
1854 * denfac_arr(i,j,k);
1856 * denfac_arr(i,j,k);
1858 * denfac_arr(i,j,k);
1860 const Real qsum = amrex::max(qsum_arr(i,j,k),
Real(1.0e-15));
1862 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
1865 if (supcol >
Real(0.0) && qi_arr(i,j,k) >
Real(qmin)) {
1868 Real(2.0) * rslope3_r_arr(i,j,k)
1869 +
Real(2.0) * diameter * rslope2_r_arr(i,j,k)
1870 + diameter * diameter * rslope_r_arr(i,j,k);
1877 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
1878 praci_arr(i,j,k) *= std::pow(
1880 amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_arr(i,j,k)),
1883 praci_arr(i,j,k) = amrex::min(
1884 praci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1889 * rslope3_r_arr(i,j,k) * rslopeb_r_arr(i,j,k)
1890 /
Real(24.0) / den_arr(i,j,k);
1891 piacr_arr(i,j,k) *= std::pow(
1893 amrex::max(
Real(0.0), qi_arr(i,j,k) / qr_arr(i,j,k)),
1896 piacr_arr(i,j,k) = amrex::min(
1897 piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
1902 Real(2.0) * rslope3_s_arr(i,j,k)
1903 +
Real(2.0) * diameter * rslope2_s_arr(i,j,k)
1904 + diameter * diameter * rslope_s_arr(i,j,k);
1909 psaci_arr(i,j,k) =
Real(
pi) * qi_arr(i,j,k) * eacrs
1910 *
Real(
n0s) * n0sfac_arr(i,j,k)
1911 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
1912 psaci_arr(i,j,k) = amrex::min(
1913 psaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1917 const Real egi = std::exp(
Real(0.07) * (-supcol));
1919 Real(2.0) * rslope3_g_arr(i,j,k)
1920 +
Real(2.0) * diameter * rslope2_g_arr(i,j,k)
1921 + diameter * diameter * rslope_g_arr(i,j,k);
1922 pgaci_arr(i,j,k) =
Real(
pi) * egi * qi_arr(i,j,k)
1923 * n0g_loc * std::abs(vt2ave - vt2i) * acrfac
1925 pgaci_arr(i,j,k) = amrex::min(
1926 pgaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1930 if (qs_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1931 psacw_arr(i,j,k) = amrex::min(
1932 Real(
pacrc) * n0sfac_arr(i,j,k) * rslope3_s_arr(i,j,k)
1933 * rslopeb_s_arr(i,j,k)
1936 amrex::max(
Real(0.0), qs_arr(i,j,k) / qc_arr(i,j,k)),
1939 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1940 qc_arr(i,j,k) / dtcld);
1943 if (qg_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1944 pgacw_arr(i,j,k) = amrex::min(
1945 Real(
pacrg) * rslope3_g_arr(i,j,k) * rslopeb_g_arr(i,j,k)
1948 amrex::max(
Real(0.0), qg_arr(i,j,k) / qc_arr(i,j,k)),
1951 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1952 qc_arr(i,j,k) / dtcld);
1956 paacw_arr(i,j,k) = (qs_arr(i,j,k) * psacw_arr(i,j,k)
1957 + qg_arr(i,j,k) * pgacw_arr(i,j,k))
1962 if (supcol >
Real(0.0)) {
1964 Real(5.0) * rslope3_s_arr(i,j,k) * rslope3_s_arr(i,j,k)
1965 * rslope_r_arr(i,j,k)
1966 +
Real(2.0) * rslope3_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1967 * rslope2_r_arr(i,j,k)
1968 +
Real(0.5) * rslope2_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1969 * rslope3_r_arr(i,j,k);
1975 *
Real(
n0s) * n0sfac_arr(i,j,k)
1976 * std::abs(vt2r - vt2ave) * (
Real(
dens_snow) / den_arr(i,j,k))
1978 pracs_arr(i,j,k) *= std::pow(
1980 amrex::max(
Real(0.0), qr_arr(i,j,k) / qs_arr(i,j,k)),
1983 pracs_arr(i,j,k) = amrex::min(
1984 pracs_arr(i,j,k), qs_arr(i,j,k) / dtcld);
1989 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
1990 * rslope_s_arr(i,j,k)
1991 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
1992 * rslope2_s_arr(i,j,k)
1993 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
1994 * rslope3_s_arr(i,j,k);
1996 *
Real(
n0s) * n0sfac_arr(i,j,k)
1997 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
1999 psacr_arr(i,j,k) *= std::pow(
2001 amrex::max(
Real(0.0), qs_arr(i,j,k) / qr_arr(i,j,k)),
2004 psacr_arr(i,j,k) = amrex::min(
2005 psacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2010 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
2011 * rslope_g_arr(i,j,k)
2012 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2013 * rslope2_g_arr(i,j,k)
2014 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2015 * rslope3_g_arr(i,j,k);
2017 * n0g_loc * std::abs(vt2ave - vt2r)
2018 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2019 pgacr_arr(i,j,k) *= std::pow(
2021 amrex::max(
Real(0.0), qg_arr(i,j,k) / qr_arr(i,j,k)),
2024 pgacr_arr(i,j,k) = amrex::min(
2025 pgacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2030 pgacs_arr(i,j,k) =
Real(0.0);
2033 if (supcol <=
Real(0.0)) {
2035 if (qs_arr(i,j,k) >
Real(0.0)) {
2040 pseml_arr(i,j,k) = amrex::min(
2043 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2044 -qs_arr(i,j,k) / dtcld),
2047 if (qg_arr(i,j,k) >
Real(0.0)) {
2048 pgeml_arr(i,j,k) = amrex::min(
2051 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2052 -qg_arr(i,j,k) / dtcld),
2057 if (supcol >
Real(0.0)) {
2058 if (qi_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2063 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2064 * (rhi_arr(i,j,k) -
Real(1.0))
2065 / workdiffi_arr(i,j,k);
2066 Real supice = satdt - prevp_arr(i,j,k);
2067 if (pidep_arr(i,j,k) <
Real(0.0)) {
2068 pidep_arr(i,j,k) = amrex::max(
2069 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2071 pidep_arr(i,j,k) = amrex::max(
2072 pidep_arr(i,j,k), -qi_arr(i,j,k) / dtcld);
2074 pidep_arr(i,j,k) = amrex::min(
2075 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2078 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2079 >= std::abs(satdt)) {
2084 if (qs_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2085 const Real coeres = rslope2_s_arr(i,j,k)
2086 * std::sqrt(rslope_s_arr(i,j,k)
2087 * rslopeb_s_arr(i,j,k));
2088 psdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2092 / workdiffi_arr(i,j,k);
2093 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2094 if (psdep_arr(i,j,k) <
Real(0.0)) {
2095 psdep_arr(i,j,k) = amrex::max(
2096 psdep_arr(i,j,k), -qs_arr(i,j,k) / dtcld);
2097 psdep_arr(i,j,k) = amrex::max(
2098 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2101 psdep_arr(i,j,k) = amrex::min(
2102 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2105 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2107 >= std::abs(satdt)) {
2112 if (qg_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2113 const Real coeres = rslope2_g_arr(i,j,k)
2114 * std::sqrt(rslope_g_arr(i,j,k)
2115 * rslopeb_g_arr(i,j,k));
2116 pgdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2119 / workdiffi_arr(i,j,k);
2120 Real supice = satdt - prevp_arr(i,j,k)
2121 - pidep_arr(i,j,k) - psdep_arr(i,j,k);
2122 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2123 pgdep_arr(i,j,k) = amrex::max(
2124 pgdep_arr(i,j,k), -qg_arr(i,j,k) / dtcld);
2125 pgdep_arr(i,j,k) = amrex::max(
2126 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2129 pgdep_arr(i,j,k) = amrex::min(
2130 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2133 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2134 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2135 >= std::abs(satdt)) {
2140 if (supsat >
Real(0.0) && ifsat != 1) {
2141 const Real supice = satdt - prevp_arr(i,j,k)
2145 const Real xni0 =
Real(1.0e3) * std::exp(
Real(0.1) * supcol);
2146 const Real roqi0 =
Real(4.92e-11) * std::pow(xni0,
Real(1.33));
2147 pigen_arr(i,j,k) = amrex::max(
2149 (roqi0 / den_arr(i,j,k)
2150 - amrex::max(qi_arr(i,j,k),
Real(0.0))) / dtcld);
2151 pigen_arr(i,j,k) = amrex::min(
2152 amrex::min(pigen_arr(i,j,k), satdt), supice);
2155 if (qi_arr(i,j,k) >
Real(0.0)) {
2161 psaut_arr(i,j,k) = amrex::max(
2162 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2165 if (qs_arr(i,j,k) >
Real(0.0)) {
2167 * std::exp(
Real(0.09) * (-supcol));
2168 pgaut_arr(i,j,k) = amrex::min(
2171 qs_arr(i,j,k) / dtcld);
2175 if (supcol <
Real(0.0)) {
2176 if (qs_arr(i,j,k) >
Real(0.0)
2177 && rhw_arr(i,j,k) <
Real(1.0)) {
2178 const Real coeres = rslope2_s_arr(i,j,k)
2179 * std::sqrt(rslope_s_arr(i,j,k)
2180 * rslopeb_s_arr(i,j,k));
2185 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2189 / workdiffw_arr(i,j,k);
2190 psevp_arr(i,j,k) = amrex::min(
2191 amrex::max(psevp_arr(i,j,k),
2192 -qs_arr(i,j,k) / dtcld),
2196 if (qg_arr(i,j,k) >
Real(0.0)
2197 && rhw_arr(i,j,k) <
Real(1.0)) {
2198 const Real coeres = rslope2_g_arr(i,j,k)
2199 * std::sqrt(rslope_g_arr(i,j,k)
2200 * rslopeb_g_arr(i,j,k));
2201 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2204 / workdiffw_arr(i,j,k);
2205 pgevp_arr(i,j,k) = amrex::min(
2206 amrex::max(pgevp_arr(i,j,k),
2207 -qg_arr(i,j,k) / dtcld),
2217 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2223 (qr_arr(i,j,k) <
Real(1.0e-4) && qs_arr(i,j,k) <
Real(1.0e-4))
2226 (qr_arr(i,j,k) <
Real(1.0e-4)) ?
Real(1.0) :
Real(0.0);
2228 if (t_arr(i,j,k) <= t0c_l) {
2231 value = amrex::max(qmin_l, qc_arr(i,j,k));
2232 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2233 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2235 if (source >
value) {
2236 factor =
value / source;
2237 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2238 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2239 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2242 value = amrex::max(qmin_l, qi_arr(i,j,k));
2243 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2244 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2245 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2246 if (source >
value) {
2247 factor =
value / source;
2248 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2249 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2250 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2251 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2252 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2253 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2256 value = amrex::max(qmin_l, qr_arr(i,j,k));
2257 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2258 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2259 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2260 if (source >
value) {
2261 factor =
value / source;
2262 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2263 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2264 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2265 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2266 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2267 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2270 value = amrex::max(qmin_l, qs_arr(i,j,k));
2271 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2272 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2273 + piacr_arr(i,j,k) * delta3
2274 + praci_arr(i,j,k) * delta3
2275 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2276 + psacr_arr(i,j,k) * delta2
2277 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2278 if (source >
value) {
2279 factor =
value / source;
2280 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2281 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2282 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2283 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2284 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2285 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2286 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2287 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2288 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2289 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2292 value = amrex::max(qmin_l, qg_arr(i,j,k));
2293 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2294 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2295 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2296 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2297 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2298 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2299 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2300 if (source >
value) {
2301 factor =
value / source;
2302 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2303 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2304 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2305 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2306 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2307 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2308 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2309 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2310 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2311 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2314 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2315 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2316 + pidep_arr(i,j,k));
2317 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2319 qc_arr(i,j,k) = amrex::max(
2320 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2321 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2324 qr_arr(i,j,k) = amrex::max(
2325 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2326 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2327 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2330 qi_arr(i,j,k) = amrex::max(
2331 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2332 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2333 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2336 qs_arr(i,j,k) = amrex::max(
2337 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2338 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2339 + piacr_arr(i,j,k) * delta3
2340 + praci_arr(i,j,k) * delta3
2341 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2342 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2343 + psacr_arr(i,j,k) * delta2) * dtcld,
2345 qg_arr(i,j,k) = amrex::max(
2346 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2347 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2348 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2349 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2350 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2351 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2352 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2356 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2357 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2358 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2359 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2360 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2361 + psacr_arr(i,j,k));
2362 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2366 value = amrex::max(qmin_l, qc_arr(i,j,k));
2367 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2368 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2370 if (source >
value) {
2371 factor =
value / source;
2372 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2373 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2374 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2377 value = amrex::max(qmin_l, qr_arr(i,j,k));
2378 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2379 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2380 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2381 - prevp_arr(i,j,k)) * dtcld;
2382 if (source >
value) {
2383 factor =
value / source;
2384 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2385 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2386 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2387 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2388 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2389 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2392 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2393 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2394 - psevp_arr(i,j,k)) * dtcld;
2395 if (source >
value) {
2396 factor =
value / source;
2397 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2398 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2399 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2402 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2403 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2404 + pgeml_arr(i,j,k)) * dtcld;
2405 if (source >
value) {
2406 factor =
value / source;
2407 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2408 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2409 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2412 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
2413 + pgevp_arr(i,j,k));
2414 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2416 qc_arr(i,j,k) = amrex::max(
2417 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2418 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2421 qr_arr(i,j,k) = amrex::max(
2422 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2423 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
2424 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
2425 - pgeml_arr(i,j,k)) * dtcld,
2427 qs_arr(i,j,k) = amrex::max(
2428 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
2429 + pseml_arr(i,j,k)) * dtcld,
2431 qg_arr(i,j,k) = amrex::max(
2432 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2433 + pgeml_arr(i,j,k)) * dtcld,
2436 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
2439 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
2440 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2448 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2454 Real tr = ttp / t_arr(i,j,k);
2456 * std::exp(xb * (
Real(1.0) - tr));
2457 qsw = amrex::min(qsw,
Real(0.99) * p_arr(i,j,k));
2458 qsatw_arr(i,j,k) =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
2459 qsatw_arr(i,j,k) = amrex::max(qsatw_arr(i,j,k),
Real(qmin));
2467 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2469 t_arr(i,j,k),
qv_arr(i,j,k), qsatw_arr(i,j,k),
2470 xl_arr(i,j,k), cpm_arr(i,j,k),
Real(qmin),
Real(rv));
2471 const Real work2loc = qc_arr(i,j,k) + workcond;
2472 static_cast<void>(work2loc);
2473 pcond_arr(i,j,k) = amrex::min(
2474 amrex::max(workcond / dtcld,
Real(0.0)),
2475 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
2476 if (qc_arr(i,j,k) >
Real(0.0) && workcond <
Real(0.0)) {
2477 pcond_arr(i,j,k) = amrex::max(workcond, -qc_arr(i,j,k)) / dtcld;
2479 qv_arr(i,j,k) =
qv_arr(i,j,k) - pcond_arr(i,j,k) * dtcld;
2480 qc_arr(i,j,k) = amrex::max(
2481 qc_arr(i,j,k) + pcond_arr(i,j,k) * dtcld,
2483 t_arr(i,j,k) = t_arr(i,j,k)
2484 + pcond_arr(i,j,k) * xl_arr(i,j,k)
2485 / cpm_arr(i,j,k) * dtcld;
2493 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2494 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
2495 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
2499 #ifdef ERF_USE_WSM6_FORT
2502 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
2503 rain_arr(i,j,klo) = rainacc_arr(i,j,0);
2504 snow_arr(i,j,klo) = snowacc_arr(i,j,0);
2505 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:43
constexpr amrex::Real lat_vap
Definition: ERF_Constants.H:117
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:44
constexpr amrex::Real lsub
Definition: ERF_Constants.H:100
constexpr amrex::Real rhoh2o
Definition: ERF_Constants.H:126
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real lat_ice
Definition: ERF_Constants.H:118
constexpr amrex::Real rhos
Definition: ERF_Constants.H:61
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:53
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:46
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:45
constexpr amrex::Real R_d
Definition: ERF_Constants.H:42
amrex::Real value
Definition: ERF_HurricaneDiagnostics.H:20
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:17
ParallelFor(grown_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:151
amrex::MultiFab * m_z_phys_nd
Definition: ERF_WSM6.H:133
amrex::Real m_rslopesbmax
Definition: ERF_WSM6.H:160
static constexpr amrex::Real avtr
Definition: ERF_WSM6.H:53
static constexpr amrex::Real dicon
Definition: ERF_WSM6.H:63
amrex::Real m_rslopes2max
Definition: ERF_WSM6.H:161
amrex::Real m_rsloper2max
Definition: ERF_WSM6.H:161
static constexpr amrex::Real qcrmin
Definition: ERF_WSM6.H:67
amrex::Real m_rslopermax
Definition: ERF_WSM6.H:159
amrex::Real m_pacrc
Definition: ERF_WSM6.H:155
static constexpr amrex::Real pfrz1
Definition: ERF_WSM6.H:65
amrex::Real m_rsloperbmax
Definition: ERF_WSM6.H:160
amrex::Real m_pi_wsm6
Definition: ERF_WSM6.H:146
static constexpr amrex::Real n0smax
Definition: ERF_WSM6.H:71
bool m_do_cond
Definition: ERF_WSM6.H:131
amrex::Real m_pidn0s
Definition: ERF_WSM6.H:155
static constexpr amrex::Real dimax
Definition: ERF_WSM6.H:64
static constexpr amrex::Real pfrz2
Definition: ERF_WSM6.H:66
static constexpr amrex::Real alpha_wsm6
Definition: ERF_WSM6.H:73
amrex::Real m_pvtg
Definition: ERF_WSM6.H:158
amrex::Real m_qck1
Definition: ERF_WSM6.H:147
amrex::Real m_precg2
Definition: ERF_WSM6.H:158
amrex::Real m_precg1
Definition: ERF_WSM6.H:158
amrex::Real m_rsloper3max
Definition: ERF_WSM6.H:162
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:72
amrex::Real m_precr2
Definition: ERF_WSM6.H:151
static constexpr amrex::Real n0r
Definition: ERF_WSM6.H:52
amrex::Real m_n0g
Definition: ERF_WSM6.H:141
amrex::Real m_pidn0g
Definition: ERF_WSM6.H:158
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:69
static constexpr amrex::Real dtcldcr
Definition: ERF_WSM6.H:51
amrex::Real m_rslopegmax
Definition: ERF_WSM6.H:159
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:60
amrex::Real m_g6pbr
Definition: ERF_WSM6.H:149
amrex::Real m_pacrg
Definition: ERF_WSM6.H:158
amrex::Real m_precs2
Definition: ERF_WSM6.H:154
amrex::Real m_rslopeg3max
Definition: ERF_WSM6.H:162
amrex::Real m_pvts
Definition: ERF_WSM6.H:154
amrex::Real m_rslopegbmax
Definition: ERF_WSM6.H:160
static constexpr amrex::Real qs0
Definition: ERF_WSM6.H:70
amrex::Geometry m_geom
Definition: ERF_WSM6.H:126
amrex::Real m_precs1
Definition: ERF_WSM6.H:154
amrex::Real dt
Definition: ERF_WSM6.H:127
static constexpr amrex::Real xncr
Definition: ERF_WSM6.H:57
static constexpr amrex::Real bvtr
Definition: ERF_WSM6.H:54
amrex::Real m_rslopesmax
Definition: ERF_WSM6.H:159
amrex::Real m_qc0
Definition: ERF_WSM6.H:147
amrex::Array< FabPtr, MicVar_WSM6::NumVars > mic_fab_vars
Definition: ERF_WSM6.H:136
amrex::Real m_bvtg
Definition: ERF_WSM6.H:141
amrex::Real m_pvtr
Definition: ERF_WSM6.H:150
amrex::Real m_pacrr
Definition: ERF_WSM6.H:150
amrex::Real m_precr1
Definition: ERF_WSM6.H:151
amrex::Real m_pidn0r
Definition: ERF_WSM6.H:155
amrex::Real m_rslopes3max
Definition: ERF_WSM6.H:162
amrex::Real m_xlv1
Definition: ERF_WSM6.H:146
amrex::Real m_rslopeg2max
Definition: ERF_WSM6.H:161
@ xlf
Definition: ERF_AdvanceMorrison.cpp:157
@ qr
Definition: ERF_WSM6.H:27
@ qi
Definition: ERF_WSM6.H:26
@ qs
Definition: ERF_WSM6.H:28
@ qv
Definition: ERF_WSM6.H:24
@ qc
Definition: ERF_WSM6.H:25
@ rain_accum
Definition: ERF_WSM6.H:30
@ snow_accum
Definition: ERF_WSM6.H:31
@ rho
Definition: ERF_WSM6.H:20
@ graup_accum
Definition: ERF_WSM6.H:32
@ qg
Definition: ERF_WSM6.H:29
@ pres
Definition: ERF_WSM6.H:23
@ tabs
Definition: ERF_WSM6.H:22
@ qsum
Definition: ERF_WSM6.H:219
@ xni
Definition: ERF_WSM6.H:224
@ 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