1 #ifndef SUPERDROPLET_PC_H_
2 #define SUPERDROPLET_PC_H_
4 #ifdef ERF_USE_PARTICLES
11 class SuperDropletPC :
public ERFPC
13 using MFPtr = std::unique_ptr<amrex::MultiFab>;
14 using BCTypeArr = amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>;
19 SuperDropletPC ( amrex::ParGDBBase* a_gdb,
20 const std::vector<Species::Name>& a_species_mat,
21 const std::vector<Species::Name>& a_aerosol_mat,
23 const std::string& a_name =
"super_droplets" )
24 : ERFPC (a_gdb, a_name)
26 define( a_species_mat,
28 a_gdb->ParticleBoxArray(m_lev),
29 a_gdb->ParticleDistributionMap(m_lev),
34 SuperDropletPC (
const amrex::Geometry& a_geom,
35 const amrex::DistributionMapping& a_dmap,
36 const amrex::BoxArray& a_ba,
37 const std::vector<Species::Name>& a_species_mat,
38 const std::vector<Species::Name>& a_aerosol_mat,
40 const std::string& a_name =
"super_droplets" )
41 : ERFPC (a_geom, a_dmap, a_ba, a_name)
43 define(a_species_mat, a_aerosol_mat, a_ba, a_dmap, a_dt);
49 if (m_mass_change_logging) {
50 fclose(m_mass_change_log);
56 virtual void setSpeciesMaterial (
const Species::Name& a_name )
58 if (a_name == Species::Name::H2O) {
59 m_idx_w = m_species_mat.size();
61 m_species_mat.push_back(std::make_unique<MaterialProperties>(a_name));
66 virtual void setSpeciesMaterial (
const std::vector<Species::Name>& a_names )
68 for (
auto& name : a_names) { setSpeciesMaterial(name); }
73 virtual const MaterialProperties& getSpeciesMaterial(
const Species::Name& a_name)
const
75 for (
auto& species : m_species_mat) {
76 if (species->m_name == a_name) {
return *species; }
78 amrex::Abort(
"SuperDropletPC::getSpeciesMaterial() - species not found");
79 return *m_species_mat[0];
84 virtual void setAerosolMaterial (
const Species::Name& a_name )
86 m_aerosol_mat.push_back(std::make_unique<MaterialProperties>(a_name));
91 virtual void setAerosolMaterial (
const std::vector<Species::Name>& a_names )
93 for (
auto& name : a_names) { setAerosolMaterial(name); }
97 [[nodiscard]]
virtual amrex::Vector<std::string> varNames ()
const override;
100 [[nodiscard]]
virtual amrex::Vector<std::string> meshPlotVarNames ()
const override;
103 virtual void computeMeshVar(
const std::string&,
105 const int )
const override;
108 virtual void InitializeParticles (
const amrex::Real,
const MFPtr& a_ptr)
override;
117 void setNumSDBoxDistribution( amrex::iMultiFab&,
120 const amrex::RealBox&,
124 void setNumSDBubbleDistribution( amrex::iMultiFab&,
127 const amrex::RealBox&,
133 virtual void SetAttributes ( amrex::MultiFab& a_mf );
138 virtual void DensityScaling (
const amrex::MultiFab& a_mf );
141 virtual void EvolveParticles (
int,
143 amrex::Vector<amrex::Vector<amrex::MultiFab>>&,
144 const amrex::Vector<MFPtr>& )
override
146 amrex::Abort(
"SuperDropletPC::EvolveParticles() is intentionally disabled.");
161 virtual void AdvectParticles (
int a_lev,
164 const amrex::MultiFab*
const a_flow_vel,
165 const amrex::MultiFab& a_density,
166 const amrex::MultiFab& a_pressure,
167 const amrex::MultiFab& a_temperature,
168 const amrex::Vector<MFPtr>& a_z_phys_nd,
169 const BCTypeArr& a_bctypes,
170 const bool a_recycle);
183 virtual void MassChange (
int a_lev,
185 const Species::Name& a_vap_name,
186 const amrex::MultiFab& a_temperature,
187 const amrex::MultiFab& a_pressure,
188 const amrex::MultiFab& a_sat_pressure,
189 const amrex::MultiFab& a_sat_ratio,
190 const amrex::Vector<MFPtr>& a_z_phys_nd,
191 const bool a_is_water);
199 virtual void Coalescence (
int a_lev,
201 const amrex::MultiFab& a_pressure,
202 const amrex::MultiFab& a_temperature);
211 virtual void Recycle (
const int a_lev,
212 const amrex::Vector<MFPtr>& a_z_phys_nd,
215 const bool a_recycle);
219 [[nodiscard]]
inline virtual amrex::Long NumSuperDroplets ()
221 return ERFPC::TotalNumberOfParticles();
225 [[nodiscard]]
virtual amrex::Real TotalNumberOfParticles ();
228 [[nodiscard]]
virtual amrex::Long NumSDDeactivated ();
233 virtual void ComputeDistributions (
int,
235 amrex::ParticleReal );
236 #ifdef ERF_USE_ML_UPHYS_DIAGNOSTICS
238 virtual void ComputeBinnedDistributions (
int );
240 virtual void ComputeBinnedDistributionsCell (
int,
amrex::Real );
244 virtual void SDNumberDensity ( amrex::MultiFab&,
const int a_comp=0 )
const;
246 virtual void numberDensity ( amrex::MultiFab&,
const int a_comp=0 )
const;
248 virtual void massDensity ( amrex::MultiFab&,
const int a_comp=0 )
const;
250 virtual void massFlux ( amrex::MultiFab&,
const int,
const int a_comp=0 )
const;
253 virtual void speciesMassDensity ( amrex::MultiFab& a_mf,
const int a_i )
const
255 speciesMassDensity(a_mf, a_i, 0.0, DBL_MAX);
258 virtual void speciesMassDensity ( amrex::MultiFab&,
262 const int a_comp = 0)
const;
264 virtual void speciesMassFlux ( amrex::MultiFab&,
const int,
const int,
const int a_comp=0 )
const;
267 virtual void aerosolMassDensity ( amrex::MultiFab&,
const int,
const int a_comp=0 )
const;
269 virtual void aerosolMassFlux ( amrex::MultiFab&,
const int,
const int,
const int a_comp=0 )
const;
272 virtual void effectiveRadius ( amrex::MultiFab&,
const int a_comp=0 )
const;
275 virtual void applyBoundaryTreatment (
int,
const amrex::Vector<MFPtr>&,
const BCTypeArr&,
const bool );
281 SDCoalescenceKernelType m_coalescence_kernel;
282 bool m_include_brownian_coalescence;
284 SDTerminalVelocityType m_term_vel_type;
286 int m_num_sd_per_cell;
287 bool m_density_scaling;
288 bool m_nucleate_particles;
289 bool m_prescribed_advection;
292 std::vector<std::unique_ptr<MaterialProperties>> m_species_mat;
294 std::vector<std::unique_ptr<MaterialProperties>> m_aerosol_mat;
303 bool m_mass_change_logging;
304 FILE* m_mass_change_log;
305 std::string m_mass_change_log_fname;
308 SDMassChangeTIMethod m_mass_change_ti;
309 long m_num_unconverged_particles;
311 amrex::IntVect m_coalescence_bin_size;
313 int m_distribution_grid_size;
315 amrex::MultiFab m_mf_buf;
317 #ifdef ERF_USE_ML_UPHYS_DIAGNOSTICS
322 amrex::MultiFab m_mass_ln_R_mf;
324 amrex::MultiFab m_num_ln_R_mf;
331 int m_num_initializations = 1;
333 std::vector< std::unique_ptr<SDInitialization> > m_initializations;
336 int m_num_injections = 0;
338 std::vector< std::unique_ptr<SDInjection> > m_injections;
344 bool m_place_randomly_in_cells;
347 std::mt19937 m_rndeng;
356 bool m_save_inactive;
367 virtual void readInputs ()
override
369 amrex::Abort(
"SuperDropletPC::readInputs(): Do not use this interface.");
376 void initializeParticlesNull (
const MFPtr&) { }
381 void define (
const std::vector<Species::Name>&,
382 const std::vector<Species::Name>&,
383 const amrex::BoxArray&,
384 const amrex::DistributionMapping&,
388 void add_superdroplet_attributes();
391 using ERFPC::massDensity;
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Super-droplets initial properties.
Definition: ERF_SDInitialization.H:44
Definition: ERF_MaterialProperties.H:48