Mesh Format

HOPR HDF5 curved mesh format used by PyHOPE


The HOPR HDF5 mesh format is designed for fast, scalable, parallel I/O of high-order unstructured 3D meshes. Mesh data is organized in non-overlapping arrays and packaged per element to minimize synchronization. A space-filling curve or structured ordering enables simple domain decomposition.

The following spectral element solvers have (optional) support for meshes generated in PyHOPE.

Framework
Language
Equation System
Reference
FLEXI Fortran NSE Krais et al., 2021
ƎLEXI Fortran NSE/MRG Kopper et al., 2023
GALÆXI Fortran/C NSE Kurz et al., 2025
FLUXO Fortran NSE/MHD/Maxwell Rueda-Ramirez et al., 2017
HORSES3D Fortran NSE/Cahn-Hilliard Ferrer et al., 2023
PICLas Fortran Maxwell/Poisson Fasoulas et al., 2019

Equation Systems: NSE - Navier-Stokes, MRG - Maxey-Riley-Gatignol, MHD - Magnetohydrodynamics

Global Attributes

Attribute
Type
Description
Version REAL Mesh file format version
Ngeo INTEGER Polynomial degree of the curved element mapping
nElems INTEGER Total number of elements
nSides INTEGER Total number of sides (element faces)
nNodes INTEGER Total number of nodes
nUniqueSides INTEGER Total number of geometrically unique sides
nUniqueNodes INTEGER Total number of geometrically unique nodes
nBCs INTEGER Number of entries in the boundary-condition list
FEMconnect ON/OFF ON if FEM edge/vertex connectivity is present in the file

Data Arrays

Array
Type
Size
Description
ElemInfo INTEGER (1:6, 1:nElems) Per-element data containing element type, zone, and offsets into side and node arrays: (ElemType, Zone, offsetIndSIDE, lastIndSIDE, offsetIndNODE, lastIndNODE).
SideInfo INTEGER (1:6, 1:nSides) Per-side data stored contiguously per element range from ElemInfo. Fields: (SideType, GlobalSideID, nbElemID, 10*nbLocSide+Flip, BCID, [ElemID,locSideID]). Flip encodes side orientation; GlobalSideID<0 marks slave side.
NodeCoords REAL (1:3, 1:nNodes) Node coordinates, stored per element range from ElemInfo. High-order nodes included.
GlobalNodeIDs INTEGER (1:nNodes) Globally unique node IDs aligned with NodeCoords
BCNames STRING (1:nBCs) List of user-defined boundary-condition names
BCType INTEGER (1:4, 1:nBCs) Four-integer code per boundary condition; see boundary conditions below

Element Definitions

Elements are defined using non-unique node IDs stored in ElemInfo and NodeCoords. Each element has a type code and a zone ID. The zone ID can be used to group elements into physical zones or blocks.

Element Types

The element encoding follows CGNS-inspired conventions. The last digit of the surface type corresponds to corner count; 3D element codes distinguish linear, bilinear, and non-linear variants.

Element Type Index Element Type Index Element Type Index
Tetrahedron, linear 104 Tetrahedron, bilinear 114 Tetrahedron, curved 204
Pyramid, linear 105 Pyramid, bilinear 115 Pyramid, curved 205
Prism/wedge, linear 106 Prism/wedge, bilinear 116 Prism/wedge, curved 206
Hexahedron, linear 108 Hexahedron, bilinear 118 Hexahedron, curved 208

High-Order Nodes

High-order nodes are stored in tensor-product style using (i,j,k) with uniform spacing in reference space \([-1, 1]^3\). Note that for NGeo=1, this node ordering differs from CGNS corner ordering for pyramids and hexahedra as the nodes 3/4 and 7/8 are swapped. The number of nodes per element depends on NGeo and element type.

Tetrahedron:
\((Ngeo+1)(Ngeo+2)(Ngeo+3)/6\)
Pyramid:
\((Ngeo+1)(Ngeo+2)(2Ngeo+3)/6\)
Prism/Wedge:
\((Ngeo+1)^2(Ngeo+2)/2\)
Hexahedron:
\((Ngeo+1)^3\)

Boundary Conditions

BCNames and BCType define the available boundary conditions. BCID in SideInfo references a 1-based index into these arrays and uses 0 for interior sides. BCType = (BoundaryType, CurveIndex, StateIndex, PeriodicIndex) contains four integers per boundary condition:

BoundaryType:
Integer code for the BC kind. Reserved values: 1 = periodic; 100 = inner/analyze sides. Periodic and inner sides also have neighbor links defined.
CurveIndex:
Geometry/CAD tag to distinguish BCs or trigger curving behavior. Currently unused in PyHOPE.
BoundaryState:
User-defined index for solver reference states; not interpreted by the format.
PeriodicIndex:
Used only for periodic sides; two matching BCs must share the same absolute value, with opposite signs.

FEM Connectivity

PyHOPE can optionally store additional connectivity information required by Finite Element Method (FEM)-based solvers. This includes topological connectivity of edges and vertices, as well as their connections across elements. This information is included when the global attribute FEMconnect is set to ON.

Global Attributes

Attribute
Type
Description
nEdges INTEGER Total number of entries in EdgeInfo
nVertices INTEGER Total number of entries in VertexInfo
nUniqueEdges INTEGER Total number of geometrically unique edges
nFEMSides INTEGER Number of topologically (incl. periodicity) unique sides
nFEMEdges INTEGER Number of topologically unique edges
nFEMEdgeConnections INTEGER Size of EdgeConnectInfo
nFEMVertices INTEGER Number of topologically unique vertices
nFEMVertexConnections INTEGER Size of VertexConnectInfo

Data Arrays

Array
Type
Size
Description
FEMElemInfo INTEGER (1:4, 1:nElems) Per-element offsets into EdgeInfo and VertexInfo: (offsetIndEDGE, lastIndEDGE, offsetIndVERTEX, lastIndVERTEX).
EdgeInfo INTEGER (1:3, 1:nEdges) For each local element edge (CGNS order): (±FEMEdgeID, offsetIndEDGEConnect, lastIndEDGEConnect). Sign encodes local-to-global orientation.
EdgeConnectInfo INTEGER (1:2, 1:nFEMEdgeConns) Edge connections: (±nbElemID, ±nbLocEdgeID). Sign on nbElemID encodes primary/replica; sign on nbLocEdgeID encodes orientation.
VertexInfo INTEGER (1:3, 1:nVertices) For each local vertex (CGNS corner order): (FEMVertexID, offsetIndVERTEXConnect, lastIndVERTEXConnect).
VertexConnectInfo INTEGER (1:2, 1:nFEMVertexConns) Vertex connections: (±nbElemID, nbLocVertexID). Sign encodes primary/replica.