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);
943 FArrayBox delz_fab(fab_box, 1);
944 auto const& delz_arr = delz_fab.array();
945 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
946 delz_arr(i,j,k) = dz_val;
950 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
951 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
952 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
953 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
954 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
958 box2d.makeSlab(2, 0);
959 Box fab_box2d(fab_box);
960 fab_box2d.makeSlab(2, 0);
965 FArrayBox rainncv_fab(fab_box2d, 1);
966 FArrayBox sr_fab(fab_box2d, 1);
967 FArrayBox snowncv_fab(fab_box2d, 1);
968 FArrayBox graupelncv_fab(fab_box2d, 1);
969 FArrayBox rainacc_fab(fab_box2d, 1);
970 FArrayBox snowacc_fab(fab_box2d, 1);
971 FArrayBox graupacc_fab(fab_box2d, 1);
973 auto const& rainncv_arr = rainncv_fab.array();
974 auto const& sr_arr = sr_fab.array();
975 auto const& snowncv_arr = snowncv_fab.array();
976 auto const& graupelncv_arr = graupelncv_fab.array();
977 auto const& rainacc_arr = rainacc_fab.array();
978 auto const& snowacc_arr = snowacc_fab.array();
979 auto const& graupacc_arr = graupacc_fab.array();
980 ParallelFor(fab_box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
981 rainncv_arr(i,j,k) =
Real(0.0);
982 sr_arr(i,j,k) =
Real(0.0);
983 snowncv_arr(i,j,k) =
Real(0.0);
984 graupelncv_arr(i,j,k) =
Real(0.0);
985 rainacc_arr(i,j,k) =
Real(0.0);
986 snowacc_arr(i,j,k) =
Real(0.0);
987 graupacc_arr(i,j,k) =
Real(0.0);
989 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
990 rainacc_arr(i,j,0) = rain_arr(i,j,klo);
991 snowacc_arr(i,j,0) = snow_arr(i,j,klo);
992 graupacc_arr(i,j,0) = graup_arr(i,j,klo);
993 rainncv_arr(i,j,0) =
Real(0.0);
994 sr_arr(i,j,0) =
Real(0.0);
995 snowncv_arr(i,j,0) =
Real(0.0);
996 graupelncv_arr(i,j,0) =
Real(0.0);
999 #ifdef ERF_USE_WSM6_FORT
1000 if (run_wsm6_fort) {
1003 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
1004 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
1005 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
1006 static_cast<double>(
dt),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
1008 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
1009 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
1010 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
1011 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
1012 ilo, ihi, jlo, jhi, klo,
khi, microphysics_debug_bridge, diag_i, diag_j);
1019 FArrayBox delqrs1_fab(box2d,1);
1020 FArrayBox delqrs2_fab(box2d,1);
1021 FArrayBox delqrs3_fab(box2d,1);
1022 FArrayBox delqi_fab(box2d,1);
1023 FArrayBox tstepsnow_fab(box2d,1);
1024 FArrayBox tstepgraup_fab(box2d,1);
1025 auto const& delqrs1_arr = delqrs1_fab.array();
1026 auto const& delqrs2_arr = delqrs2_fab.array();
1027 auto const& delqrs3_arr = delqrs3_fab.array();
1028 auto const& delqi_arr = delqi_fab.array();
1029 auto const& tstepsnow_arr = tstepsnow_fab.array();
1030 auto const& tstepgraup_arr = tstepgraup_fab.array();
1032 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1033 delqrs1_arr(i,j,k) =
Real(0.0);
1034 delqrs2_arr(i,j,k) =
Real(0.0);
1035 delqrs3_arr(i,j,k) =
Real(0.0);
1036 delqi_arr(i,j,k) =
Real(0.0);
1037 tstepsnow_arr(i,j,k) =
Real(0.0);
1038 tstepgraup_arr(i,j,k) =
Real(0.0);
1041 FArrayBox denfac_fab(fab_box,1); FArrayBox xni_fab(fab_box,1);
1042 FArrayBox cpm_fab(fab_box,1); FArrayBox xl_fab(fab_box,1);
1043 FArrayBox qsatw_fab(fab_box,1); FArrayBox qsati_fab(fab_box,1);
1044 FArrayBox rhw_fab(fab_box,1); FArrayBox rhi_fab(fab_box,1);
1045 FArrayBox den_tmp_fab(fab_box,1); FArrayBox delz_tmp_fab(fab_box,1);
1046 FArrayBox n0sfac_fab(fab_box,1);
1047 FArrayBox qrs_tmp_r_fab(fab_box,1); FArrayBox qrs_tmp_s_fab(fab_box,1);
1048 FArrayBox qrs_tmp_g_fab(fab_box,1);
1049 FArrayBox rslope_r_fab(fab_box,1); FArrayBox rslope_s_fab(fab_box,1);
1050 FArrayBox rslope_g_fab(fab_box,1);
1051 FArrayBox rslope2_r_fab(fab_box,1); FArrayBox rslope2_s_fab(fab_box,1);
1052 FArrayBox rslope2_g_fab(fab_box,1);
1053 FArrayBox rslope3_r_fab(fab_box,1); FArrayBox rslope3_s_fab(fab_box,1);
1054 FArrayBox rslope3_g_fab(fab_box,1);
1055 FArrayBox rslopeb_r_fab(fab_box,1); FArrayBox rslopeb_s_fab(fab_box,1);
1056 FArrayBox rslopeb_g_fab(fab_box,1);
1057 FArrayBox work1_r_fab(fab_box,1); FArrayBox work1_s_fab(fab_box,1);
1058 FArrayBox work1_g_fab(fab_box,1);
1059 FArrayBox work2_fab(fab_box,1); FArrayBox workdiffw_fab(fab_box,1);
1060 FArrayBox workdiffi_fab(fab_box,1);
1061 FArrayBox workr_fab(fab_box,1); FArrayBox worka_fab(fab_box,1);
1062 FArrayBox work1c_fab(fab_box,1);
1063 FArrayBox denqrs1_fab(fab_box,1); FArrayBox denqrs2_fab(fab_box,1);
1064 FArrayBox denqrs3_fab(fab_box,1); FArrayBox denqci_fab(fab_box,1);
1065 FArrayBox fall_r_fab(fab_box,1); FArrayBox fall_s_fab(fab_box,1);
1066 FArrayBox fall_g_fab(fab_box,1); FArrayBox fallc_fab(fab_box,1);
1067 FArrayBox qsum_fab(fab_box,1);
1068 FArrayBox nislfv_r_diag_fab(fab_box,6);
1069 FArrayBox nislfv_sg_diag_fab(fab_box,6);
1071 Box sed_node_box = amrex::surroundingNodes(fab_box, 2);
1074 FArrayBox praut_fab(fab_box,1); FArrayBox pracw_fab(fab_box,1);
1075 FArrayBox prevp_fab(fab_box,1); FArrayBox psdep_fab(fab_box,1);
1076 FArrayBox pgdep_fab(fab_box,1); FArrayBox psaut_fab(fab_box,1);
1077 FArrayBox pgaut_fab(fab_box,1); FArrayBox praci_fab(fab_box,1);
1078 FArrayBox piacr_fab(fab_box,1); FArrayBox psaci_fab(fab_box,1);
1079 FArrayBox psacw_fab(fab_box,1); FArrayBox pgacw_fab(fab_box,1);
1080 FArrayBox pgaci_fab(fab_box,1); FArrayBox paacw_fab(fab_box,1);
1081 FArrayBox pracs_fab(fab_box,1); FArrayBox psacr_fab(fab_box,1);
1082 FArrayBox pgacr_fab(fab_box,1); FArrayBox pgacs_fab(fab_box,1);
1083 FArrayBox pigen_fab(fab_box,1); FArrayBox pidep_fab(fab_box,1);
1084 FArrayBox pcond_fab(fab_box,1); FArrayBox psmlt_fab(fab_box,1);
1085 FArrayBox pgmlt_fab(fab_box,1); FArrayBox pseml_fab(fab_box,1);
1086 FArrayBox pgeml_fab(fab_box,1); FArrayBox psevp_fab(fab_box,1);
1087 FArrayBox pgevp_fab(fab_box,1);
1088 FArrayBox pimlt_fab(fab_box,1); FArrayBox pihmf_fab(fab_box,1);
1089 FArrayBox pihtf_fab(fab_box,1); FArrayBox pgfrz_fab(fab_box,1);
1091 auto const& denfac_arr = denfac_fab.array();
1092 auto const& xni_arr = xni_fab.array();
1093 auto const& cpm_arr = cpm_fab.array();
1094 auto const& xl_arr = xl_fab.array();
1095 auto const& qsatw_arr = qsatw_fab.array();
1096 auto const& qsati_arr = qsati_fab.array();
1097 auto const& rhw_arr = rhw_fab.array();
1098 auto const& rhi_arr = rhi_fab.array();
1099 auto const& den_tmp_arr = den_tmp_fab.array();
1100 auto const& delz_tmp_arr = delz_tmp_fab.array();
1101 auto const& n0sfac_arr = n0sfac_fab.array();
1102 auto const& qrs_tmp_r_arr = qrs_tmp_r_fab.array();
1103 auto const& qrs_tmp_s_arr = qrs_tmp_s_fab.array();
1104 auto const& qrs_tmp_g_arr = qrs_tmp_g_fab.array();
1105 auto const& rslope_r_arr = rslope_r_fab.array();
1106 auto const& rslope_s_arr = rslope_s_fab.array();
1107 auto const& rslope_g_arr = rslope_g_fab.array();
1108 auto const& rslope2_r_arr = rslope2_r_fab.array();
1109 auto const& rslope2_s_arr = rslope2_s_fab.array();
1110 auto const& rslope2_g_arr = rslope2_g_fab.array();
1111 auto const& rslope3_r_arr = rslope3_r_fab.array();
1112 auto const& rslope3_s_arr = rslope3_s_fab.array();
1113 auto const& rslope3_g_arr = rslope3_g_fab.array();
1114 auto const& rslopeb_r_arr = rslopeb_r_fab.array();
1115 auto const& rslopeb_s_arr = rslopeb_s_fab.array();
1116 auto const& rslopeb_g_arr = rslopeb_g_fab.array();
1117 auto const& work1_r_arr = work1_r_fab.array();
1118 auto const& work1_s_arr = work1_s_fab.array();
1119 auto const& work1_g_arr = work1_g_fab.array();
1120 auto const& work2_arr = work2_fab.array();
1121 auto const& workdiffw_arr = workdiffw_fab.array();
1122 auto const& workdiffi_arr = workdiffi_fab.array();
1123 auto const& workr_arr = workr_fab.array();
1124 auto const& worka_arr = worka_fab.array();
1125 auto const& work1c_arr = work1c_fab.array();
1126 auto const& denqrs1_arr = denqrs1_fab.array();
1127 auto const& denqrs2_arr = denqrs2_fab.array();
1128 auto const& denqrs3_arr = denqrs3_fab.array();
1129 auto const& denqci_arr = denqci_fab.array();
1130 auto const& fall_r_arr = fall_r_fab.array();
1131 auto const& fall_s_arr = fall_s_fab.array();
1132 auto const& fall_g_arr = fall_g_fab.array();
1133 auto const& fallc_arr = fallc_fab.array();
1134 auto const& qsum_arr = qsum_fab.array();
1135 auto const& nislfv_r_diag_arr = nislfv_r_diag_fab.array();
1136 auto const& nislfv_sg_diag_arr = nislfv_sg_diag_fab.array();
1137 auto const& sed_cell_scratch_arr = sed_cell_scratch_fab.array();
1138 auto const& sed_node_scratch_arr = sed_node_scratch_fab.array();
1140 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1141 work1c_arr(i,j,k) =
Real(0.0);
1143 ParallelFor(fab_box, nislfv_r_diag_fab.nComp(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n) {
1144 nislfv_r_diag_arr(i,j,k,n) =
Real(0.0);
1145 nislfv_sg_diag_arr(i,j,k,n) =
Real(0.0);
1147 auto const& praut_arr = praut_fab.array();
1148 auto const& pracw_arr = pracw_fab.array();
1149 auto const& prevp_arr = prevp_fab.array();
1150 auto const& psdep_arr = psdep_fab.array();
1151 auto const& pgdep_arr = pgdep_fab.array();
1152 auto const& psaut_arr = psaut_fab.array();
1153 auto const& pgaut_arr = pgaut_fab.array();
1154 auto const& praci_arr = praci_fab.array();
1155 auto const& piacr_arr = piacr_fab.array();
1156 auto const& psaci_arr = psaci_fab.array();
1157 auto const& psacw_arr = psacw_fab.array();
1158 auto const& pgacw_arr = pgacw_fab.array();
1159 auto const& pgaci_arr = pgaci_fab.array();
1160 auto const& paacw_arr = paacw_fab.array();
1161 auto const& pracs_arr = pracs_fab.array();
1162 auto const& psacr_arr = psacr_fab.array();
1163 auto const& pgacr_arr = pgacr_fab.array();
1164 auto const& pgacs_arr = pgacs_fab.array();
1165 auto const& pigen_arr = pigen_fab.array();
1166 auto const& pidep_arr = pidep_fab.array();
1167 auto const& pcond_arr = pcond_fab.array();
1168 auto const& psmlt_arr = psmlt_fab.array();
1169 auto const& pgmlt_arr = pgmlt_fab.array();
1170 auto const& pseml_arr = pseml_fab.array();
1171 auto const& pgeml_arr = pgeml_fab.array();
1172 auto const& psevp_arr = psevp_fab.array();
1173 auto const& pgevp_arr = pgevp_fab.array();
1174 auto const& pimlt_arr = pimlt_fab.array();
1175 auto const& pihmf_arr = pihmf_fab.array();
1176 auto const& pihtf_arr = pihtf_fab.array();
1177 auto const& pgfrz_arr = pgfrz_fab.array();
1181 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1182 qc_arr(i,j,k) = amrex::max(qc_arr(i,j,k),
Real(0.0));
1183 qr_arr(i,j,k) = amrex::max(qr_arr(i,j,k),
Real(0.0));
1184 qi_arr(i,j,k) = amrex::max(qi_arr(i,j,k),
Real(0.0));
1185 qs_arr(i,j,k) = amrex::max(qs_arr(i,j,k),
Real(0.0));
1186 qg_arr(i,j,k) = amrex::max(qg_arr(i,j,k),
Real(0.0));
1187 den_tmp_arr(i,j,k) = den_arr(i,j,k);
1188 delz_tmp_arr(i,j,k) = delz_arr(i,j,k);
1193 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1199 const int wsm6_loops = std::max(
1200 static_cast<int>(std::round(
dt /
dtcldcr)), 1);
1201 const Real dtcld =
dt /
static_cast<Real>(wsm6_loops);
1219 for (
int loop = 0; loop < wsm6_loops; ++loop) {
1221 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1222 const Real invden =
Real(1.0) / den_arr(i,j,k);
1223 denfac_arr(i,j,k) = std::sqrt(invden *
Real(den0));
1232 const Real xai = -dldti /
Real(rv);
1234 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1235 const Real tr = ttp / t_arr(i,j,k);
1236 Real qsw =
Real(
psat)*std::exp(std::log(tr)*xa)*std::exp(xb*(
Real(1.0)-tr));
1237 qsw = amrex::min(qsw,
Real(0.99)*p_arr(i,j,k));
1238 qsw =
Real(ep2)*qsw / (p_arr(i,j,k) - qsw);
1239 qsw = amrex::max(qsw,
Real(qmin));
1240 qsatw_arr(i,j,k) = qsw;
1241 rhw_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsw,
Real(qmin));
1242 Real qsi = (t_arr(i,j,k) < ttp)
1243 ?
Real(
psat)*std::exp(std::log(tr)*xai)*std::exp(xbi*(
Real(1.0)-tr))
1244 :
Real(
psat)*std::exp(std::log(tr)*xa )*std::exp(xb *(
Real(1.0)-tr));
1245 qsi = amrex::min(qsi,
Real(0.99)*p_arr(i,j,k));
1246 qsi =
Real(ep2)*qsi / (p_arr(i,j,k) - qsi);
1247 qsi = amrex::max(qsi,
Real(qmin));
1248 qsati_arr(i,j,k) = qsi;
1249 rhi_arr(i,j,k) = amrex::max(
qv_arr(i,j,k)/qsi,
Real(qmin));
1257 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1258 prevp_arr(i,j,k) =
Real(0.0); psdep_arr(i,j,k) =
Real(0.0);
1259 pgdep_arr(i,j,k) =
Real(0.0); praut_arr(i,j,k) =
Real(0.0);
1260 psaut_arr(i,j,k) =
Real(0.0); pgaut_arr(i,j,k) =
Real(0.0);
1261 pracw_arr(i,j,k) =
Real(0.0); praci_arr(i,j,k) =
Real(0.0);
1262 piacr_arr(i,j,k) =
Real(0.0); psaci_arr(i,j,k) =
Real(0.0);
1263 psacw_arr(i,j,k) =
Real(0.0); pracs_arr(i,j,k) =
Real(0.0);
1264 psacr_arr(i,j,k) =
Real(0.0); pgacw_arr(i,j,k) =
Real(0.0);
1265 paacw_arr(i,j,k) =
Real(0.0); pgaci_arr(i,j,k) =
Real(0.0);
1266 pgacr_arr(i,j,k) =
Real(0.0); pgacs_arr(i,j,k) =
Real(0.0);
1267 pigen_arr(i,j,k) =
Real(0.0); pidep_arr(i,j,k) =
Real(0.0);
1268 pcond_arr(i,j,k) =
Real(0.0); psmlt_arr(i,j,k) =
Real(0.0);
1269 pgmlt_arr(i,j,k) =
Real(0.0); pseml_arr(i,j,k) =
Real(0.0);
1270 pgeml_arr(i,j,k) =
Real(0.0); psevp_arr(i,j,k) =
Real(0.0);
1271 pgevp_arr(i,j,k) =
Real(0.0);
1272 fall_r_arr(i,j,k) =
Real(0.0); fall_s_arr(i,j,k) =
Real(0.0);
1273 fall_g_arr(i,j,k) =
Real(0.0); fallc_arr(i,j,k) =
Real(0.0);
1281 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1282 const Real tmp = den_arr(i,j,k)*amrex::max(qi_arr(i,j,k),
Real(qmin));
1283 xni_arr(i,j,k) = amrex::min(
1312 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1313 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1314 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1315 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1318 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1319 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1321 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1322 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1323 work1_r_arr(i,j,k));
1325 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1328 rslopesmax_loc, rslopesbmax_loc,
1329 rslopes2max_loc, rslopes3max_loc,
1331 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1332 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1333 work1_s_arr(i,j,k), dummy_n0sfac);
1335 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1337 rslopegmax_loc, rslopegbmax_loc,
1338 rslopeg2max_loc, rslopeg3max_loc,
1340 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1341 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1342 work1_g_arr(i,j,k));
1343 n0sfac_arr(i,j,k) = dummy_n0sfac;
1346 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1347 const int km_local =
khi - klo + 1;
1349 constexpr
Real qsum_min =
Real(1.0e-15);
1385 for (
int k = klo; k <=
khi; ++k) {
1386 const int kk = k - klo;
1387 den_col(kk) = den_arr(i,j,k);
1388 denfac_col(kk) = denfac_arr(i,j,k);
1389 t_col(kk) = t_arr(i,j,k);
1390 dz_col(kk) = delz_tmp_arr(i,j,k);
1392 qsum_col(kk) = amrex::max(qs_arr(i,j,k) + qg_arr(i,j,k), qsum_min);
1394 worka_col(kk) = (work1_s_arr(i,j,k) * qs_arr(i,j,k)
1395 + work1_g_arr(i,j,k) * qg_arr(i,j,k))
1403 if (qr_arr(i,j,k) <=
Real(0.0)) {
1413 &delqrs1_col, dtcld, 1,
1414 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1416 for (
int k = klo; k <=
khi; ++k) {
1417 const int kk = k - klo;
1418 nislfv_r_diag_arr(i,j,k,0) = amrex::max(
denqrs1_col(kk) / den_col(kk),
Real(0.0));
1420 nislfv_r_diag_arr(i,j,k,2) =
workr_col(kk);
1422 nislfv_r_diag_arr(i,j,k,4) = den_col(kk);
1423 nislfv_r_diag_arr(i,j,k,5) = denfac_col(kk);
1432 &delqrs2_col, &delqrs3_col, dtcld, 1,
1433 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1435 for (
int k = klo; k <=
khi; ++k) {
1436 const int kk = k - klo;
1437 nislfv_sg_diag_arr(i,j,k,0) = amrex::max(
denqrs2_col(kk) / den_col(kk),
Real(0.0));
1438 nislfv_sg_diag_arr(i,j,k,1) = amrex::max(
denqrs3_col(kk) / den_col(kk),
Real(0.0));
1446 for (
int k = klo; k <=
khi; ++k) {
1447 const int kk = k - klo;
1463 delqrs1_arr(i,j,0) = delqrs1_col / delz_arr(i,j,klo) / dtcld;
1464 delqrs2_arr(i,j,0) = delqrs2_col / delz_arr(i,j,klo) / dtcld;
1465 delqrs3_arr(i,j,0) = delqrs3_col / delz_arr(i,j,klo) / dtcld;
1466 fall_r_arr(i,j,klo) = delqrs1_arr(i,j,0);
1467 fall_s_arr(i,j,klo) = delqrs2_arr(i,j,0);
1468 fall_g_arr(i,j,klo) = delqrs3_arr(i,j,0);
1473 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1474 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1475 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1476 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1479 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1480 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1482 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1483 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1484 work1_r_arr(i,j,k));
1486 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1489 rslopesmax_loc, rslopesbmax_loc,
1490 rslopes2max_loc, rslopes3max_loc,
1492 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1493 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1494 work1_s_arr(i,j,k), dummy_n0sfac);
1496 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1498 rslopegmax_loc, rslopegbmax_loc,
1499 rslopeg2max_loc, rslopeg3max_loc,
1501 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1502 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1503 work1_g_arr(i,j,k));
1507 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1508 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1509 n0sfac_arr(i,j,k) = amrex::max(
1514 if (t_arr(i,j,k) >
Real(t0c)) {
1517 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1519 if (qs_arr(i,j,k) >
Real(0.0)) {
1521 rslope2_s_arr(i,j,k) *
1522 std::sqrt(rslope_s_arr(i,j,k) * rslopeb_s_arr(i,j,k));
1525 (
Real(t0c) - t_arr(i,j,k)) * pi_wsm6_loc *
Real(0.5) *
1530 psmlt_arr(i,j,k) = amrex::min(
1531 amrex::max(psmlt_arr(i,j,k) * dtcld,
1534 qs_arr(i,j,k) = qs_arr(i,j,k) + psmlt_arr(i,j,k);
1535 qr_arr(i,j,k) = qr_arr(i,j,k) - psmlt_arr(i,j,k);
1536 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * psmlt_arr(i,j,k);
1539 if (qg_arr(i,j,k) >
Real(0.0)) {
1541 rslope2_g_arr(i,j,k) *
1542 std::sqrt(rslope_g_arr(i,j,k) * rslopeb_g_arr(i,j,k));
1545 (
Real(t0c) - t_arr(i,j,k)) *
1549 pgmlt_arr(i,j,k) = amrex::min(
1550 amrex::max(pgmlt_arr(i,j,k) * dtcld,
1553 qg_arr(i,j,k) = qg_arr(i,j,k) + pgmlt_arr(i,j,k);
1554 qr_arr(i,j,k) = qr_arr(i,j,k) - pgmlt_arr(i,j,k);
1555 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pgmlt_arr(i,j,k);
1561 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1562 if (qi_arr(i,j,k) <=
Real(0.0)) {
1563 work1c_arr(i,j,k) =
Real(0.0);
1565 const Real tmp = den_arr(i,j,k) *
1566 amrex::max(qi_arr(i,j,k),
Real(qmin));
1568 amrex::max(
Real(5.38e7) *
1572 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1573 const Real diameter = amrex::max(
1576 work1c_arr(i,j,k) =
Real(1.49e4) *
1577 std::exp(std::log(diameter) *
Real(1.31));
1579 denqci_arr(i,j,k) = den_arr(i,j,k) * qi_arr(i,j,k);
1582 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1583 const int km_local =
khi - klo + 1;
1604 for (
int k = klo; k <=
khi; ++k) {
1605 const int kk = k - klo;
1606 den_col(kk) = den_arr(i,j,k);
1607 denfac_col(kk) = denfac_arr(i,j,k);
1608 t_col(kk) = t_arr(i,j,k);
1609 dz_col(kk) = delz_tmp_arr(i,j,k);
1618 &delqi_col, dtcld, 0,
1619 sed_cell_scratch_arr, sed_node_scratch_arr, i, j, klo);
1621 for (
int k = klo; k <=
khi; ++k) {
1622 const int kk = k - klo;
1625 qi_arr(i,j,k) = amrex::max(
1629 delqi_arr(i,j,0) = delqi_col / delz_arr(i,j,klo) / dtcld;
1630 fallc_arr(i,j,klo) = delqi_arr(i,j,0);
1634 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
1635 const Real fallsum =
1636 fall_r_arr(i,j,klo) + fall_s_arr(i,j,klo) +
1637 fall_g_arr(i,j,klo) + fallc_arr(i,j,klo);
1638 const Real fallsum_qsi = fall_s_arr(i,j,klo) + fallc_arr(i,j,klo);
1639 const Real fallsum_qg = fall_g_arr(i,j,klo);
1640 const Real precip = delz_arr(i,j,klo) / denr * dtcld *
Real(1000.0);
1642 if (fallsum >
Real(0.0)) {
1643 rainncv_arr(i,j,0) += fallsum * precip;
1644 rainacc_arr(i,j,0) += fallsum * precip;
1646 if (fallsum_qsi >
Real(0.0)) {
1647 tstepsnow_arr(i,j,0) += fallsum_qsi * precip;
1648 snowncv_arr(i,j,0) += fallsum_qsi * precip;
1649 snowacc_arr(i,j,0) += fallsum_qsi * precip;
1651 if (fallsum_qg >
Real(0.0)) {
1652 tstepgraup_arr(i,j,0) += fallsum_qg * precip;
1653 graupelncv_arr(i,j,0) += fallsum_qg * precip;
1654 graupacc_arr(i,j,0) += fallsum_qg * precip;
1656 if (fallsum >
Real(0.0)) {
1658 (snowncv_arr(i,j,0) + graupelncv_arr(i,j,0)) /
1659 (rainncv_arr(i,j,0) +
Real(1.0e-12));
1663 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
1670 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1671 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1675 pimlt_arr(i,j,k) =
Real(0.0);
1676 pihmf_arr(i,j,k) =
Real(0.0);
1677 pihtf_arr(i,j,k) =
Real(0.0);
1678 pgfrz_arr(i,j,k) =
Real(0.0);
1680 if (supcol <
Real(0.0) && qi_arr(i,j,k) >
Real(0.0)) {
1681 pimlt_arr(i,j,k) = qi_arr(i,j,k);
1682 qc_arr(i,j,k) = qc_arr(i,j,k) + qi_arr(i,j,k);
1683 t_arr(i,j,k) = t_arr(i,j,k) -
xlf / cpm_arr(i,j,k) * qi_arr(i,j,k);
1684 qi_arr(i,j,k) =
Real(0.0);
1687 if (supcol >
Real(40.0) && qc_arr(i,j,k) >
Real(0.0)) {
1688 pihmf_arr(i,j,k) = qc_arr(i,j,k);
1689 qi_arr(i,j,k) = qi_arr(i,j,k) + qc_arr(i,j,k);
1690 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * qc_arr(i,j,k);
1691 qc_arr(i,j,k) =
Real(0.0);
1694 if (supcol >
Real(0.0) && qc_arr(i,j,k) >
Real(qmin)) {
1695 const Real supcolt = amrex::min(supcol,
Real(50.0));
1696 const Real pfrzdtc = amrex::min(
1700 qc_arr(i,j,k) * qc_arr(i,j,k) * dtcld,
1702 pihtf_arr(i,j,k) = pfrzdtc;
1703 qi_arr(i,j,k) = qi_arr(i,j,k) + pfrzdtc;
1704 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtc;
1705 qc_arr(i,j,k) = qc_arr(i,j,k) - pfrzdtc;
1708 if (supcol >
Real(0.0) && qr_arr(i,j,k) >
Real(0.0)) {
1709 Real temp = rslope3_r_arr(i,j,k);
1710 temp = temp * temp * rslope_r_arr(i,j,k);
1711 const Real supcolt = amrex::min(supcol,
Real(50.0));
1712 const Real pfrzdtr = amrex::min(
1714 Real(denr) / den_arr(i,j,k) *
1718 pgfrz_arr(i,j,k) = pfrzdtr;
1719 qg_arr(i,j,k) = qg_arr(i,j,k) + pfrzdtr;
1720 t_arr(i,j,k) = t_arr(i,j,k) +
xlf / cpm_arr(i,j,k) * pfrzdtr;
1721 qr_arr(i,j,k) = qr_arr(i,j,k) - pfrzdtr;
1729 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1730 qrs_tmp_r_arr(i,j,k) = qr_arr(i,j,k);
1731 qrs_tmp_s_arr(i,j,k) = qs_arr(i,j,k);
1732 qrs_tmp_g_arr(i,j,k) = qg_arr(i,j,k);
1735 qrs_tmp_r_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1736 pidn0r_loc,
Real(
qcrmin), rslopermax_loc, rsloperbmax_loc,
1738 rslope_r_arr(i,j,k), rslopeb_r_arr(i,j,k),
1739 rslope2_r_arr(i,j,k), rslope3_r_arr(i,j,k),
1740 work1_r_arr(i,j,k));
1742 qrs_tmp_s_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1745 rslopesmax_loc, rslopesbmax_loc,
1746 rslopes2max_loc, rslopes3max_loc,
1748 rslope_s_arr(i,j,k), rslopeb_s_arr(i,j,k),
1749 rslope2_s_arr(i,j,k), rslope3_s_arr(i,j,k),
1750 work1_s_arr(i,j,k), dummy_n0sfac);
1752 qrs_tmp_g_arr(i,j,k), den_arr(i,j,k), denfac_arr(i,j,k),
1754 rslopegmax_loc, rslopegbmax_loc,
1755 rslopeg2max_loc, rslopeg3max_loc,
1757 rslope_g_arr(i,j,k), rslopeb_g_arr(i,j,k),
1758 rslope2_g_arr(i,j,k), rslope3_g_arr(i,j,k),
1759 work1_g_arr(i,j,k));
1760 n0sfac_arr(i,j,k) = dummy_n0sfac;
1767 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1769 xl_arr(i,j,k), p_arr(i,j,k), t_arr(i,j,k),
1770 den_arr(i,j,k), qsatw_arr(i,j,k),
Real(rv));
1772 Real(
xls), p_arr(i,j,k), t_arr(i,j,k),
1773 den_arr(i,j,k), qsati_arr(i,j,k),
Real(rv));
1775 p_arr(i,j,k), t_arr(i,j,k), den_arr(i,j,k),
Real(den0));
1780 const Real dtcld_l = dtcld;
1783 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1784 Real supsat = amrex::max(
qv_arr(i,j,k), qmin_l)
1786 Real satdt = supsat / dtcld_l;
1788 if (qc_arr(i,j,k) >
Real(
qc0)) {
1789 praut_arr(i,j,k) = amrex::min(
1791 qc_arr(i,j,k)/dtcld_l);
1794 if (qr_arr(i,j,k) > qcrmin_l && qc_arr(i,j,k) > qmin_l) {
1795 pracw_arr(i,j,k) = amrex::min(
1797 *rslopeb_r_arr(i,j,k)
1798 *qc_arr(i,j,k)*denfac_arr(i,j,k),
1799 qc_arr(i,j,k)/dtcld_l);
1802 if (qr_arr(i,j,k) >
Real(0.0)) {
1803 Real coeres = rslope2_r_arr(i,j,k)*std::sqrt(
1804 rslope_r_arr(i,j,k)*rslopeb_r_arr(i,j,k));
1805 Real rate = (rhw_arr(i,j,k)-
Real(1.0))
1808 / workdiffw_arr(i,j,k);
1809 if (rate <
Real(0.0)) {
1810 rate = amrex::max(rate, -qr_arr(i,j,k)/dtcld_l);
1811 rate = amrex::max(rate, satdt/
Real(2.0));
1813 rate = amrex::min(rate, satdt/
Real(2.0));
1815 prevp_arr(i,j,k) = rate;
1821 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1822 const Real supcol =
Real(t0c) - t_arr(i,j,k);
1823 n0sfac_arr(i,j,k) = amrex::max(
1830 const Real satdt = supsat / dtcld;
1833 const Real tmp = den_arr(i,j,k)
1834 * amrex::max(qi_arr(i,j,k),
Real(qmin));
1836 xni_arr(i,j,k) = amrex::min(
1837 amrex::max(
Real(5.38e7) * temp,
Real(1.0e3)),
1840 const Real xni = xni_arr(i,j,k);
1841 const Real eacrs = std::exp(
Real(0.07) * (-supcol));
1843 const Real xmi = den_arr(i,j,k) * qi_arr(i,j,k) /
xni;
1844 const Real diameter = amrex::min(
1846 const Real vt2i =
Real(1.49e4) * std::pow(diameter,
Real(1.31));
1848 * denfac_arr(i,j,k);
1850 * denfac_arr(i,j,k);
1852 * denfac_arr(i,j,k);
1854 const Real qsum = amrex::max(qsum_arr(i,j,k),
Real(1.0e-15));
1856 ? (vt2s * qs_arr(i,j,k) + vt2g * qg_arr(i,j,k)) /
qsum
1859 if (supcol >
Real(0.0) && qi_arr(i,j,k) >
Real(qmin)) {
1862 Real(2.0) * rslope3_r_arr(i,j,k)
1863 +
Real(2.0) * diameter * rslope2_r_arr(i,j,k)
1864 + diameter * diameter * rslope_r_arr(i,j,k);
1871 * std::abs(vt2r - vt2i) * acrfac /
Real(4.0);
1872 praci_arr(i,j,k) *= std::pow(
1874 amrex::max(
Real(0.0), qr_arr(i,j,k) / qi_arr(i,j,k)),
1877 praci_arr(i,j,k) = amrex::min(
1878 praci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1883 * rslope3_r_arr(i,j,k) * rslopeb_r_arr(i,j,k)
1884 /
Real(24.0) / den_arr(i,j,k);
1885 piacr_arr(i,j,k) *= std::pow(
1887 amrex::max(
Real(0.0), qi_arr(i,j,k) / qr_arr(i,j,k)),
1890 piacr_arr(i,j,k) = amrex::min(
1891 piacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
1896 Real(2.0) * rslope3_s_arr(i,j,k)
1897 +
Real(2.0) * diameter * rslope2_s_arr(i,j,k)
1898 + diameter * diameter * rslope_s_arr(i,j,k);
1903 psaci_arr(i,j,k) =
Real(
pi) * qi_arr(i,j,k) * eacrs
1904 *
Real(
n0s) * n0sfac_arr(i,j,k)
1905 * std::abs(vt2ave - vt2i) * acrfac /
Real(4.0);
1906 psaci_arr(i,j,k) = amrex::min(
1907 psaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1911 const Real egi = std::exp(
Real(0.07) * (-supcol));
1913 Real(2.0) * rslope3_g_arr(i,j,k)
1914 +
Real(2.0) * diameter * rslope2_g_arr(i,j,k)
1915 + diameter * diameter * rslope_g_arr(i,j,k);
1916 pgaci_arr(i,j,k) =
Real(
pi) * egi * qi_arr(i,j,k)
1917 * n0g_loc * std::abs(vt2ave - vt2i) * acrfac
1919 pgaci_arr(i,j,k) = amrex::min(
1920 pgaci_arr(i,j,k), qi_arr(i,j,k) / dtcld);
1924 if (qs_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1925 psacw_arr(i,j,k) = amrex::min(
1926 Real(
pacrc) * n0sfac_arr(i,j,k) * rslope3_s_arr(i,j,k)
1927 * rslopeb_s_arr(i,j,k)
1930 amrex::max(
Real(0.0), qs_arr(i,j,k) / qc_arr(i,j,k)),
1933 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1934 qc_arr(i,j,k) / dtcld);
1937 if (qg_arr(i,j,k) >
Real(
qcrmin) && qc_arr(i,j,k) >
Real(qmin)) {
1938 pgacw_arr(i,j,k) = amrex::min(
1939 Real(
pacrg) * rslope3_g_arr(i,j,k) * rslopeb_g_arr(i,j,k)
1942 amrex::max(
Real(0.0), qg_arr(i,j,k) / qc_arr(i,j,k)),
1945 * qc_arr(i,j,k) * denfac_arr(i,j,k),
1946 qc_arr(i,j,k) / dtcld);
1950 paacw_arr(i,j,k) = (qs_arr(i,j,k) * psacw_arr(i,j,k)
1951 + qg_arr(i,j,k) * pgacw_arr(i,j,k))
1956 if (supcol >
Real(0.0)) {
1958 Real(5.0) * rslope3_s_arr(i,j,k) * rslope3_s_arr(i,j,k)
1959 * rslope_r_arr(i,j,k)
1960 +
Real(2.0) * rslope3_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1961 * rslope2_r_arr(i,j,k)
1962 +
Real(0.5) * rslope2_s_arr(i,j,k) * rslope2_s_arr(i,j,k)
1963 * rslope3_r_arr(i,j,k);
1969 *
Real(
n0s) * n0sfac_arr(i,j,k)
1970 * std::abs(vt2r - vt2ave) * (
Real(
dens_snow) / den_arr(i,j,k))
1972 pracs_arr(i,j,k) *= std::pow(
1974 amrex::max(
Real(0.0), qr_arr(i,j,k) / qs_arr(i,j,k)),
1977 pracs_arr(i,j,k) = amrex::min(
1978 pracs_arr(i,j,k), qs_arr(i,j,k) / dtcld);
1983 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
1984 * rslope_s_arr(i,j,k)
1985 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
1986 * rslope2_s_arr(i,j,k)
1987 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
1988 * rslope3_s_arr(i,j,k);
1990 *
Real(
n0s) * n0sfac_arr(i,j,k)
1991 * std::abs(vt2ave - vt2r) * (
Real(denr) / den_arr(i,j,k))
1993 psacr_arr(i,j,k) *= std::pow(
1995 amrex::max(
Real(0.0), qs_arr(i,j,k) / qr_arr(i,j,k)),
1998 psacr_arr(i,j,k) = amrex::min(
1999 psacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2004 Real(5.0) * rslope3_r_arr(i,j,k) * rslope3_r_arr(i,j,k)
2005 * rslope_g_arr(i,j,k)
2006 +
Real(2.0) * rslope3_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2007 * rslope2_g_arr(i,j,k)
2008 +
Real(0.5) * rslope2_r_arr(i,j,k) * rslope2_r_arr(i,j,k)
2009 * rslope3_g_arr(i,j,k);
2011 * n0g_loc * std::abs(vt2ave - vt2r)
2012 * (
Real(denr) / den_arr(i,j,k)) * acrfac;
2013 pgacr_arr(i,j,k) *= std::pow(
2015 amrex::max(
Real(0.0), qg_arr(i,j,k) / qr_arr(i,j,k)),
2018 pgacr_arr(i,j,k) = amrex::min(
2019 pgacr_arr(i,j,k), qr_arr(i,j,k) / dtcld);
2024 pgacs_arr(i,j,k) =
Real(0.0);
2027 if (supcol <=
Real(0.0)) {
2029 if (qs_arr(i,j,k) >
Real(0.0)) {
2034 pseml_arr(i,j,k) = amrex::min(
2037 * (paacw_arr(i,j,k) + psacr_arr(i,j,k)) /
xlf,
2038 -qs_arr(i,j,k) / dtcld),
2041 if (qg_arr(i,j,k) >
Real(0.0)) {
2042 pgeml_arr(i,j,k) = amrex::min(
2045 * (paacw_arr(i,j,k) + pgacr_arr(i,j,k)) /
xlf,
2046 -qg_arr(i,j,k) / dtcld),
2051 if (supcol >
Real(0.0)) {
2052 if (qi_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2057 pidep_arr(i,j,k) =
Real(4.0) * diameter *
xni
2058 * (rhi_arr(i,j,k) -
Real(1.0))
2059 / workdiffi_arr(i,j,k);
2060 Real supice = satdt - prevp_arr(i,j,k);
2061 if (pidep_arr(i,j,k) <
Real(0.0)) {
2062 pidep_arr(i,j,k) = amrex::max(
2063 amrex::max(pidep_arr(i,j,k), satdt /
Real(2.0)),
2065 pidep_arr(i,j,k) = amrex::max(
2066 pidep_arr(i,j,k), -qi_arr(i,j,k) / dtcld);
2068 pidep_arr(i,j,k) = amrex::min(
2069 amrex::min(pidep_arr(i,j,k), satdt /
Real(2.0)),
2072 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k))
2073 >= std::abs(satdt)) {
2078 if (qs_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2079 const Real coeres = rslope2_s_arr(i,j,k)
2080 * std::sqrt(rslope_s_arr(i,j,k)
2081 * rslopeb_s_arr(i,j,k));
2082 psdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2086 / workdiffi_arr(i,j,k);
2087 Real supice = satdt - prevp_arr(i,j,k) - pidep_arr(i,j,k);
2088 if (psdep_arr(i,j,k) <
Real(0.0)) {
2089 psdep_arr(i,j,k) = amrex::max(
2090 psdep_arr(i,j,k), -qs_arr(i,j,k) / dtcld);
2091 psdep_arr(i,j,k) = amrex::max(
2092 amrex::max(psdep_arr(i,j,k), satdt /
Real(2.0)),
2095 psdep_arr(i,j,k) = amrex::min(
2096 amrex::min(psdep_arr(i,j,k), satdt /
Real(2.0)),
2099 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2101 >= std::abs(satdt)) {
2106 if (qg_arr(i,j,k) >
Real(0.0) && ifsat != 1) {
2107 const Real coeres = rslope2_g_arr(i,j,k)
2108 * std::sqrt(rslope_g_arr(i,j,k)
2109 * rslopeb_g_arr(i,j,k));
2110 pgdep_arr(i,j,k) = (rhi_arr(i,j,k) -
Real(1.0))
2113 / workdiffi_arr(i,j,k);
2114 Real supice = satdt - prevp_arr(i,j,k)
2115 - pidep_arr(i,j,k) - psdep_arr(i,j,k);
2116 if (pgdep_arr(i,j,k) <
Real(0.0)) {
2117 pgdep_arr(i,j,k) = amrex::max(
2118 pgdep_arr(i,j,k), -qg_arr(i,j,k) / dtcld);
2119 pgdep_arr(i,j,k) = amrex::max(
2120 amrex::max(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2123 pgdep_arr(i,j,k) = amrex::min(
2124 amrex::min(pgdep_arr(i,j,k), satdt /
Real(2.0)),
2127 if (std::abs(prevp_arr(i,j,k) + pidep_arr(i,j,k)
2128 + psdep_arr(i,j,k) + pgdep_arr(i,j,k))
2129 >= std::abs(satdt)) {
2134 if (supsat >
Real(0.0) && ifsat != 1) {
2135 const Real supice = satdt - prevp_arr(i,j,k)
2139 const Real xni0 =
Real(1.0e3) * std::exp(
Real(0.1) * supcol);
2140 const Real roqi0 =
Real(4.92e-11) * std::pow(xni0,
Real(1.33));
2141 pigen_arr(i,j,k) = amrex::max(
2143 (roqi0 / den_arr(i,j,k)
2144 - amrex::max(qi_arr(i,j,k),
Real(0.0))) / dtcld);
2145 pigen_arr(i,j,k) = amrex::min(
2146 amrex::min(pigen_arr(i,j,k), satdt), supice);
2149 if (qi_arr(i,j,k) >
Real(0.0)) {
2155 psaut_arr(i,j,k) = amrex::max(
2156 Real(0.0), (qi_arr(i,j,k) - qimax) / dtcld);
2159 if (qs_arr(i,j,k) >
Real(0.0)) {
2161 * std::exp(
Real(0.09) * (-supcol));
2162 pgaut_arr(i,j,k) = amrex::min(
2165 qs_arr(i,j,k) / dtcld);
2169 if (supcol <
Real(0.0)) {
2170 if (qs_arr(i,j,k) >
Real(0.0)
2171 && rhw_arr(i,j,k) <
Real(1.0)) {
2172 const Real coeres = rslope2_s_arr(i,j,k)
2173 * std::sqrt(rslope_s_arr(i,j,k)
2174 * rslopeb_s_arr(i,j,k));
2179 psevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2183 / workdiffw_arr(i,j,k);
2184 psevp_arr(i,j,k) = amrex::min(
2185 amrex::max(psevp_arr(i,j,k),
2186 -qs_arr(i,j,k) / dtcld),
2190 if (qg_arr(i,j,k) >
Real(0.0)
2191 && rhw_arr(i,j,k) <
Real(1.0)) {
2192 const Real coeres = rslope2_g_arr(i,j,k)
2193 * std::sqrt(rslope_g_arr(i,j,k)
2194 * rslopeb_g_arr(i,j,k));
2195 pgevp_arr(i,j,k) = (rhw_arr(i,j,k) -
Real(1.0))
2198 / workdiffw_arr(i,j,k);
2199 pgevp_arr(i,j,k) = amrex::min(
2200 amrex::max(pgevp_arr(i,j,k),
2201 -qg_arr(i,j,k) / dtcld),
2211 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2217 (qr_arr(i,j,k) <
Real(1.0e-4) && qs_arr(i,j,k) <
Real(1.0e-4))
2220 (qr_arr(i,j,k) <
Real(1.0e-4)) ?
Real(1.0) :
Real(0.0);
2222 if (t_arr(i,j,k) <= t0c_l) {
2225 value = amrex::max(qmin_l, qc_arr(i,j,k));
2226 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2227 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2229 if (source >
value) {
2230 factor =
value / source;
2231 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2232 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2233 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2236 value = amrex::max(qmin_l, qi_arr(i,j,k));
2237 source = (psaut_arr(i,j,k) - pigen_arr(i,j,k)
2238 - pidep_arr(i,j,k) + praci_arr(i,j,k)
2239 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)) * dtcld;
2240 if (source >
value) {
2241 factor =
value / source;
2242 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2243 pigen_arr(i,j,k) = pigen_arr(i,j,k) * factor;
2244 pidep_arr(i,j,k) = pidep_arr(i,j,k) * factor;
2245 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2246 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2247 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2250 value = amrex::max(qmin_l, qr_arr(i,j,k));
2251 source = (-praut_arr(i,j,k) - prevp_arr(i,j,k)
2252 - pracw_arr(i,j,k) + piacr_arr(i,j,k)
2253 + psacr_arr(i,j,k) + pgacr_arr(i,j,k)) * dtcld;
2254 if (source >
value) {
2255 factor =
value / source;
2256 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2257 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2258 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2259 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2260 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2261 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2264 value = amrex::max(qmin_l, qs_arr(i,j,k));
2265 source = -(psdep_arr(i,j,k) + psaut_arr(i,j,k)
2266 - pgaut_arr(i,j,k) + paacw_arr(i,j,k)
2267 + piacr_arr(i,j,k) * delta3
2268 + praci_arr(i,j,k) * delta3
2269 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2270 + psacr_arr(i,j,k) * delta2
2271 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)) * dtcld;
2272 if (source >
value) {
2273 factor =
value / source;
2274 psdep_arr(i,j,k) = psdep_arr(i,j,k) * factor;
2275 psaut_arr(i,j,k) = psaut_arr(i,j,k) * factor;
2276 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2277 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2278 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2279 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2280 psaci_arr(i,j,k) = psaci_arr(i,j,k) * factor;
2281 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2282 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2283 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2286 value = amrex::max(qmin_l, qg_arr(i,j,k));
2287 source = -(pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2288 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2289 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2290 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2291 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2292 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2293 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k)) * dtcld;
2294 if (source >
value) {
2295 factor =
value / source;
2296 pgdep_arr(i,j,k) = pgdep_arr(i,j,k) * factor;
2297 pgaut_arr(i,j,k) = pgaut_arr(i,j,k) * factor;
2298 piacr_arr(i,j,k) = piacr_arr(i,j,k) * factor;
2299 praci_arr(i,j,k) = praci_arr(i,j,k) * factor;
2300 psacr_arr(i,j,k) = psacr_arr(i,j,k) * factor;
2301 pracs_arr(i,j,k) = pracs_arr(i,j,k) * factor;
2302 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2303 pgaci_arr(i,j,k) = pgaci_arr(i,j,k) * factor;
2304 pgacr_arr(i,j,k) = pgacr_arr(i,j,k) * factor;
2305 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2308 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psdep_arr(i,j,k)
2309 + pgdep_arr(i,j,k) + pigen_arr(i,j,k)
2310 + pidep_arr(i,j,k));
2311 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2313 qc_arr(i,j,k) = amrex::max(
2314 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2315 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2318 qr_arr(i,j,k) = amrex::max(
2319 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2320 + prevp_arr(i,j,k) - piacr_arr(i,j,k)
2321 - pgacr_arr(i,j,k) - psacr_arr(i,j,k))
2324 qi_arr(i,j,k) = amrex::max(
2325 qi_arr(i,j,k) - (psaut_arr(i,j,k) + praci_arr(i,j,k)
2326 + psaci_arr(i,j,k) + pgaci_arr(i,j,k)
2327 - pigen_arr(i,j,k) - pidep_arr(i,j,k))
2330 qs_arr(i,j,k) = amrex::max(
2331 qs_arr(i,j,k) + (psdep_arr(i,j,k) + psaut_arr(i,j,k)
2332 + paacw_arr(i,j,k) - pgaut_arr(i,j,k)
2333 + piacr_arr(i,j,k) * delta3
2334 + praci_arr(i,j,k) * delta3
2335 + psaci_arr(i,j,k) - pgacs_arr(i,j,k)
2336 - pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2337 + psacr_arr(i,j,k) * delta2) * dtcld,
2339 qg_arr(i,j,k) = amrex::max(
2340 qg_arr(i,j,k) + (pgdep_arr(i,j,k) + pgaut_arr(i,j,k)
2341 + piacr_arr(i,j,k) * (
Real(1.0) - delta3)
2342 + praci_arr(i,j,k) * (
Real(1.0) - delta3)
2343 + psacr_arr(i,j,k) * (
Real(1.0) - delta2)
2344 + pracs_arr(i,j,k) * (
Real(1.0) - delta2)
2345 + pgaci_arr(i,j,k) + paacw_arr(i,j,k)
2346 + pgacr_arr(i,j,k) + pgacs_arr(i,j,k))
2350 xlwork2 = -
Real(
xls) * (psdep_arr(i,j,k) + pgdep_arr(i,j,k)
2351 + pidep_arr(i,j,k) + pigen_arr(i,j,k))
2352 - xl_arr(i,j,k) * prevp_arr(i,j,k)
2353 -
xlf * (piacr_arr(i,j,k) + paacw_arr(i,j,k)
2354 + paacw_arr(i,j,k) + pgacr_arr(i,j,k)
2355 + psacr_arr(i,j,k));
2356 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2360 value = amrex::max(qmin_l, qc_arr(i,j,k));
2361 source = (praut_arr(i,j,k) + pracw_arr(i,j,k)
2362 + paacw_arr(i,j,k) + paacw_arr(i,j,k)) * dtcld;
2364 if (source >
value) {
2365 factor =
value / source;
2366 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2367 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2368 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2371 value = amrex::max(qmin_l, qr_arr(i,j,k));
2372 source = (-paacw_arr(i,j,k) - praut_arr(i,j,k)
2373 + pseml_arr(i,j,k) + pgeml_arr(i,j,k)
2374 - pracw_arr(i,j,k) - paacw_arr(i,j,k)
2375 - prevp_arr(i,j,k)) * dtcld;
2376 if (source >
value) {
2377 factor =
value / source;
2378 praut_arr(i,j,k) = praut_arr(i,j,k) * factor;
2379 prevp_arr(i,j,k) = prevp_arr(i,j,k) * factor;
2380 pracw_arr(i,j,k) = pracw_arr(i,j,k) * factor;
2381 paacw_arr(i,j,k) = paacw_arr(i,j,k) * factor;
2382 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2383 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2386 value = amrex::max(qcrmin_l, qs_arr(i,j,k));
2387 source = (pgacs_arr(i,j,k) - pseml_arr(i,j,k)
2388 - psevp_arr(i,j,k)) * dtcld;
2389 if (source >
value) {
2390 factor =
value / source;
2391 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2392 psevp_arr(i,j,k) = psevp_arr(i,j,k) * factor;
2393 pseml_arr(i,j,k) = pseml_arr(i,j,k) * factor;
2396 value = amrex::max(qcrmin_l, qg_arr(i,j,k));
2397 source = -(pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2398 + pgeml_arr(i,j,k)) * dtcld;
2399 if (source >
value) {
2400 factor =
value / source;
2401 pgacs_arr(i,j,k) = pgacs_arr(i,j,k) * factor;
2402 pgevp_arr(i,j,k) = pgevp_arr(i,j,k) * factor;
2403 pgeml_arr(i,j,k) = pgeml_arr(i,j,k) * factor;
2406 work2_arr(i,j,k) = -(prevp_arr(i,j,k) + psevp_arr(i,j,k)
2407 + pgevp_arr(i,j,k));
2408 qv_arr(i,j,k) =
qv_arr(i,j,k) + work2_arr(i,j,k) * dtcld;
2410 qc_arr(i,j,k) = amrex::max(
2411 qc_arr(i,j,k) - (praut_arr(i,j,k) + pracw_arr(i,j,k)
2412 + paacw_arr(i,j,k) + paacw_arr(i,j,k))
2415 qr_arr(i,j,k) = amrex::max(
2416 qr_arr(i,j,k) + (praut_arr(i,j,k) + pracw_arr(i,j,k)
2417 + prevp_arr(i,j,k) + paacw_arr(i,j,k)
2418 + paacw_arr(i,j,k) - pseml_arr(i,j,k)
2419 - pgeml_arr(i,j,k)) * dtcld,
2421 qs_arr(i,j,k) = amrex::max(
2422 qs_arr(i,j,k) + (psevp_arr(i,j,k) - pgacs_arr(i,j,k)
2423 + pseml_arr(i,j,k)) * dtcld,
2425 qg_arr(i,j,k) = amrex::max(
2426 qg_arr(i,j,k) + (pgacs_arr(i,j,k) + pgevp_arr(i,j,k)
2427 + pgeml_arr(i,j,k)) * dtcld,
2430 xlwork2 = -xl_arr(i,j,k) * (prevp_arr(i,j,k)
2433 -
xlf * (pseml_arr(i,j,k) + pgeml_arr(i,j,k));
2434 t_arr(i,j,k) = t_arr(i,j,k) - xlwork2 / cpm_arr(i,j,k) * dtcld;
2442 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2448 Real tr = ttp / t_arr(i,j,k);
2450 * std::exp(xb * (
Real(1.0) - tr));
2451 qsw = amrex::min(qsw,
Real(0.99) * p_arr(i,j,k));
2452 qsatw_arr(i,j,k) =
Real(ep2) * qsw / (p_arr(i,j,k) - qsw);
2453 qsatw_arr(i,j,k) = amrex::max(qsatw_arr(i,j,k),
Real(qmin));
2461 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2463 t_arr(i,j,k),
qv_arr(i,j,k), qsatw_arr(i,j,k),
2464 xl_arr(i,j,k), cpm_arr(i,j,k),
Real(qmin),
Real(rv));
2465 const Real work2loc = qc_arr(i,j,k) + workcond;
2466 static_cast<void>(work2loc);
2467 pcond_arr(i,j,k) = amrex::min(
2468 amrex::max(workcond / dtcld,
Real(0.0)),
2469 amrex::max(
qv_arr(i,j,k),
Real(0.0)) / dtcld);
2470 if (qc_arr(i,j,k) >
Real(0.0) && workcond <
Real(0.0)) {
2471 pcond_arr(i,j,k) = amrex::max(workcond, -qc_arr(i,j,k)) / dtcld;
2473 qv_arr(i,j,k) =
qv_arr(i,j,k) - pcond_arr(i,j,k) * dtcld;
2474 qc_arr(i,j,k) = amrex::max(
2475 qc_arr(i,j,k) + pcond_arr(i,j,k) * dtcld,
2477 t_arr(i,j,k) = t_arr(i,j,k)
2478 + pcond_arr(i,j,k) * xl_arr(i,j,k)
2479 / cpm_arr(i,j,k) * dtcld;
2487 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
2488 if (qc_arr(i,j,k) <=
Real(qmin)) qc_arr(i,j,k) =
Real(0.0);
2489 if (qi_arr(i,j,k) <=
Real(qmin)) qi_arr(i,j,k) =
Real(0.0);
2493 #ifdef ERF_USE_WSM6_FORT
2496 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
2497 rain_arr(i,j,klo) = rainacc_arr(i,j,0);
2498 snow_arr(i,j,klo) = snowacc_arr(i,j,0);
2499 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:30
constexpr amrex::Real lat_vap
Definition: ERF_Constants.H:104
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:31
constexpr amrex::Real lsub
Definition: ERF_Constants.H:87
constexpr amrex::Real rhoh2o
Definition: ERF_Constants.H:113
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real lat_ice
Definition: ERF_Constants.H:105
constexpr amrex::Real rhos
Definition: ERF_Constants.H:48
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:40
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:33
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:32
constexpr amrex::Real R_d
Definition: ERF_Constants.H:29
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
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