MDAL
mdal_xdmf.hpp
1 /*
2  MDAL - Mesh Data Abstraction Library (MIT License)
3  Copyright (C) 2019 Peter Petrik (zilolv at gmail dot com)
4 */
5 
6 #ifndef MDAL_XDMF_HPP
7 #define MDAL_XDMF_HPP
8 
9 #include <string>
10 #include <vector>
11 #include <memory>
12 #include <iosfwd>
13 #include <iostream>
14 #include <fstream>
15 #include <utility>
16 
17 #include "mdal_data_model.hpp"
18 #include "mdal.h"
19 #include "mdal_hdf5.hpp"
20 #include "mdal_driver.hpp"
21 #include "mdal_xml.hpp"
22 
23 namespace MDAL
24 {
25 
35  struct HyperSlab
36  {
37  size_t startX = 0; // offset X
38  size_t startY = 0; // offset Y
39  size_t count = 0; // number of cells/vertices
40  bool countInFirstColumn = true;
41  bool isScalar;
42  };
43 
58  class XdmfDataset: public Dataset2D
59  {
60  public:
62  const HyperSlab &slab,
63  const HdfDataset &valuesDs,
65  );
66  ~XdmfDataset() override;
67 
68  size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
69  size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
70 
71  private:
72  std::vector<hsize_t> offsets( size_t indexStart );
73  std::vector<hsize_t> selections( size_t copyValues );
74 
75  HdfDataset mHdf5DatasetValues;
76  HyperSlab mHyperSlab;
77  };
78 
102  {
103  public:
105  {
106  Join = 1,
109  };
110 
112  FunctionType type,
113  const RelativeTimestamp &time
114  );
115  ~XdmfFunctionDataset() override;
116 
118  void addReferenceDataset( const HyperSlab &slab, const HdfDataset &hdfDataset, const RelativeTimestamp &time );
120  void swap();
121 
122  size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
123  size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
124 
125  private:
126  size_t subtractFunction( size_t indexStart, size_t count, double *buffer );
127  size_t flowFunction( size_t indexStart, size_t count, double *buffer );
128  size_t joinFunction( size_t indexStart, size_t count, double *buffer );
129  size_t extractRawData( size_t indexStart, size_t count, size_t nDatasets, std::vector<double> &buf );
130 
131  const FunctionType mType;
132  std::vector<std::shared_ptr<XdmfDataset>> mReferenceDatasets;
138  DatasetGroup mBaseReferenceGroup;
139  };
140 
141  class DriverXdmf: public Driver
142  {
143  public:
155  DriverXdmf();
156  ~DriverXdmf( ) override;
157  DriverXdmf *create() override;
158 
159  bool canReadDatasets( const std::string &uri ) override;
160  void load( const std::string &datFile, Mesh *mesh ) override;
161 
162  private:
183  DatasetGroups parseXdmfXml( );
184 
186  std::shared_ptr<MDAL::DatasetGroup> findGroup( std::map< std::string, std::shared_ptr<MDAL::DatasetGroup> > &groups,
187  const std::string &groupName,
188  bool isScalar );
189 
198  std::pair<HdfDataset, HyperSlab > parseXdmfDataset( const XMLFile &xmfFile, xmlNodePtr itemNod );
199 
201  HyperSlab parseHyperSlab( const std::string &str, size_t dimB );
202 
210  HyperSlab parseHyperSlabNode( const XMLFile &xmfFile, xmlNodePtr node );
211 
216  HdfDataset parseHdf5Node( const XMLFile &xmfFile, xmlNodePtr node );
217 
219  void hdf5NamePath( const std::string &dataItemPath, std::string &filePath, std::string &hdf5Path );
220 
222  std::vector<size_t> parseDimensions2D( const std::string &data );
223 
224  MDAL::Mesh *mMesh = nullptr;
225  std::string mDatFile;
226  std::map< std::string, std::shared_ptr<HdfFile> > mHdfFiles;
227 
228  };
229 
230 } // namespace MDAL
231 #endif //MDAL_XDMF_HPP
Definition: mdal_hdf5.hpp:192
Definition: mdal_data_model.hpp:97
Definition: mdal_data_model.hpp:137
Definition: mdal_xdmf.hpp:142
DriverXdmf()
Driver for XDMF Files.
Definition: mdal_xdmf.cpp:592
Definition: mdal_driver.hpp:28
Definition: mdal_data_model.hpp:238
Definition: mdal_datetime.hpp:18
The XdmfDataset is simple vector or scalar dataset where values are stored in one HD5 variable and ar...
Definition: mdal_xdmf.hpp:59
size_t vectorData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_xdmf.cpp:83
size_t scalarData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_xdmf.cpp:61
The XdmfFunctionDataset is a function that references two or three scalar XdmfDatasets to create a ve...
Definition: mdal_xdmf.hpp:102
void swap()
Swaps first and second reference dataset.
Definition: mdal_xdmf.cpp:143
void addReferenceDataset(const HyperSlab &slab, const HdfDataset &hdfDataset, const RelativeTimestamp &time)
Adds reference XMDF dataset.
Definition: mdal_xdmf.cpp:129
size_t scalarData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_xdmf.cpp:150
FunctionType
Definition: mdal_xdmf.hpp:105
@ Subtract
scalar: $1 - $0, e.g. calculate relative depth
Definition: mdal_xdmf.hpp:107
@ Flow
scalar: flow velocity (abs) = sqrt($0/($2-$3)*$0/($2-$3) + $1/($2-$3)*$1/($2-$3))
Definition: mdal_xdmf.hpp:108
@ Join
vector: [$0, $1] from 2 scalars
Definition: mdal_xdmf.hpp:106
size_t vectorData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_xdmf.cpp:164
C++ Wrapper around libxml2 library.
Definition: mdal_xml.hpp:17
The XdmfDataset reads the data directly from HDF5 file by usage of hyperslabs retrieval.
Definition: mdal_xdmf.hpp:36