849 int microphysics_debug = 0;
850 std::string micro_diag_mode =
"canonical";
851 std::vector<std::string> micro_diag_tags = {
"standing"};
852 std::vector<std::string> micro_diag_expr = {
"standing"};
853 std::vector<std::string> micro_diag_store = {
"standing"};
854 std::vector<int> micro_diag_target_column;
856 amrex::ParmParse
pp(
"erf");
857 pp.queryAdd(
"microphysics_debug", microphysics_debug);
858 pp.queryAdd(
"micro_diag_mode", micro_diag_mode);
859 pp.queryarr(
"micro_diag_tags", micro_diag_tags);
860 pp.queryarr(
"micro_diag_expr", micro_diag_expr);
861 pp.queryarr(
"micro_diag_store", micro_diag_store);
862 pp.queryarr(
"micro_diag_target_column", micro_diag_target_column);
864 microphysics_debug = std::max(0, std::min(2, microphysics_debug));
865 #ifdef ERF_USE_WSM6_FORT
866 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; }();
867 const bool micro_diag_forensic = (micro_diag_mode_lower ==
"forensic" || micro_diag_mode_lower ==
"both");
868 const int microphysics_debug_bridge = micro_diag_forensic
870 : std::min(microphysics_debug, 1);
871 bool use_wsm6_cpp_answer =
false;
872 { amrex::ParmParse
pp(
"erf");
873 pp.queryAdd(
"use_wsm6_cpp_answer", use_wsm6_cpp_answer); }
874 bool run_wsm6_fort = !use_wsm6_cpp_answer;
876 static bool wsm6_inited =
false;
880 constexpr
double den0 = 1.28;
881 constexpr
double denr =
static_cast<double>(
rhoh2o);
882 constexpr
double dens =
static_cast<double>(
rhos);
883 constexpr
double cl =
static_cast<double>(
Cp_l);
884 constexpr
double cpv =
static_cast<double>(
Cp_v);
885 constexpr
int hail_opt = 0;
891 constexpr
double g =
static_cast<double>(
CONST_GRAV);
892 constexpr
double cpd =
static_cast<double>(
Cp_d);
893 constexpr
double cpv =
static_cast<double>(
Cp_v);
894 constexpr
double rd =
static_cast<double>(
R_d);
895 constexpr
double rv =
static_cast<double>(
R_v);
896 constexpr
double t0c = 273.15;
897 constexpr
double ep1 =
static_cast<double>(
R_v /
R_d -
one);
898 amrex::ignore_unused(
g, rd, ep1);
899 constexpr
double ep2 =
static_cast<double>(
R_d /
R_v);
900 constexpr
double qmin = 1.0e-12;
901 constexpr
double xls =
static_cast<double>(
lsub);
902 constexpr
double xlv0 =
static_cast<double>(
lat_vap);
903 constexpr
double xlf0 =
static_cast<double>(
lat_ice);
904 constexpr
double den0 = 1.28;
905 constexpr
double denr =
static_cast<double>(
rhoh2o);
906 constexpr
double cliq =
static_cast<double>(
Cp_l);
907 constexpr
double cice = 2106.0;
908 constexpr
double psat = 610.78;
910 const Box box = mfi.tilebox();
911 const Box fab_box = mfi.fabbox();
926 const int ilo = box.smallEnd(0);
927 const int ihi = box.bigEnd(0);
928 const int jlo = box.smallEnd(1);
929 const int jhi = box.bigEnd(1);
930 const int klo = box.smallEnd(2);
931 const int khi = box.bigEnd(2);
932 const bool has_target_override = (micro_diag_target_column.size() == 2);
933 const int diag_i = has_target_override ? micro_diag_target_column[0] : ilo;
934 const int diag_j = has_target_override ? micro_diag_target_column[1] : jlo;
936 const int imlo = fab_box.smallEnd(0);
937 const int imhi = fab_box.bigEnd(0);
938 const int jmlo = fab_box.smallEnd(1);
939 const int jmhi = fab_box.bigEnd(1);
940 const int kmlo = fab_box.smallEnd(2);
941 const int kmhi = fab_box.bigEnd(2);
942 amrex::ignore_unused(ihi, jhi, diag_i, diag_j, imlo, imhi, jmlo, jmhi, kmlo, kmhi);
944 #if defined(ERF_USE_WSM6_FORT) && defined(AMREX_USE_GPU)
945 Arena*
Arena_Used = (run_wsm6_fort) ? The_Pinned_Arena() : The_Async_Arena();
952 auto const& delz_arr = delz_fab.array();
953 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
954 delz_arr(i,j,k) = dz_val;
958 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
959 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
960 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
961 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
962 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
966 box2d.makeSlab(2, 0);
967 Box fab_box2d(fab_box);
968 fab_box2d.makeSlab(2, 0);
973 FArrayBox rainncv_fab(fab_box2d, 1,
Arena_Used);
975 FArrayBox snowncv_fab(fab_box2d, 1,
Arena_Used);
976 FArrayBox graupelncv_fab(fab_box2d, 1,
Arena_Used);
977 FArrayBox rainacc_fab(fab_box2d, 1,
Arena_Used);
978 FArrayBox snowacc_fab(fab_box2d, 1,
Arena_Used);
979 FArrayBox graupacc_fab(fab_box2d, 1,
Arena_Used);
981 auto const& rainncv_arr = rainncv_fab.array();
982 auto const& sr_arr = sr_fab.array();
983 auto const& snowncv_arr = snowncv_fab.array();
984 auto const& graupelncv_arr = graupelncv_fab.array();
985 auto const& rainacc_arr = rainacc_fab.array();
986 auto const& snowacc_arr = snowacc_fab.array();
987 auto const& graupacc_arr = graupacc_fab.array();
988 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
989 rainncv_arr(i,j,k) =
Real(0.0);
990 sr_arr(i,j,k) =
Real(0.0);
991 snowncv_arr(i,j,k) =
Real(0.0);
992 graupelncv_arr(i,j,k) =
Real(0.0);
993 rainacc_arr(i,j,k) =
Real(0.0);
994 snowacc_arr(i,j,k) =
Real(0.0);
995 graupacc_arr(i,j,k) =
Real(0.0);
997 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
998 rainacc_arr(i,j,0) = rain_arr(i,j,
klo);
999 snowacc_arr(i,j,0) = snow_arr(i,j,
klo);
1000 graupacc_arr(i,j,0) = graup_arr(i,j,
klo);
1001 rainncv_arr(i,j,0) =
Real(0.0);
1002 sr_arr(i,j,0) =
Real(0.0);
1003 snowncv_arr(i,j,0) =
Real(0.0);
1004 graupelncv_arr(i,j,0) =
Real(0.0);
1007 #ifdef ERF_USE_WSM6_FORT
1008 if (run_wsm6_fort) {
1011 Gpu::streamSynchronize();
1014 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
1015 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
1016 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
1017 static_cast<double>(
dt),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
1019 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
1020 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
1021 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
1022 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
1023 ilo, ihi, jlo, jhi,
klo,
khi, microphysics_debug_bridge, diag_i, diag_j);
1034 FArrayBox tstepsnow_fab(box2d,1,
Arena_Used);
1035 FArrayBox tstepgraup_fab(box2d,1,
Arena_Used);
1036 auto const& delqrs1_arr = delqrs1_fab.array();
1037 auto const& delqrs2_arr = delqrs2_fab.array();
1038 auto const& delqrs3_arr = delqrs3_fab.array();
1039 auto const& delqi_arr = delqi_fab.array();
1040 auto const& tstepsnow_arr = tstepsnow_fab.array();
1041 auto const& tstepgraup_arr = tstepgraup_fab.array();
1043 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1044 delqrs1_arr(i,j,k) =
Real(0.0);
1045 delqrs2_arr(i,j,k) =
Real(0.0);
1046 delqrs3_arr(i,j,k) =
Real(0.0);
1047 delqi_arr(i,j,k) =
Real(0.0);
1048 tstepsnow_arr(i,j,k) =
Real(0.0);
1049 tstepgraup_arr(i,j,k) =
Real(0.0);
1058 FArrayBox qrs_tmp_r_fab(fab_box,1,
Arena_Used); FArrayBox qrs_tmp_s_fab(fab_box,1,
Arena_Used);
1059 FArrayBox qrs_tmp_g_fab(fab_box,1,
Arena_Used);
1061 FArrayBox rslope_g_fab(fab_box,1,
Arena_Used);
1062 FArrayBox rslope2_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope2_s_fab(fab_box,1,
Arena_Used);
1063 FArrayBox rslope2_g_fab(fab_box,1,
Arena_Used);
1064 FArrayBox rslope3_r_fab(fab_box,1,
Arena_Used); FArrayBox rslope3_s_fab(fab_box,1,
Arena_Used);
1065 FArrayBox rslope3_g_fab(fab_box,1,
Arena_Used);
1066 FArrayBox rslopeb_r_fab(fab_box,1,
Arena_Used); FArrayBox rslopeb_s_fab(fab_box,1,
Arena_Used);
1067 FArrayBox rslopeb_g_fab(fab_box,1,
Arena_Used);
1069 FArrayBox work1_g_fab(fab_box,1,
Arena_Used);
1071 FArrayBox workdiffi_fab(fab_box,1,
Arena_Used);
1079 FArrayBox nislfv_r_diag_fab(fab_box,6,
Arena_Used);
1080 FArrayBox nislfv_sg_diag_fab(fab_box,6,
Arena_Used);
1082 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1102 auto const& denfac_arr = denfac_fab.array();
1103 auto const& xni_arr = xni_fab.array();
1104 auto const& cpm_arr = cpm_fab.array();
1105 auto const& xl_arr = xl_fab.array();
1106 auto const& qsatw_arr = qsatw_fab.array();
1107 auto const& qsati_arr = qsati_fab.array();
1108 auto const& rhw_arr = rhw_fab.array();
1109 auto const& rhi_arr = rhi_fab.array();
1110 auto const& den_tmp_arr = den_tmp_fab.array();
1111 auto const& delz_tmp_arr = delz_tmp_fab.array();
1112 auto const& n0sfac_arr = n0sfac_fab.array();
1113 auto const& qrs_tmp_r_arr = qrs_tmp_r_fab.array();
1114 auto const& qrs_tmp_s_arr = qrs_tmp_s_fab.array();
1115 auto const& qrs_tmp_g_arr = qrs_tmp_g_fab.array();
1116 auto const& rslope_r_arr = rslope_r_fab.array();
1117 auto const& rslope_s_arr = rslope_s_fab.array();
1118 auto const& rslope_g_arr = rslope_g_fab.array();
1119 auto const& rslope2_r_arr = rslope2_r_fab.array();
1120 auto const& rslope2_s_arr = rslope2_s_fab.array();
1121 auto const& rslope2_g_arr = rslope2_g_fab.array();
1122 auto const& rslope3_r_arr = rslope3_r_fab.array();
1123 auto const& rslope3_s_arr = rslope3_s_fab.array();
1124 auto const& rslope3_g_arr = rslope3_g_fab.array();
1125 auto const& rslopeb_r_arr = rslopeb_r_fab.array();
1126 auto const& rslopeb_s_arr = rslopeb_s_fab.array();
1127 auto const& rslopeb_g_arr = rslopeb_g_fab.array();
1128 auto const& work1_r_arr = work1_r_fab.array();
1129 auto const& work1_s_arr = work1_s_fab.array();
1130 auto const& work1_g_arr = work1_g_fab.array();
1131 auto const& work2_arr = work2_fab.array();
1132 auto const& workdiffw_arr = workdiffw_fab.array();
1133 auto const& workdiffi_arr = workdiffi_fab.array();
1134 auto const& workr_arr = workr_fab.array();
1135 auto const& worka_arr = worka_fab.array();
1136 auto const& work1c_arr = work1c_fab.array();
1137 auto const& denqrs1_arr = denqrs1_fab.array();
1138 auto const& denqrs2_arr = denqrs2_fab.array();
1139 auto const& denqrs3_arr = denqrs3_fab.array();
1140 auto const& denqci_arr = denqci_fab.array();
1141 auto const& fall_r_arr = fall_r_fab.array();
1142 auto const& fall_s_arr = fall_s_fab.array();
1143 auto const& fall_g_arr = fall_g_fab.array();
1144 auto const& fallc_arr = fallc_fab.array();
1145 auto const& qsum_arr = qsum_fab.array();
1146 auto const& nislfv_r_diag_arr = nislfv_r_diag_fab.array();
1147 auto const& nislfv_sg_diag_arr = nislfv_sg_diag_fab.array();
1148 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1149 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1151 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1152 work1c_arr(i,j,k) =
Real(0.0);
1154 ParallelFor(fab_box, nislfv_r_diag_fab.nComp(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
1155 nislfv_r_diag_arr(i,j,k,n) =
Real(0.0);
1156 nislfv_sg_diag_arr(i,j,k,n) =
Real(0.0);
1158 auto const& praut_arr = praut_fab.array();
1159 auto const& pracw_arr = pracw_fab.array();
1160 auto const& prevp_arr = prevp_fab.array();
1161 auto const& psdep_arr = psdep_fab.array();
1162 auto const& pgdep_arr = pgdep_fab.array();
1163 auto const& psaut_arr = psaut_fab.array();
1164 auto const& pgaut_arr = pgaut_fab.array();
1165 auto const& praci_arr = praci_fab.array();
1166 auto const& piacr_arr = piacr_fab.array();
1167 auto const& psaci_arr = psaci_fab.array();
1168 auto const& psacw_arr = psacw_fab.array();
1169 auto const& pgacw_arr = pgacw_fab.array();
1170 auto const& pgaci_arr = pgaci_fab.array();
1171 auto const& paacw_arr = paacw_fab.array();
1172 auto const& pracs_arr = pracs_fab.array();
1173 auto const& psacr_arr = psacr_fab.array();
1174 auto const& pgacr_arr = pgacr_fab.array();
1175 auto const& pgacs_arr = pgacs_fab.array();
1176 auto const& pigen_arr = pigen_fab.array();
1177 auto const& pidep_arr = pidep_fab.array();
1178 auto const& pcond_arr = pcond_fab.array();
1179 auto const& psmlt_arr = psmlt_fab.array();
1180 auto const& pgmlt_arr = pgmlt_fab.array();
1181 auto const& pseml_arr = pseml_fab.array();
1182 auto const& pgeml_arr = pgeml_fab.array();
1183 auto const& psevp_arr = psevp_fab.array();
1184 auto const& pgevp_arr = pgevp_fab.array();
1185 auto const& pimlt_arr = pimlt_fab.array();
1186 auto const& pihmf_arr = pihmf_fab.array();
1187 auto const& pihtf_arr = pihtf_fab.array();
1188 auto const& pgfrz_arr = pgfrz_fab.array();
1192 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1193 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1194 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1195 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1196 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1197 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1198 den_tmp_arr(i,j,k) = den_arr(i,j,k);
1199 delz_tmp_arr(i,j,k) = delz_arr(i,j,k);
1204 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1210 const int wsm6_loops = std::max(
1211 static_cast<int>(std::round(
dt /
dtcldcr)), 1);
1212 const Real dtcld =
dt /
static_cast<Real>(wsm6_loops);
1230 for (
int loop = 0; loop < wsm6_loops; ++loop) {
1232 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1233 const Real invden =
Real(1.0) / den_arr(i,j,k);
1234 denfac_arr(i,j,k) = std::sqrt(invden *
Real(den0));
1243 const Real xai = -dldti /
Real(rv);
1245 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1246 const Real tr = ttp / t_arr(i,j,k);
1247 Real qsw =
Real(
psat)*std::exp(std::log(tr)*xa)*std::exp(xb*(
Real(1.0)-tr));
1248 qsw = amrex::min(qsw,
Real(0.99)*p_arr(i,j,k));
1249 qsw =
Real(ep2)*qsw / (p_arr(i,j,k) - qsw);
1250 qsw = amrex::max(qsw,
Real(qmin));
1251 qsatw_arr(i,j,k) = qsw;
1252 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsw,
Real(qmin));
1253 Real qsi = (t_arr(i,j,k) < ttp)
1254 ?
Real(
psat)*std::exp(std::log(tr)*xai)*std::exp(xbi*(
Real(1.0)-tr))
1255 :
Real(
psat)*std::exp(std::log(tr)*xa )*std::exp(xb *(
Real(1.0)-tr));
1256 qsi = amrex::min(qsi,
Real(0.99)*p_arr(i,j,k));
1257 qsi =
Real(ep2)*qsi / (p_arr(i,j,k) - qsi);
1258 qsi = amrex::max(qsi,
Real(qmin));
1259 qsati_arr(i,j,k) = qsi;
1260 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsi,
Real(qmin));
1268 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1269 prevp_arr(i,j,k) =
Real(0.0); psdep_arr(i,j,k) =
Real(0.0);
1270 pgdep_arr(i,j,k) =
Real(0.0); praut_arr(i,j,k) =
Real(0.0);
1271 psaut_arr(i,j,k) =
Real(0.0); pgaut_arr(i,j,k) =
Real(0.0);
1272 pracw_arr(i,j,k) =
Real(0.0); praci_arr(i,j,k) =
Real(0.0);
1273 piacr_arr(i,j,k) =
Real(0.0); psaci_arr(i,j,k) =
Real(0.0);
1274 psacw_arr(i,j,k) =
Real(0.0); pracs_arr(i,j,k) =
Real(0.0);
1275 psacr_arr(i,j,k) =
Real(0.0); pgacw_arr(i,j,k) =
Real(0.0);
1276 paacw_arr(i,j,k) =
Real(0.0); pgaci_arr(i,j,k) =
Real(0.0);
1277 pgacr_arr(i,j,k) =
Real(0.0); pgacs_arr(i,j,k) =
Real(0.0);
1278 pigen_arr(i,j,k) =
Real(0.0); pidep_arr(i,j,k) =
Real(0.0);
1279 pcond_arr(i,j,k) =
Real(0.0); psmlt_arr(i,j,k) =
Real(0.0);
1280 pgmlt_arr(i,j,k) =
Real(0.0); pseml_arr(i,j,k) =
Real(0.0);
1281 pgeml_arr(i,j,k) =
Real(0.0); psevp_arr(i,j,k) =
Real(0.0);
1282 pgevp_arr(i,j,k) =
Real(0.0);
1283 fall_r_arr(i,j,k) =
Real(0.0); fall_s_arr(i,j,k) =
Real(0.0);
1284 fall_g_arr(i,j,k) =
Real(0.0); fallc_arr(i,j,k) =
Real(0.0);
1292 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1293 const Real tmp = den_arr(i,j,k)*amrex::max(qi_arr(i,j,k),
Real(qmin));
1294 xni_arr(i,j,k) = amrex::min(
1323 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1324 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1325 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1326 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1329 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1330 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1332 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1333 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1334 work1_r_arr(i,j,k));
1336 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1339 rslopesmax_loc, rslopesbmax_loc,
1340 rslopes2max_loc, rslopes3max_loc,
1342 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1343 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1344 work1_s_arr(i,j,k), dummy_n0sfac);
1346 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1348 rslopegmax_loc, rslopegbmax_loc,
1349 rslopeg2max_loc, rslopeg3max_loc,
1351 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1352 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1353 work1_g_arr(i,j,k));
1354 n0sfac_arr(i,j,k) = dummy_n0sfac;
1357 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1358 const int km_local =
khi -
klo + 1;
1360 constexpr
Real qsum_min =
Real(1.0e-15);
1396 for (
int k =
klo; k <=
khi; ++k) {
1397 const int kk = k -
klo;
1398 den_col(kk) = den_arr(i,j,k);
1399 denfac_col(kk) = denfac_arr(i,j,k);
1400 t_col(kk) = t_arr(i,j,k);
1401 dz_col(kk) = delz_tmp_arr(i,j,k);
1403 qsum_col(kk) = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k), qsum_min);
1405 worka_col(kk) = (work1_s_arr(i,j,k) * qs_arr(i,j,k)
1406 + work1_g_arr(i,j,k) * qg_arr(i,j,k))
1414 if (qr_arr(i,j,k) <=
Real(0.0)) {
1424 &delqrs1_col, dtcld, 1,
1425 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1427 for (
int k =
klo; k <=
khi; ++k) {
1428 const int kk = k -
klo;
1429 nislfv_r_diag_arr(i,j,k,0) = amrex::max(
denqrs1_col(kk) / den_col(kk),
Real(0.0));
1431 nislfv_r_diag_arr(i,j,k,2) =
workr_col(kk);
1433 nislfv_r_diag_arr(i,j,k,4) = den_col(kk);
1434 nislfv_r_diag_arr(i,j,k,5) = denfac_col(kk);
1443 &delqrs2_col, &delqrs3_col, dtcld, 1,
1444 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1446 for (
int k =
klo; k <=
khi; ++k) {
1447 const int kk = k -
klo;
1448 nislfv_sg_diag_arr(i,j,k,0) = amrex::max(
denqrs2_col(kk) / den_col(kk),
Real(0.0));
1449 nislfv_sg_diag_arr(i,j,k,1) = amrex::max(
denqrs3_col(kk) / den_col(kk),
Real(0.0));
1457 for (
int k =
klo; k <=
khi; ++k) {
1458 const int kk = k -
klo;
1474 delqrs1_arr(i,j,0) = delqrs1_col / delz_arr(i,j,
klo) / dtcld;
1475 delqrs2_arr(i,j,0) = delqrs2_col / delz_arr(i,j,
klo) / dtcld;
1476 delqrs3_arr(i,j,0) = delqrs3_col / delz_arr(i,j,
klo) / dtcld;
1477 fall_r_arr(i,j,
klo) = delqrs1_arr(i,j,0);
1478 fall_s_arr(i,j,
klo) = delqrs2_arr(i,j,0);
1479 fall_g_arr(i,j,
klo) = delqrs3_arr(i,j,0);
1484 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1485 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1486 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1487 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1490 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1491 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1493 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1494 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1495 work1_r_arr(i,j,k));
1497 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1500 rslopesmax_loc, rslopesbmax_loc,
1501 rslopes2max_loc, rslopes3max_loc,
1503 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1504 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1505 work1_s_arr(i,j,k), dummy_n0sfac);
1507 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1509 rslopegmax_loc, rslopegbmax_loc,
1510 rslopeg2max_loc, rslopeg3max_loc,
1512 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1513 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1514 work1_g_arr(i,j,k));
1518 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1519 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1520 n0sfac_arr(i,j,k) = amrex::max(
1525 if (t_arr(i,j,k) >
Real(t0c)) {
1528 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1530 if (qs_arr(i,j,k) >
Real(0.0)) {
1532 rslope2_s_arr(i,j,k) *
1533 std::sqrt(rslope_s_arr(i,j,k) * rslopeb_s_arr(i,j,k));
1536 (
Real(t0c) - t_arr(i,j,k)) * pi_wsm6_loc *
Real(0.5) *
1541 psmlt_arr(i,j,k) = amrex::min(
1542 amrex::max(psmlt_arr(i,j,k) * dtcld,
1545 qs_arr(i,j,k) = qs_arr(i,j,k) + psmlt_arr(i,j,k);
1546 qr_arr(i,j,k) = qr_arr(i,j,k) - psmlt_arr(i,j,k);
1547 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * psmlt_arr(i,j,k);
1550 if (qg_arr(i,j,k) >
Real(0.0)) {
1552 rslope2_g_arr(i,j,k) *
1553 std::sqrt(rslope_g_arr(i,j,k) * rslopeb_g_arr(i,j,k));
1556 (
Real(t0c) - t_arr(i,j,k)) *
1560 pgmlt_arr(i,j,k) = amrex::min(
1561 amrex::max(pgmlt_arr(i,j,k) * dtcld,
1564 qg_arr(i,j,k) = qg_arr(i,j,k) + pgmlt_arr(i,j,k);
1565 qr_arr(i,j,k) = qr_arr(i,j,k) - pgmlt_arr(i,j,k);
1566 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pgmlt_arr(i,j,k);
1572 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1573 if (qi_arr(i,j,k) <=
Real(0.0)) {
1574 work1c_arr(i,j,k) =
Real(0.0);
1576 const Real tmp = den_arr(i,j,k) *
1577 amrex::max(qi_arr(i,j,k),
Real(qmin));
1579 amrex::max(
Real(5.38e7) *
1583 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1584 const Real diameter = amrex::max(
1587 work1c_arr(i,j,k) =
Real(1.49e4) *
1588 std::exp(std::log(diameter) *
Real(1.31));
1590 denqci_arr(i,j,k) = den_arr(i,j,k) * qi_arr(i,j,k);
1593 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1594 const int km_local =
khi -
klo + 1;
1615 for (
int k =
klo; k <=
khi; ++k) {
1616 const int kk = k -
klo;
1617 den_col(kk) = den_arr(i,j,k);
1618 denfac_col(kk) = denfac_arr(i,j,k);
1619 t_col(kk) = t_arr(i,j,k);
1620 dz_col(kk) = delz_tmp_arr(i,j,k);
1629 &delqi_col, dtcld, 0,
1630 sed_cell_scratch_arr, sed_node_scratch_arr, i, j,
klo);
1632 for (
int k =
klo; k <=
khi; ++k) {
1633 const int kk = k -
klo;
1636 qi_arr(i,j,k) = amrex::max(
1640 delqi_arr(i,j,0) = delqi_col / delz_arr(i,j,
klo) / dtcld;
1641 fallc_arr(i,j,
klo) = delqi_arr(i,j,0);
1645 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1646 const Real fallsum =
1647 fall_r_arr(i,j,
klo) + fall_s_arr(i,j,
klo) +
1648 fall_g_arr(i,j,
klo) + fallc_arr(i,j,
klo);
1649 const Real fallsum_qsi = fall_s_arr(i,j,
klo) + fallc_arr(i,j,
klo);
1650 const Real fallsum_qg = fall_g_arr(i,j,
klo);
1651 const Real precip = delz_arr(i,j,
klo) / denr * dtcld *
Real(1000.0);
1653 if (fallsum >
Real(0.0)) {
1654 rainncv_arr(i,j,0) += fallsum * precip;
1655 rainacc_arr(i,j,0) += fallsum * precip;
1657 if (fallsum_qsi >
Real(0.0)) {
1658 tstepsnow_arr(i,j,0) += fallsum_qsi * precip;
1659 snowncv_arr(i,j,0) += fallsum_qsi * precip;
1660 snowacc_arr(i,j,0) += fallsum_qsi * precip;
1662 if (fallsum_qg >
Real(0.0)) {
1663 tstepgraup_arr(i,j,0) += fallsum_qg * precip;
1664 graupelncv_arr(i,j,0) += fallsum_qg * precip;
1665 graupacc_arr(i,j,0) += fallsum_qg * precip;
1667 if (fallsum >
Real(0.0)) {
1669 (snowncv_arr(i,j,0) + graupelncv_arr(i,j,0)) /
1670 (rainncv_arr(i,j,0) +
Real(1.0e-12));
1674 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
1681 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1682 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1686 pimlt_arr(i,j,k) =
Real(0.0);
1687 pihmf_arr(i,j,k) =
Real(0.0);
1688 pihtf_arr(i,j,k) =
Real(0.0);
1689 pgfrz_arr(i,j,k) =
Real(0.0);
1691 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
1692 pimlt_arr(i,j,k) = qi_arr(i,j,k);
1693 qc_arr(i,j,k) = qc_arr(i,j,k) + qi_arr(i,j,k);
1694 t_arr(i,j,k) = t_arr(i,j,k) -
xlf / cpm_arr(i,j,k) * qi_arr(i,j,k);
1695 qi_arr(i,j,k) =
Real(0.0);
1698 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
1699 pihmf_arr(i,j,k) = qc_arr(i,j,k);
1700 qi_arr(i,j,k) = qi_arr(i,j,k) + qc_arr(i,j,k);
1701 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * qc_arr(i,j,k);
1702 qc_arr(i,j,k) =
Real(0.0);
1705 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
1706 const Real supcolt = amrex::min(supcol,
Real(50.0));
1707 const Real pfrzdtc = amrex::min(
1711 qc_arr(i,j,k) * qc_arr(i,j,k) * dtcld,
1713 pihtf_arr(i,j,k) = pfrzdtc;
1714 qi_arr(i,j,k) = qi_arr(i,j,k) + pfrzdtc;
1715 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtc;
1716 qc_arr(i,j,k) = qc_arr(i,j,k) - pfrzdtc;
1719 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
1720 Real temp = rslope3_r_arr(i,j,k);
1721 temp = temp * temp * rslope_r_arr(i,j,k);
1722 const Real supcolt = amrex::min(supcol,
Real(50.0));
1723 const Real pfrzdtr = amrex::min(
1725 Real(denr) / den_arr(i,j,k) *
1729 pgfrz_arr(i,j,k) = pfrzdtr;
1730 qg_arr(i,j,k) = qg_arr(i,j,k) + pfrzdtr;
1731 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtr;
1732 qr_arr(i,j,k) = qr_arr(i,j,k) - pfrzdtr;
1740 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1741 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1742 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1743 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1746 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1747 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1749 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1750 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1751 work1_r_arr(i,j,k));
1753 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1756 rslopesmax_loc, rslopesbmax_loc,
1757 rslopes2max_loc, rslopes3max_loc,
1759 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1760 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1761 work1_s_arr(i,j,k), dummy_n0sfac);
1763 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1765 rslopegmax_loc, rslopegbmax_loc,
1766 rslopeg2max_loc, rslopeg3max_loc,
1768 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1769 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1770 work1_g_arr(i,j,k));
1771 n0sfac_arr(i,j,k) = dummy_n0sfac;
1778 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1780 xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
1781 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
1783 Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
1784 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
1786 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1791 const Real dtcld_l = dtcld;
1794 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1795 Real supsat = amrex::max(
qv_arr(i,j,k), qmin_l)
1797 Real satdt = supsat / dtcld_l;
1799 if (qc_arr(i,j,k) >
Real(
qc0)) {
1800 praut_arr(i,j,k) = amrex::min(
1802 qc_arr(i,j,k)/dtcld_l);
1805 if (qr_arr(i,j,k) > qcrmin_l && qc_arr(i,j,k) > qmin_l) {
1806 pracw_arr(i,j,k) = amrex::min(
1808 *rslopeb_r_arr(i,j,k)
1809 *qc_arr(i,j,k)*denfac_arr(i,j,k),
1810 qc_arr(i,j,k)/dtcld_l);
1813 if (qr_arr(i,j,k) >
Real(0.0)) {
1814 Real coeres = rslope2_r_arr(i,j,k)*std::sqrt(
1815 rslope_r_arr(i,j,k)*rslopeb_r_arr(i,j,k));
1816 Real rate = (rhw_arr(i,j,k)-
Real(1.0))
1819 / workdiffw_arr(i,j,k);
1820 if (rate <
Real(0.0)) {
1821 rate = amrex::max(rate, -qr_arr(i,j,k)/dtcld_l);
1822 rate = amrex::max(rate, satdt/
Real(2.0));
1824 rate = amrex::min(rate, satdt/
Real(2.0));
1826 prevp_arr(i,j,k) = rate;
1832 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1833 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1834 n0sfac_arr(i,j,k) = amrex::max(
1841 const Real satdt = supsat / dtcld;
1844 const Real tmp = den_arr(i,j,k)
1845 * amrex::max(qi_arr(i,j,k),
Real(qmin));
1847 xni_arr(i,j,k) = amrex::min(
1848 amrex::max(
Real(5.38e7) * temp,
Real(1.0e3)),
1851 const Real xni = xni_arr(i,j,k);
1852 const Real eacrs = std::exp(
Real(0.07) * (-supcol));
1854 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1855 const Real diameter = amrex::min(
1857 const Real vt2i =
Real(1.49e4) * std::pow(diameter,
Real(1.31));
1859 * denfac_arr(i,j,k);
1861 * denfac_arr(i,j,k);
1863 * denfac_arr(i,j,k);
1867 const Real qsum = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k),
Real(1.0e-15));
1868 qsum_arr(i,j,k) =
qsum;
1870 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
1873 if (supcol >
Real(0.0) && qi_arr(i,j,k) >
Real(qmin)) {
1876 Real(2.0) * rslope3_r_arr(i,j,k)
1877 +
Real(2.0) * diameter * rslope2_r_arr(i,j,k)
1878 + diameter * diameter * rslope_r_arr(i,j,k);
1885 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
1886 praci_arr(i,j,k) *= std::pow(
1888 amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_arr(i,j,k)),
1891 praci_arr(i,j,k) = amrex::min(
1892 praci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1897 * rslope3_r_arr(i,j,k) * rslopeb_r_arr(i,j,k)
1898 /
Real(24.0) / den_arr(i,j,k);
1899 piacr_arr(i,j,k) *= std::pow(
1901 amrex::max(
Real(0.0), qi_arr(i,j,k) / qr_arr(i,j,k)),
1904 piacr_arr(i,j,k) = amrex::min(
1905 piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
1910 Real(2.0) * rslope3_s_arr(i,j,k)
1911 +
Real(2.0) * diameter * rslope2_s_arr(i,j,k)
1912 + diameter * diameter * rslope_s_arr(i,j,k);
1917 psaci_arr(i,j,k) =
Real(
pi) * qi_arr(i,j,k) * eacrs
1918 *
Real(
n0s) * n0sfac_arr(i,j,k)
1919 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
1920 psaci_arr(i,j,k) = amrex::min(
1921 psaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1925 const Real egi = std::exp(
Real(0.07) * (-supcol));
1927 Real(2.0) * rslope3_g_arr(i,j,k)
1928 +
Real(2.0) * diameter * rslope2_g_arr(i,j,k)
1929 + diameter * diameter * rslope_g_arr(i,j,k);
1930 pgaci_arr(i,j,k) =
Real(
pi) * egi * qi_arr(i,j,k)
1931 * n0g_loc * std::abs(vt2ave - vt2i) * acrfac
1933 pgaci_arr(i,j,k) = amrex::min(
1934 pgaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1938 if (qs_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1939 psacw_arr(i,j,k) = amrex::min(
1940 Real(
pacrc) * n0sfac_arr(i,j,k) * rslope3_s_arr(i,j,k)
1941 * rslopeb_s_arr(i,j,k)
1944 amrex::max(
Real(0.0), qs_arr(i,j,k) / qc_arr(i,j,k)),
1947 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1948 qc_arr(i,j,k) / dtcld);
1951 if (qg_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1952 pgacw_arr(i,j,k) = amrex::min(
1953 Real(
pacrg) * rslope3_g_arr(i,j,k) * rslopeb_g_arr(i,j,k)
1956 amrex::max(
Real(0.0), qg_arr(i,j,k) / qc_arr(i,j,k)),
1959 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1960 qc_arr(i,j,k) / dtcld);
1964 paacw_arr(i,j,k) = (qs_arr(i,j,k) * psacw_arr(i,j,k)
1965 + qg_arr(i,j,k) * pgacw_arr(i,j,k))
1970 if (supcol >
Real(0.0)) {
1972 Real(5.0) * rslope3_s_arr(i,j,k) * rslope3_s_arr(i,j,k)
1973 * rslope_r_arr(i,j,k)
1974 +
Real(2.0) * rslope3_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1975 * rslope2_r_arr(i,j,k)
1976 +
Real(0.5) * rslope2_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1977 * rslope3_r_arr(i,j,k);
1983 *
Real(
n0s) * n0sfac_arr(i,j,k)
1984 * std::abs(vt2r - vt2ave) * (
Real(
dens_snow) / den_arr(i,j,k))
1986 pracs_arr(i,j,k) *= std::pow(
1988 amrex::max(
Real(0.0), qr_arr(i,j,k) / qs_arr(i,j,k)),
1991 pracs_arr(i,j,k) = amrex::min(
1992 pracs_arr(i,j,k), qs_arr(i,j,k) / dtcld);
1997 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
1998 * rslope_s_arr(i,j,k)
1999 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2000 * rslope2_s_arr(i,j,k)
2001 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2002 * rslope3_s_arr(i,j,k);
2004 *
Real(
n0s) * n0sfac_arr(i,j,k)
2005 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
2007 psacr_arr(i,j,k) *= std::pow(
2009 amrex::max(
Real(0.0), qs_arr(i,j,k) / qr_arr(i,j,k)),
2012 psacr_arr(i,j,k) = amrex::min(
2013 psacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2024 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
2025 * rslope_g_arr(i,j,k)
2026 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2027 * rslope2_g_arr(i,j,k)
2028 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2029 * rslope3_g_arr(i,j,k);
2031 * n0g_loc * std::abs(vt2ave - vt2r)
2032 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2033 pgacr_arr(i,j,k) *= std::pow(
2035 amrex::max(
Real(0.0), qg_arr(i,j,k) / qr_arr(i,j,k)),
2038 pgacr_arr(i,j,k) = amrex::min(
2039 pgacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2043 pgacs_arr(i,j,k) =
Real(0.0);
2046 if (supcol <=
Real(0.0)) {
2048 if (qs_arr(i,j,k) >
Real(0.0)) {
2053 pseml_arr(i,j,k) = amrex::min(
2056 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2057 -qs_arr(i,j,k) / dtcld),
2060 if (qg_arr(i,j,k) >
Real(0.0)) {
2061 pgeml_arr(i,j,k) = amrex::min(
2064 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2065 -qg_arr(i,j,k) / dtcld),
2070 if (supcol >
Real(0.0)) {
2071 if (qi_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2076 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2077 * (rhi_arr(i,j,k) -
Real(1.0))
2078 / workdiffi_arr(i,j,k);
2079 Real supice = satdt - prevp_arr(i,j,k);
2080 if (pidep_arr(i,j,k) <
Real(0.0)) {
2081 pidep_arr(i,j,k) = amrex::max(
2082 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2084 pidep_arr(i,j,k) = amrex::max(
2085 pidep_arr(i,j,k), -qi_arr(i,j,k) / dtcld);
2087 pidep_arr(i,j,k) = amrex::min(
2088 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2091 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2092 >= std::abs(satdt)) {
2097 if (qs_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2098 const Real coeres = rslope2_s_arr(i,j,k)
2099 * std::sqrt(rslope_s_arr(i,j,k)
2100 * rslopeb_s_arr(i,j,k));
2101 psdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2105 / workdiffi_arr(i,j,k);
2106 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2107 if (psdep_arr(i,j,k) <
Real(0.0)) {
2108 psdep_arr(i,j,k) = amrex::max(
2109 psdep_arr(i,j,k), -qs_arr(i,j,k) / dtcld);
2110 psdep_arr(i,j,k) = amrex::max(
2111 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2114 psdep_arr(i,j,k) = amrex::min(
2115 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2118 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2120 >= std::abs(satdt)) {
2125 if (qg_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2126 const Real coeres = rslope2_g_arr(i,j,k)
2127 * std::sqrt(rslope_g_arr(i,j,k)
2128 * rslopeb_g_arr(i,j,k));
2129 pgdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2132 / workdiffi_arr(i,j,k);
2133 Real supice = satdt - prevp_arr(i,j,k)
2134 - pidep_arr(i,j,k) - psdep_arr(i,j,k);
2135 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2136 pgdep_arr(i,j,k) = amrex::max(
2137 pgdep_arr(i,j,k), -qg_arr(i,j,k) / dtcld);
2138 pgdep_arr(i,j,k) = amrex::max(
2139 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2142 pgdep_arr(i,j,k) = amrex::min(
2143 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2146 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2147 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2148 >= std::abs(satdt)) {
2153 if (supsat >
Real(0.0) && ifsat != 1) {
2154 const Real supice = satdt - prevp_arr(i,j,k)
2158 const Real xni0 =
Real(1.0e3) * std::exp(
Real(0.1) * supcol);
2159 const Real roqi0 =
Real(4.92e-11) * std::pow(xni0,
Real(1.33));
2160 pigen_arr(i,j,k) = amrex::max(
2162 (roqi0 / den_arr(i,j,k)
2163 - amrex::max(qi_arr(i,j,k),
Real(0.0))) / dtcld);
2164 pigen_arr(i,j,k) = amrex::min(
2165 amrex::min(pigen_arr(i,j,k), satdt), supice);
2168 if (qi_arr(i,j,k) >
Real(0.0)) {
2174 psaut_arr(i,j,k) = amrex::max(
2175 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2178 if (qs_arr(i,j,k) >
Real(0.0)) {
2180 * std::exp(
Real(0.09) * (-supcol));
2181 pgaut_arr(i,j,k) = amrex::min(
2184 qs_arr(i,j,k) / dtcld);
2188 if (supcol <
Real(0.0)) {
2189 if (qs_arr(i,j,k) >
Real(0.0)
2190 && rhw_arr(i,j,k) <
Real(1.0)) {
2191 const Real coeres = rslope2_s_arr(i,j,k)
2192 * std::sqrt(rslope_s_arr(i,j,k)
2193 * rslopeb_s_arr(i,j,k));
2198 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2202 / workdiffw_arr(i,j,k);
2203 psevp_arr(i,j,k) = amrex::min(
2204 amrex::max(psevp_arr(i,j,k),
2205 -qs_arr(i,j,k) / dtcld),
2209 if (qg_arr(i,j,k) >
Real(0.0)
2210 && rhw_arr(i,j,k) <
Real(1.0)) {
2211 const Real coeres = rslope2_g_arr(i,j,k)
2212 * std::sqrt(rslope_g_arr(i,j,k)
2213 * rslopeb_g_arr(i,j,k));
2214 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2217 / workdiffw_arr(i,j,k);
2218 pgevp_arr(i,j,k) = amrex::min(
2219 amrex::max(pgevp_arr(i,j,k),
2220 -qg_arr(i,j,k) / dtcld),
2230 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2236 (qr_arr(i,j,k) <
Real(1.0e-4) && qs_arr(i,j,k) <
Real(1.0e-4))
2239 (qr_arr(i,j,k) <
Real(1.0e-4)) ?
Real(1.0) :
Real(0.0);
2241 if (t_arr(i,j,k) <= t0c_l) {
2242 Real value, source, factor,
xlf, xlwork2;
2244 value = amrex::max(qmin_l, qc_arr(i,j,k));
2245 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2246 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2248 if (source > value) {
2249 factor = value / source;
2250 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2251 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2252 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2255 value = amrex::max(qmin_l, qi_arr(i,j,k));
2256 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2257 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2258 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2259 if (source > value) {
2260 factor = value / source;
2261 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2262 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2263 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2264 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2265 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2266 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2269 value = amrex::max(qmin_l, qr_arr(i,j,k));
2270 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2271 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2272 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2273 if (source > value) {
2274 factor = value / source;
2275 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2276 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2277 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2278 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2279 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2280 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2283 value = amrex::max(qmin_l, qs_arr(i,j,k));
2284 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2285 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2286 + piacr_arr(i,j,k) * delta3
2287 + praci_arr(i,j,k) * delta3
2288 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2289 + psacr_arr(i,j,k) * delta2
2290 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2291 if (source > value) {
2292 factor = value / source;
2293 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2294 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2295 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2296 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2297 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2298 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2299 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2300 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2301 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2302 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2305 value = amrex::max(qmin_l, qg_arr(i,j,k));
2306 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2307 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2308 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2309 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2310 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2311 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2312 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2313 if (source > value) {
2314 factor = value / source;
2315 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2316 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2317 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2318 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2319 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2320 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2321 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2322 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2323 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2324 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2327 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2328 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2329 + pidep_arr(i,j,k));
2330 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2332 qc_arr(i,j,k) = amrex::max(
2333 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2334 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2337 qr_arr(i,j,k) = amrex::max(
2338 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2339 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2340 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2343 qi_arr(i,j,k) = amrex::max(
2344 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2345 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2346 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2349 qs_arr(i,j,k) = amrex::max(
2350 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2351 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2352 + piacr_arr(i,j,k) * delta3
2353 + praci_arr(i,j,k) * delta3
2354 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2355 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2356 + psacr_arr(i,j,k) * delta2) * dtcld,
2358 qg_arr(i,j,k) = amrex::max(
2359 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2360 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2361 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2362 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2363 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2364 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2365 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2369 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2370 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2371 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2372 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2373 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2374 + psacr_arr(i,j,k));
2375 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2377 Real value, source, factor,
xlf, xlwork2;
2379 value = amrex::max(qmin_l, qc_arr(i,j,k));
2380 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2381 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2383 if (source > value) {
2384 factor = value / source;
2385 praut_arr(i,j,k) = praut_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;
2390 value = amrex::max(qmin_l, qr_arr(i,j,k));
2391 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2392 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2393 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2394 - prevp_arr(i,j,k)) * dtcld;
2395 if (source > value) {
2396 factor = value / source;
2397 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2398 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2399 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2400 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2401 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2402 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2405 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2406 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2407 - psevp_arr(i,j,k)) * dtcld;
2408 if (source > value) {
2409 factor = value / source;
2410 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2411 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2412 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2415 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2416 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2417 + pgeml_arr(i,j,k)) * dtcld;
2418 if (source > value) {
2419 factor = value / source;
2420 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2421 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2422 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2425 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
2426 + pgevp_arr(i,j,k));
2427 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2429 qc_arr(i,j,k) = amrex::max(
2430 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2431 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2434 qr_arr(i,j,k) = amrex::max(
2435 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2436 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
2437 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
2438 - pgeml_arr(i,j,k)) * dtcld,
2440 qs_arr(i,j,k) = amrex::max(
2441 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
2442 + pseml_arr(i,j,k)) * dtcld,
2444 qg_arr(i,j,k) = amrex::max(
2445 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2446 + pgeml_arr(i,j,k)) * dtcld,
2449 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
2452 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
2453 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2461 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2467 Real tr = ttp / t_arr(i,j,k);
2469 * std::exp(xb * (
Real(1.0) - tr));
2470 qsw = amrex::min(qsw,
Real(0.99) * p_arr(i,j,k));
2471 qsatw_arr(i,j,k) =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
2472 qsatw_arr(i,j,k) = amrex::max(qsatw_arr(i,j,k),
Real(qmin));
2480 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2482 t_arr(i,j,k),
qv_arr(i,j,k), qsatw_arr(i,j,k),
2483 xl_arr(i,j,k), cpm_arr(i,j,k),
Real(qmin),
Real(rv));
2484 const Real work2loc = qc_arr(i,j,k) + workcond;
2485 static_cast<void>(work2loc);
2486 pcond_arr(i,j,k) = amrex::min(
2487 amrex::max(workcond / dtcld,
Real(0.0)),
2488 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
2489 if (qc_arr(i,j,k) >
Real(0.0) && workcond <
Real(0.0)) {
2490 pcond_arr(i,j,k) = amrex::max(workcond, -qc_arr(i,j,k)) / dtcld;
2492 qv_arr(i,j,k) =
qv_arr(i,j,k) - pcond_arr(i,j,k) * dtcld;
2493 qc_arr(i,j,k) = amrex::max(
2494 qc_arr(i,j,k) + pcond_arr(i,j,k) * dtcld,
2496 t_arr(i,j,k) = t_arr(i,j,k)
2497 + pcond_arr(i,j,k) * xl_arr(i,j,k)
2498 / cpm_arr(i,j,k) * dtcld;
2506 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2507 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
2508 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
2512 #ifdef ERF_USE_WSM6_FORT
2515 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
2516 rain_arr(i,j,
klo) = rainacc_arr(i,j,0);
2517 snow_arr(i,j,
klo) = snowacc_arr(i,j,0);
2518 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:46
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_conden(Real a, Real b, Real c, Real d, Real e, Real qmin_arg, Real rv_arg)
Definition: ERF_AdvanceWSM6.cpp:66
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_slope_snow_cell(Real qs, Real den, Real denfac, Real t, Real pidn0s_arg, Real alpha_arg, Real n0smax_arg, Real n0s_arg, Real t0c_arg, Real qcrmin_arg, Real rslopesmax_arg, Real rslopesbmax_arg, Real rslopes2max_arg, Real rslopes3max_arg, Real bvts_arg, Real pvts_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt, Real &n0sfac)
Definition: ERF_AdvanceWSM6.cpp:172
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_slope_graup_cell(Real qg, Real den, Real denfac, Real pidn0g_arg, Real qcrmin_arg, Real rslopegmax_arg, Real rslopegbmax_arg, Real rslopeg2max_arg, Real rslopeg3max_arg, Real bvtg_arg, Real pvtg_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt)
Definition: ERF_AdvanceWSM6.cpp:202
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_slope_rain_cell(Real qr, Real den, Real denfac, Real pidn0r_arg, Real qcrmin_arg, Real rslopermax_arg, Real rsloperbmax_arg, Real rsloper2max_arg, Real rsloper3max_arg, Real bvtr_arg, Real pvtr_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt)
Definition: ERF_AdvanceWSM6.cpp:147
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_nislfv_rain_plm_scratch(int km, int ww_comp, int rq_comp, Real *precip, Real dt, int iter, Array4< Real > const &sed_cell, Array4< Real > const &sed_node, int i_s, int j_s, int klo_s)
Definition: ERF_AdvanceWSM6.cpp:226
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_xlcal(Real x, Real xlv0_arg, Real xlv1_arg, Real t0c_arg)
Definition: ERF_AdvanceWSM6.cpp:31
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_venfac(Real a, Real b, Real c, Real den0_arg)
Definition: ERF_AdvanceWSM6.cpp:58
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_cpmcal(Real x, Real qmin_arg, Real cpd_arg, Real cpv_arg)
Definition: ERF_AdvanceWSM6.cpp:25
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_nislfv_rain_plm6_scratch(int km, int ww_comp, int rq_comp, int rq2_comp, Real *precip1, Real *precip2, Real dt, int iter, Array4< Real > const &sed_cell, Array4< Real > const &sed_node, int i_s, int j_s, int klo_s)
Definition: ERF_AdvanceWSM6.cpp:500
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real wsm6_diffac(Real a, Real b, Real c, Real d, Real e, Real rv_arg)
Definition: ERF_AdvanceWSM6.cpp:51
constexpr amrex::Real R_v
Definition: ERF_Constants.H:35
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:36
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:56
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:38
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:37
constexpr amrex::Real R_d
Definition: ERF_Constants.H:34
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:210
constexpr amrex::Real lat_vap
Definition: ERF_MicrophysicsConstants.H:113
constexpr amrex::Real lsub
Definition: ERF_MicrophysicsConstants.H:111
constexpr amrex::Real rhoh2o
Definition: ERF_MicrophysicsConstants.H:42
constexpr amrex::Real lat_ice
Definition: ERF_MicrophysicsConstants.H:114
constexpr amrex::Real rhos
Definition: ERF_MicrophysicsConstants.H:40
Arena * Arena_Used
Definition: ERF_Morrison_Advance_F.H:23
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
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:255
amrex::MultiFab * m_z_phys_nd
Definition: ERF_WSM6.H:237
amrex::Real m_rslopesbmax
Definition: ERF_WSM6.H:264
static constexpr amrex::Real avtr
Definition: ERF_WSM6.H:140
static constexpr amrex::Real dicon
Definition: ERF_WSM6.H:150
amrex::Real m_rslopes2max
Definition: ERF_WSM6.H:265
amrex::Real m_rsloper2max
Definition: ERF_WSM6.H:265
static constexpr amrex::Real qcrmin
Definition: ERF_WSM6.H:154
amrex::Real m_rslopermax
Definition: ERF_WSM6.H:263
amrex::Real m_pacrc
Definition: ERF_WSM6.H:259
static constexpr amrex::Real pfrz1
Definition: ERF_WSM6.H:152
amrex::Real m_rsloperbmax
Definition: ERF_WSM6.H:264
amrex::Real m_pi_wsm6
Definition: ERF_WSM6.H:250
static constexpr amrex::Real n0smax
Definition: ERF_WSM6.H:158
bool m_do_cond
Definition: ERF_WSM6.H:233
amrex::Real m_pidn0s
Definition: ERF_WSM6.H:259
static constexpr amrex::Real dimax
Definition: ERF_WSM6.H:151
static constexpr amrex::Real pfrz2
Definition: ERF_WSM6.H:153
static constexpr amrex::Real alpha_wsm6
Definition: ERF_WSM6.H:160
amrex::Real m_pvtg
Definition: ERF_WSM6.H:262
amrex::Real m_qck1
Definition: ERF_WSM6.H:251
amrex::Real m_precg2
Definition: ERF_WSM6.H:262
amrex::Real m_precg1
Definition: ERF_WSM6.H:262
amrex::Real m_rsloper3max
Definition: ERF_WSM6.H:266
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:159
amrex::Real m_precr2
Definition: ERF_WSM6.H:255
static constexpr amrex::Real n0r
Definition: ERF_WSM6.H:139
amrex::Real m_n0g
Definition: ERF_WSM6.H:245
amrex::Real m_pidn0g
Definition: ERF_WSM6.H:262
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:156
static constexpr amrex::Real dtcldcr
Definition: ERF_WSM6.H:138
amrex::Real m_rslopegmax
Definition: ERF_WSM6.H:263
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:147
amrex::Real m_g6pbr
Definition: ERF_WSM6.H:253
amrex::Real m_pacrg
Definition: ERF_WSM6.H:262
amrex::Real m_precs2
Definition: ERF_WSM6.H:258
amrex::Real m_rslopeg3max
Definition: ERF_WSM6.H:266
amrex::Real m_pvts
Definition: ERF_WSM6.H:258
amrex::Real m_rslopegbmax
Definition: ERF_WSM6.H:264
static constexpr amrex::Real qs0
Definition: ERF_WSM6.H:157
amrex::Geometry m_geom
Definition: ERF_WSM6.H:228
amrex::Real m_precs1
Definition: ERF_WSM6.H:258
amrex::Real dt
Definition: ERF_WSM6.H:229
static constexpr amrex::Real xncr
Definition: ERF_WSM6.H:144
static constexpr amrex::Real bvtr
Definition: ERF_WSM6.H:141
amrex::Real m_rslopesmax
Definition: ERF_WSM6.H:263
amrex::Real m_qc0
Definition: ERF_WSM6.H:251
amrex::Array< FabPtr, MicVar_WSM6::NumVars > mic_fab_vars
Definition: ERF_WSM6.H:240
amrex::Real m_bvtg
Definition: ERF_WSM6.H:245
amrex::Real m_pvtr
Definition: ERF_WSM6.H:254
amrex::Real m_pacrr
Definition: ERF_WSM6.H:254
amrex::Real m_precr1
Definition: ERF_WSM6.H:255
amrex::Real m_pidn0r
Definition: ERF_WSM6.H:259
amrex::Real m_rslopes3max
Definition: ERF_WSM6.H:266
amrex::Real m_xlv1
Definition: ERF_WSM6.H:250
amrex::Real m_rslopeg2max
Definition: ERF_WSM6.H:265
@ xlf
Definition: ERF_AdvanceMorrison.cpp:157
@ qr
Definition: ERF_WSM6.H:29
@ qi
Definition: ERF_WSM6.H:28
@ qs
Definition: ERF_WSM6.H:30
@ qv
Definition: ERF_WSM6.H:26
@ qc
Definition: ERF_WSM6.H:27
@ rain_accum
Definition: ERF_WSM6.H:32
@ snow_accum
Definition: ERF_WSM6.H:33
@ rho
Definition: ERF_WSM6.H:22
@ graup_accum
Definition: ERF_WSM6.H:34
@ qg
Definition: ERF_WSM6.H:31
@ pres
Definition: ERF_WSM6.H:25
@ tabs
Definition: ERF_WSM6.H:24
@ qsum
Definition: ERF_WSM6.H:323
@ xni
Definition: ERF_WSM6.H:328
@ NumComps
Definition: ERF_AdvanceWSM6.cpp:128
@ workr_col
Definition: ERF_AdvanceWSM6.cpp:120
@ tmp
Definition: ERF_AdvanceWSM6.cpp:116
@ denqrs2_col
Definition: ERF_AdvanceWSM6.cpp:123
@ qsum_col
Definition: ERF_AdvanceWSM6.cpp:125
@ denqci_col
Definition: ERF_AdvanceWSM6.cpp:127
@ denqrs1_col
Definition: ERF_AdvanceWSM6.cpp:122
@ worka_col
Definition: ERF_AdvanceWSM6.cpp:121
@ denqrs3_col
Definition: ERF_AdvanceWSM6.cpp:124
@ den
Definition: ERF_AdvanceWSM6.cpp:111
@ dz
Definition: ERF_AdvanceWSM6.cpp:106
@ tk
Definition: ERF_AdvanceWSM6.cpp:113
@ denfac
Definition: ERF_AdvanceWSM6.cpp:112
@ work1c_col
Definition: ERF_AdvanceWSM6.cpp:126
@ NumComps
Definition: ERF_AdvanceWSM6.cpp:142
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