376 amrex::Real dt = dt_advance;
381 const amrex::Box& box = mfi.tilebox();
409 const int ilo = box.loVect()[0];
410 const int ihi = box.hiVect()[0];
411 const int jlo = box.loVect()[1];
412 const int jhi = box.hiVect()[1];
413 const int klo = box.loVect()[2];
414 const int khi = box.hiVect()[2];
416 amrex::Box grown_box(box); grown_box.grow(3);
417 #ifdef ERF_USE_MORR_FORT
418 const int ilom = grown_box.loVect()[0];
419 const int ihim = grown_box.hiVect()[0];
420 const int jlom = grown_box.loVect()[1];
421 const int jhim = grown_box.hiVect()[1];
422 const int klom = grown_box.loVect()[2];
423 const int khim = grown_box.hiVect()[2];
427 FArrayBox pii_fab(grown_box, 1);
428 auto const& pii_arr = pii_fab.array();
430 const amrex::Real
p0 = 100000.0;
432 const amrex::Real rdcp =
m_rdOcp;
435 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
438 pii_arr(i,j,k) = std::pow((pres_arr(i,j,k)) /
p0, rdcp);
442 FArrayBox dz_fab(grown_box, 1);
443 auto const& dz_arr = dz_fab.array();
447 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
448 dz_arr(i,j,k) = dz_val;
450 amrex::Box grown_boxD(grown_box); grown_boxD.makeSlab(2,0);
453 FArrayBox rainncv_fab(grown_boxD, 1);
454 FArrayBox sr_fab(grown_boxD, 1);
455 FArrayBox snowncv_fab(grown_boxD, 1);
456 FArrayBox graupelncv_fab(grown_boxD, 1);
458 auto const& rainncv_arr = rainncv_fab.array();
459 auto const& sr_arr = sr_fab.array();
460 auto const& snowncv_arr = snowncv_fab.array();
461 auto const& graupelncv_arr = graupelncv_fab.array();
464 ParallelFor(grown_boxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
465 rainncv_arr(i,j,k) = 0.0;
467 snowncv_arr(i,j,k) = 0.0;
468 graupelncv_arr(i,j,k) = 0.0;
472 FArrayBox ht_fab(amrex::Box(amrex::IntVect(ilo, jlo, 0), amrex::IntVect(ihi, jhi, 0)), 1);
473 [[maybe_unused]]
auto const& ht_arr = ht_fab.array();
474 ParallelFor(amrex::Box(amrex::IntVect(ilo, jlo, 0), amrex::IntVect(ihi, jhi, 0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
479 FArrayBox qrcuten_fab(grown_box, 1);
480 FArrayBox qscuten_fab(grown_box, 1);
481 FArrayBox qicuten_fab(grown_box, 1);
482 auto const& qrcuten_arr = qrcuten_fab.array();
483 auto const& qscuten_arr = qscuten_fab.array();
484 auto const& qicuten_arr = qicuten_fab.array();
487 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
488 qrcuten_arr(i,j,k) = 0.0;
489 qscuten_arr(i,j,k) = 0.0;
490 qicuten_arr(i,j,k) = 0.0;
493 #ifdef ERF_USE_MORR_FORT
495 bool flag_qndrop =
false;
498 FArrayBox rainprod_fab(grown_box, 1);
499 FArrayBox evapprod_fab(grown_box, 1);
500 FArrayBox qlsink_fab(grown_box, 1);
501 FArrayBox precr_fab(grown_box, 1);
502 FArrayBox preci_fab(grown_box, 1);
503 FArrayBox precs_fab(grown_box, 1);
504 FArrayBox precg_fab(grown_box, 1);
506 auto const& rainprod_arr = rainprod_fab.array();
507 auto const& evapprod_arr = evapprod_fab.array();
508 auto const& qlsink_arr = qlsink_fab.array();
509 auto const& precr_arr = precr_fab.array();
510 auto const& preci_arr = preci_fab.array();
511 auto const& precs_arr = precs_fab.array();
512 auto const& precg_arr = precg_fab.array();
515 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
516 rainprod_arr(i,j,k) = 0.0;
517 evapprod_arr(i,j,k) = 0.0;
518 qlsink_arr(i,j,k) = 0.0;
519 precr_arr(i,j,k) = 0.0;
520 preci_arr(i,j,k) = 0.0;
521 precs_arr(i,j,k) = 0.0;
522 precg_arr(i,j,k) = 0.0;
527 FArrayBox lamc_fab(grown_box, 1);
528 FArrayBox lami_fab(grown_box, 1);
529 FArrayBox lams_fab(grown_box, 1);
530 FArrayBox lamr_fab(grown_box, 1);
531 FArrayBox lamg_fab(grown_box, 1);
532 FArrayBox cdist1_fab(grown_box, 1);
533 FArrayBox n0i_fab(grown_box, 1);
534 FArrayBox n0s_fab(grown_box, 1);
535 FArrayBox n0r_fab(grown_box, 1);
536 FArrayBox n0g_fab(grown_box, 1);
537 FArrayBox pgam_fab(grown_box, 1);
540 auto const& lamc = lamc_fab.array();
541 auto const& lami = lami_fab.array();
542 auto const& lams = lams_fab.array();
543 auto const& lamr = lamr_fab.array();
544 auto const& lamg = lamg_fab.array();
545 auto const& cdist1 = cdist1_fab.array();
546 auto const& n0i = n0i_fab.array();
547 auto const& n0s = n0s_fab.array();
548 auto const& n0r = n0r_fab.array();
549 auto const& n0g = n0g_fab.array();
550 auto const& pgam = pgam_fab.array();
553 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
567 #ifdef ERF_USE_MORR_FORT
570 double dummy_reflectivity = 0.0;
571 double* dummy_reflectivity_ptr = &dummy_reflectivity;
581 [[maybe_unused]]
int m_ibase = 2;
582 [[maybe_unused]]
int m_isub = 0;
594 [[maybe_unused]]
bool m_do_radar_ref =
false;
601 [[maybe_unused]] amrex::Real m_cp;
613 amrex::Real m_ai, m_bi;
614 [[maybe_unused]] amrex::Real m_ac, m_bc;
615 amrex::Real m_as, m_bs;
616 amrex::Real m_ar, m_br;
617 amrex::Real m_ag, m_bg;
630 amrex::Real m_qsmall;
638 amrex::Real m_ci, m_di;
639 amrex::Real m_cs, m_ds;
640 amrex::Real m_cg, m_dg;
643 amrex::Real m_lammaxi, m_lammini;
644 amrex::Real m_lammaxr, m_lamminr;
645 amrex::Real m_lammaxs, m_lammins;
646 amrex::Real m_lammaxg, m_lamming;
649 amrex::Real m_ndcnst = 250.0;
652 [[maybe_unused]] amrex::Real m_k1;
653 [[maybe_unused]] amrex::Real m_c1;
656 [[maybe_unused]] amrex::Real m_mw;
657 [[maybe_unused]] amrex::Real m_osm;
658 [[maybe_unused]] amrex::Real m_vi;
659 [[maybe_unused]] amrex::Real m_epsm;
660 [[maybe_unused]] amrex::Real m_rhoa;
661 [[maybe_unused]] amrex::Real m_map;
662 [[maybe_unused]] amrex::Real m_ma;
663 [[maybe_unused]] amrex::Real m_rr;
664 [[maybe_unused]] amrex::Real m_bact;
665 [[maybe_unused]] amrex::Real m_rm1;
666 [[maybe_unused]] amrex::Real m_rm2;
667 amrex::Real m_nanew1;
668 amrex::Real m_nanew2;
669 [[maybe_unused]] amrex::Real m_sig1;
670 [[maybe_unused]] amrex::Real m_sig2;
671 [[maybe_unused]] amrex::Real m_f11;
672 [[maybe_unused]] amrex::Real m_f12;
673 [[maybe_unused]] amrex::Real m_f21;
674 [[maybe_unused]] amrex::Real m_f22;
677 amrex::Real m_cons1, m_cons2, m_cons3, m_cons4, m_cons5;
678 amrex::Real m_cons6, m_cons7, m_cons8, m_cons9, m_cons10;
679 amrex::Real m_cons11, m_cons12, m_cons13, m_cons14, m_cons15;
680 amrex::Real m_cons16, m_cons17, m_cons18, m_cons19, m_cons20;
681 amrex::Real m_cons21, m_cons22, m_cons23, m_cons24, m_cons25;
682 amrex::Real m_cons26, m_cons27, m_cons28, m_cons29; [[maybe_unused]] amrex::Real m_cons30;
683 amrex::Real m_cons31, m_cons32, m_cons34, m_cons35; [[maybe_unused]] amrex::Real m_cons33;
684 amrex::Real m_cons36, m_cons37, m_cons38, m_cons39, m_cons40;
685 amrex::Real m_cons41;
690 m_pi = 3.1415926535897932384626434;
695 m_cp = 7.0*287.0/2.0;
697 m_ep_2 = m_Rd / m_Rv;
700 m_rhosu = 85000.0/(287.15*273.15);
747 m_mi0 = 4.0/3.0*m_pi*m_rhoi*std::pow(10.0E-6, 3);
767 m_ci = m_rhoi * m_pi / 6.0;
769 m_cs = m_rhosn * m_pi / 6.0;
771 m_cg = m_rhog * m_pi / 6.0;
778 m_mmult = 4.0/3.0*m_pi*m_rhoi*std::pow(5.0E-6, 3);
782 m_lammaxi = 1.0/1.0E-6;
783 m_lammini = 1.0/(2.0*m_dcs + 100.0E-6);
784 m_lammaxr = 1.0/20.0E-6;
785 m_lamminr = 1.0/2800.0E-6;
786 m_lammaxs = 1.0/10.0E-6;
787 m_lammins = 1.0/2000.0E-6;
788 m_lammaxg = 1.0/20.0E-6;
789 m_lamming = 1.0/2000.0E-6;
810 m_bact = m_vi * m_osm * m_epsm * m_mw * m_rhoa / (m_map * m_rhow);
818 m_f11 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig1), 2));
819 m_f21 = 1.0 + 0.25 * std::log(m_sig1);
825 m_f12 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig2), 2));
826 m_f22 = 1.0 + 0.25 * std::log(m_sig2);
844 m_cons15 = -1108.0 * m_eii * std::pow(m_pi, (1.0-m_bs)/3.0) *
845 std::pow(m_rhosn, (-2.0-m_bs)/3.0) / (4.0*720.0);
847 m_cons17 = 4.0 * 2.0 * 3.0 * m_rhosu * m_pi * m_eci * m_eci *
849 m_cons18 = m_rhosn * m_rhosn;
850 m_cons19 = m_rhow * m_rhow;
851 m_cons20 = 20.0 * m_pi * m_pi * m_rhow * m_bimm;
852 m_cons21 = 4.0 / (m_dcs * m_rhoi);
853 m_cons22 = m_pi * m_rhoi * std::pow(m_dcs, 3) / 6.0;
856 m_cons25 = m_pi * m_pi / 24.0 * m_rhow * m_ecr *
gamma_function(m_br + 6.0);
857 m_cons26 = m_pi / 6.0 * m_rhow;
860 m_cons29 = 4.0/3.0 * m_pi * m_rhow * std::pow(25.0E-6, 3);
861 m_cons30 = 4.0/3.0 * m_pi * m_rhow;
862 m_cons31 = m_pi * m_pi * m_ecr * m_rhosn;
863 m_cons32 = m_pi / 2.0 * m_ecr;
864 m_cons33 = m_pi * m_pi * m_ecr * m_rhog;
865 m_cons34 = 5.0/2.0 + m_br/2.0;
866 m_cons35 = 5.0/2.0 + m_bs/2.0;
867 m_cons36 = 5.0/2.0 + m_bg/2.0;
868 m_cons37 = 4.0 * m_pi * 1.38E-23 / (6.0 * m_pi * m_rin);
869 m_cons38 = m_pi * m_pi / 3.0 * m_rhow;
870 m_cons39 = m_pi * m_pi / 36.0 * m_rhow * m_bimm;
871 m_cons40 = m_pi / 6.0 * m_bimm;
872 m_cons41 = m_pi * m_pi * m_ecr * m_rhow;
893 m_bact = m_vi * m_osm * m_epsm * m_mw * m_rhoa / (m_map * m_rhow);
900 m_f11 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig1), 2));
901 m_f21 = 1.0 + 0.25 * std::log(m_sig1);
907 m_f12 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig2), 2));
908 m_f22 = 1.0 + 0.25 * std::log(m_sig2);
922 m_do_radar_ref =
false;
923 amrex::Box boxD(box); boxD.makeSlab(2,0);
927 bool run_morr_cpp =
true;
929 bool use_morr_cpp_answer =
true;
930 pp.query(
"use_morr_cpp_answer", use_morr_cpp_answer);
931 Print() <<
"use_morr_cpp_answer" << use_morr_cpp_answer <<std::endl;
933 bool run_morr_fort = !use_morr_cpp_answer;
935 std::string filename = std::string(
"output_cpp") + std::to_string(use_morr_cpp_answer) +
".txt";
940 FArrayBox qc3dten_fab(grown_box, 1);
941 FArrayBox qi3dten_fab(grown_box, 1);
942 FArrayBox qni3dten_fab(grown_box, 1);
943 FArrayBox qr3dten_fab(grown_box, 1);
944 FArrayBox ni3dten_fab(grown_box, 1);
945 FArrayBox ns3dten_fab(grown_box, 1);
946 FArrayBox nr3dten_fab(grown_box, 1);
949 auto const& qc3dten = qc3dten_fab.array();
950 auto const& qi3dten = qi3dten_fab.array();
951 auto const& qni3dten = qni3dten_fab.array();
952 auto const& qr3dten = qr3dten_fab.array();
953 auto const& ni3dten = ni3dten_fab.array();
954 auto const& ns3dten = ns3dten_fab.array();
955 auto const& nr3dten = nr3dten_fab.array();
958 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
959 qc3dten(i,j,k) = 0.0;
960 qi3dten(i,j,k) = 0.0;
961 qni3dten(i,j,k) = 0.0;
962 qr3dten(i,j,k) = 0.0;
963 ni3dten(i,j,k) = 0.0;
964 ns3dten(i,j,k) = 0.0;
965 nr3dten(i,j,k) = 0.0;
969 FArrayBox qc3d_fab(grown_box, 1);
970 FArrayBox qi3d_fab(grown_box, 1);
971 FArrayBox qni3d_fab(grown_box, 1);
972 FArrayBox qr3d_fab(grown_box, 1);
973 FArrayBox ni3d_fab(grown_box, 1);
974 FArrayBox ns3d_fab(grown_box, 1);
975 FArrayBox nr3d_fab(grown_box, 1);
978 auto const& qc3d = qc3d_fab.array();
979 auto const& qi3d = qi3d_fab.array();
980 auto const& qni3d = qni3d_fab.array();
981 auto const& qr3d = qr3d_fab.array();
982 auto const& ni3d = ni3d_fab.array();
983 auto const& ns3d = ns3d_fab.array();
984 auto const& nr3d = nr3d_fab.array();
987 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
998 FArrayBox t3dten_fab(grown_box, 1);
999 FArrayBox qv3dten_fab(grown_box, 1);
1000 FArrayBox t3d_fab(grown_box, 1);
1001 FArrayBox qv3d_fab(grown_box, 1);
1002 FArrayBox pres_fab(grown_box, 1);
1003 FArrayBox dzq_fab(grown_box, 1);
1004 FArrayBox w3d_fab(grown_box, 1);
1007 FArrayBox nc3d_fab(grown_box, 1);
1008 FArrayBox nc3dten_fab(grown_box, 1);
1011 FArrayBox qg3dten_fab(grown_box, 1);
1012 FArrayBox ng3dten_fab(grown_box, 1);
1013 FArrayBox qg3d_fab(grown_box, 1);
1014 FArrayBox ng3d_fab(grown_box, 1);
1017 FArrayBox qgsten_fab(grown_box, 1);
1018 FArrayBox qrsten_fab(grown_box, 1);
1019 FArrayBox qisten_fab(grown_box, 1);
1020 FArrayBox qnisten_fab(grown_box, 1);
1021 FArrayBox qcsten_fab(grown_box, 1);
1024 FArrayBox qrcu1d_fab(grown_box, 1);
1025 FArrayBox qscu1d_fab(grown_box, 1);
1026 FArrayBox qicu1d_fab(grown_box, 1);
1029 auto const& t3dten = t3dten_fab.array();
1030 auto const& qv3dten = qv3dten_fab.array();
1031 auto const& t3d = t3d_fab.array();
1032 auto const& qv3d = qv3d_fab.array();
1033 auto const&
pres = pres_fab.array();
1034 auto const& dzq = dzq_fab.array();
1035 auto const& w3d = w3d_fab.array();
1038 auto const& nc3d = nc3d_fab.array();
1039 auto const& nc3dten = nc3dten_fab.array();
1042 auto const& qg3dten = qg3dten_fab.array();
1043 auto const& ng3dten = ng3dten_fab.array();
1044 auto const& qg3d = qg3d_fab.array();
1045 auto const& ng3d = ng3d_fab.array();
1048 auto const& qgsten = qgsten_fab.array();
1049 auto const& qrsten = qrsten_fab.array();
1050 auto const& qisten = qisten_fab.array();
1051 auto const& qnisten = qnisten_fab.array();
1052 auto const& qcsten = qcsten_fab.array();
1055 auto const& qrcu1d = qrcu1d_fab.array();
1056 auto const& qscu1d = qscu1d_fab.array();
1057 auto const& qicu1d = qicu1d_fab.array();
1060 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1061 t3dten(i,j,k) = 0.0;
1062 qv3dten(i,j,k) = 0.0;
1063 nc3dten(i,j,k) = 0.0;
1064 qg3dten(i,j,k) = 0.0;
1065 ng3dten(i,j,k) = 0.0;
1066 qgsten(i,j,k) = 0.0;
1067 qrsten(i,j,k) = 0.0;
1068 qisten(i,j,k) = 0.0;
1069 qnisten(i,j,k) = 0.0;
1070 qcsten(i,j,k) = 0.0;
1074 FArrayBox precrt_fab(grown_box, 1);
1075 FArrayBox snowrt_fab(grown_box, 1);
1076 FArrayBox snowprt_fab(grown_box, 1);
1077 FArrayBox grplprt_fab(grown_box, 1);
1080 FArrayBox effc_fab(grown_box, 1);
1081 FArrayBox effi_fab(grown_box, 1);
1082 FArrayBox effs_fab(grown_box, 1);
1083 FArrayBox effr_fab(grown_box, 1);
1084 FArrayBox effg_fab(grown_box, 1);
1087 auto const& precrt = precrt_fab.array();
1088 auto const& snowrt = snowrt_fab.array();
1089 auto const& snowprt = snowprt_fab.array();
1090 auto const& grplprt = grplprt_fab.array();
1093 auto const& effc = effc_fab.array();
1094 auto const& effi = effi_fab.array();
1095 auto const& effs = effs_fab.array();
1096 auto const& effr = effr_fab.array();
1097 auto const& effg = effg_fab.array();
1100 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1101 precrt(i,j,k) = 0.0;
1102 snowrt(i,j,k) = 0.0;
1103 snowprt(i,j,k) = 0.0;
1104 grplprt(i,j,k) = 0.0;
1113 FArrayBox rho_fab(grown_box, 1);
1114 FArrayBox mu_fab(grown_box, 1);
1115 FArrayBox ain_fab(grown_box, 1);
1116 FArrayBox arn_fab(grown_box, 1);
1117 FArrayBox asn_fab(grown_box, 1);
1118 FArrayBox acn_fab(grown_box, 1);
1119 FArrayBox agn_fab(grown_box, 1);
1122 auto const&
rho = rho_fab.array();
1123 auto const& mu = mu_fab.array();
1124 auto const& ain = ain_fab.array();
1125 auto const& arn = arn_fab.array();
1126 auto const& asn = asn_fab.array();
1127 auto const& acn = acn_fab.array();
1128 auto const& agn = agn_fab.array();
1131 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1142 FArrayBox dumi_fab(grown_box, 1);
1143 FArrayBox dumr_fab(grown_box, 1);
1144 FArrayBox dumfni_fab(grown_box, 1);
1145 FArrayBox dumg_fab(grown_box, 1);
1146 FArrayBox dumfng_fab(grown_box, 1);
1147 FArrayBox uni_fab(grown_box, 1);
1148 FArrayBox umi_fab(grown_box, 1);
1149 FArrayBox umr_fab(grown_box, 1);
1150 FArrayBox fr_fab(grown_box, 1);
1151 FArrayBox fi_fab(grown_box, 1);
1152 FArrayBox fni_fab(grown_box, 1);
1153 FArrayBox fg_fab(grown_box, 1);
1154 FArrayBox fng_fab(grown_box, 1);
1155 FArrayBox rgvm_fab(grown_box, 1);
1156 FArrayBox faloutr_fab(grown_box, 1);
1157 FArrayBox falouti_fab(grown_box, 1);
1158 FArrayBox faloutni_fab(grown_box, 1);
1159 FArrayBox faltndr_fab(grown_box, 1);
1160 FArrayBox faltndi_fab(grown_box, 1);
1161 FArrayBox faltndni_fab(grown_box, 1);
1162 FArrayBox dumqs_fab(grown_box, 1);
1163 FArrayBox dumfns_fab(grown_box, 1);
1164 FArrayBox ums_fab(grown_box, 1);
1165 FArrayBox uns_fab(grown_box, 1);
1166 FArrayBox fs_fab(grown_box, 1);
1167 FArrayBox fns_fab(grown_box, 1);
1168 FArrayBox falouts_fab(grown_box, 1);
1169 FArrayBox faloutns_fab(grown_box, 1);
1170 FArrayBox faloutg_fab(grown_box, 1);
1171 FArrayBox faloutng_fab(grown_box, 1);
1172 FArrayBox faltnds_fab(grown_box, 1);
1173 FArrayBox faltndns_fab(grown_box, 1);
1174 FArrayBox unr_fab(grown_box, 1);
1175 FArrayBox faltndg_fab(grown_box, 1);
1176 FArrayBox faltndng_fab(grown_box, 1);
1177 FArrayBox dumc_fab(grown_box, 1);
1178 FArrayBox dumfnc_fab(grown_box, 1);
1179 FArrayBox unc_fab(grown_box, 1);
1180 FArrayBox umc_fab(grown_box, 1);
1181 FArrayBox ung_fab(grown_box, 1);
1182 FArrayBox umg_fab(grown_box, 1);
1183 FArrayBox fc_fab(grown_box, 1);
1184 FArrayBox faloutc_fab(grown_box, 1);
1185 FArrayBox faloutnc_fab(grown_box, 1);
1186 FArrayBox faltndc_fab(grown_box, 1);
1187 FArrayBox faltndnc_fab(grown_box, 1);
1188 FArrayBox fnc_fab(grown_box, 1);
1189 FArrayBox dumfnr_fab(grown_box, 1);
1190 FArrayBox faloutnr_fab(grown_box, 1);
1191 FArrayBox faltndnr_fab(grown_box, 1);
1192 FArrayBox fnr_fab(grown_box, 1);
1193 FArrayBox dlams_fab(grown_box, 1);
1194 FArrayBox dlamr_fab(grown_box, 1);
1195 FArrayBox dlami_fab(grown_box, 1);
1196 FArrayBox dlamc_fab(grown_box, 1);
1197 FArrayBox dlamg_fab(grown_box, 1);
1200 auto const& dumi = dumi_fab.array();
1201 auto const& dumr = dumr_fab.array();
1202 auto const& dumfni = dumfni_fab.array();
1203 auto const& dumg = dumg_fab.array();
1204 auto const& dumfng = dumfng_fab.array();
1205 auto const& uni = uni_fab.array();
1206 auto const& umi = umi_fab.array();
1207 auto const& umr = umr_fab.array();
1208 auto const& fr = fr_fab.array();
1209 auto const& fi = fi_fab.array();
1210 auto const& fni = fni_fab.array();
1211 auto const& fg = fg_fab.array();
1212 auto const& fng = fng_fab.array();
1213 auto const& rgvm = rgvm_fab.array();
1214 auto const& faloutr = faloutr_fab.array();
1215 auto const& falouti = falouti_fab.array();
1216 auto const& faloutni = faloutni_fab.array();
1217 auto const& faltndr = faltndr_fab.array();
1218 auto const& faltndi = faltndi_fab.array();
1219 auto const& faltndni = faltndni_fab.array();
1220 auto const& dumqs = dumqs_fab.array();
1221 auto const& dumfns = dumfns_fab.array();
1222 auto const& ums = ums_fab.array();
1223 auto const& uns = uns_fab.array();
1224 auto const& fs = fs_fab.array();
1225 auto const& fns = fns_fab.array();
1226 auto const& falouts = falouts_fab.array();
1227 auto const& faloutns = faloutns_fab.array();
1228 auto const& faloutg = faloutg_fab.array();
1229 auto const& faloutng = faloutng_fab.array();
1230 auto const& faltnds = faltnds_fab.array();
1231 auto const& faltndns = faltndns_fab.array();
1232 auto const& unr = unr_fab.array();
1233 auto const& faltndg = faltndg_fab.array();
1234 auto const& faltndng = faltndng_fab.array();
1235 auto const& dumc = dumc_fab.array();
1236 auto const& dumfnc = dumfnc_fab.array();
1237 auto const& unc = unc_fab.array();
1238 auto const& umc = umc_fab.array();
1239 auto const& ung = ung_fab.array();
1240 auto const& umg = umg_fab.array();
1241 auto const& fc = fc_fab.array();
1242 auto const& faloutc = faloutc_fab.array();
1243 auto const& faloutnc = faloutnc_fab.array();
1244 auto const& faltndc = faltndc_fab.array();
1245 auto const& faltndnc = faltndnc_fab.array();
1246 auto const& fnc = fnc_fab.array();
1247 auto const& dumfnr = dumfnr_fab.array();
1248 auto const& faloutnr = faloutnr_fab.array();
1249 auto const& faltndnr = faltndnr_fab.array();
1250 auto const& fnr = fnr_fab.array();
1251 auto const& dlams = dlams_fab.array();
1252 auto const& dlamr = dlamr_fab.array();
1253 auto const& dlami = dlami_fab.array();
1254 auto const& dlamc = dlamc_fab.array();
1255 auto const& dlamg = dlamg_fab.array();
1258 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1266 dumfni(i,j,k) = 0.0;
1268 dumfng(i,j,k) = 0.0;
1278 faloutr(i,j,k) = 0.0;
1279 falouti(i,j,k) = 0.0;
1280 faloutni(i,j,k) = 0.0;
1281 faltndr(i,j,k) = 0.0;
1282 faltndi(i,j,k) = 0.0;
1283 faltndni(i,j,k) = 0.0;
1285 dumfns(i,j,k) = 0.0;
1290 falouts(i,j,k) = 0.0;
1291 faloutns(i,j,k) = 0.0;
1292 faloutg(i,j,k) = 0.0;
1293 faloutng(i,j,k) = 0.0;
1294 faltnds(i,j,k) = 0.0;
1295 faltndns(i,j,k) = 0.0;
1297 faltndg(i,j,k) = 0.0;
1298 faltndng(i,j,k) = 0.0;
1300 dumfnc(i,j,k) = 0.0;
1306 faloutc(i,j,k) = 0.0;
1307 faloutnc(i,j,k) = 0.0;
1308 faltndc(i,j,k) = 0.0;
1309 faltndnc(i,j,k) = 0.0;
1311 dumfnr(i,j,k) = 0.0;
1312 faloutnr(i,j,k) = 0.0;
1313 faltndnr(i,j,k) = 0.0;
1318 FArrayBox xxls_fab(grown_box, 1);
1319 FArrayBox xxlv_fab(grown_box, 1);
1320 FArrayBox cpm_fab(grown_box, 1);
1321 FArrayBox xlf_fab(grown_box, 1);
1324 auto const& xxls = xxls_fab.array();
1325 auto const& xxlv = xxlv_fab.array();
1326 auto const& cpm = cpm_fab.array();
1327 auto const&
xlf = xlf_fab.array();
1330 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
1342 ParallelFor( box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
1345 qc3d(i,j,k) = qcl_arr(i,j,k);
1346 qi3d(i,j,k) = qci_arr(i,j,k);
1347 qni3d(i,j,k) = qps_arr(i,j,k);
1348 qr3d(i,j,k) = qpr_arr(i,j,k);
1349 ni3d(i,j,k) = ni_arr(i,j,k);
1350 ns3d(i,j,k) = ns_arr(i,j,k);
1351 nr3d(i,j,k) = nr_arr(i,j,k);
1352 nc3d(i,j,k) = nc_arr(i,j,k);
1354 t3d(i,j,k) = theta_arr(i,j,k) * pii_arr(i,j,k);
1355 qv3d(i,j,k) = qv_arr(i,j,k);
1356 pres(i,j,k) = pres_arr(i,j,k);
1357 dzq(i,j,k) = dz_arr(i,j,k);
1358 w3d(i,j,k) = w_arr(i,j,k);
1359 qg3d(i,j,k) = qpg_arr(i,j,k);
1360 ng3d(i,j,k) = ng_arr(i,j,k);
1361 qrcu1d(i,j,k) = qrcuten_arr(i,j,k);
1362 qscu1d(i,j,k) = qscuten_arr(i,j,k);
1363 qicu1d(i,j,k) = qicuten_arr(i,j,k);
1365 ParallelFor( boxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
1371 for(
int k=klo; k<=khi; k++) {
1377 [[maybe_unused]] amrex::Real nsubc;
1401 amrex::Real npsacws;
1403 amrex::Real npsacwi;
1412 [[maybe_unused]] amrex::Real pccn;
1436 amrex::Real npsacwg;
1444 amrex::Real nmultrg;
1446 amrex::Real qmultrg;
1457 amrex::Real sc_schmidt;
1464 [[maybe_unused]] amrex::Real dum2;
1468 [[maybe_unused]] amrex::Real dumqsi;
1481 [[maybe_unused]] amrex::Real dc0;
1485 [[maybe_unused]] amrex::Real dumqr;
1487 amrex::Real sum_dep;
1490 [[maybe_unused]] amrex::Real c2prec;
1491 [[maybe_unused]] amrex::Real csed;
1492 [[maybe_unused]] amrex::Real ised;
1493 [[maybe_unused]] amrex::Real ssed;
1494 [[maybe_unused]] amrex::Real gsed;
1495 [[maybe_unused]] amrex::Real rsed;
1496 [[maybe_unused]] amrex::Real tqimelt;
1499 nc3dten(i,j,k) = 0.0;
1510 xxlv(i,j,k) = 3.1484E6 - 2370.0 * t3d(i,j,k);
1512 xxls(i,j,k) = 3.15E6 - 2370.0 * t3d(i,j,k) + 0.3337E6;
1515 const amrex::Real CP = 1004.5;
1516 cpm(i,j,k) = CP * (1.0 + 0.887 * qv3d(i,j,k));
1529 qvs = m_ep_2 * evs / (
pres(i,j,k) - evs);
1530 qvi = m_ep_2 * eis / (
pres(i,j,k) - eis);
1533 qvqvs = qv3d(i,j,k) / qvs;
1534 qvqvsi = qv3d(i,j,k) / qvi;
1537 rho(i,j,k) =
pres(i,j,k) / (m_R * t3d(i,j,k));
1542 const double CI = 800.0;
1547 if (qrcu1d(i,j,k) >= 1.0e-10) {
1548 dum = 1.8e5 * std::pow(qrcu1d(i,j,k) * dt / (m_pi * m_rhow * std::pow(
rho(i,j,k), 3)), 0.25);
1551 if (qscu1d(i,j,k) >= 1.0e-10) {
1552 dum = 3.e5 * std::pow(qscu1d(i,j,k) * dt / (m_cons1 * std::pow(
rho(i,j,k), 3)), 1.0 / (ds0 + 1.0));
1555 if (qicu1d(i,j,k) >= 1.0e-10) {
1556 dum = qicu1d(i,j,k) * dt / (CI * std::pow(80.0e-6, di0));
1563 if (qr3d(i,j,k) < 1.0e-8) {
1564 qv3d(i,j,k) += qr3d(i,j,k);
1565 t3d(i,j,k) -= qr3d(i,j,k) * xxlv(i,j,k) / cpm(i,j,k);
1568 if (qc3d(i,j,k) < 1.0e-8) {
1569 qv3d(i,j,k) += qc3d(i,j,k);
1570 t3d(i,j,k) -= qc3d(i,j,k) * xxlv(i,j,k) / cpm(i,j,k);
1575 if (qi3d(i,j,k) < 1.0e-8) {
1576 qv3d(i,j,k) += qi3d(i,j,k);
1577 t3d(i,j,k) -= qi3d(i,j,k) * xxls(i,j,k) / cpm(i,j,k);
1580 if (qni3d(i,j,k) < 1.0e-8) {
1581 qv3d(i,j,k) += qni3d(i,j,k);
1582 t3d(i,j,k) -= qni3d(i,j,k) * xxls(i,j,k) / cpm(i,j,k);
1585 if (qg3d(i,j,k) < 1.0e-8) {
1586 qv3d(i,j,k) += qg3d(i,j,k);
1587 t3d(i,j,k) -= qg3d(i,j,k) * xxls(i,j,k) / cpm(i,j,k);
1592 xlf(i,j,k) = xxls(i,j,k) - xxlv(i,j,k);
1596 const amrex::Real QSMALL = m_qsmall;
1598 if (qc3d(i,j,k) < QSMALL) {
1603 if (qr3d(i,j,k) < QSMALL) {
1608 if (qi3d(i,j,k) < QSMALL) {
1613 if (qni3d(i,j,k) < QSMALL) {
1618 if (qg3d(i,j,k) < QSMALL) {
1624 qrsten(i,j,k) = 0.0;
1625 qisten(i,j,k) = 0.0;
1626 qnisten(i,j,k) = 0.0;
1627 qcsten(i,j,k) = 0.0;
1628 qgsten(i,j,k) = 0.0;
1631 mu(i,j,k) = 1.496e-6 * std::pow(t3d(i,j,k), 1.5) / (t3d(i,j,k) + 120.0);
1634 dum = std::pow(m_rhosu /
rho(i,j,k), 0.54);
1637 ain(i,j,k) = std::pow(m_rhosu /
rho(i,j,k), 0.35) * m_ai;
1638 arn(i,j,k) = dum * m_ar;
1639 asn(i,j,k) = dum * m_as;
1642 acn(i,j,k) = m_g * m_rhow / (18.0 * mu(i,j,k));
1645 agn(i,j,k) = dum * m_ag;
1650 bool skipMicrophysics =
false;
1651 bool skipConcentrations =
false;
1652 if (qc3d(i,j,k) < QSMALL && qi3d(i,j,k) < QSMALL && qni3d(i,j,k) < QSMALL && qr3d(i,j,k) < QSMALL && qg3d(i,j,k) < QSMALL) {
1653 if ((t3d(i,j,k) < 273.15 && qvqvsi < 0.999) || (t3d(i,j,k) >= 273.15 && qvqvs < 0.999)) {
1654 skipMicrophysics =
true;
1658 if(!skipMicrophysics) {
1661 kap = 1.414e3 * mu(i,j,k);
1664 dv = 8.794e-5 * std::pow(t3d(i,j,k), 1.81) /
pres(i,j,k);
1667 sc_schmidt = mu(i,j,k) / (
rho(i,j,k) * dv);
1671 dum = (m_Rv * std::pow(t3d(i,j,k),2));
1672 dqsdt = xxlv(i,j,k) * qvs / dum;
1673 dqsidt = xxls(i,j,k) * qvi / dum;
1674 abi = 1.0 + dqsidt * xxls(i,j,k) / cpm(i,j,k);
1675 ab = 1.0 + dqsdt * xxlv(i,j,k) / cpm(i,j,k);
1678 if (t3d(i,j,k) >= 273.15) {
1687 nc3d(i,j,k) = m_ndcnst * 1.0e6 /
rho(i,j,k);
1692 if (qni3d(i,j,k) < 1.0e-6) {
1693 qr3d(i,j,k) = qr3d(i,j,k) + qni3d(i,j,k);
1694 nr3d(i,j,k) = nr3d(i,j,k) + ns3d(i,j,k);
1695 t3d(i,j,k) = t3d(i,j,k) - qni3d(i,j,k) *
xlf(i,j,k) / cpm(i,j,k);
1700 if (qg3d(i,j,k) < 1.0e-6) {
1701 qr3d(i,j,k) = qr3d(i,j,k) + qg3d(i,j,k);
1702 nr3d(i,j,k) = nr3d(i,j,k) + ng3d(i,j,k);
1703 t3d(i,j,k) = t3d(i,j,k) - qg3d(i,j,k) *
xlf(i,j,k) / cpm(i,j,k);
1708 if (qc3d(i,j,k) < m_qsmall && qni3d(i,j,k) < 1.0e-8 && qr3d(i,j,k) < m_qsmall && qg3d(i,j,k) < 1.0e-8) {
1709 skipConcentrations=
true;
1711 if(!skipConcentrations) {
1712 ns3d(i,j,k) = amrex::max(0.0,ns3d(i,j,k));
1713 nc3d(i,j,k) = amrex::max(0.0,nc3d(i,j,k));
1714 nr3d(i,j,k) = amrex::max(0.0,nr3d(i,j,k));
1715 ng3d(i,j,k) = amrex::max(0.0,ng3d(i,j,k));
1721 if (qr3d(i,j,k) >= m_qsmall) {
1723 lamr(i,j,k) = pow(m_pi * m_rhow * nr3d(i,j,k) / qr3d(i,j,k), 1.0/3.0);
1724 n0r(i,j,k) = nr3d(i,j,k)*lamr(i,j,k);
1727 if (lamr(i,j,k) < m_lamminr) {
1728 lamr(i,j,k) = m_lamminr;
1729 n0r(i,j,k) = pow(lamr(i,j,k), 4.0) * qr3d(i,j,k) / (m_pi * m_rhow);
1730 nr3d(i,j,k) = n0r(i,j,k) / lamr(i,j,k);
1731 }
else if (lamr(i,j,k) > m_lammaxr) {
1732 lamr(i,j,k) = m_lammaxr;
1733 n0r(i,j,k) = pow(lamr(i,j,k), 4.0) * qr3d(i,j,k) / (m_pi * m_rhow);
1734 nr3d(i,j,k) = n0r(i,j,k) / lamr(i,j,k);
1739 if (qc3d(i,j,k) >= m_qsmall) {
1741 dum =
pres(i,j,k)/(287.15*t3d(i,j,k));
1744 pgam(i,j,k) = 0.0005714*(nc3d(i,j,k)/1.0e6*dum) + 0.2714;
1745 pgam(i,j,k) = 1.0/(pgam(i,j,k)*pgam(i,j,k)) - 1.0;
1746 pgam(i,j,k) = amrex::max(pgam(i,j,k), 2.0);
1747 pgam(i,j,k) = amrex::min(pgam(i,j,k), 10.0);
1750 amrex::Real gamma_pgam_plus_1 =
gamma_function(pgam(i,j,k) + 1.0);
1751 amrex::Real gamma_pgam_plus_4 =
gamma_function(pgam(i,j,k) + 4.0);
1754 lamc(i,j,k) = pow((m_cons26 * nc3d(i,j,k) * gamma_pgam_plus_4) / (qc3d(i,j,k) * gamma_pgam_plus_1), 1.0/3.0);
1757 amrex::Real lambda_min = (pgam(i,j,k) + 1.0)/60.0e-6;
1758 amrex::Real lambda_max = (pgam(i,j,k) + 1.0)/1.0e-6;
1761 if (lamc(i,j,k) < lambda_min) {
1762 lamc(i,j,k) = lambda_min;
1764 nc3d(i,j,k) = exp(3.0*log(lamc(i,j,k)) + log(qc3d(i,j,k)) +
1765 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
1766 }
else if (lamc(i,j,k) > lambda_max) {
1767 lamc(i,j,k) = lambda_max;
1769 nc3d(i,j,k) = exp(3.0*log(lamc(i,j,k)) + log(qc3d(i,j,k)) +
1770 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
1774 cdist1(i,j,k) = nc3d(i,j,k) * pow(lamc(i,j,k), pgam(i,j,k)+1) / gamma_pgam_plus_1;
1778 if (qni3d(i,j,k) >= m_qsmall) {
1780 lams(i,j,k) = pow(m_cons1 * ns3d(i,j,k) / qni3d(i,j,k), 1.0/ds0);
1783 n0s(i,j,k) = ns3d(i,j,k) * lams(i,j,k);
1786 if (lams(i,j,k) < m_lammins) {
1787 lams(i,j,k) = m_lammins;
1788 n0s(i,j,k) = pow(lams(i,j,k), 4.0) * qni3d(i,j,k) / m_cons1;
1789 ns3d(i,j,k) = n0s(i,j,k) / lams(i,j,k);
1790 }
else if (lams(i,j,k) > m_lammaxs) {
1791 lams(i,j,k) = m_lammaxs;
1792 n0s(i,j,k) = pow(lams(i,j,k), 4.0) * qni3d(i,j,k) / m_cons1;
1793 ns3d(i,j,k) = n0s(i,j,k) / lams(i,j,k);
1798 if (qg3d(i,j,k) >= m_qsmall) {
1800 lamg(i,j,k) = pow(m_cons2 * ng3d(i,j,k) / qg3d(i,j,k), 1.0/dg0);
1803 n0g(i,j,k) = ng3d(i,j,k) * lamg(i,j,k);
1806 if (lamg(i,j,k) < m_lamming) {
1807 lamg(i,j,k) = m_lamming;
1808 n0g(i,j,k) = pow(lamg(i,j,k), 4.0) * qg3d(i,j,k) / m_cons2;
1809 ng3d(i,j,k) = n0g(i,j,k) / lamg(i,j,k);
1810 }
else if (lamg(i,j,k) > m_lammaxg) {
1811 lamg(i,j,k) = m_lammaxg;
1812 n0g(i,j,k) = pow(lamg(i,j,k), 4.0) * qg3d(i,j,k) / m_cons2;
1813 ng3d(i,j,k) = n0g(i,j,k) / lamg(i,j,k);
1851 if (qc3d(i,j,k) >= 1.0e-6) {
1854 prc = 1350.0 * std::pow(qc3d(i,j,k), 2.47) *
1855 std::pow((nc3d(i,j,k)/1.0e6*
rho(i,j,k)), -1.79);
1859 nprc1 = prc / m_cons29;
1860 nprc = prc / (qc3d(i,j,k) / nc3d(i,j,k));
1863 nprc = std::min(nprc, nc3d(i,j,k) / dt);
1864 nprc1 = std::min(nprc1, nprc);
1870 if (qr3d(i,j,k) >= 1.0e-8 && qni3d(i,j,k) >= 1.0e-8) {
1871 amrex::Real ums_local = asn(i,j,k) * m_cons3 / std::pow(lams(i,j,k), m_bs);
1872 amrex::Real umr_local = arn(i,j,k) * m_cons4 / std::pow(lamr(i,j,k), m_br);
1873 amrex::Real uns_local = asn(i,j,k) * m_cons5 / std::pow(lams(i,j,k), m_bs);
1874 amrex::Real unr_local = arn(i,j,k) * m_cons6 / std::pow(lamr(i,j,k), m_br);
1878 dum = std::pow(m_rhosu/
rho(i,j,k), 0.54);
1879 ums_local = std::min(ums_local, 1.2*dum);
1880 uns_local = std::min(uns_local, 1.2*dum);
1881 umr_local = std::min(umr_local, 9.1*dum);
1882 unr_local = std::min(unr_local, 9.1*dum);
1889 pracs = m_cons41 * (std::sqrt(std::pow(1.2*umr_local-0.95*ums_local, 2) +
1890 0.08*ums_local*umr_local) *
rho(i,j,k) *
1891 n0r(i,j,k) * n0s(i,j,k) / std::pow(lamr(i,j,k), 3) *
1892 (5.0/(std::pow(lamr(i,j,k), 3) * lams(i,j,k)) +
1893 2.0/(std::pow(lamr(i,j,k), 2) * std::pow(lams(i,j,k), 2)) +
1894 0.5/(lamr(i,j,k) * std::pow(lams(i,j,k), 3))));
1900 if (qr3d(i,j,k) >= 1.0e-8 && qg3d(i,j,k) >= 1.0e-8) {
1902 amrex::Real umg_local = agn(i,j,k) * m_cons7 / std::pow(lamg(i,j,k), m_bg);
1903 amrex::Real umr_local = arn(i,j,k) * m_cons4 / std::pow(lamr(i,j,k), m_br);
1904 amrex::Real ung_local = agn(i,j,k) * m_cons8 / std::pow(lamg(i,j,k), m_bg);
1905 amrex::Real unr_local = arn(i,j,k) * m_cons6 / std::pow(lamr(i,j,k), m_br);
1909 dum = std::pow(m_rhosu/
rho(i,j,k), 0.54);
1910 umg_local = std::min(umg_local, 20.0*dum);
1911 ung_local = std::min(ung_local, 20.0*dum);
1912 umr_local = std::min(umr_local, 9.1*dum);
1913 unr_local = std::min(unr_local, 9.1*dum);
1916 pracg = m_cons41 * (std::sqrt(std::pow(1.2*umr_local-0.95*umg_local, 2) +
1917 0.08*umg_local*umr_local) *
rho(i,j,k) *
1918 n0r(i,j,k) * n0g(i,j,k) / std::pow(lamr(i,j,k), 3) *
1919 (5.0/(std::pow(lamr(i,j,k), 3) * lamg(i,j,k)) +
1920 2.0/(std::pow(lamr(i,j,k), 2) * std::pow(lamg(i,j,k), 2)) +
1921 0.5/(lamr(i,j,k) * std::pow(lamg(i,j,k), 3))));
1926 npracg = m_cons32 *
rho(i,j,k) * (std::sqrt(1.7*std::pow(unr_local-ung_local, 2) +
1927 0.3*unr_local*ung_local) * n0r(i,j,k) * n0g(i,j,k) *
1928 (1.0/(std::pow(lamr(i,j,k), 3) * lamg(i,j,k)) +
1929 1.0/(std::pow(lamr(i,j,k), 2) * std::pow(lamg(i,j,k), 2)) +
1930 1.0/(lamr(i,j,k) * std::pow(lamg(i,j,k), 3))));
1933 npracg = npracg - dum;
1939 if (qr3d(i,j,k) >= 1.0e-8 && qc3d(i,j,k) >= 1.0e-8) {
1942 dum = qc3d(i,j,k) * qr3d(i,j,k);
1943 pra = 67.0 * std::pow(dum, 1.15);
1944 npra = pra / (qc3d(i,j,k) / nc3d(i,j,k));
1952 if (qr3d(i,j,k) >= 1.0e-8) {
1955 if (1.0/lamr(i,j,k) < dum1) {
1958 dum = 2.0 - std::exp(2300.0 * (1.0/lamr(i,j,k) - dum1));
1960 nragg = -5.78 * dum * nr3d(i,j,k) * qr3d(i,j,k) *
rho(i,j,k);
1963 if (qr3d(i,j,k) >= m_qsmall) {
1964 epsr = 2.0 * m_pi * n0r(i,j,k) *
rho(i,j,k) * dv *
1965 (m_f1r/(lamr(i,j,k)*lamr(i,j,k)) +
1966 m_f2r * std::sqrt(arn(i,j,k)*
rho(i,j,k)/mu(i,j,k)) *
1967 std::pow(sc_schmidt, 1.0/3.0) * m_cons9 /
1968 std::pow(lamr(i,j,k), m_cons34));
1973 if (qv3d(i,j,k) < qvs) {
1974 pre = epsr * (qv3d(i,j,k) - qvs) / ab;
1975 pre = std::min(pre, 0.0);
1983 if (qni3d(i,j,k) >= 1.0e-8) {
1986 dum = -m_cpw/
xlf(i,j,k) * (t3d(i,j,k) - 273.15) * pracs;
1989 psmlt = 2.0 * m_pi * n0s(i,j,k) * kap * (273.15 - t3d(i,j,k)) /
1990 xlf(i,j,k) * (m_f1s/(lams(i,j,k)*lams(i,j,k)) +
1991 m_f2s * std::sqrt(asn(i,j,k)*
rho(i,j,k)/mu(i,j,k)) *
1992 std::pow(sc_schmidt, 1.0/3.0) * m_cons10 /
1993 std::pow(lams(i,j,k), m_cons35)) + dum;
1997 epss = 2.0 * m_pi * n0s(i,j,k) *
rho(i,j,k) * dv *
1998 (m_f1s/(lams(i,j,k)*lams(i,j,k)) +
1999 m_f2s * std::sqrt(asn(i,j,k)*
rho(i,j,k)/mu(i,j,k)) *
2000 std::pow(sc_schmidt, 1.0/3.0) * m_cons10 /
2001 std::pow(lams(i,j,k), m_cons35));
2004 evpms = (qv3d(i,j,k) - qvs) * epss / ab;
2005 evpms = std::max(evpms, psmlt);
2006 psmlt = psmlt - evpms;
2013 if (qg3d(i,j,k) >= 1.0e-8) {
2017 dum = -m_cpw/
xlf(i,j,k) * (t3d(i,j,k) - 273.15) * pracg;
2020 pgmlt = 2.0 * m_pi * n0g(i,j,k) * kap * (273.15 - t3d(i,j,k)) /
2021 xlf(i,j,k) * (m_f1s/(lamg(i,j,k)*lamg(i,j,k)) +
2022 m_f2s * std::sqrt(agn(i,j,k)*
rho(i,j,k)/mu(i,j,k)) *
2023 std::pow(sc_schmidt, 1.0/3.0) * m_cons11 /
2024 std::pow(lamg(i,j,k), m_cons36)) + dum;
2028 epsg = 2.0 * m_pi * n0g(i,j,k) *
rho(i,j,k) * dv *
2029 (m_f1s/(lamg(i,j,k)*lamg(i,j,k)) +
2030 m_f2s * std::sqrt(agn(i,j,k)*
rho(i,j,k)/mu(i,j,k)) *
2031 std::pow(sc_schmidt, 1.0/3.0) * m_cons11 /
2032 std::pow(lamg(i,j,k), m_cons36));
2035 evpmg = (qv3d(i,j,k) - qvs) * epsg / ab;
2036 evpmg = std::max(evpmg, pgmlt);
2037 pgmlt = pgmlt - evpmg;
2048 dum = (prc + pra) * dt;
2050 if (dum > qc3d(i,j,k) && qc3d(i,j,k) >= m_qsmall) {
2051 ratio = qc3d(i,j,k) / dum;
2057 dum = (-psmlt - evpms + pracs) * dt;
2059 if (dum > qni3d(i,j,k) && qni3d(i,j,k) >= m_qsmall) {
2061 ratio = qni3d(i,j,k) / dum;
2062 psmlt = psmlt * ratio;
2063 evpms = evpms * ratio;
2064 pracs = pracs * ratio;
2068 dum = (-pgmlt - evpmg + pracg) * dt;
2070 if (dum > qg3d(i,j,k) && qg3d(i,j,k) >= m_qsmall) {
2072 ratio = qg3d(i,j,k) / dum;
2073 pgmlt = pgmlt * ratio;
2074 evpmg = evpmg * ratio;
2075 pracg = pracg * ratio;
2081 dum = (-pracs - pracg - pre - pra - prc + psmlt + pgmlt) * dt;
2083 if (dum > qr3d(i,j,k) && qr3d(i,j,k) >= m_qsmall) {
2084 ratio = (qr3d(i,j,k)/dt + pracs + pracg + pra + prc - psmlt - pgmlt) / (-pre);
2088 qv3dten(i,j,k) = qv3dten(i,j,k) + (-pre - evpms - evpmg);
2090 t3dten(i,j,k) = t3dten(i,j,k) + (pre * xxlv(i,j,k) +
2091 (evpms + evpmg) * xxls(i,j,k) +
2092 (psmlt + pgmlt - pracs - pracg) *
xlf(i,j,k)) / cpm(i,j,k);
2094 qc3dten(i,j,k) = qc3dten(i,j,k) + (-pra - prc);
2095 qr3dten(i,j,k) = qr3dten(i,j,k) + (pre + pra + prc - psmlt - pgmlt + pracs + pracg);
2096 qni3dten(i,j,k) = qni3dten(i,j,k) + (psmlt + evpms - pracs);
2097 qg3dten(i,j,k) = qg3dten(i,j,k) + (pgmlt + evpmg - pracg);
2101 nc3dten(i,j,k) = nc3dten(i,j,k) + (-npra - nprc);
2102 nr3dten(i,j,k) = nr3dten(i,j,k) + (nprc1 + nragg - npracg);
2108 dum = pre * dt / qr3d(i,j,k);
2109 dum = std::max(-1.0, dum);
2110 nsubr = dum * nr3d(i,j,k) / dt;
2113 if (evpms + psmlt < 0.0) {
2114 dum = (evpms + psmlt) * dt / qni3d(i,j,k);
2115 dum = std::max(-1.0, dum);
2116 nsmlts = dum * ns3d(i,j,k) / dt;
2120 dum = psmlt * dt / qni3d(i,j,k);
2121 dum = std::max(-1.0, dum);
2122 nsmltr = dum * ns3d(i,j,k) / dt;
2125 if (evpmg + pgmlt < 0.0) {
2126 dum = (evpmg + pgmlt) * dt / qg3d(i,j,k);
2127 dum = std::max(-1.0, dum);
2128 ngmltg = dum * ng3d(i,j,k) / dt;
2132 dum = pgmlt * dt / qg3d(i,j,k);
2133 dum = std::max(-1.0, dum);
2134 ngmltr = dum * ng3d(i,j,k) / dt;
2137 ns3dten(i,j,k) = ns3dten(i,j,k) + nsmlts;
2138 ng3dten(i,j,k) = ng3dten(i,j,k) + ngmltg;
2139 nr3dten(i,j,k) = nr3dten(i,j,k) + (nsubr - nsmltr - ngmltr);
2145 dumt = t3d(i,j,k) + dt * t3dten(i,j,k);
2146 dumqv = qv3d(i,j,k) + dt * qv3dten(i,j,k);
2150 dumqss = m_ep_2 * dum / (
pres(i,j,k) - dum);
2151 dumqc = qc3d(i,j,k) + dt * qc3dten(i,j,k);
2152 dumqc = std::max(dumqc, 0.0);
2155 dums = dumqv - dumqss;
2156 pcc = dums / (1.0 + std::pow(xxlv(i,j,k), 2) * dumqss / (cpm(i,j,k) * m_Rv * std::pow(dumt, 2))) / dt;
2157 if (pcc * dt + dumqc < 0.0) {
2162 qv3dten(i,j,k) -= pcc;
2163 t3dten(i,j,k) += pcc * xxlv(i,j,k) / cpm(i,j,k);
2164 qc3dten(i,j,k) += pcc;
2174 nc3d(i,j,k) = m_ndcnst * 1.0e6 /
rho(i,j,k);
2177 ni3d(i,j,k) = amrex::max(0.0,ni3d(i,j,k));
2178 ns3d(i,j,k) = amrex::max(0.0,ns3d(i,j,k));
2179 nc3d(i,j,k) = amrex::max(0.0,nc3d(i,j,k));
2180 nr3d(i,j,k) = amrex::max(0.0,nr3d(i,j,k));
2181 ng3d(i,j,k) = amrex::max(0.0,ng3d(i,j,k));
2187 if (qr3d(i,j,k) >= m_qsmall) {
2189 lamr(i,j,k) = pow(m_pi * m_rhow * nr3d(i,j,k) / qr3d(i,j,k), 1.0/3.0);
2192 if (lamr(i,j,k) < m_lamminr) {
2193 lamr(i,j,k) = m_lamminr;
2194 n0r(i,j,k) = pow(lamr(i,j,k), 4.0) * qr3d(i,j,k) / (m_pi * m_rhow);
2195 nr3d(i,j,k) = n0r(i,j,k) / lamr(i,j,k);
2196 }
else if (lamr(i,j,k) > m_lammaxr) {
2197 lamr(i,j,k) = m_lammaxr;
2198 n0r(i,j,k) = pow(lamr(i,j,k), 4.0) * qr3d(i,j,k) / (m_pi * m_rhow);
2199 nr3d(i,j,k) = n0r(i,j,k) / lamr(i,j,k);
2202 n0r(i,j,k) = pow(lamr(i,j,k), 4.0) * qr3d(i,j,k) / (m_pi * m_rhow);
2208 if (qc3d(i,j,k) >= m_qsmall) {
2210 dum =
pres(i,j,k)/(287.15*t3d(i,j,k));
2213 pgam(i,j,k) = 0.0005714*(nc3d(i,j,k)/1.0e6*dum) + 0.2714;
2214 pgam(i,j,k) = 1.0/(std::pow(pgam(i,j,k), 2)) - 1.0;
2215 pgam(i,j,k) = amrex::max(pgam(i,j,k), 2.0);
2216 pgam(i,j,k) = amrex::min(pgam(i,j,k), 10.0);
2219 amrex::Real gamma_pgam_plus_1 =
gamma_function(pgam(i,j,k) + 1.0);
2220 amrex::Real gamma_pgam_plus_4 =
gamma_function(pgam(i,j,k) + 4.0);
2223 lamc(i,j,k) = pow((m_cons26 * nc3d(i,j,k) * gamma_pgam_plus_4) / (qc3d(i,j,k) * gamma_pgam_plus_1), 1.0/3.0);
2226 amrex::Real lambda_min = (pgam(i,j,k) + 1.0)/60.0e-6;
2227 amrex::Real lambda_max = (pgam(i,j,k) + 1.0)/1.0e-6;
2230 if (lamc(i,j,k) < lambda_min) {
2231 lamc(i,j,k) = lambda_min;
2233 nc3d(i,j,k) = exp(3.0*log(lamc(i,j,k)) + log(qc3d(i,j,k)) +
2234 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
2235 }
else if (lamc(i,j,k) > lambda_max) {
2236 lamc(i,j,k) = lambda_max;
2238 nc3d(i,j,k) = exp(3.0*log(lamc(i,j,k)) + log(qc3d(i,j,k)) +
2239 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
2243 cdist1(i,j,k) = nc3d(i,j,k) / gamma_pgam_plus_1;
2247 if (qni3d(i,j,k) >= m_qsmall) {
2249 lams(i,j,k) = pow(m_cons1 * ns3d(i,j,k) / qni3d(i,j,k), 1.0/ds0);
2252 n0s(i,j,k) = ns3d(i,j,k) * lams(i,j,k);
2255 if (lams(i,j,k) < m_lammins) {
2256 lams(i,j,k) = m_lammins;
2257 n0s(i,j,k) = pow(lams(i,j,k), 4.0) * qni3d(i,j,k) / m_cons1;
2258 ns3d(i,j,k) = n0s(i,j,k) / lams(i,j,k);
2259 }
else if (lams(i,j,k) > m_lammaxs) {
2260 lams(i,j,k) = m_lammaxs;
2261 n0s(i,j,k) = pow(lams(i,j,k), 4.0) * qni3d(i,j,k) / m_cons1;
2262 ns3d(i,j,k) = n0s(i,j,k) / lams(i,j,k);
2267 if (qi3d(i,j,k) >= m_qsmall) {
2269 lami(i,j,k) = pow(m_cons12 * ni3d(i,j,k) / qi3d(i,j,k), 1.0/3.0);
2272 n0i(i,j,k) = ni3d(i,j,k) * lami(i,j,k);
2275 if (lami(i,j,k) < m_lammini) {
2276 lami(i,j,k) = m_lammini;
2278 n0i(i,j,k) = pow(lami(i,j,k), 4.0) * qi3d(i,j,k) / m_cons12;
2280 ni3d(i,j,k) = n0i(i,j,k) / lami(i,j,k);
2281 }
else if (lami(i,j,k) > m_lammaxi) {
2282 lami(i,j,k) = m_lammaxi;
2284 n0i(i,j,k) = pow(lami(i,j,k), 4.0) * qi3d(i,j,k) / m_cons12;
2286 ni3d(i,j,k) = n0i(i,j,k) / lami(i,j,k);
2290 if (qg3d(i,j,k) >= m_qsmall) {
2292 lamg(i,j,k) = pow(m_cons2 * ng3d(i,j,k) / qg3d(i,j,k), 1.0/dg0);
2295 n0g(i,j,k) = ng3d(i,j,k) * lamg(i,j,k);
2298 if (lamg(i,j,k) < m_lamming) {
2299 lamg(i,j,k) = m_lamming;
2300 n0g(i,j,k) = pow(lamg(i,j,k), 4.0) * qg3d(i,j,k) / m_cons2;
2301 ng3d(i,j,k) = n0g(i,j,k) / lamg(i,j,k);
2302 }
else if (lamg(i,j,k) > m_lammaxg) {
2303 lamg(i,j,k) = m_lammaxg;
2304 n0g(i,j,k) = pow(lamg(i,j,k), 4.0) * qg3d(i,j,k) / m_cons2;
2305 ng3d(i,j,k) = n0g(i,j,k) / lamg(i,j,k);
2374 if (qc3d(i,j,k) >= m_qsmall && t3d(i,j,k) < 269.15) {
2378 amrex::Real nacnt = std::exp(-2.80 + 0.262 * (273.15 - t3d(i,j,k))) * 1000.0;
2381 dum = 7.37 * t3d(i,j,k) / (288.0 * 10.0 *
pres(i,j,k)) / 100.0;
2385 amrex::Real dap = m_cons37 * t3d(i,j,k) * (1.0 + dum / m_rin) / mu(i,j,k);
2388 mnuccc = m_cons38 * dap * nacnt * std::exp(std::log(cdist1(i,j,k)) +
2389 std::log(
gamma_function(pgam(i,j,k) + 5.0)) - 4.0 * std::log(lamc(i,j,k)));
2390 nnuccc = 2.0 * m_pi * dap * nacnt * cdist1(i,j,k) *
2395 mnuccc = mnuccc + m_cons39 *
2396 std::exp(std::log(cdist1(i,j,k)) + std::log(
gamma_function(7.0 + pgam(i,j,k))) - 6.0 * std::log(lamc(i,j,k))) *
2397 (std::exp(m_aimm * (273.15 - t3d(i,j,k))) - 1.0);
2400 m_cons40 * std::exp(std::log(cdist1(i,j,k)) + std::log(
gamma_function(pgam(i,j,k) + 4.0)) - 3.0 * std::log(lamc(i,j,k))) *
2401 (std::exp(m_aimm * (273.15 - t3d(i,j,k))) - 1.0);
2405 nnuccc = std::min(nnuccc, nc3d(i,j,k) / dt);
2415 if (qc3d(i,j,k) >= 1.0e-6) {
2418 prc = 1350.0 * std::pow(qc3d(i,j,k), 2.47) *
2419 std::pow((nc3d(i,j,k) / 1.0e6 *
rho(i,j,k)), -1.79);
2423 nprc1 = prc / m_cons29;
2424 nprc = prc / (qc3d(i,j,k) / nc3d(i,j,k));
2427 nprc = std::min(nprc, nc3d(i,j,k) / dt);
2428 nprc1 = std::min(nprc1, nprc);
2432 if (qni3d(i,j,k) >= 1.0e-8) {
2433 nsagg = m_cons15 * asn(i,j,k) * std::pow(
rho(i,j,k), ((2.0 + m_bs) / 3.0)) *
2434 std::pow(qni3d(i,j,k), ((2.0 + m_bs) / 3.0)) *
2435 std::pow((ns3d(i,j,k) *
rho(i,j,k)), ((4.0 - m_bs) / 3.0)) /
rho(i,j,k);
2443 if (qni3d(i,j,k) >= 1.0e-8 && qc3d(i,j,k) >= m_qsmall) {
2444 psacws = m_cons13 * asn(i,j,k) * qc3d(i,j,k) *
rho(i,j,k) *
2445 n0s(i,j,k) / std::pow(lams(i,j,k), (m_bs + 3.0));
2447 npsacws = m_cons13 * asn(i,j,k) * nc3d(i,j,k) *
rho(i,j,k) *
2448 n0s(i,j,k) / std::pow(lams(i,j,k), (m_bs + 3.0));
2452 if (qg3d(i,j,k) >= 1.0e-8 && qc3d(i,j,k) >= m_qsmall) {
2453 psacwg = m_cons14 * agn(i,j,k) * qc3d(i,j,k) *
rho(i,j,k) *
2454 n0g(i,j,k) / std::pow(lamg(i,j,k), (m_bg + 3.0));
2456 npsacwg = m_cons14 * agn(i,j,k) * nc3d(i,j,k) *
rho(i,j,k) *
2457 n0g(i,j,k) / std::pow(lamg(i,j,k), (m_bg + 3.0));
2464 if (qi3d(i,j,k) >= 1.0e-8 && qc3d(i,j,k) >= m_qsmall) {
2467 if (1.0 / lami(i,j,k) >= 100.0e-6) {
2468 psacwi = m_cons16 * ain(i,j,k) * qc3d(i,j,k) *
rho(i,j,k) *
2469 n0i(i,j,k) / std::pow(lami(i,j,k), (m_bi + 3.0));
2471 npsacwi = m_cons16 * ain(i,j,k) * nc3d(i,j,k) *
rho(i,j,k) *
2472 n0i(i,j,k) / std::pow(lami(i,j,k), (m_bi + 3.0));
2478 if (qr3d(i,j,k) >= 1.0e-8 && qni3d(i,j,k) >= 1.0e-8) {
2479 amrex::Real ums_local = asn(i,j,k) * m_cons3 / std::pow(lams(i,j,k), m_bs);
2480 amrex::Real umr_local = arn(i,j,k) * m_cons4 / std::pow(lamr(i,j,k), m_br);
2481 amrex::Real uns_local = asn(i,j,k) * m_cons5 / std::pow(lams(i,j,k), m_bs);
2482 amrex::Real unr_local = arn(i,j,k) * m_cons6 / std::pow(lamr(i,j,k), m_br);
2486 dum = std::pow(m_rhosu /
rho(i,j,k), 0.54);
2487 ums_local = std::min(ums_local, 1.2 * dum);
2488 uns_local = std::min(uns_local, 1.2 * dum);
2489 umr_local = std::min(umr_local, 9.1 * dum);
2490 unr_local = std::min(unr_local, 9.1 * dum);
2492 pracs = m_cons41 * (std::sqrt(std::pow(1.2 * umr_local - 0.95 * ums_local, 2) +
2493 0.08 * ums_local * umr_local) *
rho(i,j,k) * n0r(i,j,k) * n0s(i,j,k) /
2494 std::pow(lamr(i,j,k), 3) * (5.0 / (std::pow(lamr(i,j,k), 3) * lams(i,j,k)) +
2495 2.0 / (std::pow(lamr(i,j,k), 2) * std::pow(lams(i,j,k), 2)) +
2496 0.5 / (lamr(i,j,k) * std::pow(lams(i,j,k), 3))));
2498 npracs = m_cons32 *
rho(i,j,k) * std::sqrt(1.7 * std::pow(unr_local - uns_local, 2) +
2499 0.3 * unr_local * uns_local) * n0r(i,j,k) * n0s(i,j,k) *
2500 (1.0 / (std::pow(lamr(i,j,k), 3) * lams(i,j,k)) +
2501 1.0 / (std::pow(lamr(i,j,k), 2) * std::pow(lams(i,j,k), 2)) +
2502 1.0 / (lamr(i,j,k) * std::pow(lams(i,j,k), 3)));
2507 pracs = std::min(pracs, qr3d(i,j,k) / dt);
2512 if (qni3d(i,j,k) >= 0.1e-3 && qr3d(i,j,k) >= 0.1e-3) {
2513 psacr = m_cons31 * (std::sqrt(std::pow(1.2 * umr_local - 0.95 * ums_local, 2) +
2514 0.08 * ums_local * umr_local) *
rho(i,j,k) * n0r(i,j,k) * n0s(i,j,k) /
2515 std::pow(lams(i,j,k), 3) * (5.0 / (std::pow(lams(i,j,k), 3) * lamr(i,j,k)) +
2516 2.0 / (std::pow(lams(i,j,k), 2) * std::pow(lamr(i,j,k), 2)) +
2517 0.5 / (lams(i,j,k) * std::pow(lamr(i,j,k), 3))));
2523 if (qr3d(i,j,k) >= 1.0e-8 && qg3d(i,j,k) >= 1.0e-8) {
2524 amrex::Real umg_local = agn(i,j,k) * m_cons7 / std::pow(lamg(i,j,k), m_bg);
2525 amrex::Real umr_local = arn(i,j,k) * m_cons4 / std::pow(lamr(i,j,k), m_br);
2526 amrex::Real ung_local = agn(i,j,k) * m_cons8 / std::pow(lamg(i,j,k), m_bg);
2527 amrex::Real unr_local = arn(i,j,k) * m_cons6 / std::pow(lamr(i,j,k), m_br);
2531 dum = std::pow(m_rhosu /
rho(i,j,k), 0.54);
2532 umg_local = std::min(umg_local, 20.0 * dum);
2533 ung_local = std::min(ung_local, 20.0 * dum);
2534 umr_local = std::min(umr_local, 9.1 * dum);
2535 unr_local = std::min(unr_local, 9.1 * dum);
2537 pracg = m_cons41 * (std::sqrt(std::pow(1.2 * umr_local - 0.95 * umg_local, 2) +
2538 0.08 * umg_local * umr_local) *
rho(i,j,k) * n0r(i,j,k) * n0g(i,j,k) /
2539 std::pow(lamr(i,j,k), 3) * (5.0 / (std::pow(lamr(i,j,k), 3) * lamg(i,j,k)) +
2540 2.0 / (std::pow(lamr(i,j,k), 2) * std::pow(lamg(i,j,k), 2)) +
2541 0.5 / (lamr(i,j,k) * std::pow(lamg(i,j,k), 3))));
2543 npracg = m_cons32 *
rho(i,j,k) * std::sqrt(1.7 * std::pow(unr_local - ung_local, 2) +
2544 0.3 * unr_local * ung_local) * n0r(i,j,k) * n0g(i,j,k) *
2545 (1.0 / (std::pow(lamr(i,j,k), 3) * lamg(i,j,k)) +
2546 1.0 / (std::pow(lamr(i,j,k), 2) * std::pow(lamg(i,j,k), 2)) +
2547 1.0 / (lamr(i,j,k) * std::pow(lamg(i,j,k), 3)));
2552 pracg = std::min(pracg, qr3d(i,j,k) / dt);
2562 if (qni3d(i,j,k) >= 0.1e-3) {
2563 if (qc3d(i,j,k) >= 0.5e-3 || qr3d(i,j,k) >= 0.1e-3) {
2564 if (psacws > 0.0 || pracs > 0.0) {
2565 if (t3d(i,j,k) < 270.16 && t3d(i,j,k) > 265.16) {
2566 amrex::Real fmult = 0.0;
2568 if (t3d(i,j,k) > 270.16) {
2570 }
else if (t3d(i,j,k) <= 270.16 && t3d(i,j,k) > 268.16) {
2571 fmult = (270.16 - t3d(i,j,k)) / 2.0;
2572 }
else if (t3d(i,j,k) >= 265.16 && t3d(i,j,k) <= 268.16) {
2573 fmult = (t3d(i,j,k) - 265.16) / 3.0;
2574 }
else if (t3d(i,j,k) < 265.16) {
2581 nmults = 35.0e4 * psacws * fmult * 1000.0;
2582 qmults = nmults * m_mmult;
2586 qmults = std::min(qmults, psacws);
2587 psacws = psacws - qmults;
2592 nmultr = 35.0e4 * pracs * fmult * 1000.0;
2593 qmultr = nmultr * m_mmult;
2597 qmultr = std::min(qmultr, pracs);
2598 pracs = pracs - qmultr;
2611 if (qg3d(i,j,k) >= 0.1e-3) {
2612 if (qc3d(i,j,k) >= 0.5e-3 || qr3d(i,j,k) >= 0.1e-3) {
2613 if (psacwg > 0.0 || pracg > 0.0) {
2614 if (t3d(i,j,k) < 270.16 && t3d(i,j,k) > 265.16) {
2615 amrex::Real fmult = 0.0;
2617 if (t3d(i,j,k) > 270.16) {
2619 }
else if (t3d(i,j,k) <= 270.16 && t3d(i,j,k) > 268.16) {
2620 fmult = (270.16 - t3d(i,j,k)) / 2.0;
2621 }
else if (t3d(i,j,k) >= 265.16 && t3d(i,j,k) <= 268.16) {
2622 fmult = (t3d(i,j,k) - 265.16) / 3.0;
2623 }
else if (t3d(i,j,k) < 265.16) {
2630 nmultg = 35.0e4 * psacwg * fmult * 1000.0;
2631 qmultg = nmultg * m_mmult;
2635 qmultg = std::min(qmultg, psacwg);
2636 psacwg = psacwg - qmultg;
2641 nmultrg = 35.0e4 * pracg * fmult * 1000.0;
2642 qmultrg = nmultrg * m_mmult;
2646 qmultrg = std::min(qmultrg, pracg);
2647 pracg = pracg - qmultrg;
2657 if (qni3d(i,j,k) >= 0.1e-3 && qc3d(i,j,k) >= 0.5e-3) {
2659 pgsacw = std::min(psacws, m_cons17 * dt * n0s(i,j,k) * qc3d(i,j,k) * qc3d(i,j,k) *
2660 asn(i,j,k) * asn(i,j,k) /
2661 (
rho(i,j,k) * std::pow(lams(i,j,k), (2.0 * m_bs + 2.0))));
2664 dum = std::max(m_rhosn / (m_rhog - m_rhosn) * pgsacw, 0.0);
2667 nscng = dum / m_mg0 *
rho(i,j,k);
2669 nscng = std::min(nscng, ns3d(i,j,k) / dt);
2672 psacws = psacws - pgsacw;
2679 if (qni3d(i,j,k) >= 0.1e-3 && qr3d(i,j,k) >= 0.1e-3) {
2681 dum = m_cons18 * std::pow(4.0 / lams(i,j,k), 3) * std::pow(4.0 / lams(i,j,k), 3) /
2682 (m_cons18 * std::pow(4.0 / lams(i,j,k), 3) * std::pow(4.0 / lams(i,j,k), 3) +
2683 m_cons19 * std::pow(4.0 / lamr(i,j,k), 3) * std::pow(4.0 / lamr(i,j,k), 3));
2684 dum = std::min(dum, 1.0);
2685 dum = std::max(dum, 0.0);
2687 pgracs = (1.0 - dum) * pracs;
2688 ngracs = (1.0 - dum) * npracs;
2691 ngracs = std::min(ngracs, nr3d(i,j,k) / dt);
2692 ngracs = std::min(ngracs, ns3d(i,j,k) / dt);
2695 pracs = pracs - pgracs;
2696 npracs = npracs - ngracs;
2699 psacr = psacr * (1.0 - dum);
2705 if (t3d(i,j,k) < 269.15 && qr3d(i,j,k) >= m_qsmall) {
2708 mnuccr = m_cons20 * nr3d(i,j,k) * (std::exp(m_aimm * (273.15 - t3d(i,j,k))) - 1.0) /
2709 std::pow(lamr(i,j,k), 3) / std::pow(lamr(i,j,k), 3);
2711 nnuccr = m_pi * nr3d(i,j,k) * m_bimm * (std::exp(m_aimm * (273.15 - t3d(i,j,k))) - 1.0) /
2712 std::pow(lamr(i,j,k), 3);
2715 nnuccr = std::min(nnuccr, nr3d(i,j,k) / dt);
2721 if (qr3d(i,j,k) >= 1.0e-8 && qc3d(i,j,k) >= 1.0e-8) {
2724 dum = qc3d(i,j,k) * qr3d(i,j,k);
2725 pra = 67.0 * std::pow(dum, 1.15);
2726 npra = pra / (qc3d(i,j,k) / nc3d(i,j,k));
2733 if (qr3d(i,j,k) >= 1.0e-8) {
2736 if (1.0 / lamr(i,j,k) < dum1) {
2738 }
else if (1.0 / lamr(i,j,k) >= dum1) {
2739 dum = 2.0 - std::exp(2300.0 * (1.0 / lamr(i,j,k) - dum1));
2741 nragg = -5.78 * dum * nr3d(i,j,k) * qr3d(i,j,k) *
rho(i,j,k);
2748 if (qi3d(i,j,k) >= 1.0e-8 && qvqvsi >= 1.0) {
2749 nprci = m_cons21 * (qv3d(i,j,k) - qvi) *
rho(i,j,k) *
2750 n0i(i,j,k) * std::exp(-lami(i,j,k) * m_dcs) * dv / abi;
2751 prci = m_cons22 * nprci;
2752 nprci = std::min(nprci, ni3d(i,j,k) / dt);
2758 if (qni3d(i,j,k) >= 1.0e-8 && qi3d(i,j,k) >= m_qsmall) {
2759 prai = m_cons23 * asn(i,j,k) * qi3d(i,j,k) *
rho(i,j,k) * n0s(i,j,k) /
2760 std::pow(lams(i,j,k), (m_bs + 3.0));
2761 nprai = m_cons23 * asn(i,j,k) * ni3d(i,j,k) *
2762 rho(i,j,k) * n0s(i,j,k) /
2763 std::pow(lams(i,j,k), (m_bs + 3.0));
2764 nprai = std::min(nprai, ni3d(i,j,k) / dt);
2770 if (qr3d(i,j,k) >= 1.0e-8 && qi3d(i,j,k) >= 1.0e-8 && t3d(i,j,k) <= 273.15) {
2773 if (qr3d(i,j,k) >= 0.1e-3) {
2774 niacr = m_cons24 * ni3d(i,j,k) * n0r(i,j,k)* arn(i,j,k) /
2775 std::pow(lamr(i,j,k), (m_br + 3.0)) *
rho(i,j,k);
2776 piacr = m_cons25 * ni3d(i,j,k) * n0r(i,j,k) * arn(i,j,k) /
2777 std::pow(lamr(i,j,k), (m_br + 3.0)) / std::pow(lamr(i,j,k), 3) *
rho(i,j,k);
2778 praci = m_cons24 * qi3d(i,j,k) * n0r(i,j,k) * arn(i,j,k) /
2779 std::pow(lamr(i,j,k), (m_br + 3.0)) *
rho(i,j,k);
2780 niacr = std::min(niacr, nr3d(i,j,k) / dt);
2781 niacr = std::min(niacr, ni3d(i,j,k) / dt);
2783 niacrs = m_cons24 * ni3d(i,j,k) * n0r(i,j,k) * arn(i,j,k) /
2784 std::pow(lamr(i,j,k), (m_br + 3.0)) *
rho(i,j,k);
2785 piacrs = m_cons25 * ni3d(i,j,k) * n0r(i,j,k) * arn(i,j,k) /
2786 std::pow(lamr(i,j,k), (m_br + 3.0)) / std::pow(lamr(i,j,k), 3) *
rho(i,j,k);
2787 pracis = m_cons24 * qi3d(i,j,k) * n0r(i,j,k) * arn(i,j,k) /
2788 std::pow(lamr(i,j,k), (m_br + 3.0)) *
rho(i,j,k);
2789 niacrs = std::min(niacrs, nr3d(i,j,k) / dt);
2790 niacrs = std::min(niacrs, ni3d(i,j,k) / dt);
2797 if ((qvqvs >= 0.999 && t3d(i,j,k) <= 265.15) || qvqvsi >= 1.08) {
2799 kc2 = 0.005 * std::exp(0.304 * (273.15 - t3d(i,j,k))) * 1000.0;
2801 kc2 = std::min(kc2, 500.0e3);
2802 kc2 = std::max(kc2 /
rho(i,j,k), 0.0);
2804 if (kc2 > ni3d(i,j,k) + ns3d(i,j,k) + ng3d(i,j,k)) {
2805 nnuccd = (kc2 - ni3d(i,j,k) - ns3d(i,j,k) - ng3d(i,j,k)) / dt;
2806 mnuccd = nnuccd * m_mi0;
2809 }
else if (m_inuc == 1) {
2810 if (t3d(i,j,k) < 273.15 && qvqvsi > 1.0) {
2811 kc2 = 0.16 * 1000.0 /
rho(i,j,k);
2812 if (kc2 > ni3d(i,j,k) + ns3d(i,j,k) + ng3d(i,j,k)) {
2813 nnuccd = (kc2 - ni3d(i,j,k) - ns3d(i,j,k) - ng3d(i,j,k)) / dt;
2814 mnuccd = nnuccd * m_mi0;
2822 if (qi3d(i,j,k) >= m_qsmall) {
2823 epsi = 2.0 * m_pi * n0i(i,j,k) *
rho(i,j,k) * dv / (lami(i,j,k) * lami(i,j,k));
2828 if (qni3d(i,j,k) >= m_qsmall) {
2829 epss = 2.0 * m_pi * n0s(i,j,k) *
rho(i,j,k) * dv *
2830 (m_f1s / (lams(i,j,k) * lams(i,j,k)) +
2831 m_f2s * std::pow(asn(i,j,k) *
rho(i,j,k) / mu(i,j,k), 0.5) *
2832 std::pow(sc_schmidt, (1.0 / 3.0)) * m_cons10 /
2833 std::pow(lams(i,j,k), m_cons35));
2838 if (qg3d(i,j,k) >= m_qsmall) {
2839 epsg = 2.0 * m_pi * n0g(i,j,k) *
rho(i,j,k) * dv *
2840 (m_f1s / (lamg(i,j,k) * lamg(i,j,k)) +
2841 m_f2s * std::pow(agn(i,j,k) *
rho(i,j,k) / mu(i,j,k), 0.5) *
2842 std::pow(sc_schmidt, (1.0 / 3.0)) * m_cons11 /
2843 std::pow(lamg(i,j,k), m_cons36));
2848 if (qr3d(i,j,k) >= m_qsmall) {
2849 epsr = 2.0 * m_pi * n0r(i,j,k) *
rho(i,j,k) * dv *
2850 (m_f1r / (lamr(i,j,k) * lamr(i,j,k)) +
2851 m_f2r * std::pow(arn(i,j,k) *
rho(i,j,k) / mu(i,j,k), 0.5) *
2852 std::pow(sc_schmidt, (1.0 / 3.0)) * m_cons9 /
2853 std::pow(lamr(i,j,k), m_cons34));
2859 if (qi3d(i,j,k) >= m_qsmall) {
2860 dum = (1.0 - std::exp(-lami(i,j,k) * m_dcs) * (1.0 + lami(i,j,k) * m_dcs));
2861 prd = epsi * (qv3d(i,j,k) - qvi) / abi * dum;
2867 if (qni3d(i,j,k) >= m_qsmall) {
2868 prds = epss * (qv3d(i,j,k) - qvi) / abi +
2869 epsi * (qv3d(i,j,k) - qvi) / abi * (1.0 - dum);
2872 prd = prd + epsi * (qv3d(i,j,k) - qvi) / abi * (1.0 - dum);
2876 prdg = epsg * (qv3d(i,j,k) - qvi) / abi;
2879 if (qv3d(i,j,k) < qvs) {
2880 pre = epsr * (qv3d(i,j,k) - qvs) / ab;
2881 pre = std::min(pre, 0.0);
2888 dum = (qv3d(i,j,k) - qvi) / dt;
2891 sum_dep = prd + prds + mnuccd + prdg;
2893 if ((dum > 0.0 && sum_dep > dum * fudgef) ||
2894 (dum < 0.0 && sum_dep < dum * fudgef)) {
2895 mnuccd = fudgef * mnuccd * dum / sum_dep;
2896 prd = fudgef * prd * dum / sum_dep;
2897 prds = fudgef * prds * dum / sum_dep;
2898 prdg = fudgef * prdg * dum / sum_dep;
2938 if (m_igraup == 1) {
2955 piacrs = piacrs + piacr;
2959 pracis = pracis + praci;
2961 psacws = psacws + pgsacw;
2963 pracs = pracs + pgracs;
2968 dum = (prc + pra + mnuccc + psacws + psacwi + qmults + psacwg + pgsacw + qmultg) * dt;
2970 if (dum > qc3d(i,j,k) && qc3d(i,j,k) >= m_qsmall) {
2971 ratio = qc3d(i,j,k) / dum;
2975 mnuccc = mnuccc * ratio;
2976 psacws = psacws * ratio;
2977 psacwi = psacwi * ratio;
2978 qmults = qmults * ratio;
2979 qmultg = qmultg * ratio;
2980 psacwg = psacwg * ratio;
2981 pgsacw = pgsacw * ratio;
2985 dum = (-prd - mnuccc + prci + prai - qmults - qmultg - qmultr - qmultrg
2986 - mnuccd + praci + pracis - eprd - psacwi) * dt;
2988 if (dum > qi3d(i,j,k) && qi3d(i,j,k) >= m_qsmall) {
2989 ratio = (qi3d(i,j,k) / dt + prd + mnuccc + qmults + qmultg + qmultr + qmultrg +
2991 (prci + prai + praci + pracis - eprd);
2993 prci = prci * ratio;
2994 prai = prai * ratio;
2995 praci = praci * ratio;
2996 pracis = pracis * ratio;
2997 eprd = eprd * ratio;
3001 dum = ((pracs - pre) + (qmultr + qmultrg - prc) + (mnuccr - pra) +
3002 piacr + piacrs + pgracs + pracg) * dt;
3004 if (dum > qr3d(i,j,k) && qr3d(i,j,k) >= m_qsmall) {
3005 ratio = (qr3d(i,j,k) / dt + prc + pra) /
3006 (-pre + qmultr + qmultrg + pracs + mnuccr + piacr + piacrs + pgracs + pracg);
3009 pracs = pracs * ratio;
3010 qmultr = qmultr * ratio;
3011 qmultrg = qmultrg * ratio;
3012 mnuccr = mnuccr * ratio;
3013 piacr = piacr * ratio;
3014 piacrs = piacrs * ratio;
3015 pgracs = pgracs * ratio;
3016 pracg = pracg * ratio;
3020 if (m_igraup == 0) {
3021 dum = (-prds - psacws - prai - prci - pracs - eprds + psacr - piacrs - pracis) * dt;
3023 if (dum > qni3d(i,j,k) && qni3d(i,j,k) >= m_qsmall) {
3024 ratio = (qni3d(i,j,k) / dt + prds + psacws + prai + prci + pracs + piacrs + pracis) /
3027 eprds = eprds * ratio;
3028 psacr = psacr * ratio;
3030 }
else if (m_igraup == 1) {
3032 dum = (-prds - psacws - prai - prci - pracs - eprds + psacr - piacrs - pracis - mnuccr) * dt;
3034 if (dum > qni3d(i,j,k) && qni3d(i,j,k) >= m_qsmall) {
3035 ratio = (qni3d(i,j,k) / dt + prds + psacws + prai + prci + pracs + piacrs + pracis + mnuccr) /
3038 eprds = eprds * ratio;
3039 psacr = psacr * ratio;
3044 dum = (-psacwg - pracg - pgsacw - pgracs - prdg - mnuccr - eprdg - piacr - praci - psacr) * dt;
3046 if (dum > qg3d(i,j,k) && qg3d(i,j,k) >= m_qsmall) {
3047 ratio = (qg3d(i,j,k) / dt + psacwg + pracg + pgsacw + pgracs + prdg + mnuccr + psacr +
3048 piacr + praci) / (-eprdg);
3050 eprdg = eprdg * ratio;
3054 qv3dten(i,j,k) = qv3dten(i,j,k) + (-pre - prd - prds - mnuccd - eprd - eprds - prdg - eprdg);
3057 t3dten(i,j,k) = t3dten(i,j,k) + (pre * xxlv(i,j,k) +
3058 (prd + prds + mnuccd + eprd + eprds + prdg + eprdg) * xxls(i,j,k) +
3059 (psacws + psacwi + mnuccc + mnuccr + qmults + qmultg + qmultr + qmultrg + pracs +
3060 psacwg + pracg + pgsacw + pgracs + piacr + piacrs) *
xlf(i,j,k)) / cpm(i,j,k);
3062 qc3dten(i,j,k) = qc3dten(i,j,k) +
3063 (-pra - prc - mnuccc + pcc -
3064 psacws - psacwi - qmults - qmultg - psacwg - pgsacw);
3066 qi3dten(i,j,k) = qi3dten(i,j,k) +
3067 (prd + eprd + psacwi + mnuccc - prci -
3068 prai + qmults + qmultg + qmultr + qmultrg + mnuccd - praci - pracis);
3070 qr3dten(i,j,k) = qr3dten(i,j,k) +
3071 (pre + pra + prc - pracs - mnuccr - qmultr - qmultrg -
3072 piacr - piacrs - pracg - pgracs);
3073 if (m_igraup == 0) {
3074 qni3dten(i,j,k) = qni3dten(i,j,k) +
3075 (prai + psacws + prds + pracs + prci + eprds - psacr + piacrs + pracis);
3077 ns3dten(i,j,k) = ns3dten(i,j,k) + (nsagg + nprci - nscng - ngracs + niacrs);
3079 qg3dten(i,j,k) = qg3dten(i,j,k) + (pracg + psacwg + pgsacw + pgracs +
3080 prdg + eprdg + mnuccr + piacr + praci + psacr);
3082 ng3dten(i,j,k) = ng3dten(i,j,k) + (nscng + ngracs + nnuccr + niacr);
3083 }
else if (m_igraup == 1) {
3085 qni3dten(i,j,k) = qni3dten(i,j,k) +
3086 (prai + psacws + prds + pracs + prci + eprds - psacr + piacrs + pracis + mnuccr);
3088 ns3dten(i,j,k) = ns3dten(i,j,k) + (nsagg + nprci - nscng - ngracs + niacrs + nnuccr);
3091 nc3dten(i,j,k) = nc3dten(i,j,k) + (-nnuccc - npsacws -
3092 npra - nprc - npsacwi - npsacwg);
3094 ni3dten(i,j,k) = ni3dten(i,j,k) +
3095 (nnuccc - nprci - nprai + nmults + nmultg + nmultr + nmultrg +
3096 nnuccd - niacr - niacrs);
3098 nr3dten(i,j,k) = nr3dten(i,j,k) + (nprc1 - npracs - nnuccr +
3099 nragg - niacr - niacrs - npracg - ngracs);
3102 c2prec = pra + prc + psacws + qmults + qmultg + psacwg +
3103 pgsacw + mnuccc + psacwi;
3107 dumt = t3d(i,j,k) + dt * t3dten(i,j,k);
3108 dumqv = qv3d(i,j,k) + dt * qv3dten(i,j,k);
3112 dumqss = m_ep_2 * dum / (
pres(i,j,k) - dum);
3114 dumqc = qc3d(i,j,k) + dt * qc3dten(i,j,k);
3115 dumqc = std::max(dumqc, 0.0);
3118 dums = dumqv - dumqss;
3120 pcc = dums / (1.0 + std::pow(xxlv(i,j,k), 2) * dumqss / (cpm(i,j,k) * m_Rv * std::pow(dumt, 2))) / dt;
3122 if (pcc * dt + dumqc < 0.0) {
3126 qv3dten(i,j,k) = qv3dten(i,j,k) - pcc;
3127 t3dten(i,j,k) = t3dten(i,j,k) + pcc * xxlv(i,j,k) / cpm(i,j,k);
3128 qc3dten(i,j,k) = qc3dten(i,j,k) + pcc;
3133 dum = eprd * dt / qi3d(i,j,k);
3134 dum = std::max(-1.0, dum);
3135 nsubi = dum * ni3d(i,j,k) / dt;
3139 dum = eprds * dt / qni3d(i,j,k);
3140 dum = std::max(-1.0, dum);
3141 nsubs = dum * ns3d(i,j,k) / dt;
3145 dum = pre * dt / qr3d(i,j,k);
3146 dum = std::max(-1.0, dum);
3147 nsubr = dum * nr3d(i,j,k) / dt;
3151 dum = eprdg * dt / qg3d(i,j,k);
3152 dum = std::max(-1.0, dum);
3153 nsubg = dum * ng3d(i,j,k) / dt;
3157 ni3dten(i,j,k) = ni3dten(i,j,k) + nsubi;
3158 ns3dten(i,j,k) = ns3dten(i,j,k) + nsubs;
3159 ng3dten(i,j,k) = ng3dten(i,j,k) + nsubg;
3160 nr3dten(i,j,k) = nr3dten(i,j,k) + nsubr;
3167 for(
int k=klo; k<=khi; k++) {
3169 precrt(i,j,k) = 0.0;
3170 snowrt(i,j,k) = 0.0;
3172 snowprt(i,j,k) = 0.0;
3173 grplprt(i,j,k) = 0.0;
3183 for(
int k=khi; k>=klo; k--) {
3198 dumi(i,j,k) = qi3d(i,j,k) + qi3dten(i,j,k) * dt;
3199 dumqs(i,j,k) = qni3d(i,j,k) + qni3dten(i,j,k) * dt;
3200 dumr(i,j,k) = qr3d(i,j,k) + qr3dten(i,j,k) * dt;
3201 dumfni(i,j,k) = ni3d(i,j,k) + ni3dten(i,j,k) * dt;
3202 dumfns(i,j,k) = ns3d(i,j,k) + ns3dten(i,j,k) * dt;
3203 dumfnr(i,j,k) = nr3d(i,j,k) + nr3dten(i,j,k) * dt;
3204 dumc(i,j,k) = qc3d(i,j,k) + qc3dten(i,j,k) * dt;
3205 dumfnc(i,j,k) = nc3d(i,j,k) + nc3dten(i,j,k) * dt;
3206 dumg(i,j,k) = qg3d(i,j,k) + qg3dten(i,j,k) * dt;
3207 dumfng(i,j,k) = ng3d(i,j,k) + ng3dten(i,j,k) * dt;
3211 dumfnc(i,j,k) = nc3d(i,j,k);
3215 dumfni(i,j,k) = amrex::max(0., dumfni(i,j,k));
3216 dumfns(i,j,k) = amrex::max(0., dumfns(i,j,k));
3217 dumfnc(i,j,k) = amrex::max(0., dumfnc(i,j,k));
3218 dumfnr(i,j,k) = amrex::max(0., dumfnr(i,j,k));
3219 dumfng(i,j,k) = amrex::max(0., dumfng(i,j,k));
3222 if (dumi(i,j,k) >= m_qsmall) {
3223 dlami(i,j,k) = std::pow(m_cons12 * dumfni(i,j,k) / dumi(i,j,k), 1.0/di0);
3224 dlami(i,j,k) = amrex::max(dlami(i,j,k), m_lammini);
3225 dlami(i,j,k) = amrex::min(dlami(i,j,k), m_lammaxi);
3229 if (dumr(i,j,k) >= m_qsmall) {
3230 dlamr(i,j,k) = std::pow(m_pi * m_rhow * dumfnr(i,j,k) / dumr(i,j,k), 1.0/3.0);
3231 dlamr(i,j,k) = amrex::max(dlamr(i,j,k), m_lamminr);
3232 dlamr(i,j,k) = amrex::min(dlamr(i,j,k), m_lammaxr);
3236 if (dumc(i,j,k) >= m_qsmall) {
3237 dum =
pres(i,j,k) / (287.15 * t3d(i,j,k));
3238 pgam(i,j,k) = 0.0005714 * (nc3d(i,j,k) / 1.0e6 * dum) + 0.2714;
3239 pgam(i,j,k) = 1.0 / (pgam(i,j,k) * pgam(i,j,k)) - 1.0;
3240 pgam(i,j,k) = amrex::max(pgam(i,j,k), 2.0);
3241 pgam(i,j,k) = amrex::min(pgam(i,j,k), 10.0);
3243 dlamc(i,j,k) = std::pow(m_cons26 * dumfnc(i,j,k) *
gamma_function(pgam(i,j,k) + 4.0) /
3245 lammin = (pgam(i,j,k) + 1.0) / 60.0e-6;
3246 lammax = (pgam(i,j,k) + 1.0) / 1.0e-6;
3247 dlamc(i,j,k) = amrex::max(dlamc(i,j,k), lammin);
3248 dlamc(i,j,k) = amrex::min(dlamc(i,j,k), lammax);
3252 if (dumqs(i,j,k) >= m_qsmall) {
3253 dlams(i,j,k) = std::pow(m_cons1 * dumfns(i,j,k) / dumqs(i,j,k), 1.0/ds0);
3254 dlams(i,j,k) = amrex::max(dlams(i,j,k), m_lammins);
3255 dlams(i,j,k) = amrex::min(dlams(i,j,k), m_lammaxs);
3259 if (dumg(i,j,k) >= m_qsmall) {
3260 dlamg(i,j,k) = std::pow(m_cons2 * dumfng(i,j,k) / dumg(i,j,k), 1.0/dg0);
3261 dlamg(i,j,k) = amrex::max(dlamg(i,j,k), m_lamming);
3262 dlamg(i,j,k) = amrex::min(dlamg(i,j,k), m_lammaxg);
3267 if (dumc(i,j,k) >= m_qsmall) {
3268 unc(i,j,k) = acn(i,j,k) *
gamma_function(1. + m_bc + pgam(i,j,k)) /
3269 (std::pow(dlamc(i,j,k), m_bc) *
gamma_function(pgam(i,j,k) + 1.));
3270 umc(i,j,k) = acn(i,j,k) *
gamma_function(4. + m_bc + pgam(i,j,k)) /
3271 (std::pow(dlamc(i,j,k), m_bc) *
gamma_function(pgam(i,j,k) + 4.));
3278 if (dumi(i,j,k) >= m_qsmall) {
3279 uni(i,j,k) = ain(i,j,k) * m_cons27 / std::pow(dlami(i,j,k), m_bi);
3280 umi(i,j,k) = ain(i,j,k) * m_cons28 / std::pow(dlami(i,j,k), m_bi);
3287 if (dumr(i,j,k) >= m_qsmall) {
3288 unr(i,j,k) = arn(i,j,k) * m_cons6 / std::pow(dlamr(i,j,k), m_br);
3289 umr(i,j,k) = arn(i,j,k) * m_cons4 / std::pow(dlamr(i,j,k), m_br);
3296 if (dumqs(i,j,k) >= m_qsmall) {
3297 ums(i,j,k) = asn(i,j,k) * m_cons3 / std::pow(dlams(i,j,k), m_bs);
3298 uns(i,j,k) = asn(i,j,k) * m_cons5 / std::pow(dlams(i,j,k), m_bs);
3305 if (dumg(i,j,k) >= m_qsmall) {
3306 umg(i,j,k) = agn(i,j,k) * m_cons7 / std::pow(dlamg(i,j,k), m_bg);
3307 ung(i,j,k) = agn(i,j,k) * m_cons8 / std::pow(dlamg(i,j,k), m_bg);
3315 dum = std::pow(m_rhosu /
rho(i,j,k), 0.54);
3316 ums(i,j,k) = std::min(ums(i,j,k), 1.2 * dum);
3317 uns(i,j,k) = std::min(uns(i,j,k), 1.2 * dum);
3321 umi(i,j,k) = std::min(umi(i,j,k), 1.2 * std::pow(m_rhosu /
rho(i,j,k), 0.35));
3322 uni(i,j,k) = std::min(uni(i,j,k), 1.2 * std::pow(m_rhosu /
rho(i,j,k), 0.35));
3323 umr(i,j,k) = std::min(umr(i,j,k), 9.1 * dum);
3324 unr(i,j,k) = std::min(unr(i,j,k), 9.1 * dum);
3325 umg(i,j,k) = std::min(umg(i,j,k), 20. * dum);
3326 ung(i,j,k) = std::min(ung(i,j,k), 20. * dum);
3329 fr(i,j,k) = umr(i,j,k);
3330 fi(i,j,k) = umi(i,j,k);
3331 fni(i,j,k) = uni(i,j,k);
3332 fs(i,j,k) = ums(i,j,k);
3333 fns(i,j,k) = uns(i,j,k);
3334 fnr(i,j,k) = unr(i,j,k);
3335 fc(i,j,k) = umc(i,j,k);
3336 fnc(i,j,k) = unc(i,j,k);
3337 fg(i,j,k) = umg(i,j,k);
3338 fng(i,j,k) = ung(i,j,k);
3341 if (fr(i,j,k) < 1.e-10) {
3342 fr(i,j,k) = fr(i,j,k+1);
3344 if (fi(i,j,k) < 1.e-10) {
3345 fi(i,j,k) = fi(i,j,k+1);
3347 if (fni(i,j,k) < 1.e-10) {
3348 fni(i,j,k) = fni(i,j,k+1);
3350 if (fs(i,j,k) < 1.e-10) {
3351 fs(i,j,k) = fs(i,j,k+1);
3353 if (fns(i,j,k) < 1.e-10) {
3354 fns(i,j,k) = fns(i,j,k+1);
3356 if (fnr(i,j,k) < 1.e-10) {
3357 fnr(i,j,k) = fnr(i,j,k+1);
3359 if (fc(i,j,k) < 1.e-10) {
3360 fc(i,j,k) = fc(i,j,k+1);
3362 if (fnc(i,j,k) < 1.e-10) {
3363 fnc(i,j,k) = fnc(i,j,k+1);
3365 if (fg(i,j,k) < 1.e-10) {
3366 fg(i,j,k) = fg(i,j,k+1);
3368 if (fng(i,j,k) < 1.e-10) {
3369 fng(i,j,k) = fng(i,j,k+1);
3374 rgvm(i,j,k) = std::max({fr(i,j,k), fi(i,j,k), fs(i,j,k), fc(i,j,k),
3375 fni(i,j,k), fnr(i,j,k), fns(i,j,k), fnc(i,j,k),
3376 fg(i,j,k), fng(i,j,k)});
3379 nstep = std::max(
static_cast<int>(rgvm(i,j,k) * dt / dzq(i,j,k) + 1.), nstep);
3381 dumr(i,j,k) = dumr(i,j,k) *
rho(i,j,k);
3382 dumi(i,j,k) = dumi(i,j,k) *
rho(i,j,k);
3383 dumfni(i,j,k) = dumfni(i,j,k) *
rho(i,j,k);
3384 dumqs(i,j,k) = dumqs(i,j,k) *
rho(i,j,k);
3385 dumfns(i,j,k) = dumfns(i,j,k) *
rho(i,j,k);
3386 dumfnr(i,j,k) = dumfnr(i,j,k) *
rho(i,j,k);
3387 dumc(i,j,k) = dumc(i,j,k) *
rho(i,j,k);
3388 dumfnc(i,j,k) = dumfnc(i,j,k) *
rho(i,j,k);
3389 dumg(i,j,k) = dumg(i,j,k) *
rho(i,j,k);
3390 dumfng(i,j,k) = dumfng(i,j,k) *
rho(i,j,k);
3393 for (
int n = 1; n <= nstep; n++) {
3395 for (
int k = klo; k <= khi; k++) {
3396 faloutr(i,j,k) = fr(i,j,k) * dumr(i,j,k);
3397 falouti(i,j,k) = fi(i,j,k) * dumi(i,j,k);
3398 faloutni(i,j,k) = fni(i,j,k) * dumfni(i,j,k);
3399 falouts(i,j,k) = fs(i,j,k) * dumqs(i,j,k);
3400 faloutns(i,j,k) = fns(i,j,k) * dumfns(i,j,k);
3401 faloutnr(i,j,k) = fnr(i,j,k) * dumfnr(i,j,k);
3402 faloutc(i,j,k) = fc(i,j,k) * dumc(i,j,k);
3403 faloutnc(i,j,k) = fnc(i,j,k) * dumfnc(i,j,k);
3404 faloutg(i,j,k) = fg(i,j,k) * dumg(i,j,k);
3405 faloutng(i,j,k) = fng(i,j,k) * dumfng(i,j,k);
3412 faltndr(i,j,k) = faloutr(i,j,k) / dzq(i,j,k);
3413 faltndi(i,j,k) = falouti(i,j,k) / dzq(i,j,k);
3414 faltndni(i,j,k) = faloutni(i,j,k) / dzq(i,j,k);
3415 faltnds(i,j,k) = falouts(i,j,k) / dzq(i,j,k);
3416 faltndns(i,j,k) = faloutns(i,j,k) / dzq(i,j,k);
3417 faltndnr(i,j,k) = faloutnr(i,j,k) / dzq(i,j,k);
3418 faltndc(i,j,k) = faloutc(i,j,k) / dzq(i,j,k);
3419 faltndnc(i,j,k) = faloutnc(i,j,k) / dzq(i,j,k);
3420 faltndg(i,j,k) = faloutg(i,j,k) / dzq(i,j,k);
3421 faltndng(i,j,k) = faloutng(i,j,k) / dzq(i,j,k);
3424 qrsten(i,j,k) = qrsten(i,j,k) - faltndr(i,j,k) / nstep /
rho(i,j,k);
3425 qisten(i,j,k) = qisten(i,j,k) - faltndi(i,j,k) / nstep /
rho(i,j,k);
3426 ni3dten(i,j,k) = ni3dten(i,j,k) - faltndni(i,j,k) / nstep /
rho(i,j,k);
3427 qnisten(i,j,k) = qnisten(i,j,k) - faltnds(i,j,k) / nstep /
rho(i,j,k);
3428 ns3dten(i,j,k) = ns3dten(i,j,k) - faltndns(i,j,k) / nstep /
rho(i,j,k);
3429 nr3dten(i,j,k) = nr3dten(i,j,k) - faltndnr(i,j,k) / nstep /
rho(i,j,k);
3430 qcsten(i,j,k) = qcsten(i,j,k) - faltndc(i,j,k) / nstep /
rho(i,j,k);
3431 nc3dten(i,j,k) = nc3dten(i,j,k) - faltndnc(i,j,k) / nstep /
rho(i,j,k);
3432 qgsten(i,j,k) = qgsten(i,j,k) - faltndg(i,j,k) / nstep /
rho(i,j,k);
3433 ng3dten(i,j,k) = ng3dten(i,j,k) - faltndng(i,j,k) / nstep /
rho(i,j,k);
3436 dumr(i,j,k) = dumr(i,j,k) - faltndr(i,j,k) * dt / nstep;
3437 dumi(i,j,k) = dumi(i,j,k) - faltndi(i,j,k) * dt / nstep;
3438 dumfni(i,j,k) = dumfni(i,j,k) - faltndni(i,j,k) * dt / nstep;
3439 dumqs(i,j,k) = dumqs(i,j,k) - faltnds(i,j,k) * dt / nstep;
3440 dumfns(i,j,k) = dumfns(i,j,k) - faltndns(i,j,k) * dt / nstep;
3441 dumfnr(i,j,k) = dumfnr(i,j,k) - faltndnr(i,j,k) * dt / nstep;
3442 dumc(i,j,k) = dumc(i,j,k) - faltndc(i,j,k) * dt / nstep;
3443 dumfnc(i,j,k) = dumfnc(i,j,k) - faltndnc(i,j,k) * dt / nstep;
3444 dumg(i,j,k) = dumg(i,j,k) - faltndg(i,j,k) * dt / nstep;
3445 dumfng(i,j,k) = dumfng(i,j,k) - faltndng(i,j,k) * dt / nstep;
3448 for (k = khi-1; k >= klo; k--) {
3450 faltndr(i,j,k) = (faloutr(i,j,k+1) - faloutr(i,j,k)) / dzq(i,j,k);
3451 faltndi(i,j,k) = (falouti(i,j,k+1) - falouti(i,j,k)) / dzq(i,j,k);
3452 faltndni(i,j,k) = (faloutni(i,j,k+1) - faloutni(i,j,k)) / dzq(i,j,k);
3453 faltnds(i,j,k) = (falouts(i,j,k+1) - falouts(i,j,k)) / dzq(i,j,k);
3454 faltndns(i,j,k) = (faloutns(i,j,k+1) - faloutns(i,j,k)) / dzq(i,j,k);
3455 faltndnr(i,j,k) = (faloutnr(i,j,k+1) - faloutnr(i,j,k)) / dzq(i,j,k);
3456 faltndc(i,j,k) = (faloutc(i,j,k+1) - faloutc(i,j,k)) / dzq(i,j,k);
3457 faltndnc(i,j,k) = (faloutnc(i,j,k+1) - faloutnc(i,j,k)) / dzq(i,j,k);
3458 faltndg(i,j,k) = (faloutg(i,j,k+1) - faloutg(i,j,k)) / dzq(i,j,k);
3459 faltndng(i,j,k) = (faloutng(i,j,k+1) - faloutng(i,j,k)) / dzq(i,j,k);
3462 qrsten(i,j,k) = qrsten(i,j,k) + faltndr(i,j,k) / nstep /
rho(i,j,k);
3463 qisten(i,j,k) = qisten(i,j,k) + faltndi(i,j,k) / nstep /
rho(i,j,k);
3464 ni3dten(i,j,k) = ni3dten(i,j,k) + faltndni(i,j,k) / nstep /
rho(i,j,k);
3465 qnisten(i,j,k) = qnisten(i,j,k) + faltnds(i,j,k) / nstep /
rho(i,j,k);
3466 ns3dten(i,j,k) = ns3dten(i,j,k) + faltndns(i,j,k) / nstep /
rho(i,j,k);
3467 nr3dten(i,j,k) = nr3dten(i,j,k) + faltndnr(i,j,k) / nstep /
rho(i,j,k);
3468 qcsten(i,j,k) = qcsten(i,j,k) + faltndc(i,j,k) / nstep /
rho(i,j,k);
3469 nc3dten(i,j,k) = nc3dten(i,j,k) + faltndnc(i,j,k) / nstep /
rho(i,j,k);
3470 qgsten(i,j,k) = qgsten(i,j,k) + faltndg(i,j,k) / nstep /
rho(i,j,k);
3471 ng3dten(i,j,k) = ng3dten(i,j,k) + faltndng(i,j,k) / nstep /
rho(i,j,k);
3473 dumr(i,j,k) = dumr(i,j,k) + faltndr(i,j,k) * dt / nstep;
3474 dumi(i,j,k) = dumi(i,j,k) + faltndi(i,j,k) * dt / nstep;
3475 dumfni(i,j,k) = dumfni(i,j,k) + faltndni(i,j,k) * dt / nstep;
3476 dumqs(i,j,k) = dumqs(i,j,k) + faltnds(i,j,k) * dt / nstep;
3477 dumfns(i,j,k) = dumfns(i,j,k) + faltndns(i,j,k) * dt / nstep;
3478 dumfnr(i,j,k) = dumfnr(i,j,k) + faltndnr(i,j,k) * dt / nstep;
3479 dumc(i,j,k) = dumc(i,j,k) + faltndc(i,j,k) * dt / nstep;
3480 dumfnc(i,j,k) = dumfnc(i,j,k) + faltndnc(i,j,k) * dt / nstep;
3481 dumg(i,j,k) = dumg(i,j,k) + faltndg(i,j,k) * dt / nstep;
3482 dumfng(i,j,k) = dumfng(i,j,k) + faltndng(i,j,k) * dt / nstep;
3488 precrt(i,j,klo) += (faloutr(i,j,kts) + faloutc(i,j,kts) + falouts(i,j,kts) +
3489 falouti(i,j,kts) + faloutg(i,j,kts)) * dt / nstep;
3490 snowrt(i,j,klo) += (falouts(i,j,kts) + falouti(i,j,kts) + faloutg(i,j,kts)) * dt / nstep;
3493 snowprt(i,j,klo) += (falouti(i,j,kts) + falouts(i,j,kts)) * dt / nstep;
3494 grplprt(i,j,klo) += faloutg(i,j,kts) * dt / nstep;
3496 for(
int k=klo; k<=khi; k++) {
3505 qr3dten(i,j,k) = qr3dten(i,j,k) + qrsten(i,j,k);
3506 qi3dten(i,j,k) = qi3dten(i,j,k) + qisten(i,j,k);
3507 qc3dten(i,j,k) = qc3dten(i,j,k) + qcsten(i,j,k);
3508 qg3dten(i,j,k) = qg3dten(i,j,k) + qgsten(i,j,k);
3509 qni3dten(i,j,k) = qni3dten(i,j,k) + qnisten(i,j,k);
3512 if (qi3d(i,j,k) >= m_qsmall && t3d(i,j,k) < 273.15 && lami(i,j,k) >= 1.e-10) {
3513 if (1.0/lami(i,j,k) >= 2.0*m_dcs) {
3514 qni3dten(i,j,k) = qni3dten(i,j,k) + qi3d(i,j,k)/dt + qi3dten(i,j,k);
3515 ns3dten(i,j,k) = ns3dten(i,j,k) + ni3d(i,j,k)/dt + ni3dten(i,j,k);
3516 qi3dten(i,j,k) = -qi3d(i,j,k)/dt;
3517 ni3dten(i,j,k) = -ni3d(i,j,k)/dt;
3522 qc3d(i,j,k) = qc3d(i,j,k) + qc3dten(i,j,k)*dt;
3523 qi3d(i,j,k) = qi3d(i,j,k) + qi3dten(i,j,k)*dt;
3524 qni3d(i,j,k) = qni3d(i,j,k) + qni3dten(i,j,k)*dt;
3525 qr3d(i,j,k) = qr3d(i,j,k) + qr3dten(i,j,k)*dt;
3526 nc3d(i,j,k) = nc3d(i,j,k) + nc3dten(i,j,k)*dt;
3527 ni3d(i,j,k) = ni3d(i,j,k) + ni3dten(i,j,k)*dt;
3528 ns3d(i,j,k) = ns3d(i,j,k) + ns3dten(i,j,k)*dt;
3529 nr3d(i,j,k) = nr3d(i,j,k) + nr3dten(i,j,k)*dt;
3530 if (m_igraup == 0) {
3531 qg3d(i,j,k) = qg3d(i,j,k) + qg3dten(i,j,k)*dt;
3532 ng3d(i,j,k) = ng3d(i,j,k) + ng3dten(i,j,k)*dt;
3536 t3d(i,j,k) = t3d(i,j,k) + t3dten(i,j,k)*dt;
3537 qv3d(i,j,k) = qv3d(i,j,k) + qv3dten(i,j,k)*dt;
3550 qvs = m_ep_2 * evs / (
pres(i,j,k) - evs);
3551 qvi = m_ep_2 * eis / (
pres(i,j,k) - eis);
3554 qvqvs = qv3d(i,j,k) / qvs;
3555 qvqvsi = qv3d(i,j,k) / qvi;
3558 if (qr3d(i,j,k) < 1.0e-8) {
3559 qv3d(i,j,k) += qr3d(i,j,k);
3560 t3d(i,j,k) -= qr3d(i,j,k) * xxlv(i,j,k) / cpm(i,j,k);
3563 if (qc3d(i,j,k) < 1.0e-8) {
3564 qv3d(i,j,k) += qc3d(i,j,k);
3565 t3d(i,j,k) -= qc3d(i,j,k) * xxlv(i,j,k) / cpm(i,j,k);
3570 if (qi3d(i,j,k) < 1.0e-8) {
3571 qv3d(i,j,k) += qi3d(i,j,k);
3572 t3d(i,j,k) -= qi3d(i,j,k) * xxls(i,j,k) / cpm(i,j,k);
3575 if (qni3d(i,j,k) < 1.0e-8) {
3576 qv3d(i,j,k) += qni3d(i,j,k);
3577 t3d(i,j,k) -= qni3d(i,j,k) * xxls(i,j,k) / cpm(i,j,k);
3580 if (qg3d(i,j,k) < 1.0e-8) {
3581 qv3d(i,j,k) += qg3d(i,j,k);
3582 t3d(i,j,k) -= qg3d(i,j,k) * xxls(i,j,k) / cpm(i,j,k);
3587 if (qc3d(i,j,k) < m_qsmall) {
3592 if (qr3d(i,j,k) < m_qsmall) {
3597 if (qi3d(i,j,k) < m_qsmall) {
3602 if (qni3d(i,j,k) < m_qsmall) {
3607 if (qg3d(i,j,k) < m_qsmall) {
3621 if (!(qc3d(i,j,k) < m_qsmall &&
3622 qi3d(i,j,k) < m_qsmall &&
3623 qni3d(i,j,k) < m_qsmall &&
3624 qr3d(i,j,k) < m_qsmall &&
3625 qg3d(i,j,k) < m_qsmall)) {
3629 if (qi3d(i,j,k) >= m_qsmall && t3d(i,j,k) >= 273.15) {
3630 qr3d(i,j,k) = qr3d(i,j,k) + qi3d(i,j,k);
3631 t3d(i,j,k) = t3d(i,j,k) - qi3d(i,j,k) *
xlf(i,j,k) / cpm(i,j,k);
3633 nr3d(i,j,k) = nr3d(i,j,k) + ni3d(i,j,k);
3637 if ((m_iliq != 1)) {
3640 if (t3d(i,j,k) <= 233.15 && qc3d(i,j,k) >= m_qsmall) {
3641 qi3d(i,j,k) = qi3d(i,j,k) + qc3d(i,j,k);
3642 t3d(i,j,k) = t3d(i,j,k) + qc3d(i,j,k) *
xlf(i,j,k) / cpm(i,j,k);
3644 ni3d(i,j,k) = ni3d(i,j,k) + nc3d(i,j,k);
3648 if (m_igraup == 0) {
3649 if (t3d(i,j,k) <= 233.15 && qr3d(i,j,k) >= m_qsmall) {
3650 qg3d(i,j,k) = qg3d(i,j,k) + qr3d(i,j,k);
3651 t3d(i,j,k) = t3d(i,j,k) + qr3d(i,j,k) *
xlf(i,j,k) / cpm(i,j,k);
3653 ng3d(i,j,k) = ng3d(i,j,k) + nr3d(i,j,k);
3656 }
else if (m_igraup == 1) {
3657 if (t3d(i,j,k) <= 233.15 && qr3d(i,j,k) >= m_qsmall) {
3658 qni3d(i,j,k) = qni3d(i,j,k) + qr3d(i,j,k);
3659 t3d(i,j,k) = t3d(i,j,k) + qr3d(i,j,k) *
xlf(i,j,k) / cpm(i,j,k);
3661 ns3d(i,j,k) = ns3d(i,j,k) + nr3d(i,j,k);
3672 ni3d(i,j,k) = std::max(0.0, ni3d(i,j,k));
3673 ns3d(i,j,k) = std::max(0.0, ns3d(i,j,k));
3674 nc3d(i,j,k) = std::max(0.0, nc3d(i,j,k));
3675 nr3d(i,j,k) = std::max(0.0, nr3d(i,j,k));
3676 ng3d(i,j,k) = std::max(0.0, ng3d(i,j,k));
3679 if (qi3d(i,j,k) >= m_qsmall) {
3680 lami(i,j,k) = std::pow(m_cons12 * ni3d(i,j,k) / qi3d(i,j,k), 1.0/m_di);
3683 if (lami(i,j,k) < m_lammini) {
3684 lami(i,j,k) = m_lammini;
3685 n0i(i,j,k) = std::pow(lami(i,j,k), 4) * qi3d(i,j,k) / m_cons12;
3686 ni3d(i,j,k) = n0i(i,j,k) / lami(i,j,k);
3687 }
else if (lami(i,j,k) > m_lammaxi) {
3688 lami(i,j,k) = m_lammaxi;
3689 n0i(i,j,k) = std::pow(lami(i,j,k), 4) * qi3d(i,j,k) / m_cons12;
3690 ni3d(i,j,k) = n0i(i,j,k) / lami(i,j,k);
3695 if (qr3d(i,j,k) >= m_qsmall) {
3696 lamr(i,j,k) = std::pow(m_pi * m_rhow * nr3d(i,j,k) / qr3d(i,j,k), 1.0/3.0);
3700 if (lamr(i,j,k) < m_lamminr) {
3701 lamr(i,j,k) = m_lamminr;
3702 n0r(i,j,k) = std::pow(lamr(i,j,k), 4) * qr3d(i,j,k) / (m_pi * m_rhow);
3703 nr3d(i,j,k) = n0r(i,j,k) / lamr(i,j,k);
3704 }
else if (lamr(i,j,k) > m_lammaxr) {
3705 lamr(i,j,k) = m_lammaxr;
3706 n0r(i,j,k) = std::pow(lamr(i,j,k), 4) * qr3d(i,j,k) / (m_pi * m_rhow);
3707 nr3d(i,j,k) = n0r(i,j,k) / lamr(i,j,k);
3713 if (qc3d(i,j,k) >= m_qsmall) {
3714 amrex::Real dum =
pres(i,j,k) / (287.15 * t3d(i,j,k));
3715 pgam(i,j,k) = 0.0005714 * (nc3d(i,j,k) / 1.0e6 * dum) + 0.2714;
3716 pgam(i,j,k) = 1.0/(std::pow(pgam(i,j,k), 2)) - 1.0;
3717 pgam(i,j,k) = std::max(pgam(i,j,k), 2.0);
3718 pgam(i,j,k) = std::min(pgam(i,j,k), 10.0);
3721 lamc(i,j,k) = std::pow(m_cons26 * nc3d(i,j,k) *
gamma_function(pgam(i,j,k) + 4.0) /
3726 amrex::Real lammin = (pgam(i,j,k) + 1.0) / 60.0e-6;
3727 amrex::Real lammax = (pgam(i,j,k) + 1.0) / 1.0e-6;
3729 if (lamc(i,j,k) < lammin) {
3730 lamc(i,j,k) = lammin;
3731 nc3d(i,j,k) = std::exp(3.0 * std::log(lamc(i,j,k)) + std::log(qc3d(i,j,k)) +
3733 }
else if (lamc(i,j,k) > lammax) {
3734 lamc(i,j,k) = lammax;
3735 nc3d(i,j,k) = std::exp(3.0 * std::log(lamc(i,j,k)) + std::log(qc3d(i,j,k)) +
3741 if (qni3d(i,j,k) >= m_qsmall) {
3742 lams(i,j,k) = std::pow(m_cons1 * ns3d(i,j,k) / qni3d(i,j,k), 1.0/m_ds);
3746 if (lams(i,j,k) < m_lammins) {
3747 lams(i,j,k) = m_lammins;
3748 n0s(i,j,k) = std::pow(lams(i,j,k), 4) * qni3d(i,j,k) / m_cons1;
3749 ns3d(i,j,k) = n0s(i,j,k) / lams(i,j,k);
3750 }
else if (lams(i,j,k) > m_lammaxs) {
3751 lams(i,j,k) = m_lammaxs;
3752 n0s(i,j,k) = std::pow(lams(i,j,k), 4) * qni3d(i,j,k) / m_cons1;
3753 ns3d(i,j,k) = n0s(i,j,k) / lams(i,j,k);
3758 if (qg3d(i,j,k) >= m_qsmall) {
3759 lamg(i,j,k) = std::pow(m_cons2 * ng3d(i,j,k) / qg3d(i,j,k), 1.0/m_dg);
3763 if (lamg(i,j,k) < m_lamming) {
3764 lamg(i,j,k) = m_lamming;
3765 n0g(i,j,k) = std::pow(lamg(i,j,k), 4) * qg3d(i,j,k) / m_cons2;
3766 ng3d(i,j,k) = n0g(i,j,k) / lamg(i,j,k);
3767 }
else if (lamg(i,j,k) > m_lammaxg) {
3768 lamg(i,j,k) = m_lammaxg;
3769 n0g(i,j,k) = std::pow(lamg(i,j,k), 4) * qg3d(i,j,k) / m_cons2;
3770 ng3d(i,j,k) = n0g(i,j,k) / lamg(i,j,k);
3777 if (qi3d(i,j,k) >= m_qsmall) {
3778 effi(i,j,k) = 3.0 / lami(i,j,k) / 2.0 * 1.0e6;
3783 if (qni3d(i,j,k) >= m_qsmall) {
3784 effs(i,j,k) = 3.0 / lams(i,j,k) / 2.0 * 1.0e6;
3789 if (qr3d(i,j,k) >= m_qsmall) {
3790 effr(i,j,k) = 3.0 / lamr(i,j,k) / 2.0 * 1.0e6;
3795 if (qc3d(i,j,k) >= m_qsmall) {
3801 if (qg3d(i,j,k) >= m_qsmall) {
3802 effg(i,j,k) = 3.0 / lamg(i,j,k) / 2.0 * 1.0e6;
3813 ni3d(i,j,k) = std::min(ni3d(i,j,k), 0.3e6 /
rho(i,j,k));
3816 if (iinum == 0 && m_iact == 2) {
3817 nc3d(i,j,k) = std::min(nc3d(i,j,k), (m_nanew1 + m_nanew2) /
rho(i,j,k));
3823 nc3d(i,j,k) = m_ndcnst * 1.0e6 /
rho(i,j,k);
3832 if(use_morr_cpp_answer) {
3833 for(
int k=klo; k<=khi; k++) {
3836 qcl_arr(i,j,k) = qc3d(i,j,k);
3837 qci_arr(i,j,k) = qi3d(i,j,k);
3838 qps_arr(i,j,k) = qni3d(i,j,k);
3839 qpr_arr(i,j,k) = qr3d(i,j,k);
3840 ni_arr(i,j,k) = ni3d(i,j,k);
3841 ns_arr(i,j,k) = ns3d(i,j,k);
3842 nr_arr(i,j,k) = nr3d(i,j,k);
3843 qpg_arr(i,j,k) = qg3d(i,j,k);
3844 ng_arr(i,j,k) = ng3d(i,j,k);
3847 theta_arr(i,j,k) = t3d(i,j,k) / pii_arr(i,j,k);
3848 qv_arr(i,j,k) = qv3d(i,j,k);
3856 rainncv_arr(i,j,0) = precrt(i,j,klo);
3857 snowncv_arr(i,j,0) = snowprt(i,j,klo);
3858 graupelncv_arr(i,j,0) = grplprt(i,j,klo);
3859 sr_arr(i,j,0) = snowrt(i,j,klo) / (precrt(i,j,klo) + 1.e-12);
3863 rain_accum_arr(i,j,klo) = rain_accum_arr(i,j,klo) + precrt(i,j,klo);
3864 snow_accum_arr(i,j,klo) = snow_accum_arr(i,j,klo) + snowprt(i,j,klo);
3865 graup_accum_arr(i,j,klo) = graup_accum_arr(i,j,klo) + grplprt(i,j,klo);
3871 amrex::Print()<<
"fortran should run "<<run_morr_fort<<std::endl;
3874 #ifdef ERF_USE_MORR_FORT
3880 theta_arr.dataPtr(),
3900 rain_accum_arr.dataPtr(),
3901 rainncv_arr.dataPtr(),
3903 snow_accum_arr.dataPtr(),
3904 snowncv_arr.dataPtr(),
3905 graup_accum_arr.dataPtr(),
3906 graupelncv_arr.dataPtr(),
3909 dummy_reflectivity_ptr,
3914 qrcuten_arr.dataPtr(),
3915 qscuten_arr.dataPtr(),
3916 qicuten_arr.dataPtr(),
3924 ilo, ihi, jlo, jhi, klo, khi,
3925 ilom, ihim, jlom, jhim, klom, khim,
3926 ilo, ihi, jlo, jhi, klo, khi,
3930 rainprod_arr.dataPtr(),
3931 evapprod_arr.dataPtr(),
3932 qlsink_arr.dataPtr(),
3933 precr_arr.dataPtr(),
3934 preci_arr.dataPtr(),
3935 precs_arr.dataPtr(),
3939 amrex::Abort(
"Trying to run fortran without compiling with USE_MORR_FORT=TRUE");
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_saturation_vapor_pressure(const amrex::Real T, const int type)
Definition: ERF_AdvanceMorrison.cpp:317
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real gamma_function(Real x)
Definition: ERF_AdvanceMorrison.cpp:304
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pp(amrex::Real y)
Definition: ERF_MicrophysicsUtils.H:219
void mp_morr_two_moment_c(int itimestep, double *th, double *qv, double *qc, double *qr, double *qi, double *qs, double *qg, double *ni, double *ns, double *nr, double *ng, double *rho, double *pii, double *p, double dt_in, double *dz, double *w, double *rainnc, double *rainncv, double *sr, double *snownc, double *snowncv, double *graupelnc, double *graupelncv, double *refl_10cm, bool diagflag, int do_radar_ref, double *qrcuten, double *qscuten, double *qicuten, bool f_qndrop, double *qndrop, double *ht, int ids, int ide, int jds, int jde, int kds, int kde, int ims, int ime, int jms, int jme, int kms, int kme, int its, int ite, int jts, int jte, int kts, int kte, bool wetscav_on, double *rainprod, double *evapprod, double *qlsink, double *precr, double *preci, double *precs, double *precg)
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
amrex::Geometry m_geom
Definition: ERF_Morrison.H:278
int m_axis
Definition: ERF_Morrison.H:287
amrex::Real m_rdOcp
Definition: ERF_Morrison.H:294
amrex::Array< FabPtr, MicVar_Morr::NumVars > mic_fab_vars
Definition: ERF_Morrison.H:301
@ pres
Definition: ERF_Kessler.H:25
@ rho
Definition: ERF_Kessler.H:22
@ qv
Definition: ERF_Morrison.H:34
@ ng
Definition: ERF_Morrison.H:48
@ nc
Definition: ERF_Morrison.H:44
@ qpg
Definition: ERF_Morrison.H:41
@ pres
Definition: ERF_Morrison.H:30
@ nr
Definition: ERF_Morrison.H:45
@ qcl
Definition: ERF_Morrison.H:35
@ tabs
Definition: ERF_Morrison.H:29
@ theta
Definition: ERF_Morrison.H:28
@ ni
Definition: ERF_Morrison.H:46
@ ns
Definition: ERF_Morrison.H:47
@ omega
Definition: ERF_Morrison.H:53
@ qps
Definition: ERF_Morrison.H:40
@ graup_accum
Definition: ERF_Morrison.H:52
@ rho
Definition: ERF_Morrison.H:27
@ qpr
Definition: ERF_Morrison.H:39
@ qci
Definition: ERF_Morrison.H:36
@ rain_accum
Definition: ERF_Morrison.H:50
@ snow_accum
Definition: ERF_Morrison.H:51
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40
real(c_double), parameter xlf
Definition: ERF_module_model_constants.F90:58
MoistureType moisture_type
Definition: ERF_DataStruct.H:787