1 #ifndef SUPERDROPLET_PC_DEFN_H_
2 #define SUPERDROPLET_PC_DEFN_H_
4 #ifdef ERF_USE_PARTICLES
6 #include <AMReX_Enum.H>
7 #include <AMReX_Array.H>
8 #include <AMReX_REAL.H>
9 #include <AMReX_Particles.H>
16 using SDSpeciesMassArr = amrex::GpuArray<amrex::ParticleReal*,SupDropInit::num_species_max>;
17 using SDAerosolMassArr = amrex::GpuArray<amrex::ParticleReal*,SupDropInit::num_aerosols_max>;
20 using SuperDropletsRealIdxAoS = ERFParticlesRealIdxAoS;
23 using SuperDropletsIntIdxAoS = ERFParticlesIntIdxAoS;
26 using SuperDropletsRealIdxSoA = ERFParticlesRealIdxSoA;
29 using SuperDropletsIntIdxSoA = ERFParticlesIntIdxSoA;
32 struct SuperDropletsIntIdxSoA_RT
41 struct SuperDropletsRealIdxSoA_RT
48 #ifdef ERF_USE_ML_UPHYS_DIAGNOSTICS
57 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
58 static int ridx_a(
const int a_i,
62 amrex::ignore_unused(a_num_a);
63 amrex::ignore_unused(a_num_s);
64 return SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
68 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
69 static int ridx_s(
const int a_i,
73 amrex::ignore_unused(a_num_s);
74 return SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
79 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
80 static int idx_a(
const int a_i,
84 return SDPCDefn::SuperDropletsRealIdxSoA::ncomps + ridx_a(a_i,a_num_a,a_num_s);
87 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
88 static int idx_s(
const int a_i,
92 return SDPCDefn::SuperDropletsRealIdxSoA::ncomps + ridx_s(a_i,a_num_a,a_num_s);
96 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
97 static amrex::ParticleReal SD_total_mass(
const int a_idx,
100 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
101 const SDPCDefn::SDAerosolMassArr& a_ae_mass )
103 amrex::ParticleReal retval =
zero;
104 for (
int j = 0; j < a_num_sp; j++) {
105 retval += a_sp_mass[j][a_idx];
107 for (
int j = 0; j < a_num_ae; j++) {
108 retval += a_ae_mass[j][a_idx];
114 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
115 static amrex::ParticleReal SD_effective_radius(
const int a_idx,
117 amrex::ParticleReal a_rho_w,
120 const int*
const a_sp_sol_arr,
121 const int*
const a_ae_sol_arr,
122 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
123 const SDPCDefn::SDAerosolMassArr& a_ae_mass,
124 const amrex::ParticleReal*
const a_sp_rho,
125 const amrex::ParticleReal*
const a_ae_rho )
127 amrex::ParticleReal m_w = a_sp_mass[a_idx_w][a_idx];
128 amrex::ParticleReal m_s =
zero;
129 amrex::ParticleReal m_p =
zero;
130 amrex::ParticleReal rho_p =
zero;
131 for (
int j = 0; j < a_num_sp; j++) {
133 if (a_sp_sol_arr[j]) {
134 m_s += a_sp_mass[j][a_idx];
136 m_p += a_sp_mass[j][a_idx];
137 rho_p += a_sp_rho[j]*a_sp_mass[j][a_idx];
141 for (
int j = 0; j < a_num_ae; j++) {
142 if (a_ae_sol_arr[j]) {
143 m_s += a_ae_mass[j][a_idx];
145 m_p += a_ae_mass[j][a_idx];
146 rho_p += a_ae_rho[j]*a_ae_mass[j][a_idx];
149 if (m_p >
zero) { rho_p /= m_p; }
150 else { rho_p =
one; }
151 auto m_t = m_w + m_s + (a_rho_w/rho_p)*m_p;
157 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
158 static amrex::ParticleReal SD_dry_radius(
const int a_idx,
161 const int*
const a_sp_sol_arr,
162 const int*
const a_ae_sol_arr,
163 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
164 const SDPCDefn::SDAerosolMassArr& a_ae_mass,
165 const amrex::ParticleReal*
const a_sp_rho,
166 const amrex::ParticleReal*
const a_ae_rho )
168 amrex::ParticleReal m_p =
zero;
169 amrex::ParticleReal rho_p =
zero;
170 for (
int j = 0; j < a_num_sp; j++) {
171 if (!a_sp_sol_arr[j]) {
172 m_p += a_sp_mass[j][a_idx];
173 rho_p += a_sp_rho[j]*a_sp_mass[j][a_idx];
176 for (
int j = 0; j < a_num_ae; j++) {
177 if (!a_ae_sol_arr[j]) {
178 m_p += a_ae_mass[j][a_idx];
179 rho_p += a_ae_rho[j]*a_ae_mass[j][a_idx];
182 if (m_p >
zero) { rho_p /= m_p; }
183 else { rho_p =
one; }
196 enum struct SDCoalescenceKernelType {
204 enum struct SDMassChangeTIMethod {
205 RK3BS, RK4, BE, CN, DIRK2
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real four_thirds_pi
Definition: ERF_Constants.H:18
AMREX_ENUM(InitType, None, Input_Sounding, NCFile, WRFInput, Metgrid, Uniform, ConstantDensity, ConstantDensityLinearTheta, Isentropic, MoistBaseState, HindCast)