1#ifndef _REMORA_PARTICLE_DATA_H_
2#define _REMORA_PARTICLE_DATA_H_
4#ifdef REMORA_USE_PARTICLES
12#include <AMReX_ParmParse.H>
13#include <AMReX_Print.H>
14#include <AMReX_Vector.H>
23typedef std::map<std::string, REMORAPC*> ParticleSpeciesMap;
24typedef std::vector<std::string> ParticlesNamesVector;
25typedef std::list<std::string> ParticlesNamesList;
34 BL_PROFILE(
"ParticleData::ParticleData()");
35 m_particle_species.clear();
37 m_namelist_unalloc.clear();
43 BL_PROFILE(
"ParticleData::~ParticleData()");
44 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
45 auto particles( m_particle_species[m_namelist[i]] );
48 m_particle_species.clear();
50 m_namelist_unalloc.clear();
54 void Checkpoint (
const std::string& a_fname )
const
56 BL_PROFILE(
"ParticleData::Checkpoint()");
57 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
58 auto name( m_namelist[i] );
59 auto particles( m_particle_species.at(name) );
60 particles->Checkpoint( a_fname, name,
true, particles->varNames() );
65 void Restart ( amrex::ParGDBBase* a_gdb,
const std::string& a_fname )
67 BL_PROFILE(
"ParticleData::Restart()");
68 AMREX_ASSERT(isEmpty());
69 for (
auto it = m_namelist_unalloc.begin(); it != m_namelist_unalloc.end(); ++it) {
70 std::string species_name( *it );
71 REMORAPC* pc =
new REMORAPC( a_gdb, species_name );
72 pc->Restart(a_fname, species_name );
73 pushBack( species_name, pc );
75 m_namelist_unalloc.clear();
79 void GetMeshPlotVarNames ( amrex::Vector<std::string>& a_names )
const
81 BL_PROFILE(
"ParticleData::GetMeshPlotVarNames()");
83 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
84 auto name( m_namelist[i] );
85 auto particles( m_particle_species.at(name) );
87 auto var_names = particles->meshPlotVarNames();
88 for (
int n = 0; n < var_names.size(); n++) {
89 a_names.push_back( std::string(name+
"_"+var_names[n]) );
94 void GetMeshPlotVar (
const std::string& a_var_name,
95 amrex::MultiFab& a_mf,
98 BL_PROFILE(
"ParticleData::GetMeshPlotVar()");
99 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
100 auto particle_name( m_namelist[i] );
101 auto particles( m_particle_species.at(particle_name) );
103 auto particle_var_names = particles->meshPlotVarNames();
105 for (
int n = 0; n < particle_var_names.size(); n++) {
107 std::string var_name = particle_name+
"_"+particle_var_names[n];
108 if ( var_name == a_var_name ) {
109 particles->computeMeshVar(particle_var_names[n], a_mf, a_lev);
114 amrex::Abort(
"Requested var_name not found in ParticleData::GetMeshPlotVar");
118 inline void Redistribute ()
120 BL_PROFILE(
"ParticleData::Redistribute()");
121 for (ParticlesNamesVector::size_type i = 0; i < m_namelist.size(); i++) {
122 m_particle_species[m_namelist[i]]->Redistribute();
127 inline REMORAPC* GetSpecies (
const std::string& a_name )
129 BL_PROFILE(
"ParticleData::GetSpecies()");
130 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
131 if (it == m_particle_species.end()) {
132 amrex::Print() <<
"ERROR: unable to find particle species with name \""
141 inline REMORAPC* operator[] (
const std::string& a_name )
143 BL_PROFILE(
"ParticleData::operator[]");
144 ParticleSpeciesMap::iterator it (m_particle_species.find(a_name));
145 if (it == m_particle_species.end()) {
146 amrex::Print() <<
"ERROR: unable to find particle species with name \""
155 inline const REMORAPC* GetSpecies (
const std::string& a_name )
const
157 BL_PROFILE(
"ParticleData::GetSpecies()");
158 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
159 if (it == m_particle_species.end()) {
160 amrex::Print() <<
"ERROR: unable to find particle species with name \""
169 inline const REMORAPC* operator[] (
const std::string& a_name )
const
171 BL_PROFILE(
"ParticleData::operator[]");
172 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
173 if (it == m_particle_species.end()) {
174 amrex::Print() <<
"ERROR: unable to find particle species with name \""
183 inline void pushBack (
const std::string& a_name,
184 REMORAPC*
const a_pc )
186 BL_PROFILE(
"ParticleData::pushBack()");
187 AMREX_ASSERT(!contains(a_name));
188 m_particle_species[a_name] = a_pc;
189 m_namelist.push_back(a_name);
193 inline void addName (
const std::string& a_name )
195 BL_PROFILE(
"ParticleData::addName()");
196 m_namelist_unalloc.push_back(a_name);
200 inline const ParticlesNamesVector& getNames ()
const
202 BL_PROFILE(
"ParticleData::getNames()");
207 inline ParticlesNamesList& getNamesUnalloc ()
209 BL_PROFILE(
"ParticleData::getNamesUnalloc()");
210 return m_namelist_unalloc;
214 inline bool contains (
const std::string& a_name )
const
216 BL_PROFILE(
"ParticleData::contains()");
217 ParticleSpeciesMap::const_iterator it (m_particle_species.find(a_name));
218 return (it != m_particle_species.end());
222 inline bool isEmpty ()
const
224 BL_PROFILE(
"ParticleData::isEmpty()");
225 return (m_particle_species.size() == 0);
232 ParticleSpeciesMap m_particle_species;
234 ParticlesNamesVector m_namelist;
236 ParticlesNamesList m_namelist_unalloc;