593 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
595 if (x ==
Real(1.0))
return Real(0.0);
596 constexpr
Real euler =
Real(0.577215664901532);
597 Real rg =
x * std::exp(euler * x);
598 for (
int ii = 1; ii <= 10000; ++ii) {
600 rg = rg * (
Real(1.0) +
x /
y) * std::exp(-x / y);
602 return Real(1.0) / rg;
626 for (
int k = 0; k < km; ++k) {
627 QQ(k) = sed_cell(i_s, j_s, klo_s + k, rq_comp);
628 QQ2(k) = sed_cell(i_s, j_s, klo_s + k, rq2_comp);
629 WW(k) = sed_cell(i_s, j_s, klo_s + k, ww_comp);
631 allold += QQ(k) + QQ2(k);
634 precip1[0] =
Real(0.0);
635 precip2[0] =
Real(0.0);
636 if (allold <=
Real(0.0)) {
641 for (
int k = 0; k < km; ++k) {
642 ZI(k + 1) = ZI(k) +
DZ(k);
645 auto update_wind_and_state = [&](void) {
648 for (
int k = 1; k < km; ++k) {
649 WI(k) = (WW(k) *
DZ(k - 1) + WW(k - 1) *
DZ(k)) / (
DZ(k - 1) +
DZ(k));
653 WI(1) =
Real(0.5) * (WW(1) + WW(0));
654 for (
int k = 2; k < km - 1; ++k) {
655 WI(k) =
Real(9.0) /
Real(16.0) * (WW(k) + WW(k - 1))
656 -
Real(1.0) /
Real(16.0) * (WW(k + 1) + WW(k - 2));
659 WI(km - 1) =
Real(0.5) * (WW(km - 1) + WW(km - 2));
663 for (
int k = 1; k < km; ++k) {
664 if (WW(k) ==
Real(0.0)) WI(k) = WW(k - 1);
668 for (
int k = km - 1; k >= 0; --k) {
669 const Real decfl = (WI(k + 1) - WI(k)) * dt /
DZ(k);
671 WI(k) = WI(k + 1) - con1 *
DZ(k) / dt;
675 for (
int k = 0; k <= km; ++k) {
676 ZA(k) = ZI(k) - WI(k) * dt;
679 for (
int k = 0; k < km; ++k) {
680 DZA(k) = ZA(k + 1) - ZA(k);
681 if (DZA(k) <=
Real(0.0)) DZA(k) =
DZ(k);
683 DZA(km) = ZI(km) - ZA(km);
684 if (DZA(km) <=
Real(0.0)) DZA(km) =
DZ(km > 0 ? km - 1 : 0);
685 for (
int k = 0; k < km; ++k) {
686 QA(k) = QQ(k) *
DZ(k) / DZA(k);
687 QA2(k) = QQ2(k) *
DZ(k) / DZA(k);
688 QR(k) = QA(k) / DEN(k);
689 QR2(k) = QA2(k) / DEN(k);
695 update_wind_and_state();
699 for (
int k = 0; k < km; ++k) {
705 TMP(k), TMP1(k), TMP2(k), TMP3(k),
706 WA(k), n0sfac_dummy);
711 TMP(k), TMP1(k), TMP2(k), TMP3(k),
714 for (
int k = 0; k < km; ++k) {
715 const Real tmpq = amrex::max(
QR(k) + QR2(k),
Real(1.0e-15));
716 if (tmpq >
Real(1.0e-15)) {
717 WA(k) = (WA(k) *
QR(k) + WA2(k) * QR2(k)) / tmpq;
722 for (
int k = 0; k < km; ++k) {
723 WW(k) =
Real(0.5) * (WD(k) + WA(k));
726 update_wind_and_state();
729 for (
int ist = 0; ist < 2; ++ist) {
730 const int qn_comp = (ist == 0)
733 const int qa_comp = (ist == 0)
736 auto QN_DST = [&](
int k) ->
Real& {
737 return sed_cell(i_s,j_s,klo_s+k,qn_comp);
739 auto QA_SRC = [&](
int k) ->
Real& {
740 return sed_node(i_s,j_s,klo_s+k,qa_comp);
742 Real* precip_dst = (ist == 0) ? &precip1[0] : &precip2[0];
744 for (
int k = 1; k < km; ++k) {
745 const Real dip = (QA_SRC(k + 1) - QA_SRC(k)) / (DZA(k + 1) + DZA(k));
746 const Real dim = (QA_SRC(k) - QA_SRC(k - 1)) / (DZA(k - 1) + DZA(k));
747 if (dip * dim <=
Real(0.0)) {
751 QPI(k) = QA_SRC(k) +
Real(0.5) * (dip + dim) * DZA(k);
752 QMI(k) =
Real(2.0) * QA_SRC(k) - QPI(k);
753 if (QPI(k) <
Real(0.0) || QMI(k) <
Real(0.0)) {
761 QMI(km) = QA_SRC(km);
762 QPI(km) = QA_SRC(km);
764 for (
int k = 0; k < km; ++k) {
765 QN_DST(k) =
Real(0.0);
770 for (
int k = 0; k < km; ++k) {
771 if (ZI(k) >= ZA(km)) {
775 for (
int kk = kb; kk < km; ++kk) {
776 if (ZI(k) <= ZA(kk + 1)) {
782 for (
int kk = kt; kk < km; ++kk) {
783 if (ZI(k + 1) <= ZA(kk)) {
788 kt = amrex::max(kt - 1, 0);
791 const Real tl = (ZI(k) - ZA(kb)) / DZA(kb);
792 const Real th = (ZI(k + 1) - ZA(kb)) / DZA(kb);
793 const Real tl2 = tl * tl;
794 const Real th2 = th * th;
795 const Real qqd =
Real(0.5) * (QPI(kb) - QMI(kb));
796 const Real qqh = qqd * th2 + QMI(kb) * th;
797 const Real qql = qqd * tl2 + QMI(kb) * tl;
798 QN_DST(k) = (qqh - qql) / (th - tl);
799 }
else if (kt > kb) {
800 const Real tl = (ZI(k) - ZA(kb)) / DZA(kb);
801 const Real tl2 = tl * tl;
802 const Real qqd =
Real(0.5) * (QPI(kb) - QMI(kb));
803 const Real qql = qqd * tl2 + QMI(kb) * tl;
804 const Real dql = QA_SRC(kb) - qql;
805 Real zsum = (
Real(1.0) - tl) * DZA(kb);
808 for (
int m = kb + 1; m < kt; ++m) {
810 qsum += QA_SRC(m) * DZA(m);
813 const Real th = (ZI(k + 1) - ZA(kt)) / DZA(kt);
814 const Real th2 = th * th;
815 const Real dqh =
Real(0.5) * (QPI(kt) - QMI(kt)) * th2 + QMI(kt) * th;
816 zsum += th * DZA(kt);
817 qsum += dqh * DZA(kt);
818 QN_DST(k) =
qsum / zsum;
823 for (
int k = 0; k < km; ++k) {
824 if (ZA(k) <
Real(0.0) && ZA(k + 1) <
Real(0.0)) {
825 precip += QA_SRC(k) * DZA(k);
826 }
else if (ZA(k) <
Real(0.0) && ZA(k + 1) >=
Real(0.0)) {
827 precip += QA_SRC(k) * (
Real(0.0) - ZA(k));
833 *precip_dst = precip;
836 for (
int k = 0; k < km; ++k) {
837 sed_cell(i_s, j_s, klo_s + k, rq_comp) = QN(k);
838 sed_cell(i_s, j_s, klo_s + k, rq2_comp) = QN2(k);
839 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:172
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:202
static constexpr amrex::Real qcrmin
Definition: ERF_WSM6.H:154
static constexpr amrex::Real lamdasmax
Definition: ERF_WSM6.H:149
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:159
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:156
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:147
static constexpr amrex::Real avts
Definition: ERF_WSM6.H:146
@ n0g
Definition: ERF_AdvanceMorrison.cpp:45
@ QR
Definition: ERF_IndexDefines.H:142
constexpr int DZ
Definition: ERF_TwoStreamColumn.H:599
@ qsum
Definition: ERF_WSM6.H:323
@ qq2
Definition: ERF_AdvanceWSM6.cpp:109
@ qq
Definition: ERF_AdvanceWSM6.cpp:108
@ qn2
Definition: ERF_AdvanceWSM6.cpp:105
@ tmp
Definition: ERF_AdvanceWSM6.cpp:116
@ wa
Definition: ERF_AdvanceWSM6.cpp:102
@ qn
Definition: ERF_AdvanceWSM6.cpp:104
@ was
Definition: ERF_AdvanceWSM6.cpp:110
@ tmp3
Definition: ERF_AdvanceWSM6.cpp:119
@ wa2
Definition: ERF_AdvanceWSM6.cpp:103
@ wd
Definition: ERF_AdvanceWSM6.cpp:101
@ qr2
Definition: ERF_AdvanceWSM6.cpp:115
@ tmp1
Definition: ERF_AdvanceWSM6.cpp:117
@ den
Definition: ERF_AdvanceWSM6.cpp:111
@ dz
Definition: ERF_AdvanceWSM6.cpp:106
@ tk
Definition: ERF_AdvanceWSM6.cpp:113
@ tmp2
Definition: ERF_AdvanceWSM6.cpp:118
@ denfac
Definition: ERF_AdvanceWSM6.cpp:112
@ qr
Definition: ERF_AdvanceWSM6.cpp:114
@ ww
Definition: ERF_AdvanceWSM6.cpp:107
@ wi
Definition: ERF_AdvanceWSM6.cpp:134
@ qmi
Definition: ERF_AdvanceWSM6.cpp:140
@ qa2
Definition: ERF_AdvanceWSM6.cpp:139
@ qpi
Definition: ERF_AdvanceWSM6.cpp:141
@ qa
Definition: ERF_AdvanceWSM6.cpp:138
@ dza
Definition: ERF_AdvanceWSM6.cpp:137
@ zi
Definition: ERF_AdvanceWSM6.cpp:135
@ za
Definition: ERF_AdvanceWSM6.cpp:136
real(c_double), parameter, private pi
Definition: ERF_module_mp_morr_two_moment.F90:100
real(kind=kind_phys), save rslopes3max
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save rslopegmax
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save rslopesmax
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pidn0s
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save rslopeg3max
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save deng
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save avtg
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pvtg
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), parameter, private dens
Definition: ERF_module_mp_wdm6.F90:61
real(kind=kind_phys), save lamdagmax
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save bvtg
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pvts
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save rslopeg2max
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys) function rgmma(x)
Definition: ERF_module_mp_wdm6.F90:2174
real(kind=kind_phys), save rslopesbmax
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save pidn0g
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save rslopegbmax
Definition: ERF_module_mp_wdm6.F90:100
real(kind=kind_phys), save rslopes2max
Definition: ERF_module_mp_wdm6.F90:100