4 #ifdef ERF_USE_PARTICLES
7 #include <AMReX_Particles.H>
8 #include <AMReX_ParticleUtil.H>
13 struct GetParticleBinERF
15 amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> plo;
16 amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> dxi;
18 amrex::IntVect bin_size;
22 unsigned int operator() (
const P&
p)
const noexcept
25 auto iv = amrex::getParticleCell(
p, plo, dxi, domain);
26 auto tid = amrex::getTileIndex(iv, box,
true, bin_size, tbx);
27 return static_cast<unsigned int>(tid);
34 struct ERFParticlesIntIdx
44 struct ERFParticlesRealIdx
56 namespace ERFParticleInitializations
59 const std::string init_box_uniform =
"box";
62 namespace ERFParticleNames
64 const std::string tracers =
"tracer_particles";
83 bool read_particle_init =
true;
87 bool advect_with_gravity =
false;
90 class ERFPC :
public amrex::ParticleContainer< 0,
92 ERFParticlesRealIdx::ncomps,
93 ERFParticlesIntIdx::ncomps,
94 amrex::DefaultAllocator >
99 ERFPC ( amrex::ParGDBBase* a_gdb,
100 const std::string& a_name =
"particles",
101 const ERFPCOptions& a_opts = ERFPCOptions() )
102 :
amrex::ParticleContainer< 0,
104 ERFParticlesRealIdx::ncomps,
105 ERFParticlesIntIdx::ncomps,
106 amrex::DefaultAllocator> (a_gdb)
108 BL_PROFILE(
"ERFPCPC::ERFPC()");
115 ERFPC (
const amrex::Geometry& a_geom,
116 const amrex::DistributionMapping& a_dmap,
117 const amrex::BoxArray& a_ba,
118 const std::string& a_name =
"particles",
119 const ERFPCOptions& a_opts = ERFPCOptions() )
120 :
amrex::ParticleContainer< 0,
122 ERFParticlesRealIdx::ncomps,
123 ERFParticlesIntIdx::ncomps,
124 amrex::DefaultAllocator> ( a_geom, a_dmap, a_ba )
126 BL_PROFILE(
"ERFPCPC::ERFPC()");
133 virtual void InitializeParticles (
const double time,
const std::unique_ptr<amrex::MultiFab>& a_ptr =
nullptr);
136 virtual void EvolveParticles (
int a_lev,
138 amrex::Vector<amrex::Vector<amrex::MultiFab>>& a_flow_vars,
139 const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& a_z_phys_nd );
142 virtual amrex::Vector<std::string> varNames ()
const
144 BL_PROFILE(
"ERFPCPC::varNames()");
145 return {AMREX_D_DECL(
"xvel",
"yvel",
"zvel"),
"mass",
"temperature"};
149 virtual amrex::Vector<std::string> meshPlotVarNames ()
const
151 BL_PROFILE(
"ERFPCPC::varNames()");
152 return {
"mass_density"};
156 virtual void AdvectWithFlow (amrex::MultiFab* a_umac,
159 const std::unique_ptr<amrex::MultiFab>& a_z_height);
162 virtual void AdvectWithGravity (
int a_lev,
164 const std::unique_ptr<amrex::MultiFab>& a_z_height);
167 virtual void ComputeTemperature (
const amrex::MultiFab& a_ucons,
170 const std::unique_ptr<amrex::MultiFab>& a_z_height);
173 virtual void massDensity ( amrex::MultiFab&,
174 const amrex::MultiFab& a_z_phys_nd,
175 const int&,
const int& a_comp = 0)
const;
178 virtual void computeMeshVar(
const std::string& a_var_name,
179 amrex::MultiFab& a_mf,
180 const amrex::MultiFab& a_z_phys_nd,
181 const int a_lev)
const
183 if (a_var_name ==
"mass_density") {
184 massDensity( a_mf, a_z_phys_nd, a_lev );
191 inline void setAdvectWithFlow (
bool a_flag)
193 BL_PROFILE(
"ERFPCPC::setAdvectWithFlow()");
194 m_advect_w_flow = a_flag;
197 inline void setAdvectWithGravity (
bool a_flag)
199 BL_PROFILE(
"ERFPCPC::setAdvectWithGravity()");
200 m_advect_w_gravity = a_flag;
212 template<
typename ValueFunc>
213 void ERFPCParticleToMesh(amrex::MultiFab& a_mf,
214 const amrex::MultiFab& a_z_phys_nd,
215 int a_lev,
int a_comp,
216 ValueFunc&& value_func)
const;
219 void initializeParticlesUniformDistributionInBox (
const std::unique_ptr<amrex::MultiFab>& a_ptr,
220 const amrex::RealBox& particle_box);
225 void ConvertZetaToZ (
const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& a_z_phys_nd);
228 void ConvertZToZeta (
const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& a_z_phys_nd);
233 void ExtractAndRouteOORParticles (
int a_lev );
236 void CountParticlesPerLevelAndHalo (
int a_finest_level );
242 virtual void SplitParticlesForRefinement (
int ) {}
247 virtual void SplitMergeAtLevelBoundary () {}
253 virtual void MergeParticlesAtDerefinement (
int ,
254 const amrex::BoxArray& ,
255 const amrex::IntVect& ) {}
259 bool m_advect_w_flow;
260 bool m_advect_w_gravity;
262 amrex::RealBox m_particle_box;
268 std::string m_initialization_type;
271 double m_inject_start_time;
273 bool m_initialized =
false;
275 bool m_stable_redistribute;
278 virtual void readInputs ();
282 bool place_randomly_in_cells;
@ P
Definition: ERF_IndexDefines.H:204
@ p
Definition: ERF_WSM6.H:191
Definition: ERF_ConsoleIO.cpp:15