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();
59 void writePlotFile (
const std::string& a_fname )
const
61 BL_PROFILE(
"ParticleData::writePlotFile");
62 if (!m_disable_particle_op) {
63 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
64 auto name( m_namelist[i] );
65 auto particles( m_particle_species.at(name) );
66 particles->WritePlotFile(a_fname, name, particles->varNames());
72 void Checkpoint (
const std::string& a_fname )
const
74 BL_PROFILE(
"ParticleData::Checkpoint()");
75 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
76 auto name( m_namelist[i] );
77 auto particles( m_particle_species.at(name) );
78 particles->Checkpoint( a_fname, name,
true, particles->varNames() );
83 void GetMeshPlotVarNames ( amrex::Vector<std::string>& a_names )
const
85 BL_PROFILE(
"ParticleData::GetMeshPlotVarNames()");
87 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
88 auto name( m_namelist[i] );
89 auto particles( m_particle_species.at(name) );
91 auto var_names = particles->meshPlotVarNames();
92 for (
int n = 0; n < var_names.size(); n++) {
93 a_names.push_back( std::string(name+
"_"+var_names[n]) );
98 void GetMeshPlotVar (
const std::string& a_var_name,
99 amrex::MultiFab& a_mf,
102 BL_PROFILE(
"ParticleData::GetMeshPlotVar()");
103 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
104 auto particle_name( m_namelist[i] );
105 auto particles( m_particle_species.at(particle_name) );
107 auto particle_var_names = particles->meshPlotVarNames();
109 for (
int n = 0; n < particle_var_names.size(); n++) {
111 std::string var_name = particle_name+
"_"+particle_var_names[n];
112 if ( var_name == a_var_name ) {
113 particles->computeMeshVar(particle_var_names[n], a_mf, a_lev);
118 amrex::Abort(
"Requested var_name not found in ParticleData::GetMeshPlotVar");
122 inline void Redistribute ()
124 BL_PROFILE(
"ParticleData::Redistribute()");
125 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
126 m_particle_species[m_namelist[i]]->Redistribute();
131 inline bool HasSpecies (
const std::string& a_name )
133 BL_PROFILE(
"ParticleData::HasSpecies()");
134 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
135 if (it == m_particle_species.end()) {
143 inline ERFPC* GetSpecies (
const std::string& a_name )
145 BL_PROFILE(
"ParticleData::GetSpecies()");
146 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
147 if (it == m_particle_species.end()) {
148 amrex::Print() <<
"ERROR: unable to find particle species with name \""
157 inline ERFPC* operator[] (
const std::string& a_name )
159 BL_PROFILE(
"ParticleData::operator[]");
160 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
161 if (it == m_particle_species.end()) {
162 amrex::Print() <<
"ERROR: unable to find particle species with name \""
171 inline const ERFPC* GetSpecies (
const std::string& a_name )
const
173 BL_PROFILE(
"ParticleData::GetSpecies()");
174 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
175 if (it == m_particle_species.end()) {
176 amrex::Print() <<
"ERROR: unable to find particle species with name \""
185 inline const ERFPC* operator[] (
const std::string& a_name )
const
187 BL_PROFILE(
"ParticleData::operator[]");
188 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
189 if (it == m_particle_species.end()) {
190 amrex::Print() <<
"ERROR: unable to find particle species with name \""
199 inline void pushBack (
const std::string& a_name,
202 BL_PROFILE(
"ParticleData::pushBack()");
203 AMREX_ASSERT(!contains(a_name));
204 m_particle_species[a_name] = a_pc;
205 m_namelist.push_back(a_name);
209 inline void addName (
const std::string& a_name )
211 BL_PROFILE(
"ParticleData::addName()");
212 m_namelist_unalloc.push_back(a_name);
216 inline const ParticlesNamesVector& getNames ()
const
218 BL_PROFILE(
"ParticleData::getNames()");
223 inline ParticlesNamesList& getNamesUnalloc ()
225 BL_PROFILE(
"ParticleData::getNamesUnalloc()");
226 return m_namelist_unalloc;
230 inline bool contains (
const std::string& a_name )
const
232 BL_PROFILE(
"ParticleData::contains()");
233 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
234 return (it != m_particle_species.end());
238 inline bool isEmpty ()
const
240 BL_PROFILE(
"ParticleData::isEmpty()");
241 return (m_particle_species.size() == 0);
248 ParticleSpeciesMap m_particle_species;
250 ParticlesNamesVector m_namelist;
252 ParticlesNamesList m_namelist_unalloc;
255 bool m_disable_particle_op;
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pp(amrex::Real y)
Definition: ERF_MicrophysicsUtils.H:230