65 #include <vtkPoints.h>
66 #include <vtkPointData.h>
67 #include <vtkDoubleArray.h>
68 #include <vtkCellArray.h>
69 #include <vtkCellData.h>
70 #include <vtkXMLUnstructuredGridWriter.h>
71 #include <vtkXMLPUnstructuredGridWriter.h>
72 #include <vtkUnstructuredGrid.h>
73 #include <vtkSmartPointer.h>
133 std::ofstream streamF;
138 streamF = std::ofstream(fileName);
141 if ( !streamF.good() ) {
142 OOFEM_ERROR(
"failed to open file %s", fileName.c_str() );
158 this->
fileStream = vtkSmartPointer< vtkUnstructuredGrid >::New();
159 this->nodes = vtkSmartPointer< vtkPoints >::New();
160 this->elemNodeArray = vtkSmartPointer< vtkIdList >::New();
167 current = localtime(& now);
173 this->
fileStream <<
"<!-- TimeStep " << tStep->
giveTargetTime() *
timeScale <<
" Computed " << current->tm_year + 1900 <<
"-" << setw(2) << current->tm_mon + 1 <<
"-" << setw(2) << current->tm_mday <<
" at " << current->tm_hour <<
":" << current->tm_min <<
":" << setw(2) << current->tm_sec <<
" -->\n";
174 this->
fileStream <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
185 int anyPieceNonEmpty = 0;
189 for (
int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
214 for (
int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
216 for (
int i = 1; i <= elements.
giveSize(); i++ ) {
241 if ( anyPieceNonEmpty == 0 ) {
243 this->
fileStream <<
"<Piece NumberOfPoints=\"0\" NumberOfCells=\"0\">\n";
244 this->
fileStream <<
"<Cells>\n<DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\"> </DataArray>\n</Cells>\n";
258 vtkSmartPointer< vtkXMLPUnstructuredGridWriter >writer = vtkSmartPointer< vtkXMLPUnstructuredGridWriter >::New();
260 writer->SetNumberOfPieces(this->
emodel->giveNumberOfProcesses() );
261 writer->SetStartPiece(this->
emodel->giveRank() );
262 writer->SetEndPiece(this->
emodel->giveRank() );
266 vtkSmartPointer< vtkXMLUnstructuredGridWriter >writer = vtkSmartPointer< vtkXMLUnstructuredGridWriter >::New();
269 writer->SetFileName(fname.c_str() );
275 writer->SetDataModeToAscii();
278 this->
fileStream <<
"</UnstructuredGrid>\n</VTKFile>";
288 std::ostringstream pvdEntry;
289 std::stringstream subStep;
301 if (
emodel->isParallel() &&
emodel->giveRank() == 0 ) {
304 for (
int i = 0; i < this->
emodel->giveNumberOfProcesses(); ++i ) {
305 std::ostringstream pvdEntry;
306 std::stringstream subStep;
308 if ( this->
emodel->giveNumberOfProcesses() > 1 ) {
316 pvdEntry <<
"<DataSet timestep=\"" << tStep->
giveTargetTime() * this->
timeScale << subStep.str() <<
"\" group=\"\" part=\"" << i <<
"\" file=\"" << this->
emodel->giveOutputBaseFileName() << fext <<
".vtu\"/>";
317 this->
pvdBuffer.push_back(pvdEntry.str() );
322 std::ostringstream pvdEntry;
323 std::stringstream subStep;
327 pvdEntry <<
"<DataSet timestep=\"" << tStep->
giveTargetTime() * this->
timeScale << subStep.str() <<
"\" group=\"\" part=\"\" file=\"" << fname <<
"\"/>";
328 this->
pvdBuffer.push_back(pvdEntry.str() );
352 for (
int inode = 1; inode <= numNodes; inode++ ) {
355 for (
int i = 1; i <= coords.
giveSize(); i++ ) {
356 vtkCoords.
at(i) = coords.
at(i);
359 this->nodes->InsertNextPoint(vtkCoords.
at(1), vtkCoords.
at(2), vtkCoords.
at(3) );
364 this->
fileStream <<
"<Piece NumberOfPoints=\"" << numNodes <<
"\" NumberOfCells=\"" << numEl <<
"\">\n";
365 this->
fileStream <<
"<Points>\n <DataArray type=\"Float64\" NumberOfComponents=\"3\" format=\"ascii\"> ";
367 for (
int inode = 1; inode <= numNodes; inode++ ) {
370 for (
int i = 1; i <= coords.
giveSize(); i++ ) {
374 for (
int i = coords.
giveSize() + 1; i <= 3; i++ ) {
379 this->
fileStream <<
"</DataArray>\n</Points>\n";
390 this->
fileStream <<
" <DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\"> ";
393 for (
int ielem = 1; ielem <= numEl; ielem++ ) {
397 elemNodeArray->Reset();
398 elemNodeArray->SetNumberOfIds(cellNodes.
giveSize() );
400 for (
int i = 1; i <= cellNodes.
giveSize(); i++ ) {
402 elemNodeArray->SetId(i - 1, cellNodes.
at(i) - 1);
419 this->
fileStream <<
" <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\"> ";
421 for (
int ielem = 1; ielem <= numEl; ielem++ ) {
429 this->
fileStream <<
" <DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\"> ";
430 for (
int ielem = 1; ielem <= numEl; ielem++ ) {
470 std::string pointHeader, cellHeader;
505 std::string scalars, vectors, tensors;
509 if ( type == DisplacementVector || type == EigenVector || type == VelocityVector || type == DirectorField || type == MacroSlipVector || type == ResidualForce ) {
512 }
else if ( type == FluxVector || type == PressureVector || type == Temperature || type == Humidity || type == DeplanationFunction || type == Concentration) {
540 if ( type == DisplacementVector || type == VelocityVector || type == DirectorField ) {
543 }
else if ( type == FluxVector || type == PressureVector || type == Temperature || type == Humidity ) {
552 scalars.append(
"VertexSetMembership ");
555 pointHeader =
"<PointData Scalars=\"" + scalars +
"\" "
556 +
"Vectors=\"" + vectors +
"\" "
557 +
"Tensors=\"" + tensors +
"\" >\n";
582 vectors.append(
"CellSetMembership ");
586 cellHeader =
"<CellData Scalars=\"" + scalars +
"\" "
587 +
"Vectors=\"" + vectors +
"\" "
588 +
"Tensors=\"" + tensors +
"\" >\n";
597 for (
int i = 1; i <= n; i++ ) {
606 ncomponents = valueArray.
giveSize();
607 ( void ) ncomponents;
611 vtkSmartPointer< vtkDoubleArray >varArray = vtkSmartPointer< vtkDoubleArray >::New();
612 varArray->SetName(name);
613 varArray->SetNumberOfComponents(ncomponents);
614 varArray->SetNumberOfTuples(numNodes);
616 for (
int inode = 1; inode <= numNodes; inode++ ) {
618 for (
int i = 1; i <= ncomponents; ++i ) {
619 varArray->SetComponent(inode - 1, i - 1, valueArray.
at(i) );
627 this->
fileStream <<
" <DataArray type=\"Float64\" Name=\"" << name <<
"\" NumberOfComponents=\"" << ncomponents <<
"\" format=\"ascii\"> ";
628 for (
int inode = 1; inode <= numNodes; inode++ ) {
652 int ncomponents = varArray->GetNumberOfComponents();
653 switch ( ncomponents ) {
655 this->fileStream->GetPointData()->SetActiveScalars(name);
656 this->fileStream->GetPointData()->SetScalars(varArray);
659 this->fileStream->GetPointData()->SetActiveVectors(name);
660 this->fileStream->GetPointData()->SetVectors(varArray);
663 this->fileStream->GetPointData()->SetActiveTensors(name);
664 this->fileStream->GetPointData()->SetTensors(varArray);
673 for (
int i = 1; i <= valueArray.
giveSize(); i++ ) {
674 this->
fileStream << scientific << valueArray.
at(i) <<
" ";
685 int ncomponents = varArray->GetNumberOfComponents();
686 switch ( ncomponents ) {
688 this->fileStream->GetCellData()->SetActiveScalars(name);
689 this->fileStream->GetCellData()->SetScalars(varArray);
692 this->fileStream->GetCellData()->SetActiveVectors(name);
693 this->fileStream->GetCellData()->SetVectors(varArray);
696 this->fileStream->GetCellData()->SetActiveTensors(name);
697 this->fileStream->GetCellData()->SetTensors(varArray);
708 for (
int i = 1; i <= valueArray.
giveSize(); i++ ) {
722 ( void ) ncomponents;
729 vtkSmartPointer< vtkDoubleArray >varArray = vtkSmartPointer< vtkDoubleArray >::New();
730 varArray->SetName(name);
731 varArray->SetNumberOfComponents(ncomponents);
732 varArray->SetNumberOfTuples(numNodes);
734 for (
int inode = 1; inode <= numNodes; inode++ ) {
736 for (
int j = 1; j <= ncomponents; ++j ) {
737 varArray->SetComponent(inode - 1, j - 1, valueArray.
at(j) );
744 this->
fileStream <<
" <DataArray type=\"Float64\" Name=\"" << name <<
"\" NumberOfComponents=\"" << ncomponents <<
"\" format=\"ascii\"> ";
745 for (
int inode = 1; inode <= numNodes; inode++ ) {
763 ( void ) ncomponents;
769 vtkSmartPointer< vtkDoubleArray >varArray = vtkSmartPointer< vtkDoubleArray >::New();
770 varArray->SetName(name.c_str() );
771 varArray->SetNumberOfComponents(ncomponents);
772 varArray->SetNumberOfTuples(numNodes);
774 for (
int inode = 1; inode <= numNodes; inode++ ) {
776 for (
int j = 1; j <= ncomponents; ++j ) {
777 varArray->SetComponent(inode - 1, j - 1, valueArray.
at(j) );
784 this->
fileStream <<
" <DataArray type=\"Float64\" Name=\"" << name <<
"\" NumberOfComponents=\"" << ncomponents <<
"\" format=\"ascii\"> ";
785 for (
int inode = 1; inode <= numNodes; inode++ ) {
799 this->
fileStream <<
"<DataArray type=\"UInt8\" Name=\"" <<
"VertexSetMembership" <<
"\" NumberOfComponents=\"" << numSetGroups <<
"\" format=\"ascii\"> ";
802 for (
auto val : setMembership ) {
803 this->fileStream << static_cast<int>(val) <<
" ";
816 this->
fileStream <<
"<DataArray type=\"UInt8\" Name=\"" <<
"CellSetMembership" <<
"\" NumberOfComponents=\"" << numSetGroups <<
"\" format=\"ascii\"> ";
819 for (
auto val : setMembership ) {
820 this->fileStream << static_cast<int>(val) <<
" ";
842 vtkSmartPointer< vtkDoubleArray >cellVarsArray = vtkSmartPointer< vtkDoubleArray >::New();
843 cellVarsArray->SetName(name);
844 cellVarsArray->SetNumberOfComponents(ncomponents);
845 cellVarsArray->SetNumberOfTuples(numCells);
846 for (
int ielem = 1; ielem <= numCells; ielem++ ) {
848 for (
int i = 1; i <= ncomponents; ++i ) {
849 cellVarsArray->SetComponent(ielem - 1, i - 1, valueArray.
at(i) );
856 this->
fileStream <<
" <DataArray type=\"Float64\" Name=\"" << name <<
"\" NumberOfComponents=\"" << ncomponents <<
"\" format=\"ascii\"> ";
857 valueArray.
resize(ncomponents);
858 for (
int ielem = 1; ielem <= numCells; ielem++ ) {
874 current = localtime(& now);
879 fname = this->
emodel->giveOutputBaseFileName() +
".m" + std::to_string(this->
number) +
".substep.pvd";
881 fname = this->
emodel->giveOutputBaseFileName() +
".m" + std::to_string(this->
number) +
".pvd";
884 std::ofstream streamP;
888 streamP = std::ofstream(fname.c_str() );
891 if ( !streamP.good() ) {
892 OOFEM_ERROR(
"failed to open file %s", fname.c_str() );
895 sprintf(buff,
"<!-- Computation started %d-%02d-%02d at %02d:%02d:%02d -->\n", current->tm_year + 1900, current->tm_mon + 1, current->tm_mday, current->tm_hour, current->tm_min, current->tm_sec);
898 streamP <<
"<?xml version=\"1.0\"?>\n<VTKFile type=\"Collection\" version=\"0.1\">\n<Collection>\n";
900 streamP << pvd <<
"\n";
903 streamP <<
"</Collection>\n</VTKFile>";
916 current = localtime(& now);
921 fname = this->
emodel->giveOutputBaseFileName() +
".m" + std::to_string(this->
number) +
".substep.gp.pvd";
923 fname = this->
emodel->giveOutputBaseFileName() +
".m" + std::to_string(this->
number) +
".gp.pvd";
926 std::ofstream outfile(fname.c_str() );
928 sprintf(buff,
"<!-- Computation started %d-%02d-%02d at %02d:%02d:%02d -->\n", current->tm_year + 1900, current->tm_mon + 1, current->tm_mday, current->tm_hour, current->tm_min, current->tm_sec);
931 outfile <<
"<?xml version=\"1.0\"?>\n<VTKFile type=\"Collection\" version=\"0.1\">\n<Collection>\n";
933 outfile << pvd <<
"\n";
936 outfile <<
"</Collection>\n</VTKFile>";
1000 std::ofstream stream;
1003 std::string scalars, vectors, tensors;
1009 std::ofstream streamG;
1013 streamG = std::ofstream(outputFileName);
1016 if ( !streamG.good() ) {
1017 OOFEM_ERROR(
"failed to open file %s", outputFileName.c_str() );
1020 streamG <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
1021 streamG <<
"<UnstructuredGrid>\n";
1024 for (
int ireg = 1; ireg <= nregions; ireg++ ) {
1027 for (
int i = 1; i <= elements.
giveSize(); i++ ) {
1032 streamG <<
"<Piece NumberOfPoints=\"" << nip <<
"\" NumberOfCells=\"" << nip <<
"\">\n";
1033 streamG <<
"<Points>\n <DataArray type=\"Float64\" NumberOfComponents=\"3\" format=\"ascii\"> ";
1034 for (
int i = 1; i <= elements.
giveSize(); i++ ) {
1035 int ielem = elements.
at(i);
1039 for (
double c :
gc ) {
1041 streamG << scientific << c <<
" ";
1044 for (
int k =
gc.giveSize() + 1; k <= 3; k++ ) {
1045 streamG << scientific << 0.0 <<
" ";
1050 streamG <<
" </DataArray>\n";
1051 streamG <<
"</Points>\n";
1052 streamG <<
"<Cells>\n";
1053 streamG <<
" <DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\">";
1054 for (
int j = 0; j < nip; j++ ) {
1055 streamG << j <<
" ";
1058 streamG <<
" </DataArray>\n";
1059 streamG <<
" <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\">";
1060 for (
int j = 1; j <= nip; j++ ) {
1061 streamG << j <<
" ";
1064 streamG <<
" </DataArray>\n";
1065 streamG <<
" <DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\">";
1066 for (
int j = 1; j <= nip; j++ ) {
1070 streamG <<
" </DataArray>\n";
1071 streamG <<
"</Cells>\n";
1073 for (
int vi = 1; vi <= valIDs.
giveSize(); vi++ ) {
1079 scalars.append(
" ");
1082 vectors.append(
" ");
1085 tensors.append(
" ");
1092 streamG <<
"<PointData Scalars=\"" << scalars.c_str() <<
"\" Vectors=\"" << vectors.c_str() <<
"\" Tensors=\"" << tensors.c_str() <<
"\" >\n";
1098 for (
int vi = 1; vi <= valIDs.
giveSize(); vi++ ) {
1105 if ( isttype == IST_BeamForceMomentTensor ) {
1114 streamG <<
" <DataArray type=\"Float64\" Name=\"" <<
__InternalStateTypeToString(isttype) <<
"\" NumberOfComponents=\"" << nc <<
"\" format=\"ascii\">";
1115 for (
int i = 1; i <= elements.
giveSize(); i++ ) {
1116 int ielem = elements.
at(i);
1124 if ( isttype == IST_BeamForceMomentTensor ) {
1134 for (
double v : value ) {
1136 streamG << scientific << v <<
" ";
1141 streamG <<
" </DataArray>\n";
1143 streamG <<
"</PointData>\n</Piece>\n";
1146 streamG <<
"</UnstructuredGrid>\n";
1147 streamG <<
"</VTKFile>\n";
#define REGISTER_ExportModule(class)
Element * giveElement(int n)
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
elementParallelMode giveParallelMode() const
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
double timeScale
Scaling time in output, e.g. conversion from seconds to hours.
bool tstep_substeps_out_flag
std::string giveOutputBaseFileName(TimeStep *tStep)
int number
Component number.
virtual void initializeFrom(InputRecord &ir)
Initializes receiver according to object description stored in input record.
bool pythonExport
Output is carried out as a python list instead of writing files.
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 & givePrimaryVarInNode(UnknownType type, int nodeNum)
FloatArray & giveInternalVarInNode(InternalStateType type, int nodeNum)
FloatArray & giveLoadInNode(int varNum, int nodeNum)
FloatArray & giveCellVar(InternalStateType type, int cellNum)
const std::vector< setMembershipGroupType > & getCellSetMembershipGroup(int icell)
int giveNumberOfSetGroups()
FloatArray & giveNodeCoords(int nodeNum)
const std::vector< setMembershipGroupType > & getVertexSetMembershipGroup(int inode)
IntArray & giveCellConnectivity(int cellNum)
int giveCellType(int cellNum)
int giveCellOffset(int cellNum)
virtual Interface * giveInterface(InterfaceType t)
Index giveSize() const
Returns the size of receiver.
void resizeWithValues(Index s, std::size_t allocChunk=0)
void zero()
Zeroes all coefficients of receiver.
int giveNumberOfIntegrationPoints() const
double giveTargetTime()
Returns target time.
int giveNumber()
Returns receiver's number.
int giveSubStepNumber()
Returns receiver's substep number.
void exportSetMembership(ExportRegion &piece, Set ®ion, TimeStep *tStep)
bool isElementComposite(Element *elem)
void exportCellVars(ExportRegion &piece, Set ®ion, IntArray &cellVarsToExport, TimeStep *tStep)
Exports cell variables (typically internal variables).
void initialize() override
static void makeFullTensorForm(FloatArray &answer, const FloatArray &reducedForm, InternalStateValueType vtype)
Gives the full form of given symmetrically stored tensors, missing components are filled with zeros.
virtual void exportIntVars(ExportRegion &piece, Set ®ion, IntArray &internalVarsToExport, NodalRecoveryModel &smoother, TimeStep *tStep)
void exportExternalForces(ExportRegion &piece, int region, TimeStep *tStep)
virtual void setupVTKPiece(ExportRegion &vtkPiece, TimeStep *tStep, Set ®ion)
virtual void exportPrimaryVars(ExportRegion &piece, Set ®ion, IntArray &primaryVarsToExport, NodalRecoveryModel &smoother, TimeStep *tStep)
virtual ~VTKXMLExportModule()
Destructor.
std::list< std::string > pvdBuffer
Buffer for earlier time steps exported to *.pvd file.
NodalRecoveryModel::NodalRecoveryModelType stype
Smoother type.
virtual void giveDataHeaders(std::string &pointHeader, std::string &cellHeader)
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.
std::unique_ptr< NodalRecoveryModel > smoother
Smoother.
void writeIntVars(ExportRegion &vtkPiece)
void exportIntVarsInGpAs(IntArray valIDs, TimeStep *tStep)
void writeExternalForces(ExportRegion &vtkPiece)
IntArray externalForcesToExport
List of primary unknowns to export.
IntArray primaryVarsToExport
List of primary unknowns to export.
IntArray ipInternalVarsToExport
List of internal variables to export directly in Integration Points (no smoothing to nodes).
std::string giveOutputFileName(TimeStep *tStep)
Returns the filename for the given time step.
NodalRecoveryModel * givePrimVarSmoother()
Returns the smoother for primary variables (nodal averaging).
std::list< std::string > gpPvdBuffer
Buffer for earlier time steps with gauss points exported to *.gp.pvd file.
std::ofstream giveOutputStream(TimeStep *tStep)
Returns the output stream for given solution step.
void writeVertexSetMembership(ExportRegion &vtkPiece)
void exportCompositeElement(ExportRegion &vtkPiece, Element *el, TimeStep *tStep)
ExportRegion defaultVTKPiece
VTKXMLExportModule(int n, EngngModel *e)
Constructor. Creates empty Output Manager. By default all components are selected.
void writeVTKPointData(FloatArray &valueArray)
IntArray cellVarsToExport
List of cell data to export.
bool writeVTKPieceVariables(ExportRegion &vtkPiece, TimeStep *tStep)
void terminate() override
void writeVTKCellData(FloatArray &valueArray)
void initialize() override
void writeCellSetMembership(ExportRegion &vtkPiece)
void doOutput(TimeStep *tStep, bool forcedOutput=false) override
bool exportSetMembershipFlag
Flag whether to export setMembership (byte encoded array).
void writePrimaryVars(ExportRegion &vtkPiece)
std::vector< ExportRegion > defaultVTKPieces
void writeGPVTKCollection()
Writes a VTK collection file for Gauss points.
bool writeVTKPieceProlog(ExportRegion &vtkPiece, TimeStep *tStep)
NodalRecoveryModel * giveSmoother()
Returns the internal smoother.
bool writeVTKPieceEpilog(ExportRegion &vtkPiece, TimeStep *tStep)
void writeVTKCollection()
void writeCellVars(ExportRegion &vtkPiece)
std::unique_ptr< NodalRecoveryModel > primVarSmoother
Smoother for primary variables.
#define OOFEM_WARNING(...)
const char * __InternalStateTypeToString(InternalStateType _value)
@ Element_local
Element is local, there are no contributions from other domains to this element.
int giveInternalStateTypeSize(InternalStateValueType valType)
InternalStateValueType
Determines the type of internal variable.
@ ISVT_TENSOR_S3E
symmetric 3x3 tensor, packed with off diagonal components multiplied by 2 (engineering strain vector,...
@ ISVT_TENSOR_S3
Symmetric 3x3 tensor.
@ ISVT_TENSOR_G
General tensor.
const char * __UnknownTypeToString(UnknownType _value)
ClassFactory & classFactory
@ VTKXMLExportModuleElementInterfaceType
InternalStateValueType giveInternalStateValueType(InternalStateType type)
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define _IFT_VTKXMLExportModule_ipvars
#define _IFT_VTKXMLExportModule_vars
#define _IFT_VTKXMLExportModule_externalForces
#define _IFT_VTKXMLExportModule_primvars
#define _IFT_VTKXMLExportModule_cellvars
#define _IFT_VTKXMLExportModule_stype
#define _IFT_VTKXMLExportModule_exportSetMembershipFlag