65 #include <vtkPoints.h>
66 #include <vtkPointData.h>
67 #include <vtkDoubleArray.h>
68 #include <vtkCellArray.h>
69 #include <vtkCellData.h>
70 #include <vtkHDF5UnstructuredGridWriter.h>
71 #include <vtkHDF5PUnstructuredGridWriter.h>
72 #include <vtkUnstructuredGrid.h>
73 #include <vtkSmartPointer.h>
119 sprintf( fext,
".m%d.hdf", this->
number);
120 this->fileName = this->
emodel->giveOutputBaseFileName() + fext;
126 H5::IntType itype(H5::PredType::NATIVE_INT);
127 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
129 this->file =
new H5::H5File (this->fileName, H5F_ACC_TRUNC);
133 this->topGroup =
new H5::Group (file->createGroup(
"/VTKHDF"));
134 this->pointDataGroup =
new H5::Group(topGroup->createGroup(
"PointData"));
135 this->cellDataGroup =
new H5::Group(topGroup->createGroup(
"CellData"));
139 H5::DataSpace attrSpace(1, dims);
140 H5::Attribute va = topGroup->createAttribute(
"Version", itype, attrSpace);
141 va.write(itype, version);
144 H5::StrType str_type(H5::PredType::C_S1, 16);
145 str_type.setCset(H5T_CSET_ASCII);
146 H5::DataSpace attrSpace1(H5S_SCALAR);
148 H5::Attribute att = topGroup->createAttribute(
"Type", str_type, attrSpace1 );
149 att.write( str_type, std::string(
"UnstructuredGrid"));
153 hsize_t maxdim1[]={H5S_UNLIMITED};
154 H5::DataSpace ds1(1, dim1, maxdim1);
155 H5::DSetCreatPropList plist1;
156 plist1.setLayout(H5D_CHUNKED);
157 hsize_t chunk_dims1[] = {1000};
158 plist1.setChunk(1, chunk_dims1);
159 H5::DataSet NumberOfConnectivityIds = topGroup->createDataSet(
"NumberOfConnectivityIds", itype, ds1, plist1 );
160 H5::DataSet numberOfPointsDSet = topGroup->createDataSet(
"NumberOfPoints", itype, ds1, plist1 );
161 H5::DataSet numberOfCellsDSet = topGroup->createDataSet(
"NumberOfCells", itype, ds1, plist1 );
163 hsize_t dim4[]={1,3};
164 hsize_t maxdim4[]={H5S_UNLIMITED,3};
165 H5::DataSpace pointsDSpace(2, dim4, maxdim4);
167 H5::DSetCreatPropList plist;
168 plist.setLayout(H5D_CHUNKED);
169 hsize_t chunk_dims2[2] = {1000, 3};
170 plist.setChunk(2, chunk_dims2);
171 H5::DataSet pointsDSet = topGroup->createDataSet(
"Points", dtype, pointsDSpace, plist );
173 H5::DataType ttype(H5::PredType::STD_U8LE);
174 H5::DataSet typesDSet = topGroup->createDataSet(
"Types", ttype, ds1, plist1 );
175 H5::DataSet connectivityDSet = topGroup->createDataSet(
"Connectivity", itype, ds1, plist1 );
176 H5::DataSet offsetsDSet = topGroup->createDataSet(
"Offsets", itype, ds1, plist1 );
181 this->stepsGroup =
new H5::Group(topGroup->createGroup(
"Steps"));
182 H5::DataSpace ads(H5S_SCALAR);
183 H5::Attribute nsa = this->stepsGroup->createAttribute(
"NSteps", itype, ads);
185 nsa.write(itype, &nsteps);
188 hsize_t maxdim[]={H5S_UNLIMITED};
189 H5::DataSpace stepDSpace(1, dim, maxdim);
191 plist1.setLayout(H5D_CHUNKED);
192 hsize_t chunk_dims3[1] = {10};
193 plist1.setChunk(1, chunk_dims3);
195 H5::DataSet valuesDSet = this->stepsGroup->createDataSet(
"Values", dtype, stepDSpace, plist1 );
197 H5::DataSet poDSet = this->stepsGroup->createDataSet(
"PartOffsets", itype, stepDSpace, plist1 );
198 H5::DataSet npDSet = this->stepsGroup->createDataSet(
"NumberOfParts", itype, stepDSpace, plist1 );
200 H5::DataSet pointOffsetsDSet = this->stepsGroup->createDataSet(
"PointOffsets", itype, stepDSpace, plist1 );
202 hsize_t dim2[]={1,1};
203 hsize_t maxdim2[]={H5S_UNLIMITED,1};
204 H5::DataSpace ds2(2, dim2, maxdim2);
205 H5::DSetCreatPropList plist2;
206 plist2.setLayout(H5D_CHUNKED);
207 hsize_t chunk_dims4[2] = {10,1};
208 plist2.setChunk(2, chunk_dims4);
209 H5::DataSet cellOffsetsDSet = this->stepsGroup->createDataSet(
"CellOffsets", itype, ds2, plist2);
211 H5::DataSet connIdOffsetsDSet = this->stepsGroup->createDataSet(
"ConnectivityIdOffsets", itype, ds2, plist2);
214 this->pointCounter = 0;
217 this->offsetCounter=0;
219}
catch ( H5::Exception& error) {
220 error.getDetailMsg();
235 delete pointDataGroup;
236 delete cellDataGroup;
251 this->nodes = vtkSmartPointer< vtkPoints >::New();
252 this->elemNodeArray = vtkSmartPointer< vtkIdList >::New();
257 H5::IntType itype(H5::PredType::NATIVE_UINT);
258 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
262 H5::Attribute nstepsattr = stepsGroup->openAttribute(
"NSteps");
264 nstepsattr.read(itype, &steps);
266 nstepsattr.write(itype, &steps);
269 hsize_t ssize[] = {steps};
270 H5::DataSet values = stepsGroup->openDataSet(
"Values");
271 values.extend( ssize );
273 hsize_t offset[] = {steps-1};
274 hsize_t dims[1] = {1};
276 this->updateDataSet(values, 1, dims, offset, dtype, &t);
279 H5::DataSet pods = stepsGroup->openDataSet(
"PointOffsets");
280 pods.extend( ssize );
281 this->updateDataSet(pods, 1, dims, offset, itype, &this->pointCounter);
284 hsize_t ssize11[] = {steps,1};
285 H5::DataSet codset = stepsGroup->openDataSet(
"CellOffsets");
286 codset.extend(ssize11);
288 hsize_t offset11[] = {steps-1,0};
289 hsize_t dims11[] = {1,1};
290 int tempdata11[1][1]={(int)this->cellCounter};
291 this->updateDataSet(codset, 2, dims11, offset11, itype, tempdata11);
294 H5::DataSet cidset = stepsGroup->openDataSet(
"ConnectivityIdOffsets");
295 cidset.extend(ssize11);
296 this->updateDataSet(cidset, 2, dims11, offset11, itype, &this->connCounter);
299 H5::DataSet npset = stepsGroup->openDataSet(
"NumberOfParts");
302 this->updateDataSet(npset, 1, dims, offset, itype, &tval);
303 H5::DataSet poset = stepsGroup->openDataSet(
"PartOffsets");
306 this->updateDataSet(poset, 1, dims, offset, itype, &tval);
310 H5::DataSet pointsDSet = topGroup->openDataSet(
"Points" );
311 H5::DataSet typesDSet = topGroup->openDataSet(
"Types" );
312 H5::DataSet connectivityDSet = topGroup->openDataSet(
"Connectivity" );
313 H5::DataSet offsetsDSet = topGroup->openDataSet(
"Offsets" );
317 int anyPieceNonEmpty = 0;
321 unsigned int stepPointCounter = 0, stepCellCounter = 0, stepConnCounter = 0;
323 for (
int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
327 this->writeVTKPieceProlog(this->
defaultVTKPiece, tStep, pointCounter, cellCounter, connCounter, offsetCounter,
328 stepPointCounter, stepCellCounter, stepConnCounter,
329 pointsDSet, connectivityDSet, offsetsDSet, typesDSet);
333 anyPieceNonEmpty += this->writeVTKPieceVariables(this->
defaultVTKPiece, tStep);
339 this->pointCounter += stepPointCounter;
340 this->cellCounter += stepCellCounter;
341 this->connCounter += stepConnCounter;
342 this->offsetCounter += (stepCellCounter+1);
345 H5::DataSet numberOfPointsDSet = topGroup->openDataSet(
"NumberOfPoints");
346 H5::DataSet numberOfCellsDSet = topGroup->openDataSet(
"NumberOfCells");
347 H5::DataSet NumberOfConnectivityIds = topGroup->openDataSet(
"NumberOfConnectivityIds");
349 numberOfPointsDSet.extend(ssize);
350 numberOfCellsDSet.extend(ssize);
351 NumberOfConnectivityIds.extend(ssize);
353 this->updateDataSet(numberOfPointsDSet, 1, dims, offset, itype, &stepPointCounter);
354 this->updateDataSet(numberOfCellsDSet, 1, dims, offset, itype, &stepCellCounter);
355 this->updateDataSet(NumberOfConnectivityIds, 1, dims, offset, itype, &stepConnCounter);
363 for (
int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
388VTKHDF5ExportModule::writeVTKPieceProlog(
ExportRegion &vtkPiece,
TimeStep *tStep,
unsigned int &pointCounter,
unsigned int &cellCounter,
unsigned int &connCounter,
unsigned int& offsetCounter,
389 unsigned int& stepPointCounter,
unsigned int& stepCellCounter,
unsigned int& stepConnCounter,
390 H5::DataSet &pointsDSet, H5::DataSet &connectivityDSet, H5::DataSet &offsetDSet, H5::DataSet &typeDSet)
401 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
402 H5::IntType itype(H5::PredType::NATIVE_INT);
403 H5::DataType ttype(H5::PredType::NATIVE_UINT);
409 double *points =
new double[numNodes*3];
411 for (
unsigned int inode = 1; inode <= numNodes; inode++ ) {
414 for (
int i = 0; i < coords.
giveSize(); i++ ) {
415 points[(inode-1)*3+i] = coords[i];
417 for (
int i = coords.
giveSize() ; i < 3; i++ ) {
418 points[(inode-1)*3+i] = 0.0;
425 hsize_t psize[] = {pointCounter+numNodes, 3};
426 pointsDSet.extend( psize );
428 hsize_t offset[] = {pointCounter, 0};
429 hsize_t dims1[] = { numNodes, 3};
430 this->updateDataSet(pointsDSet, 2, dims1, offset, dtype, points);
439 unsigned int connectivitySize=0;
440 for (
unsigned int ielem = 1; ielem <= numEl; ielem++ ) {
443 IntArray conn(connectivitySize);
444 IntArray offsets(numEl+1);
445 unsigned int * types =
new unsigned int [numEl];
449 for (
unsigned int ielem = 1; ielem <= numEl; ielem++ ) {
453 for (
int i = 0; i < cellNodes.giveSize(); i++ ) {
454 conn[cp++]=cellNodes[i]-1;
458 H5::DataSpace cspace = connectivityDSet.getSpace();
459 H5::DataSpace ospace = offsetDSet.getSpace();
460 H5::DataSpace tspace = typeDSet.getSpace();
462 hsize_t csize[] = {connectivitySize+connCounter};
463 connectivityDSet.extend( csize );
464 hsize_t cellsize[] = {numEl+cellCounter};
465 hsize_t cellsize1[] = {numEl+offsetCounter+1};
466 offsetDSet.extend( cellsize1 );
467 typeDSet.extend(cellsize);
470 hsize_t coffset[] = {connCounter};
471 hsize_t cdims[] = {connectivitySize };
472 this->updateDataSet(connectivityDSet, 1, cdims, coffset, itype, conn.givePointer());
477 hsize_t celloffset[] = {cellCounter};
478 hsize_t offsetOffset[] = {offsetCounter};
479 hsize_t celldims[] = {numEl };
480 hsize_t celldims1[] = {numEl+1};
481 this->updateDataSet(offsetDSet, 1, celldims1, offsetOffset, itype, offsets.givePointer());
482 this->updateDataSet(typeDSet, 1, celldims, celloffset, ttype, types);
486 stepPointCounter+=numNodes;
487 stepCellCounter = numEl;
488 stepConnCounter = connectivitySize;
495VTKHDF5ExportModule::writeVTKPieceEpilog(ExportRegion &vtkPiece, TimeStep *tStep)
497 if ( !vtkPiece.giveNumberOfCells() ) {
510VTKHDF5ExportModule::writeVTKPieceVariables(ExportRegion &vtkPiece, TimeStep *tStep)
516 if ( !vtkPiece.giveNumberOfCells() ) {
529 this->writePrimaryVars(vtkPiece);
530 this->writeIntVars(vtkPiece);
531 this->writeExternalForces(vtkPiece);
541 this->writeCellVars(vtkPiece);
551VTKHDF5ExportModule::giveDataHeaders(std::string &pointHeader, std::string &cellHeader)
553 std::string scalars, vectors, tensors;
555 for (
int i = 1; i <= primaryVarsToExport.giveSize(); i++ ) {
557 if ( type == DisplacementVector || type == EigenVector || type == VelocityVector || type == DirectorField || type == MacroSlipVector || type == ResidualForce ) {
560 }
else if ( type == FluxVector || type == PressureVector || type == Temperature || type == Humidity || type == DeplanationFunction ) {
568 for (
int i = 1; i <= internalVarsToExport.giveSize(); i++ ) {
572 if ( vtype == ISVT_SCALAR ) {
575 }
else if ( vtype == ISVT_VECTOR ) {
578 }
else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
586 for (
int i = 1; i <= externalForcesToExport.giveSize(); i++ ) {
588 if ( type == DisplacementVector || type == VelocityVector || type == DirectorField ) {
591 }
else if ( type == FluxVector || type == PressureVector || type == Temperature || type == Humidity ) {
600 pointHeader =
"<PointData Scalars=\"" + scalars +
"\" "
601 +
"Vectors=\"" + vectors +
"\" "
602 +
"Tensors=\"" + tensors +
"\" >\n";
609 for (
int i = 1; i <= this->cellVarsToExport.giveSize(); i++ ) {
613 if ( vtype == ISVT_SCALAR ) {
616 }
else if ( vtype == ISVT_VECTOR ) {
619 }
else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
628 cellHeader =
"<CellData Scalars=\"" + scalars +
"\" "
629 +
"Vectors=\"" + vectors +
"\" "
630 +
"Tensors=\"" + tensors +
"\" >\n";
636VTKHDF5ExportModule::writeIntVars(ExportRegion &vtkPiece)
639 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
641 unsigned int varIndx;
643 int n = internalVarsToExport.giveSize();
644 for (
int i = 1; i <= n; i++ ) {
646 unsigned int ncomponents;
650 unsigned int numNodes = vtkPiece.giveNumberOfNodes();
651 FloatArray valueArray;
652 valueArray = vtkPiece.giveInternalVarInNode(type, 1);
653 ncomponents = valueArray.giveSize();
654 ( void ) ncomponents;
657 if (this->pointDataGroup->nameExists(name)) {
658 dset = this->pointDataGroup->openDataSet( name );
660 dset.getSpace().getSimpleExtentDims(dim);
663 hsize_t dim4[]={1,ncomponents};
664 hsize_t maxdim4[]={H5S_UNLIMITED,ncomponents};
665 H5::DataSpace pointsDSpace(2, dim4, maxdim4);
667 H5::DSetCreatPropList plist;
668 plist.setLayout(H5D_CHUNKED);
669 hsize_t chunk_dims[2] = {1000, ncomponents};
670 plist.setChunk(2, chunk_dims);
671 dset = this->pointDataGroup->createDataSet( name, dtype, pointsDSpace, plist );
676 hsize_t psize[] = {varIndx+numNodes, ncomponents};
677 dset.extend( psize );
680 hsize_t dims1[2] = { numNodes, ncomponents};
681 H5::DataSpace dspace = dset.getSpace();
682 H5::DataSpace mem_space(2, dims1,
nullptr);
683 double *pdata =
new double[numNodes*ncomponents];
684 for (
unsigned int inode = 1; inode <= numNodes; inode++ ) {
685 FloatArray &valueArray = vtkPiece.giveInternalVarInNode(type, inode);
686 for (
unsigned int i=0; i<ncomponents; i++) {
687 pdata[(inode-1)*ncomponents+i]=valueArray(i);
694 dspace.selectHyperslab( H5S_SELECT_SET, dims1, offset );
699 dset.write( pdata, dtype, mem_space, dspace );
713VTKHDF5ExportModule::writeVTKPointData(
const char *name, vtkSmartPointer< vtkDoubleArray >varArray)
716 int ncomponents = varArray->GetNumberOfComponents();
717 switch ( ncomponents ) {
719 this->fileStream->GetPointData()->SetActiveScalars(name);
720 this->fileStream->GetPointData()->SetScalars(varArray);
723 this->fileStream->GetPointData()->SetActiveVectors(name);
724 this->fileStream->GetPointData()->SetVectors(varArray);
727 this->fileStream->GetPointData()->SetActiveTensors(name);
728 this->fileStream->GetPointData()->SetTensors(varArray);
734VTKHDF5ExportModule::writeVTKPointData(FloatArray &valueArray)
737 for (
int i = 1; i <= valueArray.giveSize(); i++ ) {
746VTKHDF5ExportModule::writeVTKCellData(
const char *name, vtkSmartPointer< vtkDoubleArray >varArray)
749 int ncomponents = varArray->GetNumberOfComponents();
750 switch ( ncomponents ) {
752 this->fileStream->GetCellData()->SetActiveScalars(name);
753 this->fileStream->GetCellData()->SetScalars(varArray);
756 this->fileStream->GetCellData()->SetActiveVectors(name);
757 this->fileStream->GetCellData()->SetVectors(varArray);
760 this->fileStream->GetCellData()->SetActiveTensors(name);
761 this->fileStream->GetCellData()->SetTensors(varArray);
769VTKHDF5ExportModule::writeVTKCellData(FloatArray &valueArray)
772 for (
int i = 1; i <= valueArray.giveSize(); i++ ) {
780VTKHDF5ExportModule::writePrimaryVars(ExportRegion &vtkPiece)
782 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
787 for (
int i = 1; i <= primaryVarsToExport.giveSize(); i++ ) {
791 ( void ) ncomponents;
792 unsigned int numNodes = vtkPiece.giveNumberOfNodes();
796 if (this->pointDataGroup->nameExists(name)) {
797 dset = this->pointDataGroup->openDataSet( name );
799 dset.getSpace().getSimpleExtentDims(dim);
800 primvarIndx = dim[0];
802 hsize_t dim4[]={1,ncomponents};
803 hsize_t maxdim4[]={H5S_UNLIMITED,ncomponents};
804 H5::DataSpace pointsDSpace(2, dim4, maxdim4);
806 H5::DSetCreatPropList plist;
807 plist.setLayout(H5D_CHUNKED);
808 hsize_t chunk_dims[2] = {1000, ncomponents};
809 plist.setChunk(2, chunk_dims);
810 dset = this->pointDataGroup->createDataSet( name, dtype, pointsDSpace, plist );
815 hsize_t psize[] = {primvarIndx+numNodes, ncomponents};
816 dset.extend( psize );
820 vtkSmartPointer< vtkDoubleArray >varArray = vtkSmartPointer< vtkDoubleArray >::New();
821 varArray->SetName(name);
822 varArray->SetNumberOfComponents(ncomponents);
823 varArray->SetNumberOfTuples(numNodes);
825 for (
unsigned int inode = 1; inode <= numNodes; inode++ ) {
826 FloatArray &valueArray = vtkPiece.givePrimaryVarInNode(type, inode);
827 for (
int j = 1; j <= ncomponents; ++j ) {
828 varArray->SetComponent(inode - 1, j - 1, valueArray.at(j) );
832 this->writeVTKPointData(name, varArray);
836 hsize_t dims1[2] = { numNodes, ncomponents};
837 H5::DataSpace dspace = dset.getSpace();
838 H5::DataSpace mem_space(2, dims1,
nullptr);
839 double *pdata =
new double[numNodes*ncomponents];
840 for (
unsigned int inode = 1; inode <= numNodes; inode++ ) {
841 FloatArray &valueArray = vtkPiece.givePrimaryVarInNode(type, inode);
842 for (
unsigned int i=0; i<ncomponents; i++) {
843 pdata[(inode-1)*ncomponents+i]=valueArray(i);
847 offset[0] = primvarIndx;
850 dspace.selectHyperslab( H5S_SELECT_SET, dims1, offset );
855 dset.write( pdata, dtype, mem_space, dspace );
864VTKHDF5ExportModule::writeExternalForces(ExportRegion &vtkPiece)
866 for (
int i = 1; i <= externalForcesToExport.giveSize(); i++ ) {
870 ( void ) ncomponents;
871 int numNodes = vtkPiece.giveNumberOfNodes();
876 vtkSmartPointer< vtkDoubleArray >varArray = vtkSmartPointer< vtkDoubleArray >::New();
877 varArray->SetName(name.c_str() );
878 varArray->SetNumberOfComponents(ncomponents);
879 varArray->SetNumberOfTuples(numNodes);
881 for (
int inode = 1; inode <= numNodes; inode++ ) {
882 FloatArray &valueArray = vtkPiece.giveLoadInNode(i, inode);
883 for (
int j = 1; j <= ncomponents; ++j ) {
884 varArray->SetComponent(inode - 1, j - 1, valueArray.at(j) );
888 this->writeVTKPointData(name.c_str(), varArray);
892 for (
int inode = 1; inode <= numNodes; inode++ ) {
893 FloatArray &valueArray = vtkPiece.giveLoadInNode(i, inode);
894 this->writeVTKPointData(valueArray);
902VTKHDF5ExportModule::writeCellVars(ExportRegion &vtkPiece)
904 FloatArray valueArray;
905 int numCells = vtkPiece.giveNumberOfCells();
906 for (
int i = 1; i <= cellVarsToExport.giveSize(); i++ ) {
915 vtkSmartPointer< vtkDoubleArray >cellVarsArray = vtkSmartPointer< vtkDoubleArray >::New();
916 cellVarsArray->SetName(name);
917 cellVarsArray->SetNumberOfComponents(ncomponents);
918 cellVarsArray->SetNumberOfTuples(numCells);
919 for (
int ielem = 1; ielem <= numCells; ielem++ ) {
920 valueArray = vtkPiece.giveCellVar(i, ielem);
921 for (
int i = 1; i <= ncomponents; ++i ) {
922 cellVarsArray->SetComponent(ielem - 1, i - 1, valueArray.at(i) );
926 this->writeVTKCellData(name, cellVarsArray);
930 valueArray.resize(ncomponents);
931 for (
int ielem = 1; ielem <= numCells; ielem++ ) {
932 valueArray = vtkPiece.giveCellVar(type, ielem);
933 this->writeVTKCellData(valueArray);
973 Domain *d = emodel->giveDomain(1);
977 std::ofstream stream;
980 std::string scalars, vectors, tensors;
983 int nregions = this->giveNumberOfRegions();
985 std::string outputFileName = this->giveOutputBaseFileName(tStep) +
".gp.vtu";
986 std::ofstream streamG;
987 if ( pythonExport ) {
990 streamG = std::ofstream(outputFileName);
993 if ( !streamG.good() ) {
994 OOFEM_ERROR(
"failed to open file %s", outputFileName.c_str() );
997 streamG <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
998 streamG <<
"<UnstructuredGrid>\n";
1001 for (
int ireg = 1; ireg <= nregions; ireg++ ) {
1002 const IntArray &elements = this->giveRegionSet(ireg)->giveElementList();
1004 for (
int i = 1; i <= elements.giveSize(); i++ ) {
1009 streamG <<
"<Piece NumberOfPoints=\"" << nip <<
"\" NumberOfCells=\"" << nip <<
"\">\n";
1010 streamG <<
"<Points>\n <DataArray type=\"Float64\" NumberOfComponents=\"3\" format=\"ascii\"> ";
1011 for (
int i = 1; i <= elements.giveSize(); i++ ) {
1012 int ielem = elements.at(i);
1016 for (
double c :
gc ) {
1018 streamG << scientific << c <<
" ";
1021 for (
int k =
gc.giveSize() + 1; k <= 3; k++ ) {
1022 streamG << scientific << 0.0 <<
" ";
1027 streamG <<
" </DataArray>\n";
1028 streamG <<
"</Points>\n";
1029 streamG <<
"<Cells>\n";
1030 streamG <<
" <DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\">";
1031 for (
int j = 0; j < nip; j++ ) {
1032 streamG << j <<
" ";
1035 streamG <<
" </DataArray>\n";
1036 streamG <<
" <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\">";
1037 for (
int j = 1; j <= nip; j++ ) {
1038 streamG << j <<
" ";
1041 streamG <<
" </DataArray>\n";
1042 streamG <<
" <DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\">";
1043 for (
int j = 1; j <= nip; j++ ) {
1047 streamG <<
" </DataArray>\n";
1048 streamG <<
"</Cells>\n";
1050 for (
int vi = 1; vi <= valIDs.
giveSize(); vi++ ) {
1054 if ( vtype == ISVT_SCALAR ) {
1056 scalars.append(
" ");
1057 }
else if ( vtype == ISVT_VECTOR ) {
1059 vectors.append(
" ");
1060 }
else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
1062 tensors.append(
" ");
1069 streamG <<
"<PointData Scalars=\"" << scalars.c_str() <<
"\" Vectors=\"" << vectors.c_str() <<
"\" Tensors=\"" << tensors.c_str() <<
"\" >\n";
1075 for (
int vi = 1; vi <= valIDs.
giveSize(); vi++ ) {
1078 if ( vtype == ISVT_SCALAR ) {
1080 }
else if ( vtype == ISVT_VECTOR ) {
1082 if ( isttype == IST_BeamForceMomentTensor ) {
1085 }
else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
1091 streamG <<
" <DataArray type=\"Float64\" Name=\"" <<
__InternalStateTypeToString(isttype) <<
"\" NumberOfComponents=\"" << nc <<
"\" format=\"ascii\">";
1092 for (
int i = 1; i <= elements.giveSize(); i++ ) {
1093 int ielem = elements.at(i);
1099 if ( vtype == ISVT_VECTOR ) {
1101 if ( isttype == IST_BeamForceMomentTensor ) {
1106 }
else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
1107 FloatArray help = value;
1108 this->makeFullTensorForm(value, help, vtype);
1111 for (
double v : value ) {
1113 streamG << scientific << v <<
" ";
1118 streamG <<
" </DataArray>\n";
1120 streamG <<
"</PointData>\n</Piece>\n";
1123 streamG <<
"</UnstructuredGrid>\n";
1124 streamG <<
"</VTKFile>\n";
1132void VTKHDF5ExportModule::updateDataSet (H5::DataSet& dset,
int rank, hsize_t* dim, hsize_t* offset, H5::DataType type,
const void* data)
1134 H5::DataSpace dspace = dset.getSpace();
1136 dspace.selectHyperslab( H5S_SELECT_SET, dim, offset );
1137 H5::DataSpace mem_space(rank, dim,
nullptr);
1138 dset.write(data, type, mem_space, dspace );
#define REGISTER_ExportModule(class)
Element * giveElement(int n)
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
int number
Component number.
virtual void initializeFrom(InputRecord &ir)
Initializes receiver according to object description stored in input record.
Set * giveRegionSet(int i)
Returns element set.
int giveNumberOfRegions()
Returns number of regions (aka regionSets).
EngngModel * emodel
Problem pointer.
bool testTimeStepOutput(TimeStep *tStep)
Stores all neccessary data (of a region) in a VTKPiece so it can be exported later.
FloatArray & giveNodeCoords(int nodeNum)
IntArray & giveCellConnectivity(int cellNum)
int giveCellType(int cellNum)
int giveCellOffset(int cellNum)
Index giveSize() const
Returns the size of receiver.
void resizeWithValues(Index s, std::size_t allocChunk=0)
int giveNumberOfIntegrationPoints() const
double giveTargetTime()
Returns target time.
void initialize() override
virtual void exportIntVars(ExportRegion &piece, Set ®ion, IntArray &internalVarsToExport, NodalRecoveryModel &smoother, TimeStep *tStep)
virtual void setupVTKPiece(ExportRegion &vtkPiece, TimeStep *tStep, Set ®ion)
virtual void exportPrimaryVars(ExportRegion &piece, Set ®ion, IntArray &primaryVarsToExport, NodalRecoveryModel &smoother, TimeStep *tStep)
NodalRecoveryModel * givePrimVarSmoother()
Returns the smoother for primary variables (nodal averaging).
VTKHDF5ExportModule(int n, EngngModel *e)
Constructor. Creates empty Output Manager. By default all components are selected.
void terminate() override
std::unique_ptr< NodalRecoveryModel > primVarSmoother
Smoother for primary variables.
std::unique_ptr< NodalRecoveryModel > smoother
Smoother.
void initialize() override
IntArray primaryVarsToExport
List of primary unknowns to export.
NodalRecoveryModel::NodalRecoveryModelType stype
Smoother type.
IntArray cellVarsToExport
List of cell data to export.
NodalRecoveryModel * giveSmoother()
Returns the internal smoother.
void doOutput(TimeStep *tStep, bool forcedOutput=false) override
IntArray ipInternalVarsToExport
List of internal variables to export directly in Integration Points (no smoothing to nodes).
ExportRegion defaultVTKPiece
virtual ~VTKHDF5ExportModule()
Destructor.
IntArray externalForcesToExport
List of primary unknowns to export.
IntArray internalVarsToExport
List of InternalStateType values, identifying the selected vars for export.
void initializeFrom(InputRecord &ir) override
Initializes receiver according to object description stored in input record.
#define OOFEM_WARNING(...)
const char * __InternalStateTypeToString(InternalStateType _value)
int giveInternalStateTypeSize(InternalStateValueType valType)
InternalStateValueType
Determines the type of internal variable.
const char * __UnknownTypeToString(UnknownType _value)
ClassFactory & classFactory
InternalStateValueType giveInternalStateValueType(InternalStateType type)
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define _IFT_VTKHDF5ExportModule_ipvars
#define _IFT_VTKHDF5ExportModule_vars
#define _IFT_VTKHDF5ExportModule_primvars
#define _IFT_VTKHDF5ExportModule_stype
#define _IFT_VTKHDF5ExportModule_externalForces
#define _IFT_VTKHDF5ExportModule_cellvars