220 Real dt = dt_advance;
224 bool use_morr_cpp_answer =
true;
225 pp.queryAdd(
"use_morr_cpp_answer", use_morr_cpp_answer);
226 #ifndef ERF_USE_MORR_FORT
228 if (!use_morr_cpp_answer) {
229 Abort(
"erf.use_morr_cpp_answer = false requires the Morrison Fortran bridge "
230 "(USE_MORR_FORT=TRUE or ERF_ENABLE_MORR_FORT=ON)");
235 bool run_morr_cpp = use_morr_cpp_answer;
236 bool run_morr_fort = !run_morr_cpp;
241 "Morrison: erf.use_morr_cpp_answer = false requires every box to span the domain in z "
242 "(no grids split in z, and no refined levels short of the domain top or bottom)");
245 const int dom_klo =
m_geom.Domain().smallEnd(2);
247 std::string filename = std::string(
"output_cpp") + std::to_string(use_morr_cpp_answer) +
".txt";
252 pp.queryAdd(
"morrison_ndcnst", m_ndcnst);
260 const IntVect morr_tile_size = run_morr_fort ? IntVect::TheZeroVector() :
TileNoZ();
263 auto box = mfi.tilebox();
293 auto const& sed_arr =
m_sed.
down->array(mfi);
295 : Array4<const Real>{};
302 const int ilo = box.loVect()[0];
303 const int ihi = box.hiVect()[0];
304 const int jlo = box.loVect()[1];
305 const int jhi = box.hiVect()[1];
306 const int klo = box.loVect()[2];
307 const int khi = box.hiVect()[2];
309 Box grown_box(box); grown_box.grow(3);
318 const Box& fab_box = mfi.fabbox();
320 #if defined(ERF_USE_MORR_FORT) && defined(AMREX_USE_GPU)
329 auto const& pii_arr = pii_fab.array();
336 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
339 pii_arr(i,j,k) = std::pow((pres_arr(i,j,k)) /
p0, rdcp);
344 auto const& dz_arr = dz_fab.array();
351 ParallelFor(fab_box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
352 dz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
353 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
354 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
355 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
360 Box fab_boxD(fab_box); fab_boxD.makeSlab(2,0);
363 FArrayBox rainncv_fab(fab_boxD, 1,
Arena_Used);
365 FArrayBox snowncv_fab(fab_boxD, 1,
Arena_Used);
366 FArrayBox graupelncv_fab(fab_boxD, 1,
Arena_Used);
368 auto const& rainncv_arr = rainncv_fab.array();
369 auto const& sr_arr = sr_fab.array();
370 auto const& snowncv_arr = snowncv_fab.array();
371 auto const& graupelncv_arr = graupelncv_fab.array();
374 ParallelFor(fab_boxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
375 rainncv_arr(i,j,k) =
Real(0);
376 sr_arr(i,j,k) =
Real(0);
377 snowncv_arr(i,j,k) =
Real(0);
378 graupelncv_arr(i,j,k) =
Real(0);
382 FArrayBox ht_fab(Box(IntVect(ilo, jlo, 0), IntVect(ihi, jhi, 0)), 1,
Arena_Used);
383 [[maybe_unused]]
auto const& ht_arr = ht_fab.array();
458 Real m_lammaxi, m_lammini;
459 Real m_lammaxr, m_lamminr;
460 Real m_lammaxs, m_lammins;
461 Real m_lammaxg, m_lamming;
489 Real m_cons1, m_cons2, m_cons3, m_cons4, m_cons5;
490 Real m_cons6, m_cons7, m_cons8, m_cons9, m_cons10;
491 Real m_cons11, m_cons12, m_cons13, m_cons14, m_cons15;
492 Real m_cons16, m_cons17, m_cons18, m_cons19, m_cons20;
493 Real m_cons21, m_cons22, m_cons23, m_cons24, m_cons25;
494 Real m_cons26, m_cons27, m_cons28, m_cons29;
495 Real m_cons31, m_cons32, m_cons34, m_cons35;
496 Real m_cons36, m_cons37, m_cons38, m_cons39, m_cons40;
506 m_pi =
Real(3.1415926535897932384626434);
513 m_ep_2 = m_Rd / m_Rv;
519 m_rhow =
Real(997.0);
520 m_rhoi =
Real(500.0);
521 m_rhosn =
Real(100.0);
525 m_rhog =
Real(400.0);
527 m_rhog =
Real(900.0);
544 m_ar =
Real(841.99667);
560 m_bimm =
Real(100.0);
562 m_dcs =
Real(125.0E-6);
563 m_mi0 =
Real(4.0)/
three*m_pi*m_rhoi*amrex::Math::powi<3>(
Real(10.0E-6));
564 m_mg0 =
Real(1.6E-10);
573 m_qsmall =
Real(1.0E-14);
580 m_cpw =
Real(4187.0);
583 m_ci = m_rhoi * m_pi /
Real(6.0);
585 m_cs = m_rhosn * m_pi /
Real(6.0);
587 m_cg = m_rhog * m_pi /
Real(6.0);
591 m_rin =
Real(0.1E-6);
594 m_mmult =
Real(4.0)/
three*m_pi*m_rhoi*amrex::Math::powi<3>(
Real(5.0E-6));
601 m_lamminr =
one/
Real(2800.0E-6);
603 m_lammins =
one/
Real(2000.0E-6);
605 m_lamming =
one/
Real(2000.0E-6);
633 m_nanew1 =
Real(72.2E6);
640 m_nanew2 =
Real(1.8E6);
660 m_cons15 = -
Real(1108.0) * m_eii * std::pow(m_pi, (
one-m_bs)/
three) *
663 m_cons17 =
Real(4.0) *
Real(2) *
three * m_rhosu * m_pi * m_eci * m_eci *
665 m_cons18 = m_rhosn * m_rhosn;
666 m_cons19 = m_rhow * m_rhow;
667 m_cons20 =
Real(20.0) * m_pi * m_pi * m_rhow * m_bimm;
668 m_cons21 =
Real(4.0) / (m_dcs * m_rhoi);
669 m_cons22 = m_pi * m_rhoi * amrex::Math::powi<3>(m_dcs) /
Real(6.0);
673 m_cons26 = m_pi /
Real(6.0) * m_rhow;
676 m_cons29 =
Real(4.0)/
three * m_pi * m_rhow * amrex::Math::powi<3>(
Real(25.0E-6));
677 m_cons31 = m_pi * m_pi * m_ecr * m_rhosn;
678 m_cons32 = m_pi /
Real(2) * m_ecr;
682 m_cons37 =
Real(4.0) * m_pi *
Real(1.38E-23) / (
Real(6.0) * m_pi * m_rin);
683 m_cons38 = m_pi * m_pi /
three * m_rhow;
684 m_cons39 = m_pi * m_pi /
Real(36.0) * m_rhow * m_bimm;
685 m_cons40 = m_pi /
Real(6.0) * m_bimm;
686 m_cons41 = m_pi * m_pi * m_ecr * m_rhow;
713 m_nanew1 =
Real(72.2E6);
720 m_nanew2 =
Real(1.8E6);
737 Box boxD(box); boxD.makeSlab(2,0);
743 morr_fab.template setVal<RunOn::Device>(0);
744 auto const& morr_arr = morr_fab.array();
751 ParallelFor( box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
766 morr_arr(i,j,k,
MORRInd::t3d) = theta_arr(i,j,k) * pii_arr(i,j,k);
779 ParallelFor( boxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
785 for (
int k=
klo; k<=
khi; k++) {
974 if (qvqvs <
Real(0.9)) {
977 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);
982 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);
986 if (qvqvsi <
Real(0.9)) {
989 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);
994 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);
999 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);
1008 const Real QSMALL = m_qsmall;
1043 morr_arr(i,j,k,
MORRInd::mu) =
Real(1.496e-6) * std::pow(morr_arr(i,j,k,
MORRInd::t3d),
Real(1.5)) / (morr_arr(i,j,k,
MORRInd::t3d) +
Real(120.0));
1062 bool skipMicrophysics =
false;
1063 bool skipConcentrations =
false;
1064 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) {
1066 skipMicrophysics =
true;
1070 if(!skipMicrophysics) {
1083 dum = (m_Rv * amrex::Math::powi<2>(morr_arr(i,j,k,
MORRInd::t3d)));
1099 ndcnst_to_number_mixing_ratio(m_ndcnst,
rho_arr(i,j,k));
1107 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);
1115 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);
1120 if (morr_arr(i,j,k,
MORRInd::qc3d) < m_qsmall && morr_arr(i,j,k,
MORRInd::qni3d) <
Real(1.0e-8) && morr_arr(i,j,k,
MORRInd::qr3d) < m_qsmall && morr_arr(i,j,k,
MORRInd::qg3d) <
Real(1.0e-8)) {
1121 skipConcentrations=
true;
1123 if(!skipConcentrations) {
1135 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),
one/
three);
1141 morr_arr(i,j,k,
MORRInd::n0r) = std::pow(morr_arr(i,j,k,
MORRInd::lamr),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1145 morr_arr(i,j,k,
MORRInd::n0r) = std::pow(morr_arr(i,j,k,
MORRInd::lamr),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1166 morr_arr(i,j,k,
MORRInd::lamc) = std::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),
one/
three);
1177 std::log(gamma_pgam_plus_1) - std::log(gamma_pgam_plus_4))/ m_cons26;
1182 std::log(gamma_pgam_plus_1) - std::log(gamma_pgam_plus_4))/ m_cons26;
1192 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),
one/ds0);
1200 morr_arr(i,j,k,
MORRInd::n0s) = std::pow(morr_arr(i,j,k,
MORRInd::lams),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1204 morr_arr(i,j,k,
MORRInd::n0s) = std::pow(morr_arr(i,j,k,
MORRInd::lams),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1212 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),
one/dg0);
1220 morr_arr(i,j,k,
MORRInd::n0g) = std::pow(morr_arr(i,j,k,
MORRInd::lamg),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
1224 morr_arr(i,j,k,
MORRInd::n0g) = std::pow(morr_arr(i,j,k,
MORRInd::lamg),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
1271 nprc1 = prc / m_cons29;
1276 nprc1 = std::min(nprc1, nprc);
1291 ums_local = std::min(ums_local,
Real(1.2)*dum);
1292 uns_local = std::min(uns_local,
Real(1.2)*dum);
1293 umr_local = std::min(umr_local,
Real(9.1)*dum);
1294 unr_local = std::min(unr_local,
Real(9.1)*dum);
1301 pracs = m_cons41 * (std::sqrt(amrex::Math::powi<2>(
Real(1.2)*umr_local-
Real(0.95)*ums_local) +
1322 umg_local = std::min(umg_local,
Real(20.0)*dum);
1323 ung_local = std::min(ung_local,
Real(20.0)*dum);
1324 umr_local = std::min(umr_local,
Real(9.1)*dum);
1325 unr_local = std::min(unr_local,
Real(9.1)*dum);
1328 pracg = m_cons41 * (std::sqrt(amrex::Math::powi<2>(
Real(1.2)*umr_local-
Real(0.95)*umg_local) +
1336 dum = pracg/
Real(5.2e-7);
1338 npracg = m_cons32 * morr_arr(i,j,k,
MORRInd::rho) * (std::sqrt(
Real(1.7)*amrex::Math::powi<2>(unr_local-ung_local) +
1345 npracg = npracg - dum;
1355 pra =
Real(67.0) * std::pow(dum,
Real(1.15));
1366 dum1 =
Real(300.0e-6);
1379 std::pow(sc_schmidt,
one/
three) * m_cons9 /
1387 pre = std::min(pre,
Real(0));
1404 std::pow(sc_schmidt,
one/
three) * m_cons10 /
1412 std::pow(sc_schmidt,
one/
three) * m_cons10 /
1417 evpms = std::max(evpms,
psmlt);
1435 std::pow(sc_schmidt,
one/
three) * m_cons11 /
1443 std::pow(sc_schmidt,
one/
three) * m_cons11 /
1448 evpmg = std::max(evpmg,
pgmlt);
1460 dum = (prc + pra) * dt;
1475 evpms = evpms * ratio;
1480 dum = (-
pgmlt - evpmg + pracg) * dt;
1486 evpmg = evpmg * ratio;
1487 pracg = pracg * ratio;
1519 if (pre <
Real(0)) {
1521 dum = std::max(-
one, dum);
1527 dum = std::max(-
one, dum);
1533 dum = std::max(-
one, dum);
1539 dum = std::max(-
one, dum);
1545 dum = std::max(-
one, dum);
1563 dumqss = m_ep_2 * dum / (morr_arr(i,j,k,
MORRInd::pres) - dum);
1565 dumqc = std::max(dumqc,
Real(0));
1568 dums = dumqv - dumqss;
1569 pcc = dums / (
one + amrex::Math::powi<2>(morr_arr(i,j,k,
MORRInd::xxlv)) * dumqss / (morr_arr(i,j,k,
MORRInd::cpm) * m_Rv * amrex::Math::powi<2>(dumt))) / dt;
1570 if (pcc * dt + dumqc <
Real(0)) {
1588 ndcnst_to_number_mixing_ratio(m_ndcnst,
rho_arr(i,j,k));
1603 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),
one/
three);
1608 morr_arr(i,j,k,
MORRInd::n0r) = std::pow(morr_arr(i,j,k,
MORRInd::lamr),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1612 morr_arr(i,j,k,
MORRInd::n0r) = std::pow(morr_arr(i,j,k,
MORRInd::lamr),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1616 morr_arr(i,j,k,
MORRInd::n0r) = std::pow(morr_arr(i,j,k,
MORRInd::lamr),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qr3d) / (m_pi * m_rhow);
1637 morr_arr(i,j,k,
MORRInd::lamc) = std::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),
one/
three);
1648 std::log(gamma_pgam_plus_1) - std::log(gamma_pgam_plus_4))/ m_cons26;
1653 std::log(gamma_pgam_plus_1) - std::log(gamma_pgam_plus_4))/ m_cons26;
1663 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),
one/ds0);
1671 morr_arr(i,j,k,
MORRInd::n0s) = std::pow(morr_arr(i,j,k,
MORRInd::lams),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1675 morr_arr(i,j,k,
MORRInd::n0s) = std::pow(morr_arr(i,j,k,
MORRInd::lams),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qni3d) / m_cons1;
1683 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),
one/
three);
1692 morr_arr(i,j,k,
MORRInd::n0i) = std::pow(morr_arr(i,j,k,
MORRInd::lami),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qi3d) / m_cons12;
1698 morr_arr(i,j,k,
MORRInd::n0i) = std::pow(morr_arr(i,j,k,
MORRInd::lami),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qi3d) / m_cons12;
1706 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),
one/dg0);
1714 morr_arr(i,j,k,
MORRInd::n0g) = std::pow(morr_arr(i,j,k,
MORRInd::lamg),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
1718 morr_arr(i,j,k,
MORRInd::n0g) = std::pow(morr_arr(i,j,k,
MORRInd::lamg),
Real(4.0)) * morr_arr(i,j,k,
MORRInd::qg3d) / m_cons2;
1802 mnuccc = m_cons38 * dap * nacnt * std::exp(std::log(morr_arr(i,j,k,
MORRInd::cdist1)) +
1809 mnuccc = mnuccc + m_cons39 *
1819 nnuccc = std::min(nnuccc, morr_arr(i,j,k,
MORRInd::nc3d) / dt);
1837 nprc1 = prc / m_cons29;
1842 nprc1 = std::min(nprc1, nprc);
1849 std::pow((morr_arr(i,j,k,
MORRInd::ns3d) * morr_arr(i,j,k,
MORRInd::rho)), ((
Real(4.0) - m_bs) /
three)) / morr_arr(i,j,k,
MORRInd::rho);
1901 ums_local = std::min(ums_local,
Real(1.2) * dum);
1902 uns_local = std::min(uns_local,
Real(1.2) * dum);
1903 umr_local = std::min(umr_local,
Real(9.1) * dum);
1904 unr_local = std::min(unr_local,
Real(9.1) * dum);
1906 pracs = m_cons41 * (std::sqrt(amrex::Math::powi<2>(
Real(1.2) * umr_local -
Real(0.95) * ums_local) +
1912 npracs = m_cons32 * morr_arr(i,j,k,
MORRInd::rho) * std::sqrt(
Real(1.7) * amrex::Math::powi<2>(unr_local - uns_local) +
1927 psacr = m_cons31 * (std::sqrt(amrex::Math::powi<2>(
Real(1.2) * umr_local -
Real(0.95) * ums_local) +
1946 umg_local = std::min(umg_local,
Real(20.0) * dum);
1947 ung_local = std::min(ung_local,
Real(20.0) * dum);
1948 umr_local = std::min(umr_local,
Real(9.1) * dum);
1949 unr_local = std::min(unr_local,
Real(9.1) * dum);
1951 pracg = m_cons41 * (std::sqrt(amrex::Math::powi<2>(
Real(1.2) * umr_local -
Real(0.95) * umg_local) +
1957 npracg = m_cons32 * morr_arr(i,j,k,
MORRInd::rho) * std::sqrt(
Real(1.7) * amrex::Math::powi<2>(unr_local - ung_local) +
1966 pracg = std::min(pracg, morr_arr(i,j,k,
MORRInd::qr3d) / dt);
1994 if (psacws >
Real(0)) {
1995 nmults =
Real(35.0e4) * psacws * fmult *
Real(1000.0);
1996 qmults = nmults * m_mmult;
2000 qmults = std::min(qmults, psacws);
2001 psacws = psacws - qmults;
2007 qmultr = nmultr * m_mmult;
2011 qmultr = std::min(qmultr,
pracs);
2027 if (psacwg >
Real(0) || pracg >
Real(0)) {
2043 if (psacwg >
Real(0)) {
2044 nmultg =
Real(35.0e4) * psacwg * fmult *
Real(1000.0);
2045 qmultg = nmultg * m_mmult;
2049 qmultg = std::min(qmultg, psacwg);
2050 psacwg = psacwg - qmultg;
2054 if (pracg >
Real(0)) {
2055 nmultrg =
Real(35.0e4) * pracg * fmult *
Real(1000.0);
2056 qmultrg = nmultrg * m_mmult;
2060 qmultrg = std::min(qmultrg, pracg);
2061 pracg = pracg - qmultrg;
2069 if (psacws >
Real(0)) {
2073 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) *
2078 dum = std::max(m_rhosn / (m_rhog - m_rhosn) * pgsacw,
Real(0));
2083 nscng = std::min(nscng, morr_arr(i,j,k,
MORRInd::ns3d) / dt);
2086 psacws = psacws - pgsacw;
2098 dum = std::min(dum,
Real(1));
2099 dum = std::max(dum,
Real(0));
2102 ngracs = (
one - dum) * npracs;
2105 ngracs = std::min(ngracs, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2106 ngracs = std::min(ngracs, morr_arr(i,j,k,
MORRInd::ns3d) / dt);
2110 npracs = npracs - ngracs;
2129 nnuccr = std::min(nnuccr, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2139 pra =
Real(67.0) * std::pow(dum,
Real(1.15));
2149 dum1 =
Real(300.0e-6);
2165 prci = m_cons22 * nprci;
2166 nprci = std::min(nprci, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2173 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) /
2178 nprai = std::min(nprai, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2191 std::pow(morr_arr(i,j,k,
MORRInd::lamr), (m_br +
three)) / amrex::Math::powi<3>(morr_arr(i,j,k,
MORRInd::lamr)) * morr_arr(i,j,k,
MORRInd::rho);
2194 niacr = std::min(niacr, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2195 niacr = std::min(niacr, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2200 std::pow(morr_arr(i,j,k,
MORRInd::lamr), (m_br +
three)) / amrex::Math::powi<3>(morr_arr(i,j,k,
MORRInd::lamr)) * morr_arr(i,j,k,
MORRInd::rho);
2203 niacrs = std::min(niacrs, morr_arr(i,j,k,
MORRInd::nr3d) / dt);
2204 niacrs = std::min(niacrs, morr_arr(i,j,k,
MORRInd::ni3d) / dt);
2215 kc2 = std::min(kc2,
Real(500.0e3));
2220 mnuccd = nnuccd * m_mi0;
2223 }
else if (m_inuc == 1) {
2228 mnuccd = nnuccd * m_mi0;
2237 epsi =
Real(2) * 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));
2245 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),
myhalf) *
2246 std::pow(sc_schmidt, (
one /
three)) * m_cons10 /
2255 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),
myhalf) *
2256 std::pow(sc_schmidt, (
one /
three)) * m_cons11 /
2265 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),
myhalf) *
2266 std::pow(sc_schmidt, (
one /
three)) * m_cons9 /
2275 prd = epsi * (morr_arr(i,j,k,
MORRInd::qv3d) - qvi) / abi * dum;
2286 prd = prd + epsi * (morr_arr(i,j,k,
MORRInd::qv3d) - qvi) / abi * (
one - dum);
2295 pre = std::min(pre,
Real(0));
2304 fudgef =
Real(0.9999);
2305 sum_dep = prd + prds + mnuccd + prdg;
2307 if ((dum >
Real(0) && sum_dep > dum * fudgef) ||
2308 (dum <
Real(0) && sum_dep < dum * fudgef)) {
2309 mnuccd = fudgef * mnuccd * dum / sum_dep;
2310 prd = fudgef * prd * dum / sum_dep;
2311 prds = fudgef * prds * dum / sum_dep;
2312 prdg = fudgef * prdg * dum / sum_dep;
2316 if (prd <
Real(0)) {
2320 if (prds <
Real(0)) {
2324 if (prdg <
Real(0)) {
2352 if (m_igraup == 1) {
2369 piacrs = piacrs +
piacr;
2373 pracis = pracis +
praci;
2375 psacws = psacws + pgsacw;
2382 dum = (prc + pra + mnuccc + psacws + psacwi + qmults + psacwg + pgsacw + qmultg) * dt;
2389 mnuccc = mnuccc * ratio;
2390 psacws = psacws * ratio;
2391 psacwi = psacwi * ratio;
2392 qmults = qmults * ratio;
2393 qmultg = qmultg * ratio;
2394 psacwg = psacwg * ratio;
2395 pgsacw = pgsacw * ratio;
2399 dum = (-prd - mnuccc + prci + prai - qmults - qmultg - qmultr - qmultrg
2400 - mnuccd +
praci + pracis - eprd - psacwi) * dt;
2403 ratio = (morr_arr(i,j,k,
MORRInd::qi3d) / dt + prd + mnuccc + qmults + qmultg + qmultr + qmultrg +
2405 (prci + prai +
praci + pracis - eprd);
2407 prci = prci * ratio;
2408 prai = prai * ratio;
2410 pracis = pracis * ratio;
2411 eprd = eprd * ratio;
2415 dum = ((
pracs - pre) + (qmultr + qmultrg - prc) + (mnuccr - pra) +
2416 piacr + piacrs + pgracs + pracg) * dt;
2420 (-pre + qmultr + qmultrg +
pracs + mnuccr +
piacr + piacrs + pgracs + pracg);
2424 qmultr = qmultr * ratio;
2425 qmultrg = qmultrg * ratio;
2426 mnuccr = mnuccr * ratio;
2428 piacrs = piacrs * ratio;
2429 pgracs = pgracs * ratio;
2430 pracg = pracg * ratio;
2434 if (m_igraup == 0) {
2435 dum = (-prds - psacws - prai - prci -
pracs - eprds +
psacr - piacrs - pracis) * dt;
2438 ratio = (morr_arr(i,j,k,
MORRInd::qni3d) / dt + prds + psacws + prai + prci +
pracs + piacrs + pracis) /
2441 eprds = eprds * ratio;
2444 }
else if (m_igraup == 1) {
2446 dum = (-prds - psacws - prai - prci -
pracs - eprds +
psacr - piacrs - pracis - mnuccr) * dt;
2449 ratio = (morr_arr(i,j,k,
MORRInd::qni3d) / dt + prds + psacws + prai + prci +
pracs + piacrs + pracis + mnuccr) /
2452 eprds = eprds * ratio;
2458 dum = (-psacwg - pracg - pgsacw - pgracs - prdg - mnuccr - eprdg -
piacr -
praci -
psacr) * dt;
2461 ratio = (morr_arr(i,j,k,
MORRInd::qg3d) / dt + psacwg + pracg + pgsacw + pgracs + prdg + mnuccr +
psacr +
2464 eprdg = eprdg * ratio;
2472 (prd + prds + mnuccd + eprd + eprds + prdg + eprdg) * morr_arr(i,j,k,
MORRInd::xxls) +
2473 (psacws + psacwi + mnuccc + mnuccr + qmults + qmultg + qmultr + qmultrg +
pracs +
2477 (-pra - prc - mnuccc + pcc -
2478 psacws - psacwi - qmults - qmultg - psacwg - pgsacw);
2481 (prd + eprd + psacwi + mnuccc - prci -
2482 prai + qmults + qmultg + qmultr + qmultrg + mnuccd -
praci - pracis);
2485 (pre + pra + prc -
pracs - mnuccr - qmultr - qmultrg -
2486 piacr - piacrs - pracg - pgracs);
2487 if (m_igraup == 0) {
2489 (prai + psacws + prds +
pracs + prci + eprds -
psacr + piacrs + pracis);
2497 }
else if (m_igraup == 1) {
2500 (prai + psacws + prds +
pracs + prci + eprds -
psacr + piacrs + pracis + mnuccr);
2506 npra - nprc - npsacwi - npsacwg);
2509 (nnuccc - nprci - nprai + nmults + nmultg + nmultr + nmultrg +
2510 nnuccd - niacr - niacrs);
2513 nragg - niacr - niacrs - npracg - ngracs);
2526 dumqss = m_ep_2 * dum / (morr_arr(i,j,k,
MORRInd::pres) - dum);
2529 dumqc = std::max(dumqc,
Real(0));
2532 dums = dumqv - dumqss;
2534 pcc = dums / (
one + amrex::Math::powi<2>(morr_arr(i,j,k,
MORRInd::xxlv)) * dumqss / (morr_arr(i,j,k,
MORRInd::cpm) * m_Rv * amrex::Math::powi<2>(dumt))) / dt;
2536 if (pcc * dt + dumqc <
Real(0)) {
2541 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);
2547 if (eprd <
Real(0)) {
2549 dum = std::max(-
one, dum);
2553 if (eprds <
Real(0)) {
2555 dum = std::max(-
one, dum);
2559 if (pre <
Real(0)) {
2561 dum = std::max(-
one, dum);
2565 if (eprdg <
Real(0)) {
2567 dum = std::max(-
one, dum);
2582 for(
int k=
klo; k<=
khi; k++) {
2612 sed_arr(i,j,
khi+1,n) += inflow_arr(i,j,
khi+1,n);
2624 for(
int k=
khi; k>=
klo; k--) {
2664 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),
one/di0);
2671 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),
one/
three);
2694 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),
one/ds0);
2701 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),
one/dg0);
2720 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);
2721 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);
2729 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);
2730 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);
2738 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);
2739 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);
2747 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);
2748 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);
2762 morr_arr(i,j,k,
MORRInd::umi) = std::min(morr_arr(i,j,k,
MORRInd::umi),
Real(1.2) * std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho),
Real(0.35)));
2763 morr_arr(i,j,k,
MORRInd::uni) = std::min(morr_arr(i,j,k,
MORRInd::uni),
Real(1.2) * std::pow(m_rhosu / morr_arr(i,j,k,
MORRInd::rho),
Real(0.35)));
2815 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),
2816 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),
2835 for (
int n = 1; n <= nstep; n++) {
2837 for (
int k =
klo; k <=
khi; k++) {
2850 const Real dt_sub = dt / nstep;
2879 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);
2880 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);
2881 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);
2882 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);
2883 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);
2884 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);
2885 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);
2886 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);
2887 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);
2888 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);
2903 for (k =
khi-1; k >=
klo; k--) {
2905 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);
2906 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);
2907 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);
2908 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);
2909 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);
2910 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);
2911 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);
2912 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);
2913 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);
2914 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);
2917 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);
2918 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);
2919 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);
2920 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);
2921 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);
2922 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);
2923 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);
2924 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);
2925 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);
2926 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);
2943 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) +
2945 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;
2954 for(
int k=
klo; k<=
khi; k++) {
2972 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);
2973 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);
2988 if (m_igraup == 0) {
3015 if (qvqvs <
Real(0.9)) {
3018 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);
3023 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);
3027 if (qvqvsi <
Real(0.9)) {
3030 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);
3035 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);
3040 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);
3089 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);
3095 if ((m_iliq != 1)) {
3100 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);
3106 if (m_igraup == 0) {
3109 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);
3114 }
else if (m_igraup == 1) {
3117 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);
3138 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),
one/m_di);
3154 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),
one/
three);
3200 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),
one/m_ds);
3217 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),
one/m_dg);
3254 morr_arr(i,j,k,
MORRInd::effc) =
gamma_function(morr_arr(i,j,k,
MORRInd::pgam) +
Real(4.0)) /
gamma_function(morr_arr(i,j,k,
MORRInd::pgam) +
three) / morr_arr(i,j,k,
MORRInd::lamc) /
Real(2) *
Real(1.0e6);
3271 morr_arr(i,j,k,
MORRInd::ni3d) = std::min(morr_arr(i,j,k,
MORRInd::ni3d),
Real(0.3e6) / morr_arr(i,j,k,
MORRInd::rho));
3274 if (iinum == 0 && m_iact == 2) {
3275 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));
3282 ndcnst_to_number_mixing_ratio(m_ndcnst,
rho_arr(i,j,k));
3292 if(use_morr_cpp_answer) {
3293 for (
int k=
klo; k<=
khi; k++) {
3307 theta_arr(i,j,k) = morr_arr(i,j,k,
MORRInd::t3d) / pii_arr(i,j,k);
3326 if (
klo == dom_klo) {
3340 if (run_morr_fort) {
3341 #ifdef ERF_USE_MORR_FORT
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
const int khi
Definition: ERF_InitCustomPert_Bubble.H:25
const int klo
Definition: ERF_InitCustomPert_KE.H:9
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:222
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Real gamma_function(Real x)
Definition: ERF_MorrisonGammaFunction.H:300
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calc_saturation_vapor_pressure(const amrex::Real T, const int type)
Definition: ERF_MorrisonVaporPressure.H:36
Arena * Arena_Used
Definition: ERF_Morrison_Advance_F.H:23
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
constexpr amrex::Real three
Definition: ERF_NumericalConstants.H:39
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:42
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
auto rho_arr
Definition: ERF_UpdateWSubsidence_SineMassFlux.H:3
bool boxes_span_domain() const
True when every box spans the domain in z (required by the Fortran bridges)
Definition: ERF_MicrophysicsColumns.H:44
amrex::Geometry m_geom
Definition: ERF_Morrison.H:281
amrex::Real m_rdOcp
Definition: ERF_Morrison.H:284
bool m_do_cond
Definition: ERF_Morrison.H:285
@ qisten
Definition: ERF_AdvanceMorrison.cpp:76
@ dumfnc
Definition: ERF_AdvanceMorrison.cpp:136
@ qi3dten
Definition: ERF_AdvanceMorrison.cpp:48
@ agn
Definition: ERF_AdvanceMorrison.cpp:99
@ pres
Definition: ERF_AdvanceMorrison.cpp:65
@ precrt
Definition: ERF_AdvanceMorrison.cpp:82
@ dumc
Definition: ERF_AdvanceMorrison.cpp:135
@ falouti
Definition: ERF_AdvanceMorrison.cpp:115
@ ni3d
Definition: ERF_AdvanceMorrison.cpp:58
@ dumi
Definition: ERF_AdvanceMorrison.cpp:100
@ faloutnc
Definition: ERF_AdvanceMorrison.cpp:143
@ snowprt
Definition: ERF_AdvanceMorrison.cpp:84
@ lamg
Definition: ERF_AdvanceMorrison.cpp:40
@ xxls
Definition: ERF_AdvanceMorrison.cpp:156
@ n0s
Definition: ERF_AdvanceMorrison.cpp:43
@ fns
Definition: ERF_AdvanceMorrison.cpp:125
@ grplprt
Definition: ERF_AdvanceMorrison.cpp:85
@ dumfns
Definition: ERF_AdvanceMorrison.cpp:121
@ qni3d
Definition: ERF_AdvanceMorrison.cpp:56
@ ung
Definition: ERF_AdvanceMorrison.cpp:139
@ faloutng
Definition: ERF_AdvanceMorrison.cpp:129
@ qc3dten
Definition: ERF_AdvanceMorrison.cpp:47
@ w3d
Definition: ERF_AdvanceMorrison.cpp:67
@ rgvm
Definition: ERF_AdvanceMorrison.cpp:113
@ arn
Definition: ERF_AdvanceMorrison.cpp:96
@ lami
Definition: ERF_AdvanceMorrison.cpp:37
@ qscu1d
Definition: ERF_AdvanceMorrison.cpp:80
@ qcsten
Definition: ERF_AdvanceMorrison.cpp:78
@ fc
Definition: ERF_AdvanceMorrison.cpp:141
@ fnr
Definition: ERF_AdvanceMorrison.cpp:150
@ pgam
Definition: ERF_AdvanceMorrison.cpp:46
@ qrcu1d
Definition: ERF_AdvanceMorrison.cpp:79
@ fng
Definition: ERF_AdvanceMorrison.cpp:112
@ ng3dten
Definition: ERF_AdvanceMorrison.cpp:71
@ dlami
Definition: ERF_AdvanceMorrison.cpp:153
@ faloutni
Definition: ERF_AdvanceMorrison.cpp:116
@ faloutnr
Definition: ERF_AdvanceMorrison.cpp:148
@ NumInds
Definition: ERF_AdvanceMorrison.cpp:160
@ dumfni
Definition: ERF_AdvanceMorrison.cpp:102
@ n0g
Definition: ERF_AdvanceMorrison.cpp:45
@ dlams
Definition: ERF_AdvanceMorrison.cpp:151
@ n0i
Definition: ERF_AdvanceMorrison.cpp:42
@ effs
Definition: ERF_AdvanceMorrison.cpp:90
@ faltndg
Definition: ERF_AdvanceMorrison.cpp:133
@ cpm
Definition: ERF_AdvanceMorrison.cpp:158
@ qr3dten
Definition: ERF_AdvanceMorrison.cpp:50
@ t3d
Definition: ERF_AdvanceMorrison.cpp:63
@ rainonlyprt
Definition: ERF_AdvanceMorrison.cpp:86
@ dumqs
Definition: ERF_AdvanceMorrison.cpp:120
@ qg3d
Definition: ERF_AdvanceMorrison.cpp:72
@ lamr
Definition: ERF_AdvanceMorrison.cpp:39
@ qr3d
Definition: ERF_AdvanceMorrison.cpp:57
@ nc3d
Definition: ERF_AdvanceMorrison.cpp:68
@ qg3dten
Definition: ERF_AdvanceMorrison.cpp:70
@ nr3dten
Definition: ERF_AdvanceMorrison.cpp:53
@ dzq
Definition: ERF_AdvanceMorrison.cpp:66
@ dumfnr
Definition: ERF_AdvanceMorrison.cpp:147
@ uns
Definition: ERF_AdvanceMorrison.cpp:123
@ faltndng
Definition: ERF_AdvanceMorrison.cpp:134
@ effc
Definition: ERF_AdvanceMorrison.cpp:88
@ qnisten
Definition: ERF_AdvanceMorrison.cpp:77
@ faloutg
Definition: ERF_AdvanceMorrison.cpp:128
@ t3dten
Definition: ERF_AdvanceMorrison.cpp:61
@ qv3d
Definition: ERF_AdvanceMorrison.cpp:64
@ ni3dten
Definition: ERF_AdvanceMorrison.cpp:51
@ uni
Definition: ERF_AdvanceMorrison.cpp:105
@ umi
Definition: ERF_AdvanceMorrison.cpp:106
@ qni3dten
Definition: ERF_AdvanceMorrison.cpp:49
@ faloutr
Definition: ERF_AdvanceMorrison.cpp:114
@ dumr
Definition: ERF_AdvanceMorrison.cpp:101
@ faloutns
Definition: ERF_AdvanceMorrison.cpp:127
@ effi
Definition: ERF_AdvanceMorrison.cpp:89
@ faltndni
Definition: ERF_AdvanceMorrison.cpp:119
@ unc
Definition: ERF_AdvanceMorrison.cpp:137
@ umc
Definition: ERF_AdvanceMorrison.cpp:138
@ snowonlyprt
Definition: ERF_AdvanceMorrison.cpp:87
@ qv3dten
Definition: ERF_AdvanceMorrison.cpp:62
@ faltndns
Definition: ERF_AdvanceMorrison.cpp:131
@ nc3dten
Definition: ERF_AdvanceMorrison.cpp:69
@ dumg
Definition: ERF_AdvanceMorrison.cpp:103
@ dlamc
Definition: ERF_AdvanceMorrison.cpp:154
@ rho
Definition: ERF_AdvanceMorrison.cpp:93
@ effr
Definition: ERF_AdvanceMorrison.cpp:91
@ faltndnc
Definition: ERF_AdvanceMorrison.cpp:145
@ xxlv
Definition: ERF_AdvanceMorrison.cpp:157
@ faltndc
Definition: ERF_AdvanceMorrison.cpp:144
@ faltndnr
Definition: ERF_AdvanceMorrison.cpp:149
@ fni
Definition: ERF_AdvanceMorrison.cpp:110
@ umr
Definition: ERF_AdvanceMorrison.cpp:107
@ faloutc
Definition: ERF_AdvanceMorrison.cpp:142
@ ain
Definition: ERF_AdvanceMorrison.cpp:95
@ effg
Definition: ERF_AdvanceMorrison.cpp:92
@ faltnds
Definition: ERF_AdvanceMorrison.cpp:130
@ xlf
Definition: ERF_AdvanceMorrison.cpp:159
@ asn
Definition: ERF_AdvanceMorrison.cpp:97
@ fr
Definition: ERF_AdvanceMorrison.cpp:108
@ fnc
Definition: ERF_AdvanceMorrison.cpp:146
@ fi
Definition: ERF_AdvanceMorrison.cpp:109
@ dumfng
Definition: ERF_AdvanceMorrison.cpp:104
@ faltndr
Definition: ERF_AdvanceMorrison.cpp:117
@ lams
Definition: ERF_AdvanceMorrison.cpp:38
@ fs
Definition: ERF_AdvanceMorrison.cpp:124
@ qicu1d
Definition: ERF_AdvanceMorrison.cpp:81
@ qrsten
Definition: ERF_AdvanceMorrison.cpp:75
@ qgsten
Definition: ERF_AdvanceMorrison.cpp:74
@ cdist1
Definition: ERF_AdvanceMorrison.cpp:41
@ dlamg
Definition: ERF_AdvanceMorrison.cpp:155
@ mu
Definition: ERF_AdvanceMorrison.cpp:94
@ lamc
Definition: ERF_AdvanceMorrison.cpp:36
@ ns3dten
Definition: ERF_AdvanceMorrison.cpp:52
@ ns3d
Definition: ERF_AdvanceMorrison.cpp:59
@ dlamr
Definition: ERF_AdvanceMorrison.cpp:152
@ ng3d
Definition: ERF_AdvanceMorrison.cpp:73
@ qi3d
Definition: ERF_AdvanceMorrison.cpp:55
@ acn
Definition: ERF_AdvanceMorrison.cpp:98
@ falouts
Definition: ERF_AdvanceMorrison.cpp:126
@ faltndi
Definition: ERF_AdvanceMorrison.cpp:118
@ fg
Definition: ERF_AdvanceMorrison.cpp:111
@ qc3d
Definition: ERF_AdvanceMorrison.cpp:54
@ umg
Definition: ERF_AdvanceMorrison.cpp:140
@ unr
Definition: ERF_AdvanceMorrison.cpp:132
@ ums
Definition: ERF_AdvanceMorrison.cpp:122
@ n0r
Definition: ERF_AdvanceMorrison.cpp:44
@ snowrt
Definition: ERF_AdvanceMorrison.cpp:83
@ nr3d
Definition: ERF_AdvanceMorrison.cpp:60
@ qv
Definition: ERF_Morrison.H:37
@ ng
Definition: ERF_Morrison.H:51
@ graupel_accum
Definition: ERF_Morrison.H:55
@ nc
Definition: ERF_Morrison.H:47
@ qpg
Definition: ERF_Morrison.H:44
@ pres
Definition: ERF_Morrison.H:33
@ nr
Definition: ERF_Morrison.H:48
@ qcl
Definition: ERF_Morrison.H:38
@ theta
Definition: ERF_Morrison.H:31
@ ni
Definition: ERF_Morrison.H:49
@ ns
Definition: ERF_Morrison.H:50
@ omega
Definition: ERF_Morrison.H:57
@ qps
Definition: ERF_Morrison.H:43
@ rho
Definition: ERF_Morrison.H:30
@ qpr
Definition: ERF_Morrison.H:42
@ qci
Definition: ERF_Morrison.H:39
@ rain_accum
Definition: ERF_Morrison.H:53
@ precip_accum
Definition: ERF_Morrison.H:56
@ snow_accum
Definition: ERF_Morrison.H:54
@ NumComps
Definition: ERF_Morrison.H:120
@ nr
Definition: ERF_Morrison.H:117
@ ng
Definition: ERF_Morrison.H:119
@ qg
Definition: ERF_Morrison.H:114
@ qr
Definition: ERF_Morrison.H:112
@ qi
Definition: ERF_Morrison.H:111
@ nc
Definition: ERF_Morrison.H:115
@ qs
Definition: ERF_Morrison.H:113
@ qc
Definition: ERF_Morrison.H:110
@ ns
Definition: ERF_Morrison.H:118
@ ni
Definition: ERF_Morrison.H:116
@ psacr
Definition: ERF_WSM6.H:332
@ praci
Definition: ERF_WSM6.H:328
@ psmlt
Definition: ERF_WSM6.H:338
@ pgmlt
Definition: ERF_WSM6.H:339
@ piacr
Definition: ERF_WSM6.H:326
@ pracs
Definition: ERF_WSM6.H:329
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40
MoistureType moisture_type
Moisture or microphysics model.
Definition: ERF_DataStruct.H:2942