openPMD-api
Mesh.hpp
1 /* Copyright 2017-2020 Fabian Koller
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/backend/Attributable.hpp"
24 #include "openPMD/backend/BaseRecord.hpp"
25 #include "openPMD/backend/MeshRecordComponent.hpp"
26 
27 #include <array>
28 #include <ostream>
29 #include <string>
30 #include <vector>
31 
32 
33 namespace openPMD
34 {
39 class Mesh : public BaseRecord< MeshRecordComponent >
40 {
41  friend class Container< Mesh >;
42  friend class Iteration;
43 
44 public:
45  Mesh(Mesh const&) = default;
46  Mesh& operator=(Mesh const&) = default;
47  ~Mesh() override = default;
48 
55  enum class Geometry
56  {
57  cartesian,
58  thetaMode,
59  cylindrical,
60  spherical
61  }; //Geometry
62 
65  enum class DataOrder : char
66  {
67  C = 'C',
68  F = 'F'
69  }; //DataOrder
70 
74  Geometry geometry() const;
80  Mesh& setGeometry(Geometry g);
81 
86  std::string geometryParameters() const;
93  Mesh& setGeometryParameters(std::string const& geometryParameters);
94 
98  DataOrder dataOrder() const;
104  Mesh& setDataOrder(DataOrder dor);
105 
109  std::vector< std::string > axisLabels() const;
116  Mesh& setAxisLabels(std::vector< std::string > const & axisLabels);
117 
122  template< typename T >
123  std::vector< T > gridSpacing() const;
131  template< typename T >
132  Mesh& setGridSpacing(std::vector< T > const & gridSpacing);
133 
137  std::vector< double > gridGlobalOffset() const;
144  Mesh& setGridGlobalOffset(std::vector< double > const & gridGlobalOffset);
145 
149  double gridUnitSI() const;
155  Mesh& setGridUnitSI(double gridUnitSI);
156 
162  Mesh& setUnitDimension(std::map< UnitDimension, double > const& unitDimension);
163 
168  template< typename T >
169  T timeOffset() const;
177  template< typename T >
178  Mesh& setTimeOffset(T timeOffset);
179 
180 private:
181  Mesh();
182 
183  void flush_impl(std::string const&) override;
184  void read() override;
185 }; // Mesh
186 
187 template< typename T >
188 inline std::vector< T >
190 { return readVectorFloatingpoint< T >("gridSpacing"); }
191 
192 template< typename T >
193 inline T
195 { return readFloatingpoint< T >("timeOffset"); }
196 
197 std::ostream&
198 operator<<(std::ostream&, openPMD::Mesh::Geometry const&);
199 
200 std::ostream&
201 operator<<(std::ostream&, openPMD::Mesh::DataOrder const&);
202 
203 } // openPMD
Geometry
Enumerated datatype for the geometry of the mesh.
Definition: Mesh.hpp:55
DataOrder
Enumerated datatype for the memory layout of N-dimensional data.
Definition: Mesh.hpp:65
std::string geometryParameters() const
Definition: Mesh.cpp:75
std::vector< double > gridGlobalOffset() const
Definition: Mesh.cpp:136
Logical compilation of data from one snapshot (e.g.
Definition: Iteration.hpp:38
Mesh & setGeometry(Geometry g)
Set the geometry of the mesh of the mesh record.
Definition: Mesh.cpp:54
Mesh & setDataOrder(DataOrder dor)
Set the memory layout of N-dimensional data.
Definition: Mesh.cpp:94
Mesh & setUnitDimension(std::map< UnitDimension, double > const &unitDimension)
Set the powers of the 7 base measures characterizing the record&#39;s unit in SI.
Definition: Mesh.cpp:162
Mesh & setGridUnitSI(double gridUnitSI)
Set the unit-conversion factor to multiply each value in Mesh::gridSpacing and Mesh::gridGlobalOffset...
Definition: Mesh.cpp:155
Mesh & setGridGlobalOffset(std::vector< double > const &gridGlobalOffset)
Set the start of the current domain of the simulation (position of the beginning of the first cell) i...
Definition: Mesh.cpp:142
DataOrder dataOrder() const
Definition: Mesh.cpp:88
T timeOffset() const
Definition: Mesh.hpp:194
Public definitions of openPMD-api.
Definition: Date.cpp:29
double gridUnitSI() const
Definition: Mesh.cpp:149
Definition: BaseRecord.hpp:36
std::vector< std::string > axisLabels() const
Definition: Mesh.cpp:103
Mesh & setAxisLabels(std::vector< std::string > const &axisLabels)
Set the ordering of the labels for the Mesh::geometry of the mesh.
Definition: Mesh.cpp:109
Mesh & setGridSpacing(std::vector< T > const &gridSpacing)
Set the spacing of the grid points along each dimension (in the units of the simulation).
Definition: Mesh.cpp:117
Container for N-dimensional, homogeneous Records.
Definition: Mesh.hpp:39
Geometry geometry() const
Definition: Mesh.cpp:43
Mesh & setTimeOffset(T timeOffset)
Set the offset between the time at which this record is defined and the Iteration::time attribute of ...
Definition: Mesh.cpp:176
Map-like container that enforces openPMD requirements and handles IO.
Definition: Container.hpp:70
std::vector< T > gridSpacing() const
Definition: Mesh.hpp:189
std::array< double, 7 > unitDimension() const
Return the physical dimension (quantity) of a record.
Definition: BaseRecord.hpp:249
Mesh & setGeometryParameters(std::string const &geometryParameters)
Set additional parameters for the geometry, separated by a.
Definition: Mesh.cpp:81