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 SuperDropletsRealIdx = ERFParticlesRealIdx;
23 using SuperDropletsIntIdx = ERFParticlesIntIdx;
26 struct SuperDropletsIntIdxSoA_RT
35 struct SuperDropletsRealIdxSoA_RT
42 #ifdef ERF_USE_ML_UPHYS_DIAGNOSTICS
51 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
52 static int ridx_a(
const int a_i,
56 amrex::ignore_unused(a_num_a);
57 amrex::ignore_unused(a_num_s);
58 return SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
62 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
63 static int ridx_s(
const int a_i,
67 amrex::ignore_unused(a_num_s);
68 return SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
73 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
74 static int idx_a(
const int a_i,
78 return SDPCDefn::SuperDropletsRealIdx::ncomps + ridx_a(a_i,a_num_a,a_num_s);
81 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
82 static int idx_s(
const int a_i,
86 return SDPCDefn::SuperDropletsRealIdx::ncomps + ridx_s(a_i,a_num_a,a_num_s);
90 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
91 static amrex::ParticleReal SD_total_mass(
const int a_idx,
94 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
95 const SDPCDefn::SDAerosolMassArr& a_ae_mass )
97 amrex::ParticleReal retval =
zero;
98 for (
int j = 0; j < a_num_sp; j++) {
99 retval += a_sp_mass[j][a_idx];
101 for (
int j = 0; j < a_num_ae; j++) {
102 retval += a_ae_mass[j][a_idx];
108 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
109 static amrex::ParticleReal SD_effective_radius(
const int a_idx,
111 amrex::ParticleReal a_rho_w,
114 const int*
const a_sp_sol_arr,
115 const int*
const a_ae_sol_arr,
116 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
117 const SDPCDefn::SDAerosolMassArr& a_ae_mass,
118 const amrex::ParticleReal*
const a_sp_rho,
119 const amrex::ParticleReal*
const a_ae_rho )
121 amrex::ParticleReal m_w = a_sp_mass[a_idx_w][a_idx];
122 amrex::ParticleReal m_s =
zero;
123 amrex::ParticleReal m_p =
zero;
124 amrex::ParticleReal rho_p =
zero;
125 for (
int j = 0; j < a_num_sp; j++) {
127 if (a_sp_sol_arr[j]) {
128 m_s += a_sp_mass[j][a_idx];
130 m_p += a_sp_mass[j][a_idx];
131 rho_p += a_sp_rho[j]*a_sp_mass[j][a_idx];
135 for (
int j = 0; j < a_num_ae; j++) {
136 if (a_ae_sol_arr[j]) {
137 m_s += a_ae_mass[j][a_idx];
139 m_p += a_ae_mass[j][a_idx];
140 rho_p += a_ae_rho[j]*a_ae_mass[j][a_idx];
143 if (m_p >
zero) { rho_p /= m_p; }
144 else { rho_p =
one; }
145 auto m_t = m_w + m_s + (a_rho_w/rho_p)*m_p;
151 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
152 static amrex::ParticleReal SD_dry_radius(
const int a_idx,
155 const int*
const a_sp_sol_arr,
156 const int*
const a_ae_sol_arr,
157 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
158 const SDPCDefn::SDAerosolMassArr& a_ae_mass,
159 const amrex::ParticleReal*
const a_sp_rho,
160 const amrex::ParticleReal*
const a_ae_rho )
162 amrex::ParticleReal m_p =
zero;
163 amrex::ParticleReal rho_p =
zero;
164 for (
int j = 0; j < a_num_sp; j++) {
165 if (!a_sp_sol_arr[j]) {
166 m_p += a_sp_mass[j][a_idx];
167 rho_p += a_sp_rho[j]*a_sp_mass[j][a_idx];
170 for (
int j = 0; j < a_num_ae; j++) {
171 if (!a_ae_sol_arr[j]) {
172 m_p += a_ae_mass[j][a_idx];
173 rho_p += a_ae_rho[j]*a_ae_mass[j][a_idx];
176 if (m_p >
zero) { rho_p /= m_p; }
177 else { rho_p =
one; }
190 enum struct SDCoalescenceKernelType {
198 enum struct SDMassChangeTIMethod {
199 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)