IOSS  2.0
Ioad_DatabaseIO.h
Go to the documentation of this file.
1 // Copyright(C) 1999-2010 National Technology & Engineering Solutions
2 // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
3 // NTESS, the U.S. Government retains certain rights in this software.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //
12 // * Redistributions in binary form must reproduce the above
13 // copyright notice, this list of conditions and the following
14 // disclaimer in the documentation and/or other materials provided
15 // with the distribution.
16 //
17 // * Neither the name of NTESS nor the names of its
18 // contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 
33 #ifndef IOSS_Ioad_DatabaseIO_h
34 #define IOSS_Ioad_DatabaseIO_h
35 
36 #include "Ioss_EntitySet.h"
37 #include "Ioss_Region.h" // for Region, SideSetContainer, etc
38 #include "Ioss_SideSet.h" // for SideBlockContainer, SideSet
39 #include <Ioss_DBUsage.h>
40 #include <Ioss_DatabaseIO.h>
41 
42 #include "Ioss_Field.h" // for Field, etc
43 #include <AdiosWrapper.h>
44 
45 namespace Ioss {
46  class GroupingEntity;
47  class Region;
48  class EntityBlock;
49  class NodeBlock;
50  class SideBlock;
51  class ElementBlock;
52  class NodeSet;
53  class SideSet;
54  class CommSet;
55 } // namespace Ioss
56 
57 /** \brief A namespace for the adios database format.
58  */
59 namespace Ioad {
60 
62  {
63  public:
64  DatabaseIO(Ioss::Region *region, const std::string &filename, Ioss::DatabaseUsage db_usage,
65  MPI_Comm communicator, const Ioss::PropertyManager &props);
66  ~DatabaseIO();
67  DatabaseIO(const DatabaseIO &from) = delete;
68  DatabaseIO &operator=(const DatabaseIO &from) = delete;
69 
70  bool begin__(Ioss::State state) override;
71  bool end__(Ioss::State state) override;
72 
73  unsigned entity_field_support() const override;
74  int int_byte_size_db() const override;
75 
76  private:
77  int64_t get_field_internal(const Ioss::Region *reg, const Ioss::Field &field, void *data,
78  size_t data_size) const override;
79  int64_t get_field_internal(const Ioss::NodeBlock *nb, const Ioss::Field &field, void *data,
80  size_t data_size) const override;
81  int64_t get_field_internal(const Ioss::EdgeBlock *eb, const Ioss::Field &field, void *data,
82  size_t data_size) const override;
83  int64_t get_field_internal(const Ioss::FaceBlock *fb, const Ioss::Field &field, void *data,
84  size_t data_size) const override;
85  int64_t get_field_internal(const Ioss::ElementBlock *eb, const Ioss::Field &field, void *data,
86  size_t data_size) const override;
87  int64_t get_field_internal(const Ioss::StructuredBlock *sb, const Ioss::Field &field,
88  void *data, size_t data_size) const override
89  {
90  return -1;
91  }
92  int64_t get_field_internal(const Ioss::SideBlock *sb, const Ioss::Field &field, void *data,
93  size_t data_size) const override;
94  int64_t get_field_internal(const Ioss::NodeSet *ns, const Ioss::Field &field, void *data,
95  size_t data_size) const override;
96  int64_t get_field_internal(const Ioss::EdgeSet *es, const Ioss::Field &field, void *data,
97  size_t data_size) const override;
98  int64_t get_field_internal(const Ioss::FaceSet *fs, const Ioss::Field &field, void *data,
99  size_t data_size) const override;
100  int64_t get_field_internal(const Ioss::ElementSet *es, const Ioss::Field &field, void *data,
101  size_t data_size) const override;
102  int64_t get_field_internal(const Ioss::SideSet *ss, const Ioss::Field &field, void *data,
103  size_t data_size) const override;
104  int64_t get_field_internal(const Ioss::CommSet *cs, const Ioss::Field &field, void *data,
105  size_t data_size) const override;
106 
107  int64_t get_field_internal_t(const Ioss::GroupingEntity *entity, const Ioss::Field &field,
108  void *data, size_t data_size) const;
109  template <typename T>
110  void get_data(void *data, const std::string &encoded_name,
111  bool use_step_selection = false) const;
112 
113  int64_t put_field_internal(const Ioss::Region *reg, const Ioss::Field &field, void *data,
114  size_t data_size) const override;
115  int64_t put_field_internal(const Ioss::NodeBlock *nb, const Ioss::Field &field, void *data,
116  size_t data_size) const override;
117  int64_t put_field_internal(const Ioss::EdgeBlock *eb, const Ioss::Field &field, void *data,
118  size_t data_size) const override;
119  int64_t put_field_internal(const Ioss::FaceBlock *fb, const Ioss::Field &field, void *data,
120  size_t data_size) const override;
121  int64_t put_field_internal(const Ioss::ElementBlock *eb, const Ioss::Field &field, void *data,
122  size_t data_size) const override;
123  int64_t put_field_internal(const Ioss::SideBlock *sb, const Ioss::Field &field, void *data,
124  size_t data_size) const override;
125  int64_t put_field_internal(const Ioss::NodeSet *ns, const Ioss::Field &field, void *data,
126  size_t data_size) const override;
127  int64_t put_field_internal(const Ioss::EdgeSet *es, const Ioss::Field &field, void *data,
128  size_t data_size) const override;
129  int64_t put_field_internal(const Ioss::FaceSet *fs, const Ioss::Field &field, void *data,
130  size_t data_size) const override;
131  int64_t put_field_internal(const Ioss::ElementSet *es, const Ioss::Field &field, void *data,
132  size_t data_size) const override;
133  int64_t put_field_internal(const Ioss::SideSet *ss, const Ioss::Field &field, void *data,
134  size_t data_size) const override;
135  int64_t put_field_internal(const Ioss::CommSet *cs, const Ioss::Field &field, void *data,
136  size_t data_size) const override;
137  int64_t put_field_internal(const Ioss::StructuredBlock *sb, const Ioss::Field &field,
138  void *data, size_t data_size) const override
139  {
140  return -1;
141  }
142  template <typename T>
143  int64_t put_field_internal_t(T entity, const Ioss::Field &field, void *data,
144  size_t data_size) const;
145  void define_model(Ioss::Field::RoleType *role = nullptr);
146  // Model definition that should not be re-defined when defining transient variables.
148  template <typename T> T get_attribute(const std::string &attribute_name);
149 
150  template <typename T> void put_data(void *data, const std::string &encoded_name) const;
151  template <typename T, typename = typename std::enable_if<
152  !std::is_base_of<Ioss::EntitySet, T>::value, T>::type>
153  void put_var_type(const Ioss::Field &field, const std::string &encoded_name,
154  bool transformed_field) const;
155  template <typename T>
156  void define_model_internal(const Ioss::Field &field, const std::string &encoded_name,
157  const std::string &entity_type, const std::string &field_name);
158  template <typename T>
159  void define_entity_internal(const T &entity_blocks, Ioss::Field::RoleType *role);
160 
161  int get_current_state() const;
162 
164  {
165  std::vector<size_t> steps;
166  adios2::Dims Count;
167  size_t global_size{0};
168  };
169 
171  {
172  // Information contained in block infos.
173  std::vector<size_t> steps;
175  size_t component_count = 0;
176  // Contained in metavariables
178  std::string variable_type;
180  std::string topology;
181  std::string parent_topology;
182  };
183 
184  template <typename T> BlockInfoType get_block_infos(const adios2::Variable<T> &var) const;
185 
186  template <typename T> FieldInfoType get_variable_infos(const std::string &var_name) const;
187  using GlobalMapType = std::map<std::string, std::pair<std::string, std::string>>;
188  using EntityMapType = std::map<std::string, GlobalMapType>;
189  using FieldsMapType = std::map<std::string, EntityMapType>;
190 
191  template <typename T>
192  std::string get_property_value(const FieldsMapType &properties_map,
193  const std::string &entity_type, const std::string &entity_name,
194  const std::string &property_name) const;
195 
196  template <typename T>
198  const std::string & entity_type,
199  const std::string & entity_name,
200  const std::string & var_name) const;
202  const std::string & entity_type,
203  const std::string & entity_name,
204  const std::string & var_name) const;
205 
206  template <typename T>
207  using IsIossEntityBlock =
208  typename std::enable_if<std::is_base_of<Ioss::EntityBlock, T>::value>::type;
209  template <typename T>
210  using IsNotIossEntityBlock =
211  typename std::enable_if<!std::is_base_of<Ioss::EntityBlock, T>::value>::type;
212 
213  template <typename T, typename = IsIossEntityBlock<T>>
214  void define_entity_meta_variables(const std::string &encoded_name);
215 
216  template <typename T, typename = IsNotIossEntityBlock<T>, typename = void>
217  void define_entity_meta_variables(const std::string &encoded_name);
218 
219  void define_field_meta_variables(const std::string &);
221  std::string encoded_coordinate_frame_name(Ioss::CoordinateFrame coordinate_frame);
222 
223  void put_meta_variables(const std::string &encoded_name, const Ioss::Field &field,
224  const std::string &entity_type, const std::string &field_name) const;
225  void write_meta_data();
226 
227  template <typename T>
228  void add_entity_property(Ioss::GroupingEntity *ge, const std::string &encoded_name,
229  const std::string &var_name);
230  void add_entity_properties(Ioss::GroupingEntity *ge, const FieldsMapType &properties_map,
231  std::string name = "");
232 
233  void write_properties(const Ioss::GroupingEntity *const entity,
234  const std::string & encoded_name);
235 
236  template <typename T> int64_t write_meta_data_container(const T &entity_blocks);
237  std::pair<int64_t, int64_t>
239 
240  template <typename T>
241  int64_t get_entities(const FieldsMapType &fields_map, const FieldsMapType &properties_map);
242  std::string get_optional_string_variable(const std::string &field_name,
243  const std::string &string_variable) const;
244 
245  void get_globals(const GlobalMapType &globals_map, const FieldsMapType &properties_map);
247  std::vector<std::string> &block_membership) const override;
248  void define_properties(const Ioss::GroupingEntity *entity_block,
249  const std::string & encoded_entity_name);
250 
251  void read_meta_data__() override;
253  void read_region(const FieldsMapType &fields_map);
254  void check_processor_info();
255  void check_model();
256 
257  int RankInit();
258  bool begin_state__(int state, double time) override;
259  bool end_state__(int state, double time) override;
260  unsigned long rank; // rank needs to be declared first to be initialized before adios_wrapper.
261  mutable AdiosWrapper adios_wrapper; // adios_wrapper needs to be declared before bpio
262  // and bp_engine to be initialized first.
264  int64_t edgeCount{0};
265  int64_t faceCount{0};
266  unsigned long number_proc;
269  };
270 } // namespace Ioad
271 #endif
void read_meta_data__() override
Definition: Ioad_DatabaseIO.C:1253
unsigned long rank
Definition: Ioad_DatabaseIO.h:260
std::string get_property_value(const FieldsMapType &properties_map, const std::string &entity_type, const std::string &entity_name, const std::string &property_name) const
Definition: Ioad_DatabaseIO.C:878
void define_entity_meta_variables(const std::string &encoded_name)
Definition: Ioad_DatabaseIO.C:374
std::map< std::string, std::pair< std::string, std::string > > GlobalMapType
Definition: Ioad_DatabaseIO.h:187
The main namespace for the Ioss library.
Definition: Ioad_DatabaseIO.C:66
std::vector< CoordinateFrame > CoordinateFrameContainer
Definition: Ioex_Utils.h:52
An input or output Database.
Definition: Ioss_DatabaseIO.h:82
AdiosWrapper adios_wrapper
Definition: Ioad_DatabaseIO.h:261
std::string topology
Definition: Ioad_DatabaseIO.h:180
unsigned long number_proc
Definition: Ioad_DatabaseIO.h:266
Ioss::Field::BasicType basic_type
Definition: Ioad_DatabaseIO.h:179
typename std::enable_if< std::is_base_of< Ioss::EntityBlock, T >::value >::type IsIossEntityBlock
Definition: Ioad_DatabaseIO.h:208
void define_properties(const Ioss::GroupingEntity *entity_block, const std::string &encoded_entity_name)
Definition: Ioad_DatabaseIO.C:412
~DatabaseIO()
Definition: Ioad_DatabaseIO.C:94
A collection of nodes.
Definition: Ioss_NodeSet.h:53
int64_t put_field_internal(const Ioss::StructuredBlock *sb, const Ioss::Field &field, void *data, size_t data_size) const override
Definition: Ioad_DatabaseIO.h:137
bool is_streaming
Definition: Ioad_DatabaseIO.h:267
A collection of element faces with the same topology.
Definition: Ioss_FaceBlock.h:53
A collection of element faces.
Definition: Ioss_FaceSet.h:54
Base class for all 'grouping' entities. The following derived classes are typical:
Definition: Ioss_GroupingEntity.h:93
RoleType
Definition: Ioss_Field.h:75
int64_t faceCount
Definition: Ioad_DatabaseIO.h:265
int64_t put_field_internal_t(T entity, const Ioss::Field &field, void *data, size_t data_size) const
Definition: Ioad_DatabaseIO.C:623
A collection of element edges.
Definition: Ioss_EdgeSet.h:54
int RankInit()
Definition: Ioad_DatabaseIO.C:87
std::map< std::string, GlobalMapType > EntityMapType
Definition: Ioad_DatabaseIO.h:188
Definition: AdiosWrapper.h:42
std::string encoded_coordinate_frame_name(Ioss::CoordinateFrame coordinate_frame)
Definition: Ioad_DatabaseIO.C:221
size_t global_size
Definition: Ioad_DatabaseIO.h:167
void add_entity_property(Ioss::GroupingEntity *ge, const std::string &encoded_name, const std::string &var_name)
Definition: Ioad_DatabaseIO.C:818
size_t node_boundaries_size
Definition: Ioad_DatabaseIO.h:174
void define_global_variables()
Definition: Ioad_DatabaseIO.C:575
A collection of element sides having the same topology.
Definition: Ioss_SideBlock.h:61
std::vector< size_t > steps
Definition: Ioad_DatabaseIO.h:165
std::string parent_topology
Definition: Ioad_DatabaseIO.h:181
FieldInfoType get_expected_variable_infos_from_map(const EntityMapType &fields_map, const std::string &entity_type, const std::string &entity_name, const std::string &var_name) const
Definition: Ioad_DatabaseIO.C:719
int64_t get_entities(const FieldsMapType &fields_map, const FieldsMapType &properties_map)
Definition: Ioad_DatabaseIO.C:1012
typename std::enable_if<!std::is_base_of< Ioss::EntityBlock, T >::value >::type IsNotIossEntityBlock
Definition: Ioad_DatabaseIO.h:211
int64_t get_field_internal_t(const Ioss::GroupingEntity *entity, const Ioss::Field &field, void *data, size_t data_size) const
Definition: Ioad_DatabaseIO.C:1537
State
Access states for a database.
Definition: Ioss_State.h:42
bool end_state__(int state, double time) override
Definition: Ioad_DatabaseIO.C:350
Definition: Ioad_DatabaseIO.h:170
std::vector< SideBlock * > SideBlockContainer
Definition: Ioss_SideSet.h:55
void define_model_internal(const Ioss::Field &field, const std::string &encoded_name, const std::string &entity_type, const std::string &field_name)
Definition: Ioad_DatabaseIO.C:393
DatabaseIO()=delete
bool begin__(Ioss::State state) override
Definition: Ioad_DatabaseIO.C:96
A collection of elements having the same topology.
Definition: Ioss_ElementBlock.h:48
std::string get_optional_string_variable(const std::string &field_name, const std::string &string_variable) const
Definition: Ioad_DatabaseIO.C:1108
bool begin_state__(int state, double time) override
Definition: Ioad_DatabaseIO.C:323
void check_model()
Definition: Ioad_DatabaseIO.C:277
A structured zone – i,j,k.
Definition: Ioss_StructuredBlock.h:103
A collection of elements.
Definition: Ioss_ElementSet.h:54
DatabaseUsage
Specifies how an Ioss::DatabaseIO object will be used.
Definition: Ioss_DBUsage.h:40
void define_model(Ioss::Field::RoleType *role=nullptr)
Definition: Ioad_DatabaseIO.C:518
int64_t get_field_internal(const Ioss::StructuredBlock *sb, const Ioss::Field &field, void *data, size_t data_size) const override
Definition: Ioad_DatabaseIO.h:87
unsigned entity_field_support() const override
Definition: Ioad_DatabaseIO.C:592
void define_entity_internal(const T &entity_blocks, Ioss::Field::RoleType *role)
Definition: Ioad_DatabaseIO.C:439
void put_data(void *data, const std::string &encoded_name) const
Definition: Ioad_DatabaseIO.C:605
T get_attribute(const std::string &attribute_name)
void get_data(void *data, const std::string &encoded_name, bool use_step_selection=false) const
Definition: Ioad_DatabaseIO.C:1592
void add_entity_properties(Ioss::GroupingEntity *ge, const FieldsMapType &properties_map, std::string name="")
Definition: Ioad_DatabaseIO.C:830
int64_t write_meta_data_container(const T &entity_blocks)
Definition: Ioad_DatabaseIO.C:143
void check_processor_info()
Definition: Ioad_DatabaseIO.C:1415
A namespace for the adios database format.
Definition: AdiosWrapper.C:37
A collection of all nodes in the region.
Definition: Ioss_NodeBlock.h:53
void write_meta_data()
Definition: Ioad_DatabaseIO.C:243
DatabaseIO & operator=(const DatabaseIO &from)=delete
std::vector< size_t > steps
Definition: Ioad_DatabaseIO.h:173
FieldInfoType get_variable_infos(const std::string &var_name) const
Definition: Ioad_DatabaseIO.C:1168
void define_field_meta_variables(const std::string &)
Definition: Ioad_DatabaseIO.C:367
void put_var_type(const Ioss::Field &field, const std::string &encoded_name, bool transformed_field) const
Definition: Ioss_CommSet.h:51
void read_region(const FieldsMapType &fields_map)
Definition: Ioad_DatabaseIO.C:1324
size_t component_count
Definition: Ioad_DatabaseIO.h:175
std::vector< char > data
Definition: cth_pressure_map.C:73
BlockInfoType get_block_infos(const adios2::Variable< T > &var) const
Definition: Ioad_DatabaseIO.C:1124
A grouping entity that contains other grouping entities.
Definition: Ioss_Region.h:98
int get_current_state() const
Definition: Ioad_DatabaseIO.C:1673
std::pair< int64_t, int64_t > write_meta_data_sideblockcontainer(const Ioss::SideBlockContainer &entity_blocks)
Definition: Ioad_DatabaseIO.C:172
double previous_time_streaming
Definition: Ioad_DatabaseIO.h:268
Ioss::Field::RoleType role
Definition: Ioad_DatabaseIO.h:177
bool end__(Ioss::State state) override
Definition: Ioad_DatabaseIO.C:288
BasicType
The basic data type held in the field.
Definition: Ioss_Field.h:52
std::string name(Ioss::GroupingEntity *entity)
Definition: io_info.C:87
A collection of element sides.
Definition: Ioss_SideSet.h:59
void compute_block_membership__(Ioss::SideBlock *efblock, std::vector< std::string > &block_membership) const override
Definition: Ioad_DatabaseIO.C:1628
void define_coordinate_frames_internal(const Ioss::CoordinateFrameContainer &coordinate_frames)
Definition: Ioad_DatabaseIO.C:506
Holds metadata for bulk data associated with a GroupingEntity.
Definition: Ioss_Field.h:47
int64_t edgeCount
Definition: Ioad_DatabaseIO.h:264
int MPI_Comm
Definition: Ioss_CodeTypes.h:88
void get_globals(const GlobalMapType &globals_map, const FieldsMapType &properties_map)
Definition: Ioad_DatabaseIO.C:1213
FieldInfoType get_variable_infos_from_map(const EntityMapType &fields_map, const std::string &entity_type, const std::string &entity_name, const std::string &var_name) const
Definition: Ioad_DatabaseIO.C:744
void write_properties(const Ioss::GroupingEntity *const entity, const std::string &encoded_name)
Definition: Ioad_DatabaseIO.C:113
std::map< std::string, EntityMapType > FieldsMapType
Definition: Ioad_DatabaseIO.h:189
Definition: Ioss_CoordinateFrame.h:42
std::string variable_type
Definition: Ioad_DatabaseIO.h:178
A collection of Ioss::Property objects.
Definition: Ioss_PropertyManager.h:49
Definition: Ioad_DatabaseIO.h:163
void put_meta_variables(const std::string &encoded_name, const Ioss::Field &field, const std::string &entity_type, const std::string &field_name) const
Definition: Ioad_DatabaseIO.C:611
entity_type
Definition: Iovs_DatabaseIO.C:81
A collection of element edges with the same topology.
Definition: Ioss_EdgeBlock.h:53
void read_communication_metadata()
Definition: Ioad_DatabaseIO.C:1370
Definition: Ioad_DatabaseIO.h:61
int int_byte_size_db() const override
Definition: Ioad_DatabaseIO.C:590
int64_t put_field_internal(const Ioss::Region *reg, const Ioss::Field &field, void *data, size_t data_size) const override
Definition: Ioad_DatabaseIO.C:583
int spatialDimension
Definition: Ioad_DatabaseIO.h:263
adios2::Dims Count
Definition: Ioad_DatabaseIO.h:166
int64_t get_field_internal(const Ioss::Region *reg, const Ioss::Field &field, void *data, size_t data_size) const override
Definition: Ioad_DatabaseIO.C:1446