openPMD-api
Series.hpp
1 /* Copyright 2017-2020 Fabian Koller, Axel Huebl
2  *
3  * This file is part of openPMD-api.
4  *
5  * openPMD-api is free software: you can redistribute it and/or modify
6  * it under the terms of of either the GNU General Public License or
7  * the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * openPMD-api is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License and the GNU Lesser General Public License
15  * for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * and the GNU Lesser General Public License along with openPMD-api.
19  * If not, see <http://www.gnu.org/licenses/>.
20  */
21 #pragma once
22 
23 #include "openPMD/config.hpp"
24 #include "openPMD/backend/Attributable.hpp"
25 #include "openPMD/backend/Container.hpp"
26 #include "openPMD/IO/AbstractIOHandler.hpp"
27 #include "openPMD/IO/Access.hpp"
28 #include "openPMD/IO/Format.hpp"
29 #include "openPMD/Iteration.hpp"
30 #include "openPMD/IterationEncoding.hpp"
31 #include "openPMD/Streaming.hpp"
32 #include "openPMD/auxiliary/Option.hpp"
33 #include "openPMD/auxiliary/Variant.hpp"
34 #include "openPMD/backend/Attributable.hpp"
35 #include "openPMD/backend/Container.hpp"
36 #include "openPMD/config.hpp"
37 #include "openPMD/version.hpp"
38 
39 #if openPMD_HAVE_MPI
40 # include <mpi.h>
41 #endif
42 
43 #include <map>
44 #include <string>
45 
46 // expose private and protected members for invasive testing
47 #ifndef OPENPMD_private
48 # define OPENPMD_private private
49 #endif
50 
51 
52 namespace openPMD
53 {
54 class ReadIterations;
55 class WriteIterations;
56 
64 class Series : public Attributable
65 {
66  friend class Iteration;
67  friend class SeriesIterator;
68 
69 public:
70 #if openPMD_HAVE_MPI
71  Series(
72  std::string const & filepath,
73  Access at,
74  MPI_Comm comm,
75  std::string const & options = "{}" );
76 #endif
77 
78  Series(
79  std::string const & filepath,
80  Access at,
81  std::string const & options = "{}" );
82  ~Series();
83 
87  std::string openPMD() const;
93  Series& setOpenPMD(std::string const& openPMD);
94 
98  uint32_t openPMDextension() const;
104  Series& setOpenPMDextension(uint32_t openPMDextension);
105 
109  std::string basePath() const;
115  Series& setBasePath(std::string const& basePath);
116 
121  std::string meshesPath() const;
127  Series& setMeshesPath(std::string const& meshesPath);
128 
133  std::string particlesPath() const;
139  Series& setParticlesPath(std::string const& particlesPath);
140 
145  std::string author() const;
151  Series& setAuthor(std::string const& author);
152 
157  std::string software() const;
164  Series& setSoftware(std::string const& newName, std::string const& newVersion = std::string("unspecified"));
165 
170  std::string softwareVersion() const;
178  [[deprecated("Set the version with the second argument of setSoftware()")]]
179  Series& setSoftwareVersion(std::string const& softwareVersion);
180 
185  std::string date() const;
191  Series& setDate(std::string const& date);
192 
197  std::string softwareDependencies() const;
203  Series& setSoftwareDependencies(std::string const& newSoftwareDependencies);
204 
209  std::string machine() const;
215  Series& setMachine(std::string const& newMachine);
216 
226  Series& setIterationEncoding(IterationEncoding iterationEncoding);
227 
231  std::string iterationFormat() const;
242  Series& setIterationFormat(std::string const& iterationFormat);
243 
247  std::string name() const;
248 
254  Series& setName(std::string const& name);
255 
262  std::string backend() const;
263 
266  void flush();
267 
279  readIterations();
280 
294  writeIterations();
295 
297 
298 OPENPMD_private:
299  struct ParsedInput;
300  using iterations_iterator = decltype( iterations )::iterator;
301 
302  std::unique_ptr< ParsedInput > parseInput(std::string);
303  void init(std::shared_ptr< AbstractIOHandler >, std::unique_ptr< ParsedInput >);
304  void initDefaults();
305  std::future< void > flush_impl(
306  iterations_iterator begin, iterations_iterator end );
307  void flushFileBased( iterations_iterator begin, iterations_iterator end );
308  void flushGroupBased( iterations_iterator begin, iterations_iterator end );
309  void flushMeshesPath();
310  void flushParticlesPath();
311  void readFileBased( );
320  void readGroupBased( bool init = true );
321  void
322  readBase();
323  void read();
324  std::string iterationFilename( uint64_t i );
325  void openIteration( uint64_t index, Iteration iteration );
326 
331  iterations_iterator
332  indexOf( Iteration const & );
333 
350  advance(
351  AdvanceMode mode,
352  Attributable & file,
353  iterations_iterator it,
354  Iteration & iteration );
355 
363  std::shared_ptr< StepStatus > m_stepStatus =
364  std::make_shared< StepStatus >( StepStatus::NoStep );
365 
366  static constexpr char const * const BASEPATH = "/data/%T/";
367 
368  std::shared_ptr< IterationEncoding > m_iterationEncoding;
369  std::shared_ptr< std::string > m_name;
370  std::shared_ptr< Format > m_format;
371 
372  std::shared_ptr< std::string > m_filenamePrefix;
373  std::shared_ptr< std::string > m_filenamePostfix;
374  std::shared_ptr< int > m_filenamePadding;
375 
376  std::shared_ptr< auxiliary::Option< WriteIterations > > m_writeIterations =
377  std::make_shared< auxiliary::Option< WriteIterations > >();
378 }; // Series
379 
385 {
386  friend class SeriesIterator;
387 
388 public:
389  using iterations_t = decltype( Series::iterations );
390  using index_t = iterations_t::key_type;
391  index_t const iterationIndex;
392 
393 private:
394  template< typename Iteration_t >
395  IndexedIteration( Iteration_t && it, index_t index )
396  : Iteration( std::forward< Iteration_t >( it ) )
397  , iterationIndex( index )
398  {
399  }
400 };
401 
403 {
404  using iteration_index_t = IndexedIteration::index_t;
405 
407 
408  maybe_series_t m_series;
409  iteration_index_t m_currentIteration = 0;
410 
412  SeriesIterator();
413 
414 public:
415  SeriesIterator( Series * );
416 
418  operator++();
419 
421  operator*();
422 
423  bool
424  operator==( SeriesIterator const & other ) const;
425 
426  bool
427  operator!=( SeriesIterator const & other ) const;
428 
429  static SeriesIterator
430  end();
431 };
432 
450 {
451  friend class Series;
452 
453 private:
454  using iterations_t = decltype( Series::iterations );
455  using iterator_t = SeriesIterator;
456 
457  Series * m_series;
458 
459  ReadIterations( Series * );
460 
461 public:
462  iterator_t
463  begin();
464 
465  iterator_t
466  end();
467 };
468 
484 class WriteIterations : private Container< Iteration, uint64_t >
485 {
486  friend class Series;
487 
488 private:
490  struct SharedResources
491  {
492  iterations_t iterations;
493  auxiliary::Option< uint64_t > currentlyOpen;
494 
495  SharedResources( iterations_t );
496  ~SharedResources();
497  };
498 
499  using key_type = typename iterations_t::key_type;
500  using value_type = typename iterations_t::key_type;
502  explicit WriteIterations() = default;
504  std::shared_ptr< SharedResources > shared;
505 
506 public:
507  mapped_type &
508  operator[]( key_type const & key ) override;
509  mapped_type &
510  operator[]( key_type && key ) override;
511 };
512 } // namespace openPMD
Subclass of Iteration that knows its own index withing the containing Series.
Definition: Series.hpp:384
Series & setOpenPMD(std::string const &openPMD)
Set the version of the enforced openPMD standard.
Definition: Series.cpp:128
std::string basePath() const
Definition: Series.cpp:148
Access
File access mode to use during IO.
Definition: Access.hpp:28
Series & setSoftwareDependencies(std::string const &newSoftwareDependencies)
Indicate dependencies of software that were used to create the file.
Definition: Series.cpp:266
std::string softwareDependencies() const
Definition: Series.cpp:260
Logical compilation of data from one snapshot (e.g.
Definition: Iteration.hpp:38
Definition: Series.cpp:65
Series & setMachine(std::string const &newMachine)
Indicate the machine or relevant hardware that created the file.
Definition: Series.cpp:279
std::string meshesPath() const
Definition: Series.cpp:165
ReadIterations readIterations()
Entry point to the reading end of the streaming API.
Definition: Series.cpp:365
Series & setDate(std::string const &date)
Indicate the date of creation.
Definition: Series.cpp:253
Series & setName(std::string const &name)
Set the pattern for file names.
Definition: Series.cpp:339
Series & setBasePath(std::string const &basePath)
Set the common prefix for all data sets and sub-groups of a specific iteration.
Definition: Series.cpp:154
std::string machine() const
Definition: Series.cpp:273
AdvanceStatus
In step-based mode (i.e.
Definition: Streaming.hpp:20
AdvanceMode
In step-based mode (i.e.
Definition: Streaming.hpp:33
std::string name() const
Definition: Series.cpp:333
std::string author() const
Definition: Series.cpp:207
Writing side of the streaming API.
Definition: Series.hpp:484
Reading side of the streaming API.
Definition: Series.hpp:449
std::string iterationFormat() const
Definition: Series.cpp:313
Root level of the openPMD hierarchy.
Definition: Series.hpp:64
void flush()
Execute all required remaining IO operations to write or read data.
Definition: Series.cpp:359
uint32_t openPMDextension() const
Definition: Series.cpp:135
std::string backend() const
The currently used backend.
Definition: Series.cpp:353
Simple Option type based on variantSrc::variant.
Definition: Option.hpp:47
Series & setMeshesPath(std::string const &meshesPath)
Set the path to mesh records, relative(!) to basePath.
Definition: Series.cpp:171
Public definitions of openPMD-api.
Definition: Date.cpp:29
IterationEncoding iterationEncoding() const
Definition: Series.cpp:286
Definition: Series.hpp:402
Series & setIterationFormat(std::string const &iterationFormat)
Set a pattern describing how to access single iterations in the raw file.
Definition: Series.cpp:319
Series & setSoftwareVersion(std::string const &softwareVersion)
Indicate the version of the software/code/simulation that created the file.
Definition: Series.cpp:240
Series & setIterationEncoding(IterationEncoding iterationEncoding)
Set the encoding style for multiple iterations in this series.
Definition: Series.cpp:292
IterationEncoding
Encoding scheme of an Iterations Series&#39;.
Definition: IterationEncoding.hpp:32
Series & setParticlesPath(std::string const &particlesPath)
Set the path to groups for each particle species, relative(!) to basePath.
Definition: Series.cpp:192
Series & setAuthor(std::string const &author)
Indicate the author and contact for the information in the file.
Definition: Series.cpp:213
WriteIterations writeIterations()
Entry point to the writing end of the streaming API.
Definition: Series.cpp:371
std::string softwareVersion() const
Definition: Series.cpp:234
Series & setOpenPMDextension(uint32_t openPMDextension)
Set a 32-bit mask of applied extensions to the openPMD standard.
Definition: Series.cpp:141
std::string particlesPath() const
Definition: Series.cpp:186
std::string date() const
Definition: Series.cpp:247
Series & setSoftware(std::string const &newName, std::string const &newVersion=std::string("unspecified"))
Indicate the software/code/simulation that created the file.
Definition: Series.cpp:226
std::string openPMD() const
Definition: Series.cpp:122
std::string software() const
Definition: Series.cpp:220
Layer to manage storage of attributes associated with file objects.
Definition: Attributable.hpp:65