51 OOFEM_ERROR(
"VTKHDF5Reader: HDF5 module not available, cannot read VTKHDF5 files");
79 this->file =
new H5::H5File(
fileName, H5F_ACC_RDONLY);
82 if ( !file->exists(
"/VTKHDF") ) {
85 this->topGroup =
new H5::Group(file->openGroup(
"/VTKHDF"));
87 H5::Attribute versionAttr = topGroup->openAttribute(
"Version");
89 versionAttr.read(versionAttr.getDataType(), &version);
92 H5::Attribute typeAttr = topGroup->openAttribute(
"Type");
94 typeAttr.read(typeAttr.getDataType(), type);
97 if (version[0] != 2 || version[1] != 2 || type !=
"UnstructuredGrid") {
98 OOFEM_ERROR(
"Unsupported version or type of VTKHDF5 file, version 2.2 and UnstructuredGrid type is required.");
102 this->stepsGroup =
new H5::Group(topGroup->openGroup(
"Steps"));
103 H5::Attribute nstepsattr = stepsGroup->openAttribute(
"NSteps");
104 nstepsattr.read(nstepsattr.getDataType(), &numSteps);
106 H5::DataSet values = stepsGroup->openDataSet(
"Values");
108 values.getSpace().getSimpleExtentDims(dim);
109 this->stepValues.resize(dim[0]);
110 values.read(this->stepValues.givePointer(), values.getDataType());
116 delete this->topGroup;
117 delete this->stepsGroup;
124void VTKHDF5Reader::readDataSet (H5::DataSet& dset,
int rank, hsize_t* dim, hsize_t* offset, H5::DataType type,
void* data)
126 H5::DataSpace dspace = dset.getSpace();
128 dspace.selectHyperslab( H5S_SELECT_SET, dim, offset );
129 H5::DataSpace mem_space(rank, dim,
nullptr);
130 dset.read(data, type, mem_space, dspace );
133void VTKHDF5Reader::getTimeStepOffsets(
TimeStep* tStep,
int& nParts,
int& pOffset,
int& pointOffset,
int& cellOffset,
int& connIdOffset,
int& offsetOfOffset,
int& nPoints,
int &nCells,
int& nconectivities) {
134 H5::IntType itype(H5::PredType::NATIVE_UINT);
135 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
139 double tt = tStep->giveTargetTime();
140 unsigned int indx = 0;
142 for (indx = 0; indx < stepValues.giveSize(); indx++) {
143 if (fabs(stepValues[indx] - tt) < 1.e-6) {
151 H5::DataSet npDSet = stepsGroup->openDataSet(
"NumberOfParts");
152 H5::DataSet poDSet = stepsGroup->openDataSet(
"PartOffsets");
153 H5::DataSet pointOffsetsDSet = stepsGroup->openDataSet(
"PointOffsets");
154 H5::DataSet cellOffsetsDSet = stepsGroup->openDataSet(
"CellOffsets");
155 H5::DataSet connIdOffsetsDSet = stepsGroup->openDataSet(
"ConnectivityIdOffsets");
156 H5::DataSet offsetsDSet = topGroup->openDataSet(
"Offsets" );
158 hsize_t offset[] = {indx};
159 hsize_t dims[1] = {1};
160 this->readDataSet(npDSet, 1, dims, offset, itype, &nParts);
161 this->readDataSet(poDSet, 1, dims, offset, itype, &pOffset);
163 this->readDataSet(pointOffsetsDSet, 1, dims, offset, itype, &pointOffset);
164 hsize_t dims11[] = {1,1};
165 hsize_t offset11[] = {indx,0};
166 this->readDataSet(cellOffsetsDSet, 2, dims11, offset11, itype, &cellOffset);
167 this->readDataSet(connIdOffsetsDSet, 2, dims11, offset11, itype, &connIdOffset);
171 H5::DataSet numberOfPointsDSet = topGroup->openDataSet(
"NumberOfPoints");
172 H5::DataSet numberOfCellsDSet = topGroup->openDataSet(
"NumberOfCells");
173 H5::DataSet numberOfConnectivityIds = topGroup->openDataSet(
"NumberOfConnectivityIds");
176 int stepCells[numSteps];
177 numberOfCellsDSet.read(stepCells, numberOfCellsDSet.getDataType());
180 for (
int i = 0; i < indx; i++) {
181 offsetOfOffset += stepCells[i]+1;
183 nCells = stepCells[indx];
185 this->readDataSet(numberOfPointsDSet, 1, dims, offset, itype, &nPoints);
187 this->readDataSet(numberOfConnectivityIds, 1, dims, offset, itype, &nconectivities);
191 OOFEM_ERROR(
"Matching time not found, time=%lf, step number %d", tt, tStep->giveNumber());
196VTKHDF5Reader::giveElementGeometryType(
int vtkCellType)
202 if ( vtkCellType == 1 ) {
204 }
else if ( vtkCellType == 3 ) {
206 }
else if ( vtkCellType == 21 ) {
208 }
else if ( vtkCellType == 5 ) {
209 elemGT = EGT_triangle_1;
210 }
else if ( vtkCellType == 22 ) {
211 elemGT = EGT_triangle_2;
212 }
else if ( vtkCellType == 10 ) {
213 elemGT = EGT_tetra_1;
214 }
else if ( vtkCellType == 24 ) {
215 elemGT = EGT_tetra_2;
216 }
else if ( vtkCellType == 9 ) {
218 }
else if ( vtkCellType == 30 ) {
219 elemGT = EGT_quad_21_interface;
220 }
else if ( vtkCellType == 23 ) {
222 }
else if ( vtkCellType == 12 ) {
224 }
else if ( vtkCellType == 25 ) {
226 }
else if ( vtkCellType == 29 ) {
227 elemGT = EGT_hexa_27;
228 }
else if ( vtkCellType == 13 ) {
229 elemGT = EGT_wedge_1;
230 }
else if ( vtkCellType == 26 ) {
231 elemGT = EGT_wedge_2;
233 OOFEM_ERROR(
"unsupported vtk cell type %d", vtkCellType);
240 int nParts, pOffset, pointOffset, cellOffset, connIdOffset, offsetOfOffset, nPoints, nCells, nconectivities;
241 this->getTimeStepOffsets (tStep, nParts, pOffset, pointOffset, cellOffset, connIdOffset, offsetOfOffset, nPoints, nCells, nconectivities);
242 H5::IntType itype(H5::PredType::NATIVE_UINT);
243 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
244 H5::DataSet pointsDSet = topGroup->openDataSet(
"Points" );
245 H5::DataSet typesDSet = topGroup->openDataSet(
"Types" );
246 H5::DataSet connectivityDSet = topGroup->openDataSet(
"Connectivity" );
247 H5::DataSet offsetsDSet = topGroup->openDataSet(
"Offsets" );
250 hsize_t dim2[]={nPoints,3};
251 hsize_t offset2[] = {pointOffset, 0};
252 double *points =
new double[dim2[0]*3];
253 this->readDataSet(pointsDSet, 2, dim2, offset2, dtype, points);
256 hsize_t dim1[1]={nCells};
257 hsize_t offset1[] = {cellOffset};
258 unsigned int *types =
new unsigned int[dim1[0]];
259 this->readDataSet(typesDSet, 1, dim1, offset1, itype, types);
262 dim1[0]=nconectivities;
263 offset1[0] = connIdOffset;
264 unsigned int *connectivity =
new unsigned int[dim1[0]];
265 this->readDataSet(connectivityDSet, 1, dim1, offset1, itype, connectivity);
269 offset1[0] = offsetOfOffset;
270 unsigned int *offsets =
new unsigned int[dim1[0]];
271 this->readDataSet(offsetsDSet, 1, dim1, offset1, itype, offsets);
274 f.initialize(nPoints, nCells);
276 for (
int i = 0; i < nPoints; i++) {
277 FloatArray coords(3);
278 coords.at(1) = points[i*3];
279 coords.at(2) = points[i*3+1];
280 coords.at(3) = points[i*3+2];
281 f.addVertex(i+1, coords);
285 for (
int i = 0; i < nCells; i++) {
287 int nNodes = offsets[i+1] - offsets[i];
288 IntArray nodes(nNodes);
289 for (
int j = 0; j < nNodes; j++) {
290 nodes[j] = connectivity[offsets[i]+j]+1;
292 f.addCell(i+1, this->giveElementGeometryType(type), nodes) ;
305 int nParts, pOffset, pointOffset, cellOffset, connIdOffset, offsetOfOffset, nPoints, nCells, nconectivities;
306 this->getTimeStepOffsets (tStep, nParts, pOffset, pointOffset, cellOffset, connIdOffset, offsetOfOffset, nPoints, nCells, nconectivities);
308 H5::Group* pointDataGroup =
new H5::Group(topGroup->openGroup(
"PointData"));
310 if (pointDataGroup->nameExists(field_name.c_str())) {
311 H5::DataSet dSet = pointDataGroup->openDataSet(field_name.c_str());
312 int nPoints = field.giveNumberOfVertices();
314 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
316 dSet.getSpace().getSimpleExtentDims(dim);
318 double *fieldData =
new double[nPoints*dim[1]];
319 hsize_t offset2[] = {pointOffset, 0};
320 this->readDataSet(dSet, 2, dim, offset2, dtype, fieldData);
322 FloatArray valueArray((
int)dim[1]);
323 for (
unsigned int inode = 0; inode < nPoints; inode++ ) {
324 for (
unsigned int i=0; i<dim[1]; i++) {
325 valueArray(i) = fieldData[(inode)*dim[1]+i];
327 field.setVertexValue(inode+1, valueArray);
332 OOFEM_ERROR(
"Field %s not found in VTKHDF5 file", field_name.c_str());
334 delete pointDataGroup;
std::string fileName
File name.
void initialize(std::string &fileName)
VTKHDF5Reader()
Constructor. Creates empty Output Manager. By default all components are selected.
virtual ~VTKHDF5Reader()
Destructor.
void readMesh(UnstructuredGridField &, TimeStep *tStep)
void readField(UnstructuredGridField &, TimeStep *tStep, const std::string &field_name)