1 #ifndef ERF_PARTICLE_DATA_H_
2 #define ERF_PARTICLE_DATA_H_
4 #ifdef ERF_USE_PARTICLES
12 #include <AMReX_ParmParse.H>
13 #include <AMReX_Print.H>
14 #include <AMReX_Vector.H>
15 #include <AMReX_Gpu.H>
23 typedef std::map<std::string, ERFPC*> ParticleSpeciesMap;
24 typedef std::vector<std::string> ParticlesNamesVector;
25 typedef std::list<std::string> ParticlesNamesList;
34 BL_PROFILE(
"ParticleData::ParticleData()");
36 amrex::ParmParse
pp(
"particles");
37 m_disable_particle_op =
false;
38 pp.query(
"disable_plt", m_disable_particle_op);
40 m_particle_species.clear();
42 m_namelist_unalloc.clear();
48 BL_PROFILE(
"ParticleData::~ParticleData()");
49 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
50 auto particles( m_particle_species[m_namelist[i]] );
53 m_particle_species.clear();
55 m_namelist_unalloc.clear();
61 void writePlotFile (
const std::string& a_fname,
62 const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& a_z_phys_nd )
const
64 BL_PROFILE(
"ParticleData::writePlotFile");
65 if (!m_disable_particle_op) {
66 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
67 auto name( m_namelist[i] );
68 auto particles( m_particle_species.at(name) );
69 particles->ConvertZetaToZ(a_z_phys_nd);
70 particles->WritePlotFile(a_fname, name, particles->varNames());
71 particles->ConvertZToZeta(a_z_phys_nd);
77 void Checkpoint (
const std::string& a_fname )
const
79 BL_PROFILE(
"ParticleData::Checkpoint()");
80 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
81 auto name( m_namelist[i] );
82 auto particles( m_particle_species.at(name) );
83 particles->Checkpoint( a_fname, name,
true, particles->varNames() );
88 void GetMeshPlotVarNames ( amrex::Vector<std::string>& a_names )
const
90 BL_PROFILE(
"ParticleData::GetMeshPlotVarNames()");
92 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
93 auto name( m_namelist[i] );
94 auto particles( m_particle_species.at(name) );
96 auto var_names = particles->meshPlotVarNames();
97 for (
int n = 0; n < var_names.size(); n++) {
98 a_names.push_back( std::string(name+
"_"+var_names[n]) );
103 void GetMeshPlotVar (
const std::string& a_var_name,
104 amrex::MultiFab& a_mf,
105 const amrex::MultiFab& a_z_phys_nd,
108 BL_PROFILE(
"ParticleData::GetMeshPlotVar()");
109 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
110 auto particle_name( m_namelist[i] );
111 auto particles( m_particle_species.at(particle_name) );
113 auto particle_var_names = particles->meshPlotVarNames();
115 for (
int n = 0; n < particle_var_names.size(); n++) {
117 std::string var_name = particle_name+
"_"+particle_var_names[n];
118 if ( var_name == a_var_name ) {
119 particles->computeMeshVar(particle_var_names[n], a_mf, a_z_phys_nd, a_lev);
124 amrex::Abort(
"Requested var_name not found in ParticleData::GetMeshPlotVar");
128 inline void Redistribute ()
130 BL_PROFILE(
"ParticleData::Redistribute()");
131 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
132 m_particle_species[m_namelist[i]]->Redistribute();
137 inline void Redistribute (
138 const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& )
140 BL_PROFILE(
"ParticleData::Redistribute(z_phys_nd)");
141 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
142 m_particle_species[m_namelist[i]]->Redistribute();
147 inline bool HasSpecies (
const std::string& a_name )
149 BL_PROFILE(
"ParticleData::HasSpecies()");
150 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
151 if (it == m_particle_species.end()) {
159 inline ERFPC* GetSpecies (
const std::string& a_name )
161 BL_PROFILE(
"ParticleData::GetSpecies()");
162 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
163 if (it == m_particle_species.end()) {
164 amrex::Print() <<
"ERROR: unable to find particle species with name \""
173 inline ERFPC* operator[] (
const std::string& a_name )
175 BL_PROFILE(
"ParticleData::operator[]");
176 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
177 if (it == m_particle_species.end()) {
178 amrex::Print() <<
"ERROR: unable to find particle species with name \""
187 inline const ERFPC* GetSpecies (
const std::string& a_name )
const
189 BL_PROFILE(
"ParticleData::GetSpecies()");
190 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
191 if (it == m_particle_species.end()) {
192 amrex::Print() <<
"ERROR: unable to find particle species with name \""
201 inline const ERFPC* operator[] (
const std::string& a_name )
const
203 BL_PROFILE(
"ParticleData::operator[]");
204 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
205 if (it == m_particle_species.end()) {
206 amrex::Print() <<
"ERROR: unable to find particle species with name \""
215 inline void pushBack (
const std::string& a_name,
218 BL_PROFILE(
"ParticleData::pushBack()");
219 AMREX_ASSERT(!contains(a_name));
220 m_particle_species[a_name] = a_pc;
221 m_namelist.push_back(a_name);
225 inline void addName (
const std::string& a_name )
227 BL_PROFILE(
"ParticleData::addName()");
228 m_namelist_unalloc.push_back(a_name);
232 inline const ParticlesNamesVector& getNames ()
const
234 BL_PROFILE(
"ParticleData::getNames()");
239 inline ParticlesNamesList& getNamesUnalloc ()
241 BL_PROFILE(
"ParticleData::getNamesUnalloc()");
242 return m_namelist_unalloc;
246 inline bool contains (
const std::string& a_name )
const
248 BL_PROFILE(
"ParticleData::contains()");
249 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
250 return (it != m_particle_species.end());
254 inline bool isEmpty ()
const
256 BL_PROFILE(
"ParticleData::isEmpty()");
257 return (m_particle_species.size() == 0);
264 ParticleSpeciesMap m_particle_species;
266 ParticlesNamesVector m_namelist;
268 ParticlesNamesList m_namelist_unalloc;
271 bool m_disable_particle_op;