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:42
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:41
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 auto prob_lo=geomdata.ProbLo();const auto dx=geomdata.CellSize();const Real x=(prob_lo[0]+(i+myhalf) *dx[0])/mf_m(i, j, 0);const Real z=z_cc(i, j, k);Real L=std::sqrt(std::pow((x - x_c)/x_r, 2)+std::pow((z - z_c)/z_r, 2));if(L<=one) { Real dT=T_pert *(std::cos(PI *L)+one)/two;Real Tbar_hse=p_hse(i, j, k)/(R_d *r_hse(i, j, k));Real theta_perturbed=(Tbar_hse+dT) *std::pow(p_0/p_hse(i, j, k), rdOcp);Real theta_0=(Tbar_hse) *std::pow(p_0/p_hse(i, j, k), rdOcp);if(const_rho) { state_pert(i, j, k, RhoTheta_comp)=r_hse(i, j, k) *(theta_perturbed - theta_0);} else { state_pert(i, j, k, Rho_comp)=getRhoThetagivenP(p_hse(i, j, k))/theta_perturbed - r_hse(i, j, k);} } })
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:160
amrex::Array< FabPtr, MicVar::NumVars > mic_fab_vars
Definition: ERF_SAM.H:330
amrex::Real m_rdOcp
Definition: ERF_SAM.H:319
amrex::Real m_fac_fus
Definition: ERF_SAM.H:317
bool m_do_cond
Definition: ERF_SAM.H:320
amrex::Real m_fac_cond
Definition: ERF_SAM.H:316
amrex::Geometry m_geom
Definition: ERF_SAM.H:301
amrex::Real m_fac_sub
Definition: ERF_SAM.H:318
int m_real_width
Definition: ERF_SAM.H:304
@ 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:1206