Split cloud components according to saturation pressures; source theta from latent heat.
24 int SAM_moisture_type = 1;
27 SAM_moisture_type = 2;
42 const auto& box3d = mfi.tilebox();
44 ParallelFor(box3d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
53 Real delta_qv, delta_qc, delta_qi;
61 if (SAM_moisture_type == 1){
63 if (tabs_array(i,j,k) >=
tbgmax) {
65 delta_qi = qci_array(i,j,k);
66 qci_array(i,j,k) = 0.0;
67 qcl_array(i,j,k) += delta_qi;
68 tabs_array(i,j,k) -= fac_fus * delta_qi;
69 pres_array(i,j,k) = rho_array(i,j,k) *
R_d * tabs_array(i,j,k)
70 * (1.0 +
R_v/
R_d * qv_array(i,j,k));
71 theta_array(i,j,k) =
getThgivenTandP(tabs_array(i,j,k), pres_array(i,j,k), rdOcp);
72 pres_array(i,j,k) *= 0.01;
75 else if (tabs_array(i,j,k) <=
tbgmin) {
77 delta_qc = qcl_array(i,j,k);
78 qcl_array(i,j,k) = 0.0;
79 qci_array(i,j,k) += delta_qc;
80 tabs_array(i,j,k) += fac_fus * delta_qc;
81 pres_array(i,j,k) = rho_array(i,j,k) *
R_d * tabs_array(i,j,k)
82 * (1.0 +
R_v/
R_d * qv_array(i,j,k));
83 theta_array(i,j,k) =
getThgivenTandP(tabs_array(i,j,k), pres_array(i,j,k), rdOcp);
84 pres_array(i,j,k) *= 0.01;
88 omn = an*tabs_array(i,j,k)-bn;
89 delta_qc = qcl_array(i,j,k) - qn_array(i,j,k) * omn;
90 delta_qi = qci_array(i,j,k) - qn_array(i,j,k) * (1.0 - omn);
91 qcl_array(i,j,k) = qn_array(i,j,k) * omn;
92 qci_array(i,j,k) = qn_array(i,j,k) * (1.0 - omn);
93 tabs_array(i,j,k) += fac_fus * delta_qc;
94 pres_array(i,j,k) = rho_array(i,j,k) *
R_d * tabs_array(i,j,k)
95 * (1.0 +
R_v/
R_d * qv_array(i,j,k));
96 theta_array(i,j,k) =
getThgivenTandP(tabs_array(i,j,k), pres_array(i,j,k), rdOcp);
97 pres_array(i,j,k) *= 0.01;
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) = 0.0;
107 tabs_array(i,j,k) += fac_cond * delta_qc;
108 pres_array(i,j,k) = rho_array(i,j,k) *
R_d * tabs_array(i,j,k)
109 * (1.0 +
R_v/
R_d * qv_array(i,j,k));
110 theta_array(i,j,k) =
getThgivenTandP(tabs_array(i,j,k), pres_array(i,j,k), rdOcp);
111 pres_array(i,j,k) *= 0.01;
115 erf_qsatw(tabs_array(i,j,k), pres_array(i,j,k), qsatw);
116 erf_qsati(tabs_array(i,j,k), pres_array(i,j,k), qsati);
117 qsat = omn * qsatw + (1.0-omn) * qsati;
120 if (qt_array(i,j,k) > qsat) {
123 tabs_array(i,j,k) =
NewtonIterSat(i, j, k , SAM_moisture_type ,
124 fac_cond , fac_fus , fac_sub ,
126 tabs_array, pres_array,
127 qv_array , qcl_array , qci_array,
128 qn_array , qt_array);
131 theta_array(i,j,k) =
getThgivenTandP(tabs_array(i,j,k), 100.0*pres_array(i,j,k), rdOcp);
142 delta_qv = qcl_array(i,j,k) + qci_array(i,j,k);
143 delta_qc = qcl_array(i,j,k);
144 delta_qi = qci_array(i,j,k);
147 qv_array(i,j,k) += delta_qv;
148 qcl_array(i,j,k) = 0.0;
149 qci_array(i,j,k) = 0.0;
150 qn_array(i,j,k) = 0.0;
151 qt_array(i,j,k) = qv_array(i,j,k);
154 tabs_array(i,j,k) -= fac_cond * delta_qc + fac_sub * delta_qi;
157 theta_array(i,j,k) =
getThgivenTandP(tabs_array(i,j,k), 100.0*pres_array(i,j,k), rdOcp);
160 erf_qsatw(tabs_array(i,j,k), pres_array(i,j,k), qsatw);
161 erf_qsati(tabs_array(i,j,k), pres_array(i,j,k), qsati);
162 qsat = omn * qsatw + (1.0-omn) * qsati;
163 if (qt_array(i,j,k) > qsat) {
166 tabs_array(i,j,k) =
NewtonIterSat(i, j, k , SAM_moisture_type ,
167 fac_cond , fac_fus , fac_sub ,
169 tabs_array, pres_array,
170 qv_array , qcl_array , qci_array,
171 qn_array , qt_array);
174 theta_array(i,j,k) =
getThgivenTandP(tabs_array(i,j,k), 100.0*pres_array(i,j,k), rdOcp);
constexpr amrex::Real R_v
Definition: ERF_Constants.H:11
constexpr amrex::Real tbgmax
Definition: ERF_Constants.H:32
constexpr amrex::Real tbgmin
Definition: ERF_Constants.H:31
constexpr amrex::Real R_d
Definition: ERF_Constants.H:10
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
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsatw(amrex::Real t, amrex::Real p, amrex::Real &qsatw)
Definition: ERF_MicrophysicsUtils.H:163
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsati(amrex::Real t, amrex::Real p, amrex::Real &qsati)
Definition: ERF_MicrophysicsUtils.H:152
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Array< FabPtr, MicVar::NumVars > mic_fab_vars
Definition: ERF_SAM.H:318
amrex::Real m_rdOcp
Definition: ERF_SAM.H:310
amrex::Real m_fac_fus
Definition: ERF_SAM.H:307
bool m_do_cond
Definition: ERF_SAM.H:311
amrex::Real m_fac_cond
Definition: ERF_SAM.H:306
amrex::Real m_fac_sub
Definition: ERF_SAM.H:308
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 &, 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:151
@ pres
Definition: ERF_SAM.H:33
@ qci
Definition: ERF_SAM.H:39
@ qv
Definition: ERF_SAM.H:37
@ rho
Definition: ERF_SAM.H:30
@ 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:911