601 constexpr
Real pi =
Real(3.141592653589793238462643383279502884);
603 if (x ==
Real(1.0))
return Real(0.0);
604 constexpr
Real euler =
Real(0.577215664901532);
605 Real rg =
x * std::exp(euler * x);
606 for (
int ii = 1; ii <= 10000; ++ii) {
608 rg = rg * (
Real(1.0) +
x /
y) * std::exp(-x / y);
610 return Real(1.0) / rg;
634 for (
int k = 0; k < km; ++k) {
635 QQ(k) = sed_cell(i_s, j_s, klo_s + k, rq_comp);
636 QQ2(k) = sed_cell(i_s, j_s, klo_s + k, rq2_comp);
637 WW(k) = sed_cell(i_s, j_s, klo_s + k, ww_comp);
639 allold += QQ(k) + QQ2(k);
642 precip1[0] =
Real(0.0);
643 precip2[0] =
Real(0.0);
644 if (allold <=
Real(0.0)) {
649 for (
int k = 0; k < km; ++k) {
650 ZI(k + 1) = ZI(k) +
DZ(k);
653 auto update_wind_and_state = [&](void) {
656 for (
int k = 1; k < km; ++k) {
657 WI(k) = (WW(k) *
DZ(k - 1) + WW(k - 1) *
DZ(k)) / (
DZ(k - 1) +
DZ(k));
661 WI(1) =
Real(0.5) * (WW(1) + WW(0));
662 for (
int k = 2; k < km - 1; ++k) {
663 WI(k) =
Real(9.0) /
Real(16.0) * (WW(k) + WW(k - 1))
664 -
Real(1.0) /
Real(16.0) * (WW(k + 1) + WW(k - 2));
667 WI(km - 1) =
Real(0.5) * (WW(km - 1) + WW(km - 2));
671 for (
int k = 1; k < km; ++k) {
672 if (WW(k) ==
Real(0.0)) WI(k) = WW(k - 1);
676 for (
int k = km - 1; k >= 0; --k) {
677 const Real decfl = (WI(k + 1) - WI(k)) * dt /
DZ(k);
679 WI(k) = WI(k + 1) - con1 *
DZ(k) / dt;
683 for (
int k = 0; k <= km; ++k) {
684 ZA(k) = ZI(k) - WI(k) * dt;
687 for (
int k = 0; k < km; ++k) {
688 DZA(k) = ZA(k + 1) - ZA(k);
689 if (DZA(k) <=
Real(0.0)) DZA(k) =
DZ(k);
691 DZA(km) = ZI(km) - ZA(km);
692 if (DZA(km) <=
Real(0.0)) DZA(km) =
DZ(km > 0 ? km - 1 : 0);
693 for (
int k = 0; k < km; ++k) {
694 QA(k) = QQ(k) *
DZ(k) / DZA(k);
695 QA2(k) = QQ2(k) *
DZ(k) / DZA(k);
696 QR(k) = QA(k) / DEN(k);
697 QR2(k) = QA2(k) / DEN(k);
703 update_wind_and_state();
707 for (
int k = 0; k < km; ++k) {
713 TMP(k), TMP1(k), TMP2(k), TMP3(k),
714 WA(k), n0sfac_dummy);
719 TMP(k), TMP1(k), TMP2(k), TMP3(k),
722 for (
int k = 0; k < km; ++k) {
723 const Real tmpq = amrex::max(
QR(k) + QR2(k),
Real(1.0e-15));
724 if (tmpq >
Real(1.0e-15)) {
725 WA(k) = (WA(k) *
QR(k) + WA2(k) * QR2(k)) / tmpq;
730 for (
int k = 0; k < km; ++k) {
731 WW(k) =
Real(0.5) * (WD(k) + WA(k));
734 update_wind_and_state();
737 for (
int ist = 0; ist < 2; ++ist) {
738 const int qn_comp = (ist == 0)
741 const int qa_comp = (ist == 0)
744 auto QN_DST = [&](
int k) ->
Real& {
745 return sed_cell(i_s,j_s,klo_s+k,qn_comp);
747 auto QA_SRC = [&](
int k) ->
Real& {
748 return sed_node(i_s,j_s,klo_s+k,qa_comp);
750 Real* precip_dst = (ist == 0) ? &precip1[0] : &precip2[0];
752 for (
int k = 1; k < km; ++k) {
753 const Real dip = (QA_SRC(k + 1) - QA_SRC(k)) / (DZA(k + 1) + DZA(k));
754 const Real dim = (QA_SRC(k) - QA_SRC(k - 1)) / (DZA(k - 1) + DZA(k));
755 if (dip * dim <=
Real(0.0)) {
759 QPI(k) = QA_SRC(k) +
Real(0.5) * (dip + dim) * DZA(k);
760 QMI(k) =
Real(2.0) * QA_SRC(k) - QPI(k);
761 if (QPI(k) <
Real(0.0) || QMI(k) <
Real(0.0)) {
769 QMI(km) = QA_SRC(km);
770 QPI(km) = QA_SRC(km);
772 for (
int k = 0; k < km; ++k) {
773 QN_DST(k) =
Real(0.0);
778 for (
int k = 0; k < km; ++k) {
779 if (ZI(k) >= ZA(km)) {
783 for (
int kk = kb; kk < km; ++kk) {
784 if (ZI(k) <= ZA(kk + 1)) {
795 bool kt_found =
false;
796 for (
int kk = kt; kk <= km; ++kk) {
797 if (ZI(k + 1) <= ZA(kk)) {
803 if (!kt_found) { kt = km + 1; }
804 kt = amrex::max(kt - 1, 0);
807 const Real tl = (ZI(k) - ZA(kb)) / DZA(kb);
808 const Real th = (ZI(k + 1) - ZA(kb)) / DZA(kb);
809 const Real tl2 = tl * tl;
810 const Real th2 = th * th;
811 const Real qqd =
Real(0.5) * (QPI(kb) - QMI(kb));
812 const Real qqh = qqd * th2 + QMI(kb) * th;
813 const Real qql = qqd * tl2 + QMI(kb) * tl;
814 QN_DST(k) = (qqh - qql) / (th - tl);
815 }
else if (kt > kb) {
816 const Real tl = (ZI(k) - ZA(kb)) / DZA(kb);
817 const Real tl2 = tl * tl;
818 const Real qqd =
Real(0.5) * (QPI(kb) - QMI(kb));
819 const Real qql = qqd * tl2 + QMI(kb) * tl;
820 const Real dql = QA_SRC(kb) - qql;
821 Real zsum = (
Real(1.0) - tl) * DZA(kb);
824 for (
int m = kb + 1; m < kt; ++m) {
826 qsum += QA_SRC(m) * DZA(m);
829 const Real th = (ZI(k + 1) - ZA(kt)) / DZA(kt);
830 const Real th2 = th * th;
831 const Real dqh =
Real(0.5) * (QPI(kt) - QMI(kt)) * th2 + QMI(kt) * th;
832 zsum += th * DZA(kt);
833 qsum += dqh * DZA(kt);
834 QN_DST(k) =
qsum / zsum;
839 for (
int k = 0; k < km; ++k) {
840 if (ZA(k) <
Real(0.0) && ZA(k + 1) <
Real(0.0)) {
841 precip += QA_SRC(k) * DZA(k);
842 }
else if (ZA(k) <
Real(0.0) && ZA(k + 1) >=
Real(0.0)) {
852 for (
int k = 0; k < km; ++k) {
853 sed_cell(i_s, j_s, klo_s + k, rq_comp) = QN(k);
854 sed_cell(i_s, j_s, klo_s + k, rq2_comp) = QN2(k);
855 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:161
static constexpr amrex::Real lamdasmax
Definition: ERF_WSM6.H:156
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:166
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:163
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:154
static constexpr amrex::Real avts
Definition: ERF_WSM6.H:153
@ n0g
Definition: ERF_AdvanceMorrison.cpp:45
@ QR
Definition: ERF_IndexDefines.H:182
@ precip
Definition: ERF_SLM.H:133
constexpr int DZ
Definition: ERF_TwoStreamColumn.H:599
@ qsum
Definition: ERF_WSM6.H:344
@ 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:2185
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