OOFEM 3.0
Loading...
Searching...
No Matches
vtkhdf5exportmodule.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include "vtkhdf5exportmodule.h"
36#include "element.h"
37#include "gausspoint.h"
38#include "timestep.h"
39#include "engngm.h"
40#include "node.h"
41#include "dof.h"
42#include "materialinterface.h"
43#include "mathfem.h"
44#include "cltypes.h"
45#include "material.h"
46#include "classfactory.h"
47#include "crosssection.h"
49
50#include "xfem/xfemmanager.h"
51#include "xfem/enrichmentitem.h"
52
55
56#ifdef __PFEM_MODULE
57 #include "pfem/pfemparticle.h"
58#endif
59
60#include <string>
61#include <sstream>
62#include <ctime>
63
64#ifdef __VTK_MODULE
65 #include <vtkPoints.h>
66 #include <vtkPointData.h>
67 #include <vtkDoubleArray.h>
68 #include <vtkCellArray.h>
69 #include <vtkCellData.h>
70 #include <vtkHDF5UnstructuredGridWriter.h> // @check!
71 #include <vtkHDF5PUnstructuredGridWriter.h>
72 #include <vtkUnstructuredGrid.h>
73 #include <vtkSmartPointer.h>
74#endif
75
76#ifdef __HDF_MODULE
77#include <H5Cpp.h>
78#endif
79
80namespace oofem {
82
83
84VTKHDF5ExportModule::VTKHDF5ExportModule(int n, EngngModel *e) : VTKBaseExportModule(n, e), internalVarsToExport(), primaryVarsToExport()
85{}
86
87
89
90
91void
108
109
110void
112{
113 this->smoother = nullptr;
114 this->primVarSmoother = nullptr;
116
117#ifdef __HDF_MODULE
118 char fext[100];
119 sprintf( fext, ".m%d.hdf", this->number);
120 this->fileName = this->emodel->giveOutputBaseFileName() + fext;
121 /*
122 * Create the named file, truncating the existing file one if any,
123 * using default create and access property lists.
124 */
125 try {
126 H5::IntType itype(H5::PredType::NATIVE_INT);
127 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
128
129 this->file = new H5::H5File (this->fileName, H5F_ACC_TRUNC);
130 /*
131 * Create a VTHHDF group
132 */
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"));
136 /* Create version attribute*/
137 int version[]={2,2};
138 hsize_t dims[1]={2};
139 H5::DataSpace attrSpace(1, dims);
140 H5::Attribute va = topGroup->createAttribute("Version", itype, attrSpace);
141 va.write(itype, version);
142
143 // Create type attribute
144 H5::StrType str_type(H5::PredType::C_S1, 16); /* required by vtkhdf reader Type string with ASCII encoding and fixed length*/
145 str_type.setCset(H5T_CSET_ASCII);
146 H5::DataSpace attrSpace1(H5S_SCALAR);
147
148 H5::Attribute att = topGroup->createAttribute( "Type", str_type, attrSpace1 );
149 att.write( str_type, std::string("UnstructuredGrid"));
150
151 /* Create Unstructured grid top level datasets*/
152 hsize_t dim1[]={1};
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 );
162
163 hsize_t dim4[]={1,3};
164 hsize_t maxdim4[]={H5S_UNLIMITED,3};
165 H5::DataSpace pointsDSpace(2, dim4, maxdim4);
166 // Create dataset creation property list to enable chunking
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 );
172
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 );
177
178
179
180 // Create Steps group (transient data support)
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);
184 int nsteps = 0;
185 nsa.write(itype, &nsteps);
186 // create Steps data sets
187 hsize_t dim[]={1};
188 hsize_t maxdim[]={H5S_UNLIMITED};
189 H5::DataSpace stepDSpace(1, dim, maxdim);
190 // Create dataset creation property list to enable chunking
191 plist1.setLayout(H5D_CHUNKED);
192 hsize_t chunk_dims3[1] = {10};
193 plist1.setChunk(1, chunk_dims3);
194 // create Steps/Values (each entry indicates the time value for the associated time step)
195 H5::DataSet valuesDSet = this->stepsGroup->createDataSet( "Values", dtype, stepDSpace, plist1 );
196 // create PartOffsets [dims = (NSteps)]: each entry indicates at which part offset to start reading the associated time step
197 H5::DataSet poDSet = this->stepsGroup->createDataSet( "PartOffsets", itype, stepDSpace, plist1 );
198 H5::DataSet npDSet = this->stepsGroup->createDataSet( "NumberOfParts", itype, stepDSpace, plist1 );
199 // PointOffsets [dims = (NSteps)]: each entry indicates where in the VTKHDF/Points data set to start reading point coordinates for the associated time step
200 H5::DataSet pointOffsetsDSet = this->stepsGroup->createDataSet( "PointOffsets", itype, stepDSpace, plist1 );
201 // CellOffsets [dims = (NSteps, NTopologies)]: each entry indicates by how many cells to offset reading into the connectivity offset structures for the associated time step
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);
210 // ConnectivityIdOffsets [dims = (NSteps, NTopologies)]: each entry indicates by how many values to offset reading into the connectivity indexing structures for the associated time step
211 H5::DataSet connIdOffsetsDSet = this->stepsGroup->createDataSet( "ConnectivityIdOffsets", itype, ds2, plist2);
212
213
214 this->pointCounter = 0;
215 this->cellCounter=0;
216 this->connCounter=0;
217 this->offsetCounter=0;
218
219} catch ( H5::Exception& error) {
220 error.getDetailMsg(); // error.printErrorStack();
221 return;
222}
223
224
225#endif
226
227}
228
229
230void
232{
233#ifdef __HDF_MODULE
234 delete topGroup;
235 delete pointDataGroup;
236 delete cellDataGroup;
237 delete stepsGroup;
238 delete file;
239#endif
240}
241
242void
243VTKHDF5ExportModule::doOutput(TimeStep *tStep, bool forcedOutput)
244{
245 if ( !( testTimeStepOutput(tStep) || forcedOutput ) ) {
246 return;
247 }
248
249#ifdef __VTK_MODULE
250 //this->fileStream = vtkSmartPointer< vtkUnstructuredGrid >::New();
251 this->nodes = vtkSmartPointer< vtkPoints >::New();
252 this->elemNodeArray = vtkSmartPointer< vtkIdList >::New();
253
254#endif
255#ifdef __HDF_MODULE
256 //int rank = 0; // at present no support fro parallel partitioned output
257 H5::IntType itype(H5::PredType::NATIVE_UINT);
258 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
259
260 // update Steps/offset informations
261 // increment number of steps
262 H5::Attribute nstepsattr = stepsGroup->openAttribute("NSteps");
263 unsigned int steps;
264 nstepsattr.read(itype, &steps);
265 steps ++;
266 nstepsattr.write(itype, &steps);
267 // resize and update steps datasets
268 // update Steps/Values Attribute (step time values)
269 hsize_t ssize[] = {steps};
270 H5::DataSet values = stepsGroup->openDataSet("Values");
271 values.extend( ssize );
272 /* create hyperslab to update point data */
273 hsize_t offset[] = {steps-1};
274 hsize_t dims[1] = {1};
275 double t = tStep->giveTargetTime();
276 this->updateDataSet(values, 1, dims, offset, dtype, &t);
277
278 // Update Steps/PointOffsets
279 H5::DataSet pods = stepsGroup->openDataSet("PointOffsets");
280 pods.extend( ssize );
281 this->updateDataSet(pods, 1, dims, offset, itype, &this->pointCounter);
282
283 // Update Steps/CellOffsets
284 hsize_t ssize11[] = {steps,1};
285 H5::DataSet codset = stepsGroup->openDataSet("CellOffsets");// CellOffsets
286 codset.extend(ssize11);
287 /* create hyperslab to update point data */
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);
292
293 // update Steps/ConnectivityIdOffsets
294 H5::DataSet cidset = stepsGroup->openDataSet("ConnectivityIdOffsets");
295 cidset.extend(ssize11);
296 this->updateDataSet(cidset, 2, dims11, offset11, itype, &this->connCounter);
297
298 // update Steps/NumberOfParts and Steps/PartOffsets
299 H5::DataSet npset = stepsGroup->openDataSet("NumberOfParts");
300 npset.extend(ssize);
301 int tval = 1;
302 this->updateDataSet(npset, 1, dims, offset, itype, &tval);
303 H5::DataSet poset = stepsGroup->openDataSet("PartOffsets");
304 poset.extend(ssize);
305 tval =steps-1;
306 this->updateDataSet(poset, 1, dims, offset, itype, &tval);
307
308
309
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" );
314
315
316 int nPiecesToExport = this->giveNumberOfRegions(); //old name: region, meaning: sets
317 int anyPieceNonEmpty = 0;
320
321 unsigned int stepPointCounter = 0, stepCellCounter = 0, stepConnCounter = 0;
322
323 for ( int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
324 // Fills a data struct (VTKPiece) with all the necessary data.
325 Set* region = this->giveRegionSet(pieceNum);
326 this->setupVTKPiece(this->defaultVTKPiece, tStep, *region);
327 this->writeVTKPieceProlog(this->defaultVTKPiece, tStep, pointCounter, cellCounter, connCounter, offsetCounter,
328 stepPointCounter, stepCellCounter, stepConnCounter,
329 pointsDSet, connectivityDSet, offsetsDSet, typesDSet);
330
332 this->exportIntVars(this->defaultVTKPiece, *region, internalVarsToExport, *smoother, tStep);
333 anyPieceNonEmpty += this->writeVTKPieceVariables(this->defaultVTKPiece, tStep);
334
335 this->defaultVTKPiece.clear();
336
337 }
338
339 this->pointCounter += stepPointCounter;
340 this->cellCounter += stepCellCounter;
341 this->connCounter += stepConnCounter;
342 this->offsetCounter += (stepCellCounter+1);
343
344 /* Update basic datasets*/
345 H5::DataSet numberOfPointsDSet = topGroup->openDataSet("NumberOfPoints");
346 H5::DataSet numberOfCellsDSet = topGroup->openDataSet("NumberOfCells");
347 H5::DataSet NumberOfConnectivityIds = topGroup->openDataSet("NumberOfConnectivityIds");
348
349 numberOfPointsDSet.extend(ssize);
350 numberOfCellsDSet.extend(ssize);
351 NumberOfConnectivityIds.extend(ssize);
352
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);
356
357 return;
358
359#endif
360
361#if 0
362
363 for ( int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
364 // Fills a data struct (VTKPiece) with all the necessary data.
365 Set* region = this->giveRegionSet(pieceNum);
366 this->setupVTKPiece(this->defaultVTKPiece, tStep, *region);
367 /*
368 this->writeVTKPieceProlog(this->defaultVTKPiece, tStep);
369 // Export primary, internal and XFEM variables as nodal quantities
370 this->exportPrimaryVars(this->defaultVTKPiece, *region, primaryVarsToExport, *primVarSmoother, tStep);
371 this->exportIntVars(this->defaultVTKPiece, *region, internalVarsToExport, *smoother, tStep);
372 this->exportExternalForces(this->defaultVTKPiece, *region, externalForcesToExport, tStep);
373 this->exportCellVars(this->defaultVTKPiece, *region, cellVarsToExport, tStep);
374
375 // Write the VTK piece to file.
376 anyPieceNonEmpty += this->writeVTKPieceVariables(this->defaultVTKPiece, tStep);
377 this->writeVTKPieceEpilog(this->defaultVTKPiece, tStep);
378 */
379 this->defaultVTKPiece.clear();
380 }
381
382 return;
383#endif
384}
385
386#ifdef __HDF_MODULE
387bool
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)
391{
392 // Writes a VTK piece header + geometry to file.
393 // This could be the whole domain (most common case) or it can be a
394 // (so-called) composite element consisting of several VTK cells (layered structures, XFEM, etc.).
395
396 // Write output: node coords
397 unsigned int numNodes = vtkPiece.giveNumberOfNodes();
398 unsigned int numEl = vtkPiece.giveNumberOfCells();
399 FloatArray coords;
400
401 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
402 H5::IntType itype(H5::PredType::NATIVE_INT);
403 H5::DataType ttype(H5::PredType::NATIVE_UINT); /* required by vtkhdf reader datset Types of type unsigned int */
404
405 if ( !vtkPiece.giveNumberOfCells() ) {
406 return false;
407 }
408
409 double *points = new double[numNodes*3];
410
411 for ( unsigned int inode = 1; inode <= numNodes; inode++ ) {
412 coords = vtkPiece.giveNodeCoords(inode);
414 for ( int i = 0; i < coords.giveSize(); i++ ) {
415 points[(inode-1)*3+i] = coords[i];
416 }
417 for ( int i = coords.giveSize() ; i < 3; i++ ) {
418 points[(inode-1)*3+i] = 0.0;
419 }
420 }
421
422 /*
423 * Extend the dataset. This call assures that dataset is at least 3 x 3.
424 */
425 hsize_t psize[] = {pointCounter+numNodes, 3};
426 pointsDSet.extend( psize );
427 /* create hyperslab to update point data */
428 hsize_t offset[] = {pointCounter, 0};
429 hsize_t dims1[] = { numNodes, 3}; /* data1 dimensions */
430 this->updateDataSet(pointsDSet, 2, dims1, offset, dtype, points);
431
432 delete(points);
433
434
435 // Write output: connectivity, offsets, cell types
436 // output the connectivity data
437
438 IntArray cellNodes;
439 unsigned int connectivitySize=0;
440 for ( unsigned int ielem = 1; ielem <= numEl; ielem++ ) {
441 connectivitySize+=vtkPiece.giveCellConnectivity(ielem).giveSize();
442 }
443 IntArray conn(connectivitySize);
444 IntArray offsets(numEl+1);
445 unsigned int * types = new unsigned int [numEl];
446 int cp = 0;
447
448 offsets.at(1)=0;
449 for ( unsigned int ielem = 1; ielem <= numEl; ielem++ ) {
450 offsets.at(ielem+1) = vtkPiece.giveCellOffset(ielem);
451 types[ielem-1] = vtkPiece.giveCellType(ielem);
452 cellNodes = vtkPiece.giveCellConnectivity(ielem);
453 for ( int i = 0; i < cellNodes.giveSize(); i++ ) {
454 conn[cp++]=cellNodes[i]-1;
455 }
456 }
457
458 H5::DataSpace cspace = connectivityDSet.getSpace();
459 H5::DataSpace ospace = offsetDSet.getSpace();
460 H5::DataSpace tspace = typeDSet.getSpace();
461
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);
468
469 /* create hyperslab to update point data */
470 hsize_t coffset[] = {connCounter};
471 hsize_t cdims[] = {connectivitySize }; /* data1 dimensions */
472 this->updateDataSet(connectivityDSet, 1, cdims, coffset, itype, conn.givePointer());
473
474
475
476 /* create hyperslab to update cell data */
477 hsize_t celloffset[] = {cellCounter};
478 hsize_t offsetOffset[] = {offsetCounter};
479 hsize_t celldims[] = {numEl }; /* data1 dimensions */
480 hsize_t celldims1[] = {numEl+1}; /* data1 dimensions */
481 this->updateDataSet(offsetDSet, 1, celldims1, offsetOffset, itype, offsets.givePointer());
482 this->updateDataSet(typeDSet, 1, celldims, celloffset, ttype, types);
483
484 delete(types);
485
486 stepPointCounter+=numNodes;
487 stepCellCounter = numEl;
488 stepConnCounter = connectivitySize;
489 return true;
490
491
492}
493
494bool
495VTKHDF5ExportModule::writeVTKPieceEpilog(ExportRegion &vtkPiece, TimeStep *tStep)
496{
497 if ( !vtkPiece.giveNumberOfCells() ) {
498 return false;
499 }
500
501#ifndef __VTK_MODULE
502 //this->fileStream << "</Piece>\n";
503#endif
504 return true;
505}
506
507
508
509bool
510VTKHDF5ExportModule::writeVTKPieceVariables(ExportRegion &vtkPiece, TimeStep *tStep)
511{
512 // Write a VTK piece variables to file.
513 // This could be the whole domain (most common case) or it can be a
514 // (so-called) composite element consisting of several VTK cells (layered structures, XFEM, etc.).
515
516 if ( !vtkPiece.giveNumberOfCells() ) {
517 return false;
518 }
519
520
521#ifndef __VTK_MODULE
523 //std::string pointHeader, cellHeader;
524 //this->giveDataHeaders(pointHeader, cellHeader);
525
526 //this->fileStream << pointHeader.c_str();
527#endif
528
529 this->writePrimaryVars(vtkPiece); // Primary field
530 this->writeIntVars(vtkPiece); // Internal State Type variables smoothed to the nodes
531 this->writeExternalForces(vtkPiece); // External forces
532
533 //if ( emodel->giveDomain(1)->hasXfemManager() ) {
534 // this->writeXFEMVars(vtkPiece); // XFEM State Type variables associated with XFEM structure
535 //}
536
537#ifndef __VTK_MODULE
538 //this->fileStream << "</PointData>\n";
539 //this->fileStream << cellHeader.c_str();
540#endif
541 this->writeCellVars(vtkPiece); // Single cell variables ( if given in the integration points then an average will be exported)
542
543#ifndef __VTK_MODULE
544 //this->fileStream << "</CellData>\n";
545#endif
546 return true;
547}
548
549#ifdef __VTK_MODULE
550void
551VTKHDF5ExportModule::giveDataHeaders(std::string &pointHeader, std::string &cellHeader)
552{
553 std::string scalars, vectors, tensors;
554
555 for ( int i = 1; i <= primaryVarsToExport.giveSize(); i++ ) {
556 UnknownType type = ( UnknownType ) primaryVarsToExport.at(i);
557 if ( type == DisplacementVector || type == EigenVector || type == VelocityVector || type == DirectorField || type == MacroSlipVector || type == ResidualForce ) {
558 vectors += __UnknownTypeToString(type);
559 vectors.append(" ");
560 } else if ( type == FluxVector || type == PressureVector || type == Temperature || type == Humidity || type == DeplanationFunction ) {
561 scalars += __UnknownTypeToString(type);
562 scalars.append(" ");
563 } else {
564 OOFEM_ERROR("unsupported UnknownType %s", __UnknownTypeToString(type) );
565 }
566 }
567
568 for ( int i = 1; i <= internalVarsToExport.giveSize(); i++ ) {
569 InternalStateType isttype = ( InternalStateType ) internalVarsToExport.at(i);
571
572 if ( vtype == ISVT_SCALAR ) {
573 scalars += __InternalStateTypeToString(isttype);
574 scalars.append(" ");
575 } else if ( vtype == ISVT_VECTOR ) {
576 vectors += __InternalStateTypeToString(isttype);
577 vectors.append(" ");
578 } else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
579 tensors += __InternalStateTypeToString(isttype);
580 tensors.append(" ");
581 } else {
582 OOFEM_ERROR("unsupported variable type %s\n", __InternalStateTypeToString(isttype) );
583 }
584 }
585
586 for ( int i = 1; i <= externalForcesToExport.giveSize(); i++ ) {
587 UnknownType type = ( UnknownType ) externalForcesToExport.at(i);
588 if ( type == DisplacementVector || type == VelocityVector || type == DirectorField ) {
589 vectors += std::string("Load") + __UnknownTypeToString(type);
590 vectors.append(" ");
591 } else if ( type == FluxVector || type == PressureVector || type == Temperature || type == Humidity ) {
592 scalars += std::string("Load") + __UnknownTypeToString(type);
593 scalars.append(" ");
594 } else {
595 OOFEM_ERROR("unsupported UnknownType %s", __UnknownTypeToString(type) );
596 }
597 }
598
599 // print header
600 pointHeader = "<PointData Scalars=\"" + scalars + "\" "
601 + "Vectors=\"" + vectors + "\" "
602 + "Tensors=\"" + tensors + "\" >\n";
603
604
605 scalars.clear();
606 vectors.clear();
607 tensors.clear();
608 // prepare header
609 for ( int i = 1; i <= this->cellVarsToExport.giveSize(); i++ ) {
610 InternalStateType isttype = ( InternalStateType ) cellVarsToExport.at(i);
612
613 if ( vtype == ISVT_SCALAR ) {
614 scalars += __InternalStateTypeToString(isttype);
615 scalars.append(" ");
616 } else if ( vtype == ISVT_VECTOR ) {
617 vectors += __InternalStateTypeToString(isttype);
618 vectors.append(" ");
619 } else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
620 tensors += __InternalStateTypeToString(isttype);
621 tensors.append(" ");
622 } else {
623 OOFEM_WARNING("unsupported variable type %s\n", __InternalStateTypeToString(isttype) );
624 }
625 }
626
627 // print header
628 cellHeader = "<CellData Scalars=\"" + scalars + "\" "
629 + "Vectors=\"" + vectors + "\" "
630 + "Tensors=\"" + tensors + "\" >\n";
631}
632#endif
633
634
635void
636VTKHDF5ExportModule::writeIntVars(ExportRegion &vtkPiece)
637{
638
639 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
640 H5::DataSet dset;
641 unsigned int varIndx;
642
643 int n = internalVarsToExport.giveSize();
644 for ( int i = 1; i <= n; i++ ) {
645 InternalStateType type = ( InternalStateType ) internalVarsToExport.at(i);
646 unsigned int ncomponents;
647
648 const char *name = __InternalStateTypeToString(type);
649 ( void ) name;//silence warning
650 unsigned int numNodes = vtkPiece.giveNumberOfNodes();
651 FloatArray valueArray;
652 valueArray = vtkPiece.giveInternalVarInNode(type, 1);
653 ncomponents = valueArray.giveSize();
654 ( void ) ncomponents;//silence warning
655
656#ifdef __HDF_MODULE
657 if (this->pointDataGroup->nameExists(name)) {
658 dset = this->pointDataGroup->openDataSet( name );
659 hsize_t dim[2];
660 dset.getSpace().getSimpleExtentDims(dim); // get existing dimensions to append the data
661 varIndx = dim[0];
662 } else {
663 hsize_t dim4[]={1,ncomponents};
664 hsize_t maxdim4[]={H5S_UNLIMITED,ncomponents};
665 H5::DataSpace pointsDSpace(2, dim4, maxdim4);
666 // Create dataset creation property list to enable chunking
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 );
672 varIndx = 0;
673
674 }
675 // extend the dataset
676 hsize_t psize[] = {varIndx+numNodes, ncomponents};
677 dset.extend( psize );
678
679 hsize_t offset[2];
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);
688 }
689 }
690 /* create hyperslab to update point data */
691 offset[0] = varIndx;
692 offset[1] = 0;
693 //dspace.selectNone();
694 dspace.selectHyperslab( H5S_SELECT_SET, dims1, offset );
695 /*
696 * Write the data to the hyperslab.
697 */
698 //dspace = dset->getSpace();
699 dset.write( pdata, dtype, mem_space, dspace );
700 delete pdata;
701 //this->fileStream << "</DataArray>\n";
702#endif
703 }
704}
705
706
707
708//----------------------------------------------------
709// Misc. functions
710//----------------------------------------------------
711#ifdef __VTK_MODULE
712void
713VTKHDF5ExportModule::writeVTKPointData(const char *name, vtkSmartPointer< vtkDoubleArray >varArray)
714{
715 // Write the data to file
716 int ncomponents = varArray->GetNumberOfComponents();
717 switch ( ncomponents ) {
718 case 1:
719 this->fileStream->GetPointData()->SetActiveScalars(name);
720 this->fileStream->GetPointData()->SetScalars(varArray);
721 break;
722 case 3:
723 this->fileStream->GetPointData()->SetActiveVectors(name);
724 this->fileStream->GetPointData()->SetVectors(varArray);
725 break;
726 case 9:
727 this->fileStream->GetPointData()->SetActiveTensors(name);
728 this->fileStream->GetPointData()->SetTensors(varArray);
729 break;
730 }
731}
732#else
733void
734VTKHDF5ExportModule::writeVTKPointData(FloatArray &valueArray)
735{
736 // Write the data to file
737 for ( int i = 1; i <= valueArray.giveSize(); i++ ) {
738 //this->fileStream << scientific << valueArray.at(i) << " ";
739 }
740}
741#endif
742
743
744#ifdef __VTK_MODULE
745void
746VTKHDF5ExportModule::writeVTKCellData(const char *name, vtkSmartPointer< vtkDoubleArray >varArray)
747{
748 // Write the data to file
749 int ncomponents = varArray->GetNumberOfComponents();
750 switch ( ncomponents ) {
751 case 1:
752 this->fileStream->GetCellData()->SetActiveScalars(name);
753 this->fileStream->GetCellData()->SetScalars(varArray);
754 break;
755 case 3:
756 this->fileStream->GetCellData()->SetActiveVectors(name);
757 this->fileStream->GetCellData()->SetVectors(varArray);
758 break;
759 case 9:
760 this->fileStream->GetCellData()->SetActiveTensors(name);
761 this->fileStream->GetCellData()->SetTensors(varArray);
762 break;
763 }
764}
765
766#else
767
768void
769VTKHDF5ExportModule::writeVTKCellData(FloatArray &valueArray)
770{
771 // Write the data to file ///@todo exact copy of writeVTKPointData so remove
772 for ( int i = 1; i <= valueArray.giveSize(); i++ ) {
773 //this->fileStream << valueArray.at(i) << " ";
774 }
775}
776#endif
777
778
779void
780VTKHDF5ExportModule::writePrimaryVars(ExportRegion &vtkPiece)
781{
782 H5::DataType dtype(H5::PredType::NATIVE_DOUBLE);
783 H5::DataSet dset;
784 int primvarIndx;
785
786
787 for ( int i = 1; i <= primaryVarsToExport.giveSize(); i++ ) {
788 UnknownType type = ( UnknownType ) primaryVarsToExport.at(i);
790 unsigned int ncomponents = giveInternalStateTypeSize(valType);
791 ( void ) ncomponents; //silence the warning
792 unsigned int numNodes = vtkPiece.giveNumberOfNodes();
793 const char *name = __UnknownTypeToString(type);
794 ( void ) name; //silence the warning
795#ifdef __HDF_MODULE
796 if (this->pointDataGroup->nameExists(name)) {
797 dset = this->pointDataGroup->openDataSet( name );
798 hsize_t dim[2];
799 dset.getSpace().getSimpleExtentDims(dim); // get existing dimensions to append the data
800 primvarIndx = dim[0];
801 } else {
802 hsize_t dim4[]={1,ncomponents};
803 hsize_t maxdim4[]={H5S_UNLIMITED,ncomponents};
804 H5::DataSpace pointsDSpace(2, dim4, maxdim4);
805 // Create dataset creation property list to enable chunking
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 );
811 primvarIndx = 0;
812
813 }
814 // extend the dataset
815 hsize_t psize[] = {primvarIndx+numNodes, ncomponents};
816 dset.extend( psize );
817#endif
818 // Header
819#ifdef __VTK_MODULE
820 vtkSmartPointer< vtkDoubleArray >varArray = vtkSmartPointer< vtkDoubleArray >::New();
821 varArray->SetName(name);
822 varArray->SetNumberOfComponents(ncomponents);
823 varArray->SetNumberOfTuples(numNodes);
824
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) );
829 }
830 }
831
832 this->writeVTKPointData(name, varArray);
833
834#else
835 hsize_t offset[2];
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);
844 }
845 }
846 /* create hyperslab to update point data */
847 offset[0] = primvarIndx;
848 offset[1] = 0;
849 //dspace.selectNone();
850 dspace.selectHyperslab( H5S_SELECT_SET, dims1, offset );
851 /*
852 * Write the data to the hyperslab.
853 */
854 //dspace = dset->getSpace();
855 dset.write( pdata, dtype, mem_space, dspace );
856 delete pdata;
857 //this->fileStream << "</DataArray>\n";
858#endif
859 }
860}
861
862
863void
864VTKHDF5ExportModule::writeExternalForces(ExportRegion &vtkPiece)
865{
866 for ( int i = 1; i <= externalForcesToExport.giveSize(); i++ ) {
867 UnknownType type = ( UnknownType ) externalForcesToExport.at(i);
869 int ncomponents = giveInternalStateTypeSize(valType);
870 ( void ) ncomponents; //silence the warning
871 int numNodes = vtkPiece.giveNumberOfNodes();
872 std::string name = std::string("Load") + __UnknownTypeToString(type);
873
874 // Header
875#ifdef __VTK_MODULE
876 vtkSmartPointer< vtkDoubleArray >varArray = vtkSmartPointer< vtkDoubleArray >::New();
877 varArray->SetName(name.c_str() );
878 varArray->SetNumberOfComponents(ncomponents);
879 varArray->SetNumberOfTuples(numNodes);
880
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) );
885 }
886 }
887
888 this->writeVTKPointData(name.c_str(), varArray);
889
890#else
891 //this->fileStream << " <DataArray type=\"Float64\" Name=\"" << name << "\" NumberOfComponents=\"" << ncomponents << "\" format=\"ascii\"> ";
892 for ( int inode = 1; inode <= numNodes; inode++ ) {
893 FloatArray &valueArray = vtkPiece.giveLoadInNode(i, inode);
894 this->writeVTKPointData(valueArray);
895 }
896 //this->fileStream << "</DataArray>\n";
897#endif
898 }
899}
900
901void
902VTKHDF5ExportModule::writeCellVars(ExportRegion &vtkPiece)
903{
904 FloatArray valueArray;
905 int numCells = vtkPiece.giveNumberOfCells();
906 for ( int i = 1; i <= cellVarsToExport.giveSize(); i++ ) {
907 InternalStateType type = ( InternalStateType ) cellVarsToExport.at(i);
909 int ncomponents = giveInternalStateTypeSize(valType);
910 const char *name = __InternalStateTypeToString(type);
911 ( void ) name; //silence the warning
912
913 // Header
914#ifdef __VTK_MODULE
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) );
923 }
924 }
925
926 this->writeVTKCellData(name, cellVarsArray);
927
928#else
929 //this->fileStream << " <DataArray type=\"Float64\" Name=\"" << name << "\" NumberOfComponents=\"" << ncomponents << "\" format=\"ascii\"> ";
930 valueArray.resize(ncomponents);
931 for ( int ielem = 1; ielem <= numCells; ielem++ ) {
932 valueArray = vtkPiece.giveCellVar(type, ielem);
933 this->writeVTKCellData(valueArray);
934 }
935 //this->fileStream << "</DataArray>\n";
936#endif
937
938 }//end of for
939}
940
941#endif
942
943
944NodalRecoveryModel *
946{
947 Domain *d = emodel->giveDomain(1);
948
949 if ( !this->smoother ) {
950 this->smoother = classFactory.createNodalRecoveryModel(this->stype, d);
951 }
952
953 return this->smoother.get();
954}
955
956
959{
960 Domain *d = emodel->giveDomain(1);
961
962 if ( !this->primVarSmoother ) {
963 this->primVarSmoother = classFactory.createNodalRecoveryModel(NodalRecoveryModel::NRM_NodalAveraging, d);
964 }
965
966 return this->primVarSmoother.get();
967}
968
969#ifdef __HDF_MODULE
970void
971VTKHDF5ExportModule::exportIntVarsInGpAs(IntArray valIDs, TimeStep *tStep)
972{
973 Domain *d = emodel->giveDomain(1);
974 int nc = 0;
975 ( void ) nc; //silence the warning
976 FloatArray gc, value;
977 std::ofstream stream;
978 InternalStateType isttype;
980 std::string scalars, vectors, tensors;
981
982 // output nodes Region By Region
983 int nregions = this->giveNumberOfRegions(); // aka sets
984 // open output stream
985 std::string outputFileName = this->giveOutputBaseFileName(tStep) + ".gp.vtu";
986 std::ofstream streamG;
987 if ( pythonExport ) {
988 streamG = std::ofstream(NULL_DEVICE);
989 } else {
990 streamG = std::ofstream(outputFileName);
991 }
992
993 if ( !streamG.good() ) {
994 OOFEM_ERROR("failed to open file %s", outputFileName.c_str() );
995 }
996
997 streamG << "<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
998 streamG << "<UnstructuredGrid>\n";
999
1000 /* loop over regions */
1001 for ( int ireg = 1; ireg <= nregions; ireg++ ) {
1002 const IntArray &elements = this->giveRegionSet(ireg)->giveElementList();
1003 int nip = 0;
1004 for ( int i = 1; i <= elements.giveSize(); i++ ) {
1006 }
1007
1008 //Create one cell per each GP
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);
1013
1014 for ( GaussPoint *gp : * d->giveElement(ielem)->giveDefaultIntegrationRulePtr() ) {
1015 d->giveElement(ielem)->computeGlobalCoordinates(gc, gp->giveNaturalCoordinates() );
1016 for ( double c : gc ) {
1017 ( void ) c; //silence the warning
1018 streamG << scientific << c << " ";
1019 }
1020
1021 for ( int k = gc.giveSize() + 1; k <= 3; k++ ) {
1022 streamG << scientific << 0.0 << " ";
1023 }
1024 }
1025 }
1026
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 << " ";
1033 }
1034
1035 streamG << " </DataArray>\n";
1036 streamG << " <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\">";
1037 for ( int j = 1; j <= nip; j++ ) {
1038 streamG << j << " ";
1039 }
1040
1041 streamG << " </DataArray>\n";
1042 streamG << " <DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\">";
1043 for ( int j = 1; j <= nip; j++ ) {
1044 streamG << "1 ";
1045 }
1046
1047 streamG << " </DataArray>\n";
1048 streamG << "</Cells>\n";
1049 // prepare the data header
1050 for ( int vi = 1; vi <= valIDs.giveSize(); vi++ ) {
1051 isttype = ( InternalStateType ) valIDs.at(vi);
1052 vtype = giveInternalStateValueType(isttype);
1053
1054 if ( vtype == ISVT_SCALAR ) {
1055 scalars += __InternalStateTypeToString(isttype);
1056 scalars.append(" ");
1057 } else if ( vtype == ISVT_VECTOR ) {
1058 vectors += __InternalStateTypeToString(isttype);
1059 vectors.append(" ");
1060 } else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
1061 tensors += __InternalStateTypeToString(isttype);
1062 tensors.append(" ");
1063 } else {
1064 OOFEM_WARNING("unsupported variable type %s\n", __InternalStateTypeToString(isttype) );
1065 }
1066 }
1067
1068 // print collected data summary in header
1069 streamG << "<PointData Scalars=\"" << scalars.c_str() << "\" Vectors=\"" << vectors.c_str() << "\" Tensors=\"" << tensors.c_str() << "\" >\n";
1070 scalars.clear();
1071 vectors.clear();
1072 tensors.clear();
1073
1074 // export actual data, loop over individual IDs to export
1075 for ( int vi = 1; vi <= valIDs.giveSize(); vi++ ) {
1076 isttype = ( InternalStateType ) valIDs.at(vi);
1077 vtype = giveInternalStateValueType(isttype);
1078 if ( vtype == ISVT_SCALAR ) {
1079 nc = 1;
1080 } else if ( vtype == ISVT_VECTOR ) {
1081 nc = 3;
1082 if ( isttype == IST_BeamForceMomentTensor ) { //AS: to make the hack work
1083 nc = 6;
1084 }
1085 } else if ( vtype == ISVT_TENSOR_S3 || vtype == ISVT_TENSOR_S3E || vtype == ISVT_TENSOR_G ) {
1086 nc = 9;
1087 } else {
1088 OOFEM_WARNING("unsupported variable type %s\n", __InternalStateTypeToString(isttype) );
1089 }
1090
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);
1094
1095 // loop over default IRule gps
1096 for ( GaussPoint *gp : * d->giveElement(ielem)->giveDefaultIntegrationRulePtr() ) {
1097 d->giveElement(ielem)->giveIPValue(value, gp, isttype, tStep);
1098
1099 if ( vtype == ISVT_VECTOR ) {
1100 // bp: hack for BeamForceMomentTensor, which should be splitted into force and momentum vectors
1101 if ( isttype == IST_BeamForceMomentTensor ) {
1102 value.resizeWithValues(6);
1103 } else {
1104 value.resizeWithValues(3);
1105 }
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);
1109 }
1110
1111 for ( double v : value ) {
1112 ( void ) v; //silence the warning
1113 streamG << scientific << v << " ";
1114 }
1115 } // end loop over IPs
1116 } // end loop over elements
1117
1118 streamG << " </DataArray>\n";
1119 } // end loop over values to be exported
1120 streamG << "</PointData>\n</Piece>\n";
1121 } // end loop over regions
1122
1123 streamG << "</UnstructuredGrid>\n";
1124 streamG << "</VTKFile>\n";
1125 if(streamG){
1126 streamG.close();
1127 }
1128}
1129#endif
1130
1131#ifdef __HDF_MODULE
1132void VTKHDF5ExportModule::updateDataSet (H5::DataSet& dset, int rank, hsize_t* dim, hsize_t* offset, H5::DataType type, const void* data)
1133{
1134 H5::DataSpace dspace = dset.getSpace();
1135 /* create hyperslab to update point data */
1136 dspace.selectHyperslab( H5S_SELECT_SET, dim, offset );
1137 H5::DataSpace mem_space(rank, dim, nullptr);
1138 dset.write(data, type, mem_space, dspace );
1139}
1140
1141#endif
1142
1143} // end namespace oofem
#define REGISTER_ExportModule(class)
Element * giveElement(int n)
Definition domain.C:165
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Definition element.C:1225
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
Definition element.h:886
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Definition element.C:1298
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.
Definition floatarray.h:261
void resizeWithValues(Index s, std::size_t allocChunk=0)
Definition floatarray.C:103
int & at(std::size_t i)
Definition intarray.h:104
int giveSize() const
Definition intarray.h:211
int giveNumberOfIntegrationPoints() const
double giveTargetTime()
Returns target time.
Definition timestep.h:164
virtual void exportIntVars(ExportRegion &piece, Set &region, IntArray &internalVarsToExport, NodalRecoveryModel &smoother, TimeStep *tStep)
virtual void setupVTKPiece(ExportRegion &vtkPiece, TimeStep *tStep, Set &region)
virtual void exportPrimaryVars(ExportRegion &piece, Set &region, 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.
std::unique_ptr< NodalRecoveryModel > primVarSmoother
Smoother for primary variables.
std::unique_ptr< NodalRecoveryModel > smoother
Smoother.
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).
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(...)
Definition error.h:80
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
const char * __InternalStateTypeToString(InternalStateType _value)
Definition cltypes.C:309
int giveInternalStateTypeSize(InternalStateValueType valType)
Definition cltypes.C:229
InternalStateValueType
Determines the type of internal variable.
const char * __UnknownTypeToString(UnknownType _value)
Definition cltypes.C:313
ClassFactory & classFactory
InternalStateValueType giveInternalStateValueType(InternalStateType type)
Definition cltypes.C:75
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define NULL_DEVICE
#define _IFT_VTKHDF5ExportModule_ipvars
#define _IFT_VTKHDF5ExportModule_vars
#define _IFT_VTKHDF5ExportModule_primvars
#define _IFT_VTKHDF5ExportModule_stype
#define _IFT_VTKHDF5ExportModule_externalForces
#define _IFT_VTKHDF5ExportModule_cellvars

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011