1 #ifndef SUPERDROPLET_PC_DEFN_H_
2 #define SUPERDROPLET_PC_DEFN_H_
4 #ifdef ERF_USE_PARTICLES
6 #include <AMReX_Array.H>
7 #include <AMReX_REAL.H>
8 #include <AMReX_Particles.H>
14 using SDSpeciesMassArr = amrex::GpuArray<amrex::ParticleReal*,SupDropInit::num_species_max>;
15 using SDAerosolMassArr = amrex::GpuArray<amrex::ParticleReal*,SupDropInit::num_aerosols_max>;
18 using SuperDropletsRealIdxAoS = ERFParticlesRealIdxAoS;
21 using SuperDropletsIntIdxAoS = ERFParticlesIntIdxAoS;
24 using SuperDropletsRealIdxSoA = ERFParticlesRealIdxSoA;
27 struct SuperDropletsIntIdxSoA_RT
36 struct SuperDropletsRealIdxSoA_RT
43 #ifdef ERF_USE_ML_UPHYS_DIAGNOSTICS
52 using SuperDropletsIntIdxSoA = ERFParticlesIntIdxSoA;
55 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
56 static int idx_a(
const int a_i,
60 amrex::ignore_unused(a_num_a);
61 amrex::ignore_unused(a_num_s);
62 return SDPCDefn::SuperDropletsRealIdxSoA::ncomps
63 + SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
67 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
68 static int idx_s(
const int a_i,
72 amrex::ignore_unused(a_num_s);
73 return SDPCDefn::SuperDropletsRealIdxSoA::ncomps
74 + SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
79 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
80 static int ridx_a(
const int a_i,
84 amrex::ignore_unused(a_num_a);
85 amrex::ignore_unused(a_num_s);
86 return SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
90 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
91 static int ridx_s(
const int a_i,
95 amrex::ignore_unused(a_num_s);
96 return SDPCDefn::SuperDropletsRealIdxSoA_RT::ncomps
102 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
103 static amrex::ParticleReal SD_total_mass(
const int a_idx,
106 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
107 const SDPCDefn::SDAerosolMassArr& a_ae_mass )
109 amrex::ParticleReal retval = 0.0;
110 for (
int j = 0; j < a_num_sp; j++) {
111 retval += a_sp_mass[j][a_idx];
113 for (
int j = 0; j < a_num_ae; j++) {
114 retval += a_ae_mass[j][a_idx];
120 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
121 static amrex::ParticleReal SD_effective_radius(
const int a_idx,
123 amrex::ParticleReal a_rho_w,
126 const int*
const a_sp_sol_arr,
127 const int*
const a_ae_sol_arr,
128 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
129 const SDPCDefn::SDAerosolMassArr& a_ae_mass,
130 const amrex::ParticleReal*
const a_sp_rho,
131 const amrex::ParticleReal*
const a_ae_rho )
133 amrex::ParticleReal m_w = a_sp_mass[a_idx_w][a_idx];
134 amrex::ParticleReal m_s = 0.0;
135 amrex::ParticleReal m_p = 0.0;
136 amrex::ParticleReal rho_p = 0.0;
137 for (
int j = 0; j < a_num_sp; j++) {
139 if (a_sp_sol_arr[j]) {
140 m_s += a_sp_mass[j][a_idx];
142 m_p += a_sp_mass[j][a_idx];
143 rho_p += a_sp_rho[j]*a_sp_mass[j][a_idx];
147 for (
int j = 0; j < a_num_ae; j++) {
148 if (a_ae_sol_arr[j]) {
149 m_s += a_ae_mass[j][a_idx];
151 m_p += a_ae_mass[j][a_idx];
152 rho_p += a_ae_rho[j]*a_ae_mass[j][a_idx];
155 if (m_p > 0.0) { rho_p /= m_p; }
156 else { rho_p = 1.0; }
157 auto m_t = m_w + m_s + (a_rho_w/rho_p)*m_p;
158 auto r_eff = std::cbrt(m_t / (4.0/3.0*
PI*a_rho_w));
163 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
164 static amrex::ParticleReal SD_dry_radius(
const int a_idx,
167 const int*
const a_sp_sol_arr,
168 const int*
const a_ae_sol_arr,
169 const SDPCDefn::SDSpeciesMassArr& a_sp_mass,
170 const SDPCDefn::SDAerosolMassArr& a_ae_mass,
171 const amrex::ParticleReal*
const a_sp_rho,
172 const amrex::ParticleReal*
const a_ae_rho )
174 amrex::ParticleReal m_p = 0.0;
175 amrex::ParticleReal rho_p = 0.0;
176 for (
int j = 0; j < a_num_sp; j++) {
177 if (!a_sp_sol_arr[j]) {
178 m_p += a_sp_mass[j][a_idx];
179 rho_p += a_sp_rho[j]*a_sp_mass[j][a_idx];
182 for (
int j = 0; j < a_num_ae; j++) {
183 if (!a_ae_sol_arr[j]) {
184 m_p += a_ae_mass[j][a_idx];
185 rho_p += a_ae_rho[j]*a_ae_mass[j][a_idx];
188 if (m_p > 0.0) { rho_p /= m_p; }
189 else { rho_p = 1.0; }
190 auto r_dry = std::cbrt(m_p / (4.0/3.0*
PI*rho_p));
195 enum struct SDTerminalVelocityType {
202 enum struct SDCoalescenceKernelType {
210 enum struct SDMassChangeTIMethod {
211 RK3BS, RK4, BE, CN, DIRK2
constexpr amrex::Real PI
Definition: ERF_Constants.H:6