512 const amrex::Box& box = mfi.tilebox();
540 const int ilo = box.loVect()[0];
541 const int ihi = box.hiVect()[0];
542 const int jlo = box.loVect()[1];
543 const int jhi = box.hiVect()[1];
544 const int klo = box.loVect()[2];
545 const int khi = box.hiVect()[2];
547 amrex::Box grown_box(box); grown_box.grow(3);
548 #ifdef ERF_USE_MORR_FORT
549 const int ilom = grown_box.loVect()[0];
550 const int ihim = grown_box.hiVect()[0];
551 const int jlom = grown_box.loVect()[1];
552 const int jhim = grown_box.hiVect()[1];
553 const int klom = grown_box.loVect()[2];
554 const int khim = grown_box.hiVect()[2];
558 FArrayBox pii_fab(grown_box, 1);
559 auto const& pii_arr = pii_fab.array();
566 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
569 pii_arr(i,j,k) = std::pow((pres_arr(i,j,k)) /
p0, rdcp);
573 FArrayBox dz_fab(grown_box, 1);
574 auto const& dz_arr = dz_fab.array();
578 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
579 dz_arr(i,j,k) = dz_val;
581 amrex::Box grown_boxD(grown_box); grown_boxD.makeSlab(2,0);
584 FArrayBox rainncv_fab(grown_boxD, 1);
585 FArrayBox sr_fab(grown_boxD, 1);
586 FArrayBox snowncv_fab(grown_boxD, 1);
587 FArrayBox graupelncv_fab(grown_boxD, 1);
589 auto const& rainncv_arr = rainncv_fab.array();
590 auto const& sr_arr = sr_fab.array();
591 auto const& snowncv_arr = snowncv_fab.array();
592 auto const& graupelncv_arr = graupelncv_fab.array();
595 ParallelFor(grown_boxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
596 rainncv_arr(i,j,k) = 0.0;
598 snowncv_arr(i,j,k) = 0.0;
599 graupelncv_arr(i,j,k) = 0.0;
603 FArrayBox ht_fab(amrex::Box(amrex::IntVect(ilo, jlo, 0), amrex::IntVect(ihi, jhi, 0)), 1);
604 [[maybe_unused]]
auto const& ht_arr = ht_fab.array();
605 ParallelFor(amrex::Box(amrex::IntVect(ilo, jlo, 0), amrex::IntVect(ihi, jhi, 0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
609 #ifdef ERF_USE_MORR_FORT
611 FArrayBox qrcuten_fab(grown_box, 1);
612 FArrayBox qscuten_fab(grown_box, 1);
613 FArrayBox qicuten_fab(grown_box, 1);
619 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
626 bool flag_qndrop =
false;
629 FArrayBox rainprod_fab(grown_box, 1);
630 FArrayBox evapprod_fab(grown_box, 1);
631 FArrayBox qlsink_fab(grown_box, 1);
632 FArrayBox precr_fab(grown_box, 1);
633 FArrayBox preci_fab(grown_box, 1);
634 FArrayBox precs_fab(grown_box, 1);
635 FArrayBox precg_fab(grown_box, 1);
637 auto const& rainprod_arr = rainprod_fab.array();
638 auto const& evapprod_arr = evapprod_fab.array();
639 auto const& qlsink_arr = qlsink_fab.array();
640 auto const& precr_arr = precr_fab.array();
641 auto const& preci_arr = preci_fab.array();
642 auto const& precs_arr = precs_fab.array();
643 auto const& precg_arr = precg_fab.array();
646 ParallelFor(grown_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
647 rainprod_arr(i,j,k) = 0.0;
648 evapprod_arr(i,j,k) = 0.0;
649 qlsink_arr(i,j,k) = 0.0;
650 precr_arr(i,j,k) = 0.0;
651 preci_arr(i,j,k) = 0.0;
652 precs_arr(i,j,k) = 0.0;
653 precg_arr(i,j,k) = 0.0;
657 #ifdef ERF_USE_MORR_FORT
660 double dummy_reflectivity = 0.0;
661 double* dummy_reflectivity_ptr = &dummy_reflectivity;
671 [[maybe_unused]]
int m_ibase = 2;
672 [[maybe_unused]]
int m_isub = 0;
684 [[maybe_unused]]
bool m_do_radar_ref =
false;
767 amrex::Real m_cons1, m_cons2, m_cons3, m_cons4, m_cons5;
768 amrex::Real m_cons6, m_cons7, m_cons8, m_cons9, m_cons10;
769 amrex::Real m_cons11, m_cons12, m_cons13, m_cons14, m_cons15;
770 amrex::Real m_cons16, m_cons17, m_cons18, m_cons19, m_cons20;
771 amrex::Real m_cons21, m_cons22, m_cons23, m_cons24, m_cons25;
774 amrex::Real m_cons36, m_cons37, m_cons38, m_cons39, m_cons40;
780 m_pi = 3.1415926535897932384626434;
785 m_cp = 7.0*287.0/2.0;
787 m_ep_2 = m_Rd / m_Rv;
790 m_rhosu = 85000.0/(287.15*273.15);
837 m_mi0 = 4.0/3.0*m_pi*m_rhoi*std::pow(10.0E-6, 3);
857 m_ci = m_rhoi * m_pi / 6.0;
859 m_cs = m_rhosn * m_pi / 6.0;
861 m_cg = m_rhog * m_pi / 6.0;
868 m_mmult = 4.0/3.0*m_pi*m_rhoi*std::pow(5.0E-6, 3);
872 m_lammaxi = 1.0/1.0E-6;
873 m_lammini = 1.0/(2.0*m_dcs + 100.0E-6);
874 m_lammaxr = 1.0/20.0E-6;
875 m_lamminr = 1.0/2800.0E-6;
876 m_lammaxs = 1.0/10.0E-6;
877 m_lammins = 1.0/2000.0E-6;
878 m_lammaxg = 1.0/20.0E-6;
879 m_lamming = 1.0/2000.0E-6;
900 m_bact = m_vi * m_osm * m_epsm * m_mw * m_rhoa / (m_map * m_rhow);
908 m_f11 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig1), 2));
909 m_f21 = 1.0 + 0.25 * std::log(m_sig1);
915 m_f12 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig2), 2));
916 m_f22 = 1.0 + 0.25 * std::log(m_sig2);
934 m_cons15 = -1108.0 * m_eii * std::pow(m_pi, (1.0-m_bs)/3.0) *
935 std::pow(m_rhosn, (-2.0-m_bs)/3.0) / (4.0*720.0);
937 m_cons17 = 4.0 * 2.0 * 3.0 * m_rhosu * m_pi * m_eci * m_eci *
939 m_cons18 = m_rhosn * m_rhosn;
940 m_cons19 = m_rhow * m_rhow;
941 m_cons20 = 20.0 * m_pi * m_pi * m_rhow * m_bimm;
942 m_cons21 = 4.0 / (m_dcs * m_rhoi);
943 m_cons22 = m_pi * m_rhoi * std::pow(m_dcs, 3) / 6.0;
946 m_cons25 = m_pi * m_pi / 24.0 * m_rhow * m_ecr *
gamma_function(m_br + 6.0);
947 m_cons26 = m_pi / 6.0 * m_rhow;
950 m_cons29 = 4.0/3.0 * m_pi * m_rhow * std::pow(25.0E-6, 3);
951 m_cons30 = 4.0/3.0 * m_pi * m_rhow;
952 m_cons31 = m_pi * m_pi * m_ecr * m_rhosn;
953 m_cons32 = m_pi / 2.0 * m_ecr;
954 m_cons33 = m_pi * m_pi * m_ecr * m_rhog;
955 m_cons34 = 5.0/2.0 + m_br/2.0;
956 m_cons35 = 5.0/2.0 + m_bs/2.0;
957 m_cons36 = 5.0/2.0 + m_bg/2.0;
958 m_cons37 = 4.0 * m_pi * 1.38E-23 / (6.0 * m_pi * m_rin);
959 m_cons38 = m_pi * m_pi / 3.0 * m_rhow;
960 m_cons39 = m_pi * m_pi / 36.0 * m_rhow * m_bimm;
961 m_cons40 = m_pi / 6.0 * m_bimm;
962 m_cons41 = m_pi * m_pi * m_ecr * m_rhow;
983 m_bact = m_vi * m_osm * m_epsm * m_mw * m_rhoa / (m_map * m_rhow);
990 m_f11 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig1), 2));
991 m_f21 = 1.0 + 0.25 * std::log(m_sig1);
997 m_f12 = 0.5 * std::exp(2.5 * std::pow(std::log(m_sig2), 2));
998 m_f22 = 1.0 + 0.25 * std::log(m_sig2);
1012 m_do_radar_ref =
false;
1013 amrex::Box boxD(box); boxD.makeSlab(2,0);
1015 ParmParse
pp(
"erf");
1017 bool run_morr_cpp =
true;
1019 bool use_morr_cpp_answer =
true;
1020 pp.query(
"use_morr_cpp_answer", use_morr_cpp_answer);
1021 Print() <<
"use_morr_cpp_answer" << use_morr_cpp_answer <<std::endl;
1023 bool run_morr_fort = !use_morr_cpp_answer;
1025 std::string filename = std::string(
"output_cpp") + std::to_string(use_morr_cpp_answer) +
".txt";
1031 morr_fab.template setVal<RunOn::Device>(0.0);
1032 auto const& morr_arr = morr_fab.array();
1039 ParallelFor( box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
1051 morr_arr(i,j,k,
MORRInd::t3d) = theta_arr(i,j,k) * pii_arr(i,j,k);
1062 ParallelFor( boxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
1068 for(
int k=klo; k<=khi; k++) {
1239 const double CI = 800.0;
1249 dum = 3.e5 * std::pow(morr_arr(i,j,k,
MORRInd::qscu1d) * dt / (m_cons1 * std::pow(morr_arr(i,j,k,
MORRInd::rho), 3)), 1.0 / (ds0 + 1.0));
1253 dum = morr_arr(i,j,k,
MORRInd::qicu1d) * dt / (CI * std::pow(80.0e-6, di0));
1262 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qr3d) * morr_arr(i,j,k,
MORRInd::xxlv) / morr_arr(i,j,k,
MORRInd::cpm);
1267 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qc3d) * morr_arr(i,j,k,
MORRInd::xxlv) / morr_arr(i,j,k,
MORRInd::cpm);
1274 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qi3d) * morr_arr(i,j,k,
MORRInd::xxls) / morr_arr(i,j,k,
MORRInd::cpm);
1279 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qni3d) * morr_arr(i,j,k,
MORRInd::xxls) / morr_arr(i,j,k,
MORRInd::cpm);
1284 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qg3d) * morr_arr(i,j,k,
MORRInd::xxls) / morr_arr(i,j,k,
MORRInd::cpm);
1328 morr_arr(i,j,k,
MORRInd::mu) = 1.496e-6 * std::pow(morr_arr(i,j,k,
MORRInd::t3d), 1.5) / (morr_arr(i,j,k,
MORRInd::t3d) + 120.0);
1331 dum = std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho), 0.54);
1347 bool skipMicrophysics =
false;
1348 bool skipConcentrations =
false;
1349 if (morr_arr(i,j,k,
MORRInd::qc3d) < QSMALL && morr_arr(i,j,k,
MORRInd::qi3d) < QSMALL && morr_arr(i,j,k,
MORRInd::qni3d) < QSMALL && morr_arr(i,j,k,
MORRInd::qr3d) < QSMALL && morr_arr(i,j,k,
MORRInd::qg3d) < QSMALL) {
1350 if ((morr_arr(i,j,k,
MORRInd::t3d) < 273.15 && qvqvsi < 0.999) || (morr_arr(i,j,k,
MORRInd::t3d) >= 273.15 && qvqvs < 0.999)) {
1351 skipMicrophysics =
true;
1355 if(!skipMicrophysics) {
1368 dum = (m_Rv * std::pow(morr_arr(i,j,k,
MORRInd::t3d),2));
1392 morr_arr(i,j,k,
MORRInd::t3d) = morr_arr(i,j,k,
MORRInd::t3d) - morr_arr(i,j,k,
MORRInd::qni3d) * morr_arr(i,j,k,
MORRInd::xlf) / morr_arr(i,j,k,
MORRInd::cpm);
1400 morr_arr(i,j,k,
MORRInd::t3d) = morr_arr(i,j,k,
MORRInd::t3d) - morr_arr(i,j,k,
MORRInd::qg3d) * morr_arr(i,j,k,
MORRInd::xlf) / morr_arr(i,j,k,
MORRInd::cpm);
1405 if (morr_arr(i,j,k,
MORRInd::qc3d) < m_qsmall && morr_arr(i,j,k,
MORRInd::qni3d) < 1.0e-8 && morr_arr(i,j,k,
MORRInd::qr3d) < m_qsmall && morr_arr(i,j,k,
MORRInd::qg3d) < 1.0e-8) {
1406 skipConcentrations=
true;
1408 if(!skipConcentrations) {
1420 morr_arr(i,j,k,
MORRInd::lamr) = pow(m_pi * m_rhow * morr_arr(i,j,k,
MORRInd::nr3d) / morr_arr(i,j,k,
MORRInd::qr3d), 1.0/3.0);
1426 morr_arr(i,j,k,
MORRInd::n0r) = pow(morr_arr(i,j,k,
MORRInd::lamr), 4.0) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1430 morr_arr(i,j,k,
MORRInd::n0r) = pow(morr_arr(i,j,k,
MORRInd::lamr), 4.0) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1451 morr_arr(i,j,k,
MORRInd::lamc) = pow((m_cons26 * morr_arr(i,j,k,
MORRInd::nc3d) * gamma_pgam_plus_4) / (morr_arr(i,j,k,
MORRInd::qc3d) * gamma_pgam_plus_1), 1.0/3.0);
1462 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
1467 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
1471 morr_arr(i,j,k,
MORRInd::cdist1) = morr_arr(i,j,k,
MORRInd::nc3d) * pow(morr_arr(i,j,k,
MORRInd::lamc), morr_arr(i,j,k,
MORRInd::pgam)+1) / gamma_pgam_plus_1;
1477 morr_arr(i,j,k,
MORRInd::lams) = pow(m_cons1 * morr_arr(i,j,k,
MORRInd::ns3d) / morr_arr(i,j,k,
MORRInd::qni3d), 1.0/ds0);
1485 morr_arr(i,j,k,
MORRInd::n0s) = pow(morr_arr(i,j,k,
MORRInd::lams), 4.0) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1489 morr_arr(i,j,k,
MORRInd::n0s) = pow(morr_arr(i,j,k,
MORRInd::lams), 4.0) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1497 morr_arr(i,j,k,
MORRInd::lamg) = pow(m_cons2 * morr_arr(i,j,k,
MORRInd::ng3d) / morr_arr(i,j,k,
MORRInd::qg3d), 1.0/dg0);
1505 morr_arr(i,j,k,
MORRInd::n0g) = pow(morr_arr(i,j,k,
MORRInd::lamg), 4.0) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
1509 morr_arr(i,j,k,
MORRInd::n0g) = pow(morr_arr(i,j,k,
MORRInd::lamg), 4.0) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
1551 prc = 1350.0 * std::pow(morr_arr(i,j,k,
MORRInd::qc3d), 2.47) *
1556 nprc1 = prc / m_cons29;
1561 nprc1 = std::min(nprc1, nprc);
1575 dum = std::pow(m_rhosu/morr_arr(i,j,k,
MORRInd::rho), 0.54);
1576 ums_local = std::min(ums_local, 1.2*dum);
1577 uns_local = std::min(uns_local, 1.2*dum);
1578 umr_local = std::min(umr_local, 9.1*dum);
1579 unr_local = std::min(unr_local, 9.1*dum);
1586 pracs = m_cons41 * (std::sqrt(std::pow(1.2*umr_local-0.95*ums_local, 2) +
1587 0.08*ums_local*umr_local) * morr_arr(i,j,k,
MORRInd::rho) *
1588 morr_arr(i,j,k,
MORRInd::n0r) * morr_arr(i,j,k,
MORRInd::n0s) / std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) *
1606 dum = std::pow(m_rhosu/morr_arr(i,j,k,
MORRInd::rho), 0.54);
1607 umg_local = std::min(umg_local, 20.0*dum);
1608 ung_local = std::min(ung_local, 20.0*dum);
1609 umr_local = std::min(umr_local, 9.1*dum);
1610 unr_local = std::min(unr_local, 9.1*dum);
1613 pracg = m_cons41 * (std::sqrt(std::pow(1.2*umr_local-0.95*umg_local, 2) +
1614 0.08*umg_local*umr_local) * morr_arr(i,j,k,
MORRInd::rho) *
1615 morr_arr(i,j,k,
MORRInd::n0r) * morr_arr(i,j,k,
MORRInd::n0g) / std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) *
1623 npracg = m_cons32 * morr_arr(i,j,k,
MORRInd::rho) * (std::sqrt(1.7*std::pow(unr_local-ung_local, 2) +
1630 npracg = npracg - dum;
1640 pra = 67.0 * std::pow(dum, 1.15);
1655 dum = 2.0 - std::exp(2300.0 * (1.0/morr_arr(i,j,k,
MORRInd::lamr) - dum1));
1664 std::pow(sc_schmidt, 1.0/3.0) * m_cons9 /
1672 pre = std::min(pre, 0.0);
1689 std::pow(sc_schmidt, 1.0/3.0) * m_cons10 /
1697 std::pow(sc_schmidt, 1.0/3.0) * m_cons10 /
1702 evpms = std::max(evpms, psmlt);
1703 psmlt = psmlt - evpms;
1720 std::pow(sc_schmidt, 1.0/3.0) * m_cons11 /
1728 std::pow(sc_schmidt, 1.0/3.0) * m_cons11 /
1733 evpmg = std::max(evpmg, pgmlt);
1734 pgmlt = pgmlt - evpmg;
1745 dum = (prc + pra) * dt;
1754 dum = (-psmlt - evpms + pracs) * dt;
1759 psmlt = psmlt * ratio;
1760 evpms = evpms * ratio;
1761 pracs = pracs * ratio;
1765 dum = (-pgmlt - evpmg + pracg) * dt;
1770 pgmlt = pgmlt * ratio;
1771 evpmg = evpmg * ratio;
1772 pracg = pracg * ratio;
1778 dum = (-pracs - pracg - pre - pra - prc + psmlt + pgmlt) * dt;
1781 ratio = (morr_arr(i,j,k,
MORRInd::qr3d)/dt + pracs + pracg + pra + prc - psmlt - pgmlt) / (-pre);
1806 dum = std::max(-1.0, dum);
1810 if (evpms + psmlt < 0.0) {
1812 dum = std::max(-1.0, dum);
1818 dum = std::max(-1.0, dum);
1822 if (evpmg + pgmlt < 0.0) {
1824 dum = std::max(-1.0, dum);
1830 dum = std::max(-1.0, dum);
1847 dumqss = m_ep_2 * dum / (morr_arr(i,j,k,
MORRInd::pres) - dum);
1849 dumqc = std::max(dumqc, 0.0);
1852 dums = dumqv - dumqss;
1853 pcc = dums / (1.0 + std::pow(morr_arr(i,j,k,
MORRInd::xxlv), 2) * dumqss / (morr_arr(i,j,k,
MORRInd::cpm) * m_Rv * std::pow(dumt, 2))) / dt;
1854 if (pcc * dt + dumqc < 0.0) {
1886 morr_arr(i,j,k,
MORRInd::lamr) = pow(m_pi * m_rhow * morr_arr(i,j,k,
MORRInd::nr3d) / morr_arr(i,j,k,
MORRInd::qr3d), 1.0/3.0);
1891 morr_arr(i,j,k,
MORRInd::n0r) = pow(morr_arr(i,j,k,
MORRInd::lamr), 4.0) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1895 morr_arr(i,j,k,
MORRInd::n0r) = pow(morr_arr(i,j,k,
MORRInd::lamr), 4.0) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1899 morr_arr(i,j,k,
MORRInd::n0r) = pow(morr_arr(i,j,k,
MORRInd::lamr), 4.0) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1920 morr_arr(i,j,k,
MORRInd::lamc) = pow((m_cons26 * morr_arr(i,j,k,
MORRInd::nc3d) * gamma_pgam_plus_4) / (morr_arr(i,j,k,
MORRInd::qc3d) * gamma_pgam_plus_1), 1.0/3.0);
1931 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
1936 log(gamma_pgam_plus_1) - log(gamma_pgam_plus_4))/ m_cons26;
1946 morr_arr(i,j,k,
MORRInd::lams) = pow(m_cons1 * morr_arr(i,j,k,
MORRInd::ns3d) / morr_arr(i,j,k,
MORRInd::qni3d), 1.0/ds0);
1954 morr_arr(i,j,k,
MORRInd::n0s) = pow(morr_arr(i,j,k,
MORRInd::lams), 4.0) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1958 morr_arr(i,j,k,
MORRInd::n0s) = pow(morr_arr(i,j,k,
MORRInd::lams), 4.0) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1966 morr_arr(i,j,k,
MORRInd::lami) = pow(m_cons12 * morr_arr(i,j,k,
MORRInd::ni3d) / morr_arr(i,j,k,
MORRInd::qi3d), 1.0/3.0);
1975 morr_arr(i,j,k,
MORRInd::n0i) = pow(morr_arr(i,j,k,
MORRInd::lami), 4.0) * morr_arr(i,j,k,
MORRInd::qi3d) / m_cons12;
1981 morr_arr(i,j,k,
MORRInd::n0i) = pow(morr_arr(i,j,k,
MORRInd::lami), 4.0) * morr_arr(i,j,k,
MORRInd::qi3d) / m_cons12;
1989 morr_arr(i,j,k,
MORRInd::lamg) = pow(m_cons2 * morr_arr(i,j,k,
MORRInd::ng3d) / morr_arr(i,j,k,
MORRInd::qg3d), 1.0/dg0);
1997 morr_arr(i,j,k,
MORRInd::n0g) = pow(morr_arr(i,j,k,
MORRInd::lamg), 4.0) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
2001 morr_arr(i,j,k,
MORRInd::n0g) = pow(morr_arr(i,j,k,
MORRInd::lamg), 4.0) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
2085 mnuccc = m_cons38 * dap * nacnt * std::exp(std::log(morr_arr(i,j,k,
MORRInd::cdist1)) +
2092 mnuccc = mnuccc + m_cons39 *
2094 (std::exp(m_aimm * (273.15 - morr_arr(i,j,k,
MORRInd::t3d))) - 1.0);
2098 (std::exp(m_aimm * (273.15 - morr_arr(i,j,k,
MORRInd::t3d))) - 1.0);
2102 nnuccc = std::min(nnuccc, morr_arr(i,j,k,
MORRInd::nc3d) / dt);
2115 prc = 1350.0 * std::pow(morr_arr(i,j,k,
MORRInd::qc3d), 2.47) *
2120 nprc1 = prc / m_cons29;
2125 nprc1 = std::min(nprc1, nprc);
2132 std::pow((morr_arr(i,j,k,
MORRInd::ns3d) * morr_arr(i,j,k,
MORRInd::rho)), ((4.0 - m_bs) / 3.0)) / morr_arr(i,j,k,
MORRInd::rho);
2183 dum = std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho), 0.54);
2184 ums_local = std::min(ums_local, 1.2 * dum);
2185 uns_local = std::min(uns_local, 1.2 * dum);
2186 umr_local = std::min(umr_local, 9.1 * dum);
2187 unr_local = std::min(unr_local, 9.1 * dum);
2189 pracs = m_cons41 * (std::sqrt(std::pow(1.2 * umr_local - 0.95 * ums_local, 2) +
2191 std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) * (5.0 / (std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) * morr_arr(i,j,k,
MORRInd::lams)) +
2195 npracs = m_cons32 * morr_arr(i,j,k,
MORRInd::rho) * std::sqrt(1.7 * std::pow(unr_local - uns_local, 2) +
2204 pracs = std::min(pracs, morr_arr(i,j,k,
MORRInd::qr3d) / dt);
2210 psacr = m_cons31 * (std::sqrt(std::pow(1.2 * umr_local - 0.95 * ums_local, 2) +
2212 std::pow(morr_arr(i,j,k,
MORRInd::lams), 3) * (5.0 / (std::pow(morr_arr(i,j,k,
MORRInd::lams), 3) * morr_arr(i,j,k,
MORRInd::lamr)) +
2228 dum = std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho), 0.54);
2229 umg_local = std::min(umg_local, 20.0 * dum);
2230 ung_local = std::min(ung_local, 20.0 * dum);
2231 umr_local = std::min(umr_local, 9.1 * dum);
2232 unr_local = std::min(unr_local, 9.1 * dum);
2234 pracg = m_cons41 * (std::sqrt(std::pow(1.2 * umr_local - 0.95 * umg_local, 2) +
2236 std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) * (5.0 / (std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) * morr_arr(i,j,k,
MORRInd::lamg)) +
2240 npracg = m_cons32 * morr_arr(i,j,k,
MORRInd::rho) * std::sqrt(1.7 * std::pow(unr_local - ung_local, 2) +
2249 pracg = std::min(pracg, morr_arr(i,j,k,
MORRInd::qr3d) / dt);
2261 if (psacws > 0.0 || pracs > 0.0) {
2278 nmults = 35.0e4 * psacws * fmult * 1000.0;
2279 qmults = nmults * m_mmult;
2283 qmults = std::min(qmults, psacws);
2284 psacws = psacws - qmults;
2289 nmultr = 35.0e4 * pracs * fmult * 1000.0;
2290 qmultr = nmultr * m_mmult;
2294 qmultr = std::min(qmultr, pracs);
2295 pracs = pracs - qmultr;
2310 if (psacwg > 0.0 || pracg > 0.0) {
2327 nmultg = 35.0e4 * psacwg * fmult * 1000.0;
2328 qmultg = nmultg * m_mmult;
2332 qmultg = std::min(qmultg, psacwg);
2333 psacwg = psacwg - qmultg;
2338 nmultrg = 35.0e4 * pracg * fmult * 1000.0;
2339 qmultrg = nmultrg * m_mmult;
2343 qmultrg = std::min(qmultrg, pracg);
2344 pracg = pracg - qmultrg;
2356 pgsacw = std::min(psacws, m_cons17 * dt * morr_arr(i,j,k,
MORRInd::n0s) * morr_arr(i,j,k,
MORRInd::qc3d) * morr_arr(i,j,k,
MORRInd::qc3d) *
2361 dum = std::max(m_rhosn / (m_rhog - m_rhosn) * pgsacw, 0.0);
2366 nscng = std::min(nscng, morr_arr(i,j,k,
MORRInd::ns3d) / dt);
2369 psacws = psacws - pgsacw;
2381 dum = std::min(dum, 1.0);
2382 dum = std::max(dum, 0.0);
2384 pgracs = (1.0 - dum) * pracs;
2385 ngracs = (1.0 - dum) * npracs;
2388 ngracs = std::min(ngracs, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2389 ngracs = std::min(ngracs, morr_arr(i,j,k,
MORRInd::ns3d) / dt);
2392 pracs = pracs - pgracs;
2393 npracs = npracs - ngracs;
2396 psacr = psacr * (1.0 - dum);
2405 mnuccr = m_cons20 * morr_arr(i,j,k,
MORRInd::nr3d) * (std::exp(m_aimm * (273.15 - morr_arr(i,j,k,
MORRInd::t3d))) - 1.0) /
2408 nnuccr = m_pi * morr_arr(i,j,k,
MORRInd::nr3d) * m_bimm * (std::exp(m_aimm * (273.15 - morr_arr(i,j,k,
MORRInd::t3d))) - 1.0) /
2412 nnuccr = std::min(nnuccr, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2422 pra = 67.0 * std::pow(dum, 1.15);
2436 dum = 2.0 - std::exp(2300.0 * (1.0 / morr_arr(i,j,k,
MORRInd::lamr) - dum1));
2445 if (morr_arr(i,j,k,
MORRInd::qi3d) >= 1.0e-8 && qvqvsi >= 1.0) {
2448 prci = m_cons22 * nprci;
2449 nprci = std::min(nprci, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2456 prai = m_cons23 * morr_arr(i,j,k,
MORRInd::asn) * morr_arr(i,j,k,
MORRInd::qi3d) * morr_arr(i,j,k,
MORRInd::rho) * morr_arr(i,j,k,
MORRInd::n0s) /
2461 nprai = std::min(nprai, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2474 std::pow(morr_arr(i,j,k,
MORRInd::lamr), (m_br + 3.0)) / std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) * morr_arr(i,j,k,
MORRInd::rho);
2477 niacr = std::min(niacr, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2478 niacr = std::min(niacr, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2483 std::pow(morr_arr(i,j,k,
MORRInd::lamr), (m_br + 3.0)) / std::pow(morr_arr(i,j,k,
MORRInd::lamr), 3) * morr_arr(i,j,k,
MORRInd::rho);
2486 niacrs = std::min(niacrs, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2487 niacrs = std::min(niacrs, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2494 if ((qvqvs >= 0.999 && morr_arr(i,j,k,
MORRInd::t3d) <= 265.15) || qvqvsi >= 1.08) {
2496 kc2 = 0.005 * std::exp(0.304 * (273.15 - morr_arr(i,j,k,
MORRInd::t3d))) * 1000.0;
2498 kc2 = std::min(kc2, 500.0e3);
2499 kc2 = std::max(kc2 / morr_arr(i,j,k,
MORRInd::rho), 0.0);
2503 mnuccd = nnuccd * m_mi0;
2506 }
else if (m_inuc == 1) {
2507 if (morr_arr(i,j,k,
MORRInd::t3d) < 273.15 && qvqvsi > 1.0) {
2511 mnuccd = nnuccd * m_mi0;
2520 epsi = 2.0 * m_pi * morr_arr(i,j,k,
MORRInd::n0i) * morr_arr(i,j,k,
MORRInd::rho) * dv / (morr_arr(i,j,k,
MORRInd::lami) * morr_arr(i,j,k,
MORRInd::lami));
2528 m_f2s * std::pow(morr_arr(i,j,k,
MORRInd::asn) * morr_arr(i,j,k,
MORRInd::rho) / morr_arr(i,j,k,
MORRInd::mu), 0.5) *
2529 std::pow(sc_schmidt, (1.0 / 3.0)) * m_cons10 /
2538 m_f2s * std::pow(morr_arr(i,j,k,
MORRInd::agn) * morr_arr(i,j,k,
MORRInd::rho) / morr_arr(i,j,k,
MORRInd::mu), 0.5) *
2539 std::pow(sc_schmidt, (1.0 / 3.0)) * m_cons11 /
2548 m_f2r * std::pow(morr_arr(i,j,k,
MORRInd::arn) * morr_arr(i,j,k,
MORRInd::rho) / morr_arr(i,j,k,
MORRInd::mu), 0.5) *
2549 std::pow(sc_schmidt, (1.0 / 3.0)) * m_cons9 /
2558 prd = epsi * (morr_arr(i,j,k,
MORRInd::qv3d) - qvi) / abi * dum;
2566 epsi * (morr_arr(i,j,k,
MORRInd::qv3d) - qvi) / abi * (1.0 - dum);
2569 prd = prd + epsi * (morr_arr(i,j,k,
MORRInd::qv3d) - qvi) / abi * (1.0 - dum);
2578 pre = std::min(pre, 0.0);
2588 sum_dep = prd + prds + mnuccd + prdg;
2590 if ((dum > 0.0 && sum_dep > dum * fudgef) ||
2591 (dum < 0.0 && sum_dep < dum * fudgef)) {
2592 mnuccd = fudgef * mnuccd * dum / sum_dep;
2593 prd = fudgef * prd * dum / sum_dep;
2594 prds = fudgef * prds * dum / sum_dep;
2595 prdg = fudgef * prdg * dum / sum_dep;
2635 if (m_igraup == 1) {
2652 piacrs = piacrs + piacr;
2656 pracis = pracis + praci;
2658 psacws = psacws + pgsacw;
2660 pracs = pracs + pgracs;
2665 dum = (prc + pra + mnuccc + psacws + psacwi + qmults + psacwg + pgsacw + qmultg) * dt;
2672 mnuccc = mnuccc * ratio;
2673 psacws = psacws * ratio;
2674 psacwi = psacwi * ratio;
2675 qmults = qmults * ratio;
2676 qmultg = qmultg * ratio;
2677 psacwg = psacwg * ratio;
2678 pgsacw = pgsacw * ratio;
2682 dum = (-prd - mnuccc + prci + prai - qmults - qmultg - qmultr - qmultrg
2683 - mnuccd + praci + pracis - eprd - psacwi) * dt;
2686 ratio = (morr_arr(i,j,k,
MORRInd::qi3d) / dt + prd + mnuccc + qmults + qmultg + qmultr + qmultrg +
2688 (prci + prai + praci + pracis - eprd);
2690 prci = prci * ratio;
2691 prai = prai * ratio;
2692 praci = praci * ratio;
2693 pracis = pracis * ratio;
2694 eprd = eprd * ratio;
2698 dum = ((pracs - pre) + (qmultr + qmultrg - prc) + (mnuccr - pra) +
2699 piacr + piacrs + pgracs + pracg) * dt;
2703 (-pre + qmultr + qmultrg + pracs + mnuccr + piacr + piacrs + pgracs + pracg);
2706 pracs = pracs * ratio;
2707 qmultr = qmultr * ratio;
2708 qmultrg = qmultrg * ratio;
2709 mnuccr = mnuccr * ratio;
2710 piacr = piacr * ratio;
2711 piacrs = piacrs * ratio;
2712 pgracs = pgracs * ratio;
2713 pracg = pracg * ratio;
2717 if (m_igraup == 0) {
2718 dum = (-prds - psacws - prai - prci - pracs - eprds + psacr - piacrs - pracis) * dt;
2721 ratio = (morr_arr(i,j,k,
MORRInd::qni3d) / dt + prds + psacws + prai + prci + pracs + piacrs + pracis) /
2724 eprds = eprds * ratio;
2725 psacr = psacr * ratio;
2727 }
else if (m_igraup == 1) {
2729 dum = (-prds - psacws - prai - prci - pracs - eprds + psacr - piacrs - pracis - mnuccr) * dt;
2732 ratio = (morr_arr(i,j,k,
MORRInd::qni3d) / dt + prds + psacws + prai + prci + pracs + piacrs + pracis + mnuccr) /
2735 eprds = eprds * ratio;
2736 psacr = psacr * ratio;
2741 dum = (-psacwg - pracg - pgsacw - pgracs - prdg - mnuccr - eprdg - piacr - praci - psacr) * dt;
2744 ratio = (morr_arr(i,j,k,
MORRInd::qg3d) / dt + psacwg + pracg + pgsacw + pgracs + prdg + mnuccr + psacr +
2745 piacr + praci) / (-eprdg);
2747 eprdg = eprdg * ratio;
2755 (prd + prds + mnuccd + eprd + eprds + prdg + eprdg) * morr_arr(i,j,k,
MORRInd::xxls) +
2756 (psacws + psacwi + mnuccc + mnuccr + qmults + qmultg + qmultr + qmultrg + pracs +
2760 (-pra - prc - mnuccc + pcc -
2761 psacws - psacwi - qmults - qmultg - psacwg - pgsacw);
2764 (prd + eprd + psacwi + mnuccc - prci -
2765 prai + qmults + qmultg + qmultr + qmultrg + mnuccd - praci - pracis);
2768 (pre + pra + prc - pracs - mnuccr - qmultr - qmultrg -
2769 piacr - piacrs - pracg - pgracs);
2770 if (m_igraup == 0) {
2772 (prai + psacws + prds + pracs + prci + eprds - psacr + piacrs + pracis);
2777 prdg + eprdg + mnuccr + piacr + praci + psacr);
2780 }
else if (m_igraup == 1) {
2783 (prai + psacws + prds + pracs + prci + eprds - psacr + piacrs + pracis + mnuccr);
2789 npra - nprc - npsacwi - npsacwg);
2792 (nnuccc - nprci - nprai + nmults + nmultg + nmultr + nmultrg +
2793 nnuccd - niacr - niacrs);
2796 nragg - niacr - niacrs - npracg - ngracs);
2799 c2prec = pra + prc + psacws + qmults + qmultg + psacwg +
2800 pgsacw + mnuccc + psacwi;
2809 dumqss = m_ep_2 * dum / (morr_arr(i,j,k,
MORRInd::pres) - dum);
2812 dumqc = std::max(dumqc, 0.0);
2815 dums = dumqv - dumqss;
2817 pcc = dums / (1.0 + std::pow(morr_arr(i,j,k,
MORRInd::xxlv), 2) * dumqss / (morr_arr(i,j,k,
MORRInd::cpm) * m_Rv * std::pow(dumt, 2))) / dt;
2819 if (pcc * dt + dumqc < 0.0) {
2824 morr_arr(i,j,k,
MORRInd::t3dten) = morr_arr(i,j,k,
MORRInd::t3dten) + pcc * morr_arr(i,j,k,
MORRInd::xxlv) / morr_arr(i,j,k,
MORRInd::cpm);
2831 dum = std::max(-1.0, dum);
2837 dum = std::max(-1.0, dum);
2843 dum = std::max(-1.0, dum);
2849 dum = std::max(-1.0, dum);
2864 for(
int k=klo; k<=khi; k++) {
2880 for(
int k=khi; k>=klo; k--) {
2920 morr_arr(i,j,k,
MORRInd::dlami) = std::pow(m_cons12 * morr_arr(i,j,k,
MORRInd::dumfni) / morr_arr(i,j,k,
MORRInd::dumi), 1.0/di0);
2927 morr_arr(i,j,k,
MORRInd::dlamr) = std::pow(m_pi * m_rhow * morr_arr(i,j,k,
MORRInd::dumfnr) / morr_arr(i,j,k,
MORRInd::dumr), 1.0/3.0);
2950 morr_arr(i,j,k,
MORRInd::dlams) = std::pow(m_cons1 * morr_arr(i,j,k,
MORRInd::dumfns) / morr_arr(i,j,k,
MORRInd::dumqs), 1.0/ds0);
2957 morr_arr(i,j,k,
MORRInd::dlamg) = std::pow(m_cons2 * morr_arr(i,j,k,
MORRInd::dumfng) / morr_arr(i,j,k,
MORRInd::dumg), 1.0/dg0);
2976 morr_arr(i,j,k,
MORRInd::uni) = morr_arr(i,j,k,
MORRInd::ain) * m_cons27 / std::pow(morr_arr(i,j,k,
MORRInd::dlami), m_bi);
2977 morr_arr(i,j,k,
MORRInd::umi) = morr_arr(i,j,k,
MORRInd::ain) * m_cons28 / std::pow(morr_arr(i,j,k,
MORRInd::dlami), m_bi);
2985 morr_arr(i,j,k,
MORRInd::unr) = morr_arr(i,j,k,
MORRInd::arn) * m_cons6 / std::pow(morr_arr(i,j,k,
MORRInd::dlamr), m_br);
2986 morr_arr(i,j,k,
MORRInd::umr) = morr_arr(i,j,k,
MORRInd::arn) * m_cons4 / std::pow(morr_arr(i,j,k,
MORRInd::dlamr), m_br);
2994 morr_arr(i,j,k,
MORRInd::ums) = morr_arr(i,j,k,
MORRInd::asn) * m_cons3 / std::pow(morr_arr(i,j,k,
MORRInd::dlams), m_bs);
2995 morr_arr(i,j,k,
MORRInd::uns) = morr_arr(i,j,k,
MORRInd::asn) * m_cons5 / std::pow(morr_arr(i,j,k,
MORRInd::dlams), m_bs);
3003 morr_arr(i,j,k,
MORRInd::umg) = morr_arr(i,j,k,
MORRInd::agn) * m_cons7 / std::pow(morr_arr(i,j,k,
MORRInd::dlamg), m_bg);
3004 morr_arr(i,j,k,
MORRInd::ung) = morr_arr(i,j,k,
MORRInd::agn) * m_cons8 / std::pow(morr_arr(i,j,k,
MORRInd::dlamg), m_bg);
3012 dum = std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho), 0.54);
3018 morr_arr(i,j,k,
MORRInd::umi) = std::min(morr_arr(i,j,k,
MORRInd::umi), 1.2 * std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho), 0.35));
3019 morr_arr(i,j,k,
MORRInd::uni) = std::min(morr_arr(i,j,k,
MORRInd::uni), 1.2 * std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho), 0.35));
3071 morr_arr(i,j,k,
MORRInd::rgvm) = std::max({morr_arr(i,j,k,
MORRInd::fr), morr_arr(i,j,k,
MORRInd::fi), morr_arr(i,j,k,
MORRInd::fs), morr_arr(i,j,k,
MORRInd::fc),
3072 morr_arr(i,j,k,
MORRInd::fni), morr_arr(i,j,k,
MORRInd::fnr), morr_arr(i,j,k,
MORRInd::fns), morr_arr(i,j,k,
MORRInd::fnc),
3090 for (
int n = 1; n <= nstep; n++) {
3092 for (
int k = klo; k <= khi; k++) {
3121 morr_arr(i,j,k,
MORRInd::qrsten) = morr_arr(i,j,k,
MORRInd::qrsten) - morr_arr(i,j,k,
MORRInd::faltndr) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3122 morr_arr(i,j,k,
MORRInd::qisten) = morr_arr(i,j,k,
MORRInd::qisten) - morr_arr(i,j,k,
MORRInd::faltndi) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3123 morr_arr(i,j,k,
MORRInd::ni3dten) = morr_arr(i,j,k,
MORRInd::ni3dten) - morr_arr(i,j,k,
MORRInd::faltndni) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3124 morr_arr(i,j,k,
MORRInd::qnisten) = morr_arr(i,j,k,
MORRInd::qnisten) - morr_arr(i,j,k,
MORRInd::faltnds) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3125 morr_arr(i,j,k,
MORRInd::ns3dten) = morr_arr(i,j,k,
MORRInd::ns3dten) - morr_arr(i,j,k,
MORRInd::faltndns) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3126 morr_arr(i,j,k,
MORRInd::nr3dten) = morr_arr(i,j,k,
MORRInd::nr3dten) - morr_arr(i,j,k,
MORRInd::faltndnr) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3127 morr_arr(i,j,k,
MORRInd::qcsten) = morr_arr(i,j,k,
MORRInd::qcsten) - morr_arr(i,j,k,
MORRInd::faltndc) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3128 morr_arr(i,j,k,
MORRInd::nc3dten) = morr_arr(i,j,k,
MORRInd::nc3dten) - morr_arr(i,j,k,
MORRInd::faltndnc) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3129 morr_arr(i,j,k,
MORRInd::qgsten) = morr_arr(i,j,k,
MORRInd::qgsten) - morr_arr(i,j,k,
MORRInd::faltndg) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3130 morr_arr(i,j,k,
MORRInd::ng3dten) = morr_arr(i,j,k,
MORRInd::ng3dten) - morr_arr(i,j,k,
MORRInd::faltndng) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3145 for (k = khi-1; k >= klo; k--) {
3147 morr_arr(i,j,k,
MORRInd::faltndr) = (morr_arr(i,j,k+1,
MORRInd::faloutr) - morr_arr(i,j,k,
MORRInd::faloutr)) / morr_arr(i,j,k,
MORRInd::dzq);
3148 morr_arr(i,j,k,
MORRInd::faltndi) = (morr_arr(i,j,k+1,
MORRInd::falouti) - morr_arr(i,j,k,
MORRInd::falouti)) / morr_arr(i,j,k,
MORRInd::dzq);
3149 morr_arr(i,j,k,
MORRInd::faltndni) = (morr_arr(i,j,k+1,
MORRInd::faloutni) - morr_arr(i,j,k,
MORRInd::faloutni)) / morr_arr(i,j,k,
MORRInd::dzq);
3150 morr_arr(i,j,k,
MORRInd::faltnds) = (morr_arr(i,j,k+1,
MORRInd::falouts) - morr_arr(i,j,k,
MORRInd::falouts)) / morr_arr(i,j,k,
MORRInd::dzq);
3151 morr_arr(i,j,k,
MORRInd::faltndns) = (morr_arr(i,j,k+1,
MORRInd::faloutns) - morr_arr(i,j,k,
MORRInd::faloutns)) / morr_arr(i,j,k,
MORRInd::dzq);
3152 morr_arr(i,j,k,
MORRInd::faltndnr) = (morr_arr(i,j,k+1,
MORRInd::faloutnr) - morr_arr(i,j,k,
MORRInd::faloutnr)) / morr_arr(i,j,k,
MORRInd::dzq);
3153 morr_arr(i,j,k,
MORRInd::faltndc) = (morr_arr(i,j,k+1,
MORRInd::faloutc) - morr_arr(i,j,k,
MORRInd::faloutc)) / morr_arr(i,j,k,
MORRInd::dzq);
3154 morr_arr(i,j,k,
MORRInd::faltndnc) = (morr_arr(i,j,k+1,
MORRInd::faloutnc) - morr_arr(i,j,k,
MORRInd::faloutnc)) / morr_arr(i,j,k,
MORRInd::dzq);
3155 morr_arr(i,j,k,
MORRInd::faltndg) = (morr_arr(i,j,k+1,
MORRInd::faloutg) - morr_arr(i,j,k,
MORRInd::faloutg)) / morr_arr(i,j,k,
MORRInd::dzq);
3156 morr_arr(i,j,k,
MORRInd::faltndng) = (morr_arr(i,j,k+1,
MORRInd::faloutng) - morr_arr(i,j,k,
MORRInd::faloutng)) / morr_arr(i,j,k,
MORRInd::dzq);
3159 morr_arr(i,j,k,
MORRInd::qrsten) = morr_arr(i,j,k,
MORRInd::qrsten) + morr_arr(i,j,k,
MORRInd::faltndr) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3160 morr_arr(i,j,k,
MORRInd::qisten) = morr_arr(i,j,k,
MORRInd::qisten) + morr_arr(i,j,k,
MORRInd::faltndi) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3161 morr_arr(i,j,k,
MORRInd::ni3dten) = morr_arr(i,j,k,
MORRInd::ni3dten) + morr_arr(i,j,k,
MORRInd::faltndni) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3162 morr_arr(i,j,k,
MORRInd::qnisten) = morr_arr(i,j,k,
MORRInd::qnisten) + morr_arr(i,j,k,
MORRInd::faltnds) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3163 morr_arr(i,j,k,
MORRInd::ns3dten) = morr_arr(i,j,k,
MORRInd::ns3dten) + morr_arr(i,j,k,
MORRInd::faltndns) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3164 morr_arr(i,j,k,
MORRInd::nr3dten) = morr_arr(i,j,k,
MORRInd::nr3dten) + morr_arr(i,j,k,
MORRInd::faltndnr) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3165 morr_arr(i,j,k,
MORRInd::qcsten) = morr_arr(i,j,k,
MORRInd::qcsten) + morr_arr(i,j,k,
MORRInd::faltndc) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3166 morr_arr(i,j,k,
MORRInd::nc3dten) = morr_arr(i,j,k,
MORRInd::nc3dten) + morr_arr(i,j,k,
MORRInd::faltndnc) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3167 morr_arr(i,j,k,
MORRInd::qgsten) = morr_arr(i,j,k,
MORRInd::qgsten) + morr_arr(i,j,k,
MORRInd::faltndg) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3168 morr_arr(i,j,k,
MORRInd::ng3dten) = morr_arr(i,j,k,
MORRInd::ng3dten) + morr_arr(i,j,k,
MORRInd::faltndng) / nstep / morr_arr(i,j,k,
MORRInd::rho);
3185 morr_arr(i,j,klo,
MORRInd::precrt) += (morr_arr(i,j,kts,
MORRInd::faloutr) + morr_arr(i,j,kts,
MORRInd::faloutc) + morr_arr(i,j,kts,
MORRInd::falouts) +
3187 morr_arr(i,j,klo,
MORRInd::snowrt) += (morr_arr(i,j,kts,
MORRInd::falouts) + morr_arr(i,j,kts,
MORRInd::falouti) + morr_arr(i,j,kts,
MORRInd::faloutg)) * dt / nstep;
3193 for(
int k=klo; k<=khi; k++) {
3211 morr_arr(i,j,k,
MORRInd::qni3dten) = morr_arr(i,j,k,
MORRInd::qni3dten) + morr_arr(i,j,k,
MORRInd::qi3d)/dt + morr_arr(i,j,k,
MORRInd::qi3dten);
3212 morr_arr(i,j,k,
MORRInd::ns3dten) = morr_arr(i,j,k,
MORRInd::ns3dten) + morr_arr(i,j,k,
MORRInd::ni3d)/dt + morr_arr(i,j,k,
MORRInd::ni3dten);
3227 if (m_igraup == 0) {
3257 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qr3d) * morr_arr(i,j,k,
MORRInd::xxlv) / morr_arr(i,j,k,
MORRInd::cpm);
3262 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qc3d) * morr_arr(i,j,k,
MORRInd::xxlv) / morr_arr(i,j,k,
MORRInd::cpm);
3269 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qi3d) * morr_arr(i,j,k,
MORRInd::xxls) / morr_arr(i,j,k,
MORRInd::cpm);
3274 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qni3d) * morr_arr(i,j,k,
MORRInd::xxls) / morr_arr(i,j,k,
MORRInd::cpm);
3279 morr_arr(i,j,k,
MORRInd::t3d) -= morr_arr(i,j,k,
MORRInd::qg3d) * morr_arr(i,j,k,
MORRInd::xxls) / morr_arr(i,j,k,
MORRInd::cpm);
3328 morr_arr(i,j,k,
MORRInd::t3d) = morr_arr(i,j,k,
MORRInd::t3d) - morr_arr(i,j,k,
MORRInd::qi3d) * morr_arr(i,j,k,
MORRInd::xlf) / morr_arr(i,j,k,
MORRInd::cpm);
3334 if ((m_iliq != 1)) {
3339 morr_arr(i,j,k,
MORRInd::t3d) = morr_arr(i,j,k,
MORRInd::t3d) + morr_arr(i,j,k,
MORRInd::qc3d) * morr_arr(i,j,k,
MORRInd::xlf) / morr_arr(i,j,k,
MORRInd::cpm);
3345 if (m_igraup == 0) {
3348 morr_arr(i,j,k,
MORRInd::t3d) = morr_arr(i,j,k,
MORRInd::t3d) + morr_arr(i,j,k,
MORRInd::qr3d) * morr_arr(i,j,k,
MORRInd::xlf) / morr_arr(i,j,k,
MORRInd::cpm);
3353 }
else if (m_igraup == 1) {
3356 morr_arr(i,j,k,
MORRInd::t3d) = morr_arr(i,j,k,
MORRInd::t3d) + morr_arr(i,j,k,
MORRInd::qr3d) * morr_arr(i,j,k,
MORRInd::xlf) / morr_arr(i,j,k,
MORRInd::cpm);
3377 morr_arr(i,j,k,
MORRInd::lami) = std::pow(m_cons12 * morr_arr(i,j,k,
MORRInd::ni3d) / morr_arr(i,j,k,
MORRInd::qi3d), 1.0/m_di);
3382 morr_arr(i,j,k,
MORRInd::n0i) = std::pow(morr_arr(i,j,k,
MORRInd::lami), 4) * morr_arr(i,j,k,
MORRInd::qi3d) / m_cons12;
3386 morr_arr(i,j,k,
MORRInd::n0i) = std::pow(morr_arr(i,j,k,
MORRInd::lami), 4) * morr_arr(i,j,k,
MORRInd::qi3d) / m_cons12;
3393 morr_arr(i,j,k,
MORRInd::lamr) = std::pow(m_pi * m_rhow * morr_arr(i,j,k,
MORRInd::nr3d) / morr_arr(i,j,k,
MORRInd::qr3d), 1.0/3.0);
3399 morr_arr(i,j,k,
MORRInd::n0r) = std::pow(morr_arr(i,j,k,
MORRInd::lamr), 4) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
3403 morr_arr(i,j,k,
MORRInd::n0r) = std::pow(morr_arr(i,j,k,
MORRInd::lamr), 4) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
3439 morr_arr(i,j,k,
MORRInd::lams) = std::pow(m_cons1 * morr_arr(i,j,k,
MORRInd::ns3d) / morr_arr(i,j,k,
MORRInd::qni3d), 1.0/m_ds);
3445 morr_arr(i,j,k,
MORRInd::n0s) = std::pow(morr_arr(i,j,k,
MORRInd::lams), 4) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
3449 morr_arr(i,j,k,
MORRInd::n0s) = std::pow(morr_arr(i,j,k,
MORRInd::lams), 4) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
3456 morr_arr(i,j,k,
MORRInd::lamg) = std::pow(m_cons2 * morr_arr(i,j,k,
MORRInd::ng3d) / morr_arr(i,j,k,
MORRInd::qg3d), 1.0/m_dg);
3462 morr_arr(i,j,k,
MORRInd::n0g) = std::pow(morr_arr(i,j,k,
MORRInd::lamg), 4) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
3466 morr_arr(i,j,k,
MORRInd::n0g) = std::pow(morr_arr(i,j,k,
MORRInd::lamg), 4) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
3493 morr_arr(i,j,k,
MORRInd::effc) =
gamma_function(morr_arr(i,j,k,
MORRInd::pgam) + 4.0) /
gamma_function(morr_arr(i,j,k,
MORRInd::pgam) + 3.0) / morr_arr(i,j,k,
MORRInd::lamc) / 2.0 * 1.0e6;
3510 morr_arr(i,j,k,
MORRInd::ni3d) = std::min(morr_arr(i,j,k,
MORRInd::ni3d), 0.3e6 / morr_arr(i,j,k,
MORRInd::rho));
3513 if (iinum == 0 && m_iact == 2) {
3514 morr_arr(i,j,k,
MORRInd::nc3d) = std::min(morr_arr(i,j,k,
MORRInd::nc3d), (m_nanew1 + m_nanew2) / morr_arr(i,j,k,
MORRInd::rho));
3529 if(use_morr_cpp_answer) {
3530 for(
int k=klo; k<=khi; k++) {
3544 theta_arr(i,j,k) = morr_arr(i,j,k,
MORRInd::t3d) / pii_arr(i,j,k);
3560 rain_accum_arr(i,j,klo) = rain_accum_arr(i,j,klo) + morr_arr(i,j,klo,
MORRInd::precrt);
3561 snow_accum_arr(i,j,klo) = snow_accum_arr(i,j,klo) + morr_arr(i,j,klo,
MORRInd::snowprt);
3562 graup_accum_arr(i,j,klo) = graup_accum_arr(i,j,klo) + morr_arr(i,j,klo,
MORRInd::grplprt);
3568 amrex::Print()<<
"fortran should run "<<run_morr_fort<<std::endl;
3571 #ifdef ERF_USE_MORR_FORT
3577 theta_arr.dataPtr(),
3597 rain_accum_arr.dataPtr(),
3598 rainncv_arr.dataPtr(),
3600 snow_accum_arr.dataPtr(),
3601 snowncv_arr.dataPtr(),
3602 graup_accum_arr.dataPtr(),
3603 graupelncv_arr.dataPtr(),
3606 dummy_reflectivity_ptr,
3621 ilo, ihi, jlo, jhi, klo, khi,
3622 ilom, ihim, jlom, jhim, klom, khim,
3623 ilo, ihi, jlo, jhi, klo, khi,
3627 rainprod_arr.dataPtr(),
3628 evapprod_arr.dataPtr(),
3629 qlsink_arr.dataPtr(),
3630 precr_arr.dataPtr(),
3631 preci_arr.dataPtr(),
3632 precs_arr.dataPtr(),
3636 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:448
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real gamma_function(Real x)
Definition: ERF_AdvanceMorrison.cpp:435
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pp(amrex::Real y)
Definition: ERF_MicrophysicsUtils.H:230
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::Real Real
Definition: ERF_ShocInterface.H:16
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
@ qisten
Definition: ERF_AdvanceMorrison.cpp:71
@ dumfnc
Definition: ERF_AdvanceMorrison.cpp:129
@ qi3dten
Definition: ERF_AdvanceMorrison.cpp:43
@ agn
Definition: ERF_AdvanceMorrison.cpp:92
@ pres
Definition: ERF_AdvanceMorrison.cpp:60
@ precrt
Definition: ERF_AdvanceMorrison.cpp:77
@ dumc
Definition: ERF_AdvanceMorrison.cpp:128
@ falouti
Definition: ERF_AdvanceMorrison.cpp:108
@ ni3d
Definition: ERF_AdvanceMorrison.cpp:53
@ dumi
Definition: ERF_AdvanceMorrison.cpp:93
@ faloutnc
Definition: ERF_AdvanceMorrison.cpp:136
@ snowprt
Definition: ERF_AdvanceMorrison.cpp:79
@ lamg
Definition: ERF_AdvanceMorrison.cpp:35
@ xxls
Definition: ERF_AdvanceMorrison.cpp:149
@ n0s
Definition: ERF_AdvanceMorrison.cpp:38
@ fns
Definition: ERF_AdvanceMorrison.cpp:118
@ grplprt
Definition: ERF_AdvanceMorrison.cpp:80
@ dumfns
Definition: ERF_AdvanceMorrison.cpp:114
@ qni3d
Definition: ERF_AdvanceMorrison.cpp:51
@ ung
Definition: ERF_AdvanceMorrison.cpp:132
@ faloutng
Definition: ERF_AdvanceMorrison.cpp:122
@ qc3dten
Definition: ERF_AdvanceMorrison.cpp:42
@ w3d
Definition: ERF_AdvanceMorrison.cpp:62
@ rgvm
Definition: ERF_AdvanceMorrison.cpp:106
@ arn
Definition: ERF_AdvanceMorrison.cpp:89
@ lami
Definition: ERF_AdvanceMorrison.cpp:32
@ qscu1d
Definition: ERF_AdvanceMorrison.cpp:75
@ qcsten
Definition: ERF_AdvanceMorrison.cpp:73
@ fc
Definition: ERF_AdvanceMorrison.cpp:134
@ qrcuten_arr
Definition: ERF_AdvanceMorrison.cpp:28
@ fnr
Definition: ERF_AdvanceMorrison.cpp:143
@ pgam
Definition: ERF_AdvanceMorrison.cpp:41
@ qrcu1d
Definition: ERF_AdvanceMorrison.cpp:74
@ fng
Definition: ERF_AdvanceMorrison.cpp:105
@ ng3dten
Definition: ERF_AdvanceMorrison.cpp:66
@ dlami
Definition: ERF_AdvanceMorrison.cpp:146
@ faloutni
Definition: ERF_AdvanceMorrison.cpp:109
@ faloutnr
Definition: ERF_AdvanceMorrison.cpp:141
@ NumInds
Definition: ERF_AdvanceMorrison.cpp:153
@ qscuten_arr
Definition: ERF_AdvanceMorrison.cpp:29
@ dumfni
Definition: ERF_AdvanceMorrison.cpp:95
@ n0g
Definition: ERF_AdvanceMorrison.cpp:40
@ dlams
Definition: ERF_AdvanceMorrison.cpp:144
@ n0i
Definition: ERF_AdvanceMorrison.cpp:37
@ effs
Definition: ERF_AdvanceMorrison.cpp:83
@ faltndg
Definition: ERF_AdvanceMorrison.cpp:126
@ cpm
Definition: ERF_AdvanceMorrison.cpp:151
@ qr3dten
Definition: ERF_AdvanceMorrison.cpp:45
@ t3d
Definition: ERF_AdvanceMorrison.cpp:58
@ dumqs
Definition: ERF_AdvanceMorrison.cpp:113
@ qg3d
Definition: ERF_AdvanceMorrison.cpp:67
@ lamr
Definition: ERF_AdvanceMorrison.cpp:34
@ qr3d
Definition: ERF_AdvanceMorrison.cpp:52
@ nc3d
Definition: ERF_AdvanceMorrison.cpp:63
@ qg3dten
Definition: ERF_AdvanceMorrison.cpp:65
@ nr3dten
Definition: ERF_AdvanceMorrison.cpp:48
@ dzq
Definition: ERF_AdvanceMorrison.cpp:61
@ dumfnr
Definition: ERF_AdvanceMorrison.cpp:140
@ uns
Definition: ERF_AdvanceMorrison.cpp:116
@ faltndng
Definition: ERF_AdvanceMorrison.cpp:127
@ effc
Definition: ERF_AdvanceMorrison.cpp:81
@ qnisten
Definition: ERF_AdvanceMorrison.cpp:72
@ faloutg
Definition: ERF_AdvanceMorrison.cpp:121
@ t3dten
Definition: ERF_AdvanceMorrison.cpp:56
@ qv3d
Definition: ERF_AdvanceMorrison.cpp:59
@ ni3dten
Definition: ERF_AdvanceMorrison.cpp:46
@ uni
Definition: ERF_AdvanceMorrison.cpp:98
@ umi
Definition: ERF_AdvanceMorrison.cpp:99
@ qni3dten
Definition: ERF_AdvanceMorrison.cpp:44
@ faloutr
Definition: ERF_AdvanceMorrison.cpp:107
@ dumr
Definition: ERF_AdvanceMorrison.cpp:94
@ faloutns
Definition: ERF_AdvanceMorrison.cpp:120
@ effi
Definition: ERF_AdvanceMorrison.cpp:82
@ faltndni
Definition: ERF_AdvanceMorrison.cpp:112
@ unc
Definition: ERF_AdvanceMorrison.cpp:130
@ umc
Definition: ERF_AdvanceMorrison.cpp:131
@ qv3dten
Definition: ERF_AdvanceMorrison.cpp:57
@ qicuten_arr
Definition: ERF_AdvanceMorrison.cpp:30
@ faltndns
Definition: ERF_AdvanceMorrison.cpp:124
@ nc3dten
Definition: ERF_AdvanceMorrison.cpp:64
@ dumg
Definition: ERF_AdvanceMorrison.cpp:96
@ dlamc
Definition: ERF_AdvanceMorrison.cpp:147
@ rho
Definition: ERF_AdvanceMorrison.cpp:86
@ effr
Definition: ERF_AdvanceMorrison.cpp:84
@ faltndnc
Definition: ERF_AdvanceMorrison.cpp:138
@ xxlv
Definition: ERF_AdvanceMorrison.cpp:150
@ faltndc
Definition: ERF_AdvanceMorrison.cpp:137
@ faltndnr
Definition: ERF_AdvanceMorrison.cpp:142
@ fni
Definition: ERF_AdvanceMorrison.cpp:103
@ umr
Definition: ERF_AdvanceMorrison.cpp:100
@ faloutc
Definition: ERF_AdvanceMorrison.cpp:135
@ ain
Definition: ERF_AdvanceMorrison.cpp:88
@ effg
Definition: ERF_AdvanceMorrison.cpp:85
@ faltnds
Definition: ERF_AdvanceMorrison.cpp:123
@ xlf
Definition: ERF_AdvanceMorrison.cpp:152
@ asn
Definition: ERF_AdvanceMorrison.cpp:90
@ fr
Definition: ERF_AdvanceMorrison.cpp:101
@ fnc
Definition: ERF_AdvanceMorrison.cpp:139
@ fi
Definition: ERF_AdvanceMorrison.cpp:102
@ dumfng
Definition: ERF_AdvanceMorrison.cpp:97
@ faltndr
Definition: ERF_AdvanceMorrison.cpp:110
@ lams
Definition: ERF_AdvanceMorrison.cpp:33
@ fs
Definition: ERF_AdvanceMorrison.cpp:117
@ qicu1d
Definition: ERF_AdvanceMorrison.cpp:76
@ qrsten
Definition: ERF_AdvanceMorrison.cpp:70
@ qgsten
Definition: ERF_AdvanceMorrison.cpp:69
@ cdist1
Definition: ERF_AdvanceMorrison.cpp:36
@ dlamg
Definition: ERF_AdvanceMorrison.cpp:148
@ mu
Definition: ERF_AdvanceMorrison.cpp:87
@ lamc
Definition: ERF_AdvanceMorrison.cpp:31
@ ns3dten
Definition: ERF_AdvanceMorrison.cpp:47
@ ns3d
Definition: ERF_AdvanceMorrison.cpp:54
@ dlamr
Definition: ERF_AdvanceMorrison.cpp:145
@ ng3d
Definition: ERF_AdvanceMorrison.cpp:68
@ qi3d
Definition: ERF_AdvanceMorrison.cpp:50
@ acn
Definition: ERF_AdvanceMorrison.cpp:91
@ falouts
Definition: ERF_AdvanceMorrison.cpp:119
@ faltndi
Definition: ERF_AdvanceMorrison.cpp:111
@ fg
Definition: ERF_AdvanceMorrison.cpp:104
@ qc3d
Definition: ERF_AdvanceMorrison.cpp:49
@ umg
Definition: ERF_AdvanceMorrison.cpp:133
@ unr
Definition: ERF_AdvanceMorrison.cpp:125
@ ums
Definition: ERF_AdvanceMorrison.cpp:115
@ n0r
Definition: ERF_AdvanceMorrison.cpp:39
@ snowrt
Definition: ERF_AdvanceMorrison.cpp:78
@ nr3d
Definition: ERF_AdvanceMorrison.cpp:55
@ 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
MoistureType moisture_type
Definition: ERF_DataStruct.H:873