591 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
593 if (x ==
Real(1.0))
return Real(0.0);
594 constexpr
Real euler =
Real(0.577215664901532);
595 Real rg =
x * std::exp(euler * x);
596 for (
int ii = 1; ii <= 10000; ++ii) {
598 rg = rg * (
Real(1.0) +
x /
y) * std::exp(-x / y);
600 return Real(1.0) / rg;
624 for (
int k = 0; k < km; ++k) {
625 QQ(k) = sed_cell(i_s, j_s, klo_s + k, rq_comp);
626 QQ2(k) = sed_cell(i_s, j_s, klo_s + k, rq2_comp);
627 WW(k) = sed_cell(i_s, j_s, klo_s + k, ww_comp);
629 allold += QQ(k) + QQ2(k);
632 precip1[0] =
Real(0.0);
633 precip2[0] =
Real(0.0);
634 if (allold <=
Real(0.0)) {
639 for (
int k = 0; k < km; ++k) {
640 ZI(k + 1) = ZI(k) + DZ(k);
643 auto update_wind_and_state = [&](void) {
646 for (
int k = 1; k < km; ++k) {
647 WI(k) = (WW(k) * DZ(k - 1) + WW(k - 1) * DZ(k)) / (DZ(k - 1) + DZ(k));
651 WI(1) =
Real(0.5) * (WW(1) + WW(0));
652 for (
int k = 2; k < km - 1; ++k) {
653 WI(k) =
Real(9.0) /
Real(16.0) * (WW(k) + WW(k - 1))
654 -
Real(1.0) /
Real(16.0) * (WW(k + 1) + WW(k - 2));
657 WI(km - 1) =
Real(0.5) * (WW(km - 1) + WW(km - 2));
661 for (
int k = 1; k < km; ++k) {
662 if (WW(k) ==
Real(0.0)) WI(k) = WW(k - 1);
666 for (
int k = km - 1; k >= 0; --k) {
667 const Real decfl = (WI(k + 1) - WI(k)) * dt / DZ(k);
669 WI(k) = WI(k + 1) - con1 * DZ(k) / dt;
673 for (
int k = 0; k <= km; ++k) {
674 ZA(k) = ZI(k) - WI(k) * dt;
677 for (
int k = 0; k < km; ++k) {
678 DZA(k) = ZA(k + 1) - ZA(k);
679 if (DZA(k) <=
Real(0.0)) DZA(k) = DZ(k);
681 DZA(km) = ZI(km) - ZA(km);
682 if (DZA(km) <=
Real(0.0)) DZA(km) = DZ(km > 0 ? km - 1 : 0);
683 for (
int k = 0; k < km; ++k) {
684 QA(k) = QQ(k) * DZ(k) / DZA(k);
685 QA2(k) = QQ2(k) * DZ(k) / DZA(k);
686 QR(k) = QA(k) / DEN(k);
687 QR2(k) = QA2(k) / DEN(k);
693 update_wind_and_state();
697 for (
int k = 0; k < km; ++k) {
703 TMP(k), TMP1(k), TMP2(k), TMP3(k),
704 WA(k), n0sfac_dummy);
709 TMP(k), TMP1(k), TMP2(k), TMP3(k),
712 for (
int k = 0; k < km; ++k) {
713 const Real tmpq = amrex::max(QR(k) + QR2(k),
Real(1.0e-15));
714 if (tmpq >
Real(1.0e-15)) {
715 WA(k) = (WA(k) * QR(k) + WA2(k) * QR2(k)) / tmpq;
720 for (
int k = 0; k < km; ++k) {
721 WW(k) =
Real(0.5) * (WD(k) + WA(k));
724 update_wind_and_state();
727 for (
int ist = 0; ist < 2; ++ist) {
728 const int qn_comp = (ist == 0)
731 const int qa_comp = (ist == 0)
734 auto QN_DST = [&](
int k) ->
Real& {
735 return sed_cell(i_s,j_s,klo_s+k,qn_comp);
737 auto QA_SRC = [&](
int k) ->
Real& {
738 return sed_node(i_s,j_s,klo_s+k,qa_comp);
740 Real* precip_dst = (ist == 0) ? &precip1[0] : &precip2[0];
742 for (
int k = 1; k < km; ++k) {
743 const Real dip = (QA_SRC(k + 1) - QA_SRC(k)) / (DZA(k + 1) + DZA(k));
744 const Real dim = (QA_SRC(k) - QA_SRC(k - 1)) / (DZA(k - 1) + DZA(k));
745 if (dip * dim <=
Real(0.0)) {
749 QPI(k) = QA_SRC(k) +
Real(0.5) * (dip + dim) * DZA(k);
750 QMI(k) =
Real(2.0) * QA_SRC(k) - QPI(k);
751 if (QPI(k) <
Real(0.0) || QMI(k) <
Real(0.0)) {
759 QMI(km) = QA_SRC(km);
760 QPI(km) = QA_SRC(km);
762 for (
int k = 0; k < km; ++k) {
763 QN_DST(k) =
Real(0.0);
768 for (
int k = 0; k < km; ++k) {
769 if (ZI(k) >= ZA(km)) {
773 for (
int kk = kb; kk < km; ++kk) {
774 if (ZI(k) <= ZA(kk + 1)) {
780 for (
int kk = kt; kk < km; ++kk) {
781 if (ZI(k + 1) <= ZA(kk)) {
786 kt = amrex::max(kt - 1, 0);
789 const Real tl = (ZI(k) - ZA(kb)) / DZA(kb);
790 const Real th = (ZI(k + 1) - ZA(kb)) / DZA(kb);
791 const Real tl2 = tl * tl;
792 const Real th2 = th * th;
793 const Real qqd =
Real(0.5) * (QPI(kb) - QMI(kb));
794 const Real qqh = qqd * th2 + QMI(kb) * th;
795 const Real qql = qqd * tl2 + QMI(kb) * tl;
796 QN_DST(k) = (qqh - qql) / (th - tl);
797 }
else if (kt > kb) {
798 const Real tl = (ZI(k) - ZA(kb)) / DZA(kb);
799 const Real tl2 = tl * tl;
800 const Real qqd =
Real(0.5) * (QPI(kb) - QMI(kb));
801 const Real qql = qqd * tl2 + QMI(kb) * tl;
802 const Real dql = QA_SRC(kb) - qql;
803 Real zsum = (
Real(1.0) - tl) * DZA(kb);
806 for (
int m = kb + 1; m < kt; ++m) {
808 qsum += QA_SRC(m) * DZA(m);
811 const Real th = (ZI(k + 1) - ZA(kt)) / DZA(kt);
812 const Real th2 = th * th;
813 const Real dqh =
Real(0.5) * (QPI(kt) - QMI(kt)) * th2 + QMI(kt) * th;
814 zsum += th * DZA(kt);
815 qsum += dqh * DZA(kt);
816 QN_DST(k) =
qsum / zsum;
821 for (
int k = 0; k < km; ++k) {
822 if (ZA(k) <
Real(0.0) && ZA(k + 1) <
Real(0.0)) {
823 precip += QA_SRC(k) * DZA(k);
824 }
else if (ZA(k) <
Real(0.0) && ZA(k + 1) >=
Real(0.0)) {
825 precip += QA_SRC(k) * (
Real(0.0) - ZA(k));
831 *precip_dst = precip;
834 for (
int k = 0; k < km; ++k) {
835 sed_cell(i_s, j_s, klo_s + k, rq_comp) = QN(k);
836 sed_cell(i_s, j_s, klo_s + k, rq2_comp) = QN2(k);
837 sed_cell(i_s, j_s, klo_s + k, ww_comp) = WW(k);
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_slope_snow_cell(Real qs, Real den, Real denfac, Real t, Real pidn0s_arg, Real alpha_arg, Real n0smax_arg, Real n0s_arg, Real t0c_arg, Real qcrmin_arg, Real rslopesmax_arg, Real rslopesbmax_arg, Real rslopes2max_arg, Real rslopes3max_arg, Real bvts_arg, Real pvts_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt, Real &n0sfac)
Definition: ERF_AdvanceWSM6.cpp:170
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void wsm6_slope_graup_cell(Real qg, Real den, Real denfac, Real pidn0g_arg, Real qcrmin_arg, Real rslopegmax_arg, Real rslopegbmax_arg, Real rslopeg2max_arg, Real rslopeg3max_arg, Real bvtg_arg, Real pvtg_arg, Real &rslope, Real &rslopeb, Real &rslope2, Real &rslope3, Real &vt)
Definition: ERF_AdvanceWSM6.cpp:200
static constexpr amrex::Real qcrmin
Definition: ERF_WSM6.H:67
static constexpr amrex::Real lamdasmax
Definition: ERF_WSM6.H:62
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:72
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:69
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:60
static constexpr amrex::Real avts
Definition: ERF_WSM6.H:59
@ n0g
Definition: ERF_AdvanceMorrison.cpp:45
@ qsum
Definition: ERF_WSM6.H:219
@ qq2
Definition: ERF_AdvanceWSM6.cpp:107
@ qq
Definition: ERF_AdvanceWSM6.cpp:106
@ qn2
Definition: ERF_AdvanceWSM6.cpp:103
@ tmp
Definition: ERF_AdvanceWSM6.cpp:114
@ wa
Definition: ERF_AdvanceWSM6.cpp:100
@ qn
Definition: ERF_AdvanceWSM6.cpp:102
@ was
Definition: ERF_AdvanceWSM6.cpp:108
@ tmp3
Definition: ERF_AdvanceWSM6.cpp:117
@ wa2
Definition: ERF_AdvanceWSM6.cpp:101
@ wd
Definition: ERF_AdvanceWSM6.cpp:99
@ qr2
Definition: ERF_AdvanceWSM6.cpp:113
@ tmp1
Definition: ERF_AdvanceWSM6.cpp:115
@ den
Definition: ERF_AdvanceWSM6.cpp:109
@ dz
Definition: ERF_AdvanceWSM6.cpp:104
@ tk
Definition: ERF_AdvanceWSM6.cpp:111
@ tmp2
Definition: ERF_AdvanceWSM6.cpp:116
@ denfac
Definition: ERF_AdvanceWSM6.cpp:110
@ qr
Definition: ERF_AdvanceWSM6.cpp:112
@ ww
Definition: ERF_AdvanceWSM6.cpp:105
@ wi
Definition: ERF_AdvanceWSM6.cpp:132
@ qmi
Definition: ERF_AdvanceWSM6.cpp:138
@ qa2
Definition: ERF_AdvanceWSM6.cpp:137
@ qpi
Definition: ERF_AdvanceWSM6.cpp:139
@ qa
Definition: ERF_AdvanceWSM6.cpp:136
@ dza
Definition: ERF_AdvanceWSM6.cpp:135
@ zi
Definition: ERF_AdvanceWSM6.cpp:133
@ za
Definition: ERF_AdvanceWSM6.cpp:134
real(c_double), parameter, private pi
Definition: ERF_module_mp_morr_two_moment.F90:100
real(kind=kind_phys), save bvtg
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save avtg
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save lamdagmax
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pidn0g
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), parameter, private dens
Definition: ERF_module_mp_wsm6.F90:39
real(kind=kind_phys), save rslopesbmax
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save, public pidn0s
Definition: ERF_module_mp_wsm6.F90:64
real(kind=kind_phys), save rslopeg2max
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save rslopegbmax
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save deng
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys) function rgmma(x)
Definition: ERF_module_mp_wsm6.F90:1584
real(kind=kind_phys), save pvtg
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save pvts
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save rslopes3max
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save rslopeg3max
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save rslopesmax
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save rslopes2max
Definition: ERF_module_mp_wsm6.F90:46
real(kind=kind_phys), save rslopegmax
Definition: ERF_module_mp_wsm6.F90:46