Split cloud components according to saturation pressures; source theta from latent heat.
24 int SAM_moisture_type = 1;
27 SAM_moisture_type = 2;
30 auto domain =
m_geom.Domain();
31 int i_lo = domain.smallEnd(0);
32 int i_hi = domain.bigEnd(0);
33 int j_lo = domain.smallEnd(1);
34 int j_hi = domain.bigEnd(1);
47 auto tbx = mfi.tilebox();
48 if (tbx.smallEnd(0) == i_lo) { tbx.growLo(0,-
m_real_width); }
49 if (tbx.bigEnd(0) == i_hi) { tbx.growHi(0,-
m_real_width); }
50 if (tbx.smallEnd(1) == j_lo) { tbx.growLo(1,-
m_real_width); }
51 if (tbx.bigEnd(1) == j_hi) { tbx.growHi(1,-
m_real_width); }
53 ParallelFor(tbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
62 Real delta_qv, delta_qc, delta_qi;
70 if (SAM_moisture_type == 1){
72 if (tabs_array(i,j,k) >=
tbgmax) {
74 delta_qi = qci_array(i,j,k);
75 qci_array(i,j,k) =
zero;
76 qcl_array(i,j,k) += delta_qi;
77 tabs_array(i,j,k) -= fac_fus * delta_qi;
81 else if (tabs_array(i,j,k) <=
tbgmin) {
83 delta_qc = qcl_array(i,j,k);
84 qcl_array(i,j,k) =
zero;
85 qci_array(i,j,k) += delta_qc;
86 tabs_array(i,j,k) += fac_fus * delta_qc;
91 omn = an*tabs_array(i,j,k)-bn;
92 delta_qc = qcl_array(i,j,k) - qn_array(i,j,k) * omn;
93 delta_qi = qci_array(i,j,k) - qn_array(i,j,k) * (
one - omn);
94 qcl_array(i,j,k) = qn_array(i,j,k) * omn;
95 qci_array(i,j,k) = qn_array(i,j,k) * (
one - omn);
96 tabs_array(i,j,k) += fac_fus * delta_qc;
100 else if (SAM_moisture_type == 2)
103 delta_qc = qcl_array(i,j,k) - qn_array(i,j,k);
105 qcl_array(i,j,k) = qn_array(i,j,k);
106 qci_array(i,j,k) =
zero;
107 tabs_array(i,j,k) += fac_cond * delta_qc;
112 erf_qsatw(tabs_array(i,j,k), pres_array(i,j,k), qsatw);
113 erf_qsati(tabs_array(i,j,k), pres_array(i,j,k), qsati);
114 qsat = omn * qsatw + (
one-omn) * qsati;
117 if (qt_array(i,j,k) > qsat) {
120 tabs_array(i,j,k) =
NewtonIterSat(i, j, k , SAM_moisture_type ,
121 fac_cond , fac_fus , fac_sub ,
123 tabs_array, pres_array,
124 qv_array , qcl_array , qci_array,
125 qn_array , qt_array);
139 delta_qv = qcl_array(i,j,k) + qci_array(i,j,k);
140 delta_qc = qcl_array(i,j,k);
141 delta_qi = qci_array(i,j,k);
144 qv_array(i,j,k) += delta_qv;
145 qcl_array(i,j,k) =
zero;
146 qci_array(i,j,k) =
zero;
147 qn_array(i,j,k) =
zero;
148 qt_array(i,j,k) = qv_array(i,j,k);
151 tabs_array(i,j,k) -= fac_cond * delta_qc + fac_sub * delta_qi;
157 erf_qsatw(tabs_array(i,j,k), pres_array(i,j,k), qsatw);
158 erf_qsati(tabs_array(i,j,k), pres_array(i,j,k), qsati);
159 qsat = omn * qsatw + (
one-omn) * qsati;
160 if (qt_array(i,j,k) > qsat) {
163 tabs_array(i,j,k) =
NewtonIterSat(i, j, k , SAM_moisture_type ,
164 fac_cond , fac_fus , fac_sub ,
166 tabs_array, pres_array,
167 qv_array , qcl_array , qci_array,
168 qn_array , qt_array);
constexpr amrex::Real tbgmax
Definition: ERF_Constants.H:43
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real tbgmin
Definition: ERF_Constants.H:42
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getThgivenTandP(const amrex::Real T, const amrex::Real P, const amrex::Real rdOcp)
Definition: ERF_EOS.H:18
const Real rdOcp
Definition: ERF_InitCustomPert_Bomex.H:16
ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { const Real *dx=geomdata.CellSize();const Real x=(i+0.5) *dx[0];const Real y=(j+0.5) *dx[1];const Real Omg=erf_vortex_Gaussian(x, y, xc, yc, R, beta, sigma);const Real deltaT=-(gamma - 1.0)/(2.0 *sigma *sigma) *Omg *Omg;const Real rho_norm=std::pow(1.0+deltaT, inv_gm1);const Real T=(1.0+deltaT) *T_inf;const Real p=std::pow(rho_norm, Gamma)/Gamma *rho_0 *a_inf *a_inf;const Real rho_theta=rho_0 *rho_norm *(T *std::pow(p_0/p, rdOcp));state_pert(i, j, k, RhoTheta_comp)=rho_theta - getRhoThetagivenP(p_hse(i, j, k));const Real r2d_xy=std::sqrt((x-xc) *(x-xc)+(y-yc) *(y-yc));state_pert(i, j, k, RhoScalar_comp)=0.25 *(1.0+std::cos(PI *std::min(r2d_xy, R)/R));})
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsatw(amrex::Real t, amrex::Real p, amrex::Real &qsatw)
Definition: ERF_MicrophysicsUtils.H:171
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsati(amrex::Real t, amrex::Real p, amrex::Real &qsati)
Definition: ERF_MicrophysicsUtils.H:160
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real NewtonIterSat(int &i, int &j, int &k, const int &SAM_moisture_type, const amrex::Real &fac_cond, const amrex::Real &fac_fus, const amrex::Real &fac_sub, const amrex::Real &an, const amrex::Real &bn, const amrex::Array4< amrex::Real > &tabs_array, const amrex::Array4< amrex::Real > &pres_array, const amrex::Array4< amrex::Real > &qv_array, const amrex::Array4< amrex::Real > &qc_array, const amrex::Array4< amrex::Real > &qi_array, const amrex::Array4< amrex::Real > &qn_array, const amrex::Array4< amrex::Real > &qt_array)
Definition: ERF_SAM.H:161
amrex::Array< FabPtr, MicVar::NumVars > mic_fab_vars
Definition: ERF_SAM.H:331
amrex::Real m_rdOcp
Definition: ERF_SAM.H:320
amrex::Real m_fac_fus
Definition: ERF_SAM.H:318
bool m_do_cond
Definition: ERF_SAM.H:321
amrex::Real m_fac_cond
Definition: ERF_SAM.H:317
amrex::Geometry m_geom
Definition: ERF_SAM.H:302
amrex::Real m_fac_sub
Definition: ERF_SAM.H:319
int m_real_width
Definition: ERF_SAM.H:305
@ pres
Definition: ERF_SAM.H:33
@ qci
Definition: ERF_SAM.H:39
@ qv
Definition: ERF_SAM.H:37
@ qt
Definition: ERF_SAM.H:35
@ qn
Definition: ERF_SAM.H:36
@ theta
Definition: ERF_SAM.H:31
@ qcl
Definition: ERF_SAM.H:38
@ tabs
Definition: ERF_SAM.H:32
MoistureType moisture_type
Definition: ERF_DataStruct.H:1249