LBPM/IO/Xdmf.h
2021-09-13 11:51:21 -04:00

132 lines
4.7 KiB
C++

#include "IO/HDF5_IO.h"
#include "common/Array.h"
#include "common/MPI.h"
#include "common/Utilities.h"
#include <map>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
// Helper class to write/read XDMF files
class Xdmf
{
public:
enum class TopologyType {
Null = 0,
Polyvertex,
Polyline,
Polygon,
Triangle,
Quadrilateral,
Tetrahedron,
Pyramid,
Wedge,
Hexahedron,
Edge_3,
Triangle_6,
Quadrilateral_8,
Tetrahedron_10,
Pyramid_13,
Wedge_15,
Hexahedron_20,
Mixed,
CurvilinearMesh2D,
CurvilinearMesh3D,
RectangularMesh2D,
RectangularMesh3D,
UniformMesh2D,
UniformMesh3D,
};
enum class DataType { Null = 0, Char, Int32, Int64, Uint32, Uint64, Float, Double };
enum class RankType { Null = 0, Scalar, Vector, Tensor, Tensor6, Matrix, GlobalID };
enum class Center { Null = 0, Node, Edge, Face, Cell, Grid, Other };
struct VarData {
std::string name; // Variable name
ArraySize size; // Size of variable
RankType rankType; // Rank order of data
Center center; // Variable centering
std::string data; // Variable data
};
struct MeshData {
std::string name; // Name of mesh
TopologyType type; // Type of mesh
ArraySize size; // Size of mesh (meaning depends on mesh type)
double range[6]; // Range of the mesh (only used for UniformMesh2D/UniformMesh3D)
std::string x; // x coordinates (or xy/xyz coordinates)
std::string y; // y coordinates
std::string z; // z coordinates
std::string dofMap; // mesh connectivity
std::vector<VarData> vars; // Variables
MeshData() : type( TopologyType::Null ), range{ 0 } {}
//! Add a variable
void addVariable( const std::string &meshName, const std::string &varName,
ArraySize varSize, RankType rank, Center center, const std::string &varData );
};
public:
//! Add a Point mesh
static MeshData createPointMesh( const std::string &name, uint8_t NDIM, size_t N,
const std::string &x, const std::string &y = "", const std::string &z = "" );
/*!
* @brief Add a uniform mesh
* @details This function adds a uniform rectangular mesh
* @param[in] name The name of the mesh
* @param[in] range The range of the mesh [ x_min, x_max, y_min, y_max, z_min, z_max ]
* @param[in] size The number of cells in the mesh
*/
static MeshData createUniformMesh(
const std::string &name, const std::vector<double> &range, ArraySize size );
/*!
* @brief Add a Curvilinear mesh
* @details This function adds a curvilinear mesh
* @param[in] name The name of the mesh
* @param[in] size The number of cells in the mesh
* @param[in] x The x coordinates or the xy/xyz coordinates
* @param[in] y The y coordinates (may be null)
* @param[in] z The z coordinates (may be null)
*/
static MeshData createCurvilinearMesh( const std::string &name, ArraySize size,
const std::string &x, const std::string &y, const std::string &z = "" );
/*!
* @brief Add an unstructured mesh
* @details This function adds an unstructerd mesh to the class to write.
* The mesh may be one of several unsupported unstructured mesh types.
* This function does not support mixed elements.
* @param[in] name The name of the mesh
* @param[in] NDIM The number of physical dimensions
* @param[in] type The element type
* @param[in] NumElements The number of elements
* @param[in] dofMap The connectivity information (type x NumElements)
* @param[in] NumNodes The number of nodes
* @param[in] x The x coordinates or the xy/xyz coordinates
* @param[in] y The y coordinates (may be null)
* @param[in] z The z coordinates (may be null)
*/
static MeshData createUnstructuredMesh( const std::string &name, uint8_t NDIM,
TopologyType type, size_t NumElements, const std::string &dofMap, size_t NumNodes,
const std::string &x, const std::string &y = "", const std::string &z = "" );
public:
//! Add a sub-domain
void addMesh( const std::string &meshName, const MeshData &domain );
//! Gather all data to rank 0
void gather( const Utilities::MPI &comm );
//! Write the xml file
void write( const std::string &filename ) const;
private:
std::map<std::string, std::vector<MeshData>> d_meshData;
};