WarpX
WarpXOpenPMD.H
Go to the documentation of this file.
1 /* Copyright 2019-2021 Axel Huebl, Junmin Gu, Maxence Thevenet
2  *
3  *
4  * This file is part of WarpX.
5  *
6  * License: BSD-3-Clause-LBNL
7  */
8 #ifndef WARPX_OPEN_PMD_H_
9 #define WARPX_OPEN_PMD_H_
10 
13 
15 
16 #include <AMReX_AmrParticles.H>
17 #include <AMReX_Geometry.H>
18 #include <AMReX_GpuAllocators.H>
19 #include <AMReX_ParIter.H>
21 #include <AMReX_Print.H>
22 #include <AMReX_REAL.H>
23 #include <AMReX_Utility.H>
24 #include <AMReX_Vector.H>
25 
26 #include <AMReX_BaseFwd.H>
27 
28 #ifdef WARPX_USE_OPENPMD
29 # include <openPMD/openPMD.hpp>
30 #endif
31 
32 #include <cstdint>
33 #include <map>
34 #include <memory>
35 #include <string>
36 #include <vector>
37 
38 //
39 //
41 {
42 public:
45 
47  [[nodiscard]] unsigned long GetTotalNumParticles () const {return m_Total;}
48 
49  std::vector<unsigned long long> m_ParticleOffsetAtRank;
50  std::vector<unsigned long long> m_ParticleSizeAtRank;
51 private:
58  void GetParticleOffsetOfProcessor (const long& numParticles,
59  unsigned long long& offset,
60  unsigned long long& sum) const ;
61 
62 
63  int m_MPIRank = 0;
64  int m_MPISize = 1;
65 
66  unsigned long long m_Total = 0;
67 
68  std::vector<unsigned long long> m_ParticleCounterByLevel;
69 };
70 
71 
72 #ifdef WARPX_USE_OPENPMD
73 //
74 //
77 {
78 public:
81 
94  const std::string& filetype,
95  const std::string& operator_type,
96  const std::map< std::string, std::string >& operator_parameters,
97  const std::string& engine_type,
98  const std::map< std::string, std::string >& engine_parameters,
99  const std::vector<bool>& fieldPMLdirections,
100  const std::string& authors);
101 
103 
104  WarpXOpenPMDPlot ( WarpXOpenPMDPlot const &) = delete;
108 
114  void SetStep (int ts, const std::string& dirPrefix, int file_min_digits,
115  bool isBTD=false);
116 
121  void CloseStep (bool isBTD = false, bool isLastBTDFlush = false);
122 
123  void WriteOpenPMDParticles (
124  const amrex::Vector<ParticleDiag>& particle_diags,
125  amrex::Real time,
126  bool use_pinned_pc = false,
127  bool isBTD = false,
128  bool isLastBTDFlush = false);
129 
142  void WriteOpenPMDFieldsAll (
143  const std::vector<std::string>& varnames,
146  int output_levels,
147  int iteration,
148  double time,
149  bool isBTD = false,
150  const amrex::Geometry& full_BTD_snapshot=amrex::Geometry() ) const;
151 
153  std::string OpenPMDFileType () { return m_OpenPMDFileType; }
154 
155 private:
156  void Init (openPMD::Access access, bool isBTD);
157 
158 
169  [[nodiscard]] inline openPMD::Iteration GetIteration (int const iteration, bool const isBTD) const
170  {
171  if (isBTD)
172  {
173  return m_Series->iterations[iteration];
174  } else {
175  return m_Series->writeIterations()[iteration];
176  }
177  }
178 
179 
184  void SetupFields (
186  amrex::Geometry& full_geom
187  ) const;
188 
189  void SetupMeshComp (
190  openPMD::Mesh& mesh,
191  amrex::Geometry const& full_geom,
192  std::string const& comp_name,
193  std::string const& field_name,
194  amrex::MultiFab const& mf,
195  bool var_in_theta_mode
196  ) const;
197 
210  void GetMeshCompNames (
211  int meshLevel,
212  const std::string& varname,
213  std::string& field_name,
214  std::string& comp_name,
215  bool var_in_theta_mode
216  ) const;
217 
224  void SetupPos (
225  openPMD::ParticleSpecies& currSpecies,
226  const unsigned long long& np,
227  bool isBTD = false);
228 
239  openPMD::ParticleSpecies& currSpecies,
240  const unsigned long long& np,
241  amrex::ParticleReal charge,
242  amrex::ParticleReal mass);
243 
255  void SetupRealProperties (ParticleContainer const * pc,
256  openPMD::ParticleSpecies& currSpecies,
257  const amrex::Vector<int>& write_real_comp,
258  const amrex::Vector<std::string>& real_comp_names,
259  const amrex::Vector<int>& write_int_comp,
260  const amrex::Vector<std::string>& int_comp_names,
261  unsigned long long np, bool isBTD = false) const;
262 
273  void SaveRealProperty (ParticleIter& pti, //int, int,
274  openPMD::ParticleSpecies& currSpecies,
275  unsigned long long offset,
276  const amrex::Vector<int>& write_real_comp,
277  const amrex::Vector<std::string>& real_comp_names,
278  const amrex::Vector<int>& write_int_comp,
279  const amrex::Vector<std::string>& int_comp_names) const;
280 
296  void DumpToFile (ParticleContainer* pc,
297  const std::string& name,
298  int iteration,
299  const amrex::Vector<int>& write_real_comp,
300  const amrex::Vector<int>& write_int_comp,
301  const amrex::Vector<std::string>& real_comp_names,
302  const amrex::Vector<std::string>& int_comp_names,
303  amrex::ParticleReal charge,
304  amrex::ParticleReal mass,
305  bool isBTD = false,
306  bool isLastBTDFlush = false);
307 
316  std::string GetFileName (std::string& filepath);
317 
318  std::unique_ptr<openPMD::Series> m_Series;
319 
326  std::string m_dirPrefix;
327 
331 
332  int m_MPIRank = 0;
333  int m_MPISize = 1;
334 
336  std::string m_OpenPMDFileType = "bp";
337  std::string m_OpenPMDoptions = "{}";
338  int m_CurrentStep = -1;
339 
340  // meta data
341  std::vector< bool > m_fieldPMLdirections;
342 
343  // The authors' string
344  std::string m_authors;
345 };
346 #endif // WARPX_USE_OPENPMD
347 
348 #endif // WARPX_OPEN_PMD_H
Definition: WarpXOpenPMD.H:77
void SetupPos(openPMD::ParticleSpecies &currSpecies, const unsigned long long &np, bool isBTD=false)
Definition: WarpXOpenPMD.cpp:979
typename amrex::ParConstIterSoA< PIdx::nattribs, 0, amrex::PinnedArenaAllocator > ParticleIter
Definition: WarpXOpenPMD.H:80
openPMD::IterationEncoding m_Encoding
Definition: WarpXOpenPMD.H:335
std::unique_ptr< openPMD::Series > m_Series
Definition: WarpXOpenPMD.H:318
void CloseStep(bool isBTD=false, bool isLastBTDFlush=false)
Definition: WarpXOpenPMD.cpp:453
void SetConstParticleRecordsEDPIC(openPMD::ParticleSpecies &currSpecies, const unsigned long long &np, amrex::ParticleReal charge, amrex::ParticleReal mass)
Definition: WarpXOpenPMD.cpp:999
void Init(openPMD::Access access, bool isBTD)
Definition: WarpXOpenPMD.cpp:479
void DumpToFile(ParticleContainer *pc, const std::string &name, int iteration, const amrex::Vector< int > &write_real_comp, const amrex::Vector< int > &write_int_comp, const amrex::Vector< std::string > &real_comp_names, const amrex::Vector< std::string > &int_comp_names, amrex::ParticleReal charge, amrex::ParticleReal mass, bool isBTD=false, bool isLastBTDFlush=false)
Definition: WarpXOpenPMD.cpp:651
std::string GetFileName(std::string &filepath)
Definition: WarpXOpenPMD.cpp:409
WarpXOpenPMDPlot(WarpXOpenPMDPlot &&)=default
std::string m_OpenPMDFileType
Definition: WarpXOpenPMD.H:336
void SaveRealProperty(ParticleIter &pti, openPMD::ParticleSpecies &currSpecies, unsigned long long offset, const amrex::Vector< int > &write_real_comp, const amrex::Vector< std::string > &real_comp_names, const amrex::Vector< int > &write_int_comp, const amrex::Vector< std::string > &int_comp_names) const
Definition: WarpXOpenPMD.cpp:885
WarpXOpenPMDPlot & operator=(WarpXOpenPMDPlot const &)=delete
void SetStep(int ts, const std::string &dirPrefix, int file_min_digits, bool isBTD=false)
Definition: WarpXOpenPMD.cpp:430
void WriteOpenPMDFieldsAll(const std::vector< std::string > &varnames, const amrex::Vector< amrex::MultiFab > &mf, amrex::Vector< amrex::Geometry > &geom, int output_levels, int iteration, double time, bool isBTD=false, const amrex::Geometry &full_BTD_snapshot=amrex::Geometry()) const
Definition: WarpXOpenPMD.cpp:1319
openPMD::Iteration GetIteration(int const iteration, bool const isBTD) const
Definition: WarpXOpenPMD.H:169
int m_MPIRank
Definition: WarpXOpenPMD.H:332
WarpXOpenPMDPlot(openPMD::IterationEncoding ie, const std::string &filetype, const std::string &operator_type, const std::map< std::string, std::string > &operator_parameters, const std::string &engine_type, const std::map< std::string, std::string > &engine_parameters, const std::vector< bool > &fieldPMLdirections, const std::string &authors)
Definition: WarpXOpenPMD.cpp:378
std::string m_dirPrefix
Definition: WarpXOpenPMD.H:326
void SetupRealProperties(ParticleContainer const *pc, openPMD::ParticleSpecies &currSpecies, const amrex::Vector< int > &write_real_comp, const amrex::Vector< std::string > &real_comp_names, const amrex::Vector< int > &write_int_comp, const amrex::Vector< std::string > &int_comp_names, unsigned long long np, bool isBTD=false) const
Definition: WarpXOpenPMD.cpp:805
int m_CurrentStep
JSON option string for openPMD::Series constructor.
Definition: WarpXOpenPMD.H:338
int m_file_min_digits
Definition: WarpXOpenPMD.H:330
std::string OpenPMDFileType()
Definition: WarpXOpenPMD.H:153
int m_MPISize
Definition: WarpXOpenPMD.H:333
void SetupMeshComp(openPMD::Mesh &mesh, amrex::Geometry const &full_geom, std::string const &comp_name, std::string const &field_name, amrex::MultiFab const &mf, bool var_in_theta_mode) const
Definition: WarpXOpenPMD.cpp:1198
typename WarpXParticleContainer::ContainerLike< amrex::PinnedArenaAllocator > ParticleContainer
Definition: WarpXOpenPMD.H:79
void SetupFields(openPMD::Container< openPMD::Mesh > &meshes, amrex::Geometry &full_geom) const
Definition: WarpXOpenPMD.cpp:1117
~WarpXOpenPMDPlot()
Definition: WarpXOpenPMD.cpp:399
WarpXOpenPMDPlot(WarpXOpenPMDPlot const &)=delete
std::vector< bool > m_fieldPMLdirections
Definition: WarpXOpenPMD.H:341
void GetMeshCompNames(int meshLevel, const std::string &varname, std::string &field_name, std::string &comp_name, bool var_in_theta_mode) const
Definition: WarpXOpenPMD.cpp:1241
void WriteOpenPMDParticles(const amrex::Vector< ParticleDiag > &particle_diags, amrex::Real time, bool use_pinned_pc=false, bool isBTD=false, bool isLastBTDFlush=false)
Definition: WarpXOpenPMD.cpp:528
std::string m_OpenPMDoptions
MPI-parallel openPMD backend: bp or h5.
Definition: WarpXOpenPMD.H:337
std::string m_authors
Definition: WarpXOpenPMD.H:344
Definition: WarpXOpenPMD.H:41
typename WarpXParticleContainer::ContainerLike< amrex::PinnedArenaAllocator > ParticleContainer
Definition: WarpXOpenPMD.H:43
unsigned long long m_Total
Definition: WarpXOpenPMD.H:66
std::vector< unsigned long long > m_ParticleCounterByLevel
Definition: WarpXOpenPMD.H:68
unsigned long GetTotalNumParticles() const
Definition: WarpXOpenPMD.H:47
std::vector< unsigned long long > m_ParticleOffsetAtRank
Definition: WarpXOpenPMD.H:49
std::vector< unsigned long long > m_ParticleSizeAtRank
Definition: WarpXOpenPMD.H:50
WarpXParticleCounter(ParticleContainer *pc)
Definition: WarpXOpenPMD.cpp:1470
int m_MPIRank
Definition: WarpXOpenPMD.H:63
typename amrex::ParIterSoA< PIdx::nattribs, 0, amrex::PinnedArenaAllocator > ParticleIter
Definition: WarpXOpenPMD.H:44
void GetParticleOffsetOfProcessor(const long &numParticles, unsigned long long &offset, unsigned long long &sum) const
Definition: WarpXOpenPMD.cpp:1517
int m_MPISize
Definition: WarpXOpenPMD.H:64
ParticleContainer_impl< Particle< T_NStructReal, T_NStructInt >, T_NArrayReal, T_NArrayInt, Allocator, CellAssignor > ParticleContainer
name
Definition: run_automated.py:229