92 std::ofstream streamC;
97 streamC = std::ofstream(fileName);
100 if ( !streamC.good() ) {
101 OOFEM_ERROR(
"failed to open file %s", fileName.c_str() );
113 for (
int x = -1; x < 2; x++ ) {
114 for (
int y = -1; y < 2; y++ ) {
115 for (
int z = -1; z < 2; z++ ) {
116 if ( !( z == 0 && y == 0 && x == 0 ) ) {
117 if ( counter == location ) {
151 if ( numNodes > 0 && numRegionEl > 0 ) {
154 for (
int inode = 1; inode <= numNodes; inode++ ) {
155 if ( mapL2G.
at(inode) <= nnodes && mapL2G.
at(inode) != 0 ) {
158 }
else if ( mapL2G.
at(inode) > nnodes && mapL2G.
at(inode) <= numNodes && mapL2G.
at(inode) != 0 ) {
182 for (
int ei = 1; ei <= elems.
giveSize(); ei++ ) {
183 int elNum = elems.
at(ei);
203 for (
int ielnode = 1; ielnode <= 2; ielnode++ ) {
204 if ( loc.
at(ielnode) != 0 ) {
218 int numElNodes = cellNodes.
giveSize();
222 for (
int i = 1; i <= numElNodes; i++ ) {
223 connectivity.
at(i) = mapG2L.
at(cellNodes.
at(i) );
230 offset += numElNodes;
245 int numberOfElements = elements.
giveSize();
248 int numberOfCrossSectionNodes = 0;
251 crossSectionTable.
resize(numberOfElements);
252 int numberOfNodes = 0;
253 for (
int ie = 1; ie <= numberOfElements; ie++ ) {
268 crossSectionTable.
at(ie) = numberOfCrossSectionNodes;
269 numberOfNodes += numberOfCrossSectionNodes;
273 nodeTable.
resize(numberOfNodes, 3);
280 for (
int ie = 1; ie <= elements.
giveSize(); ie++ ) {
297 for (
int is = 0; is < numberOfCrossSectionNodes; is++ ) {
299 nodeTable.
at(nodeCounter, 1) = crossSectionCoordinates.
at(3 * is + 1);
300 nodeTable.
at(nodeCounter, 2) = crossSectionCoordinates.
at(3 * is + 2);
301 nodeTable.
at(nodeCounter, 3) = crossSectionCoordinates.
at(3 * is + 3);
305 if ( numberOfNodes > 0 && numberOfElements > 0 ) {
308 for (
int inode = 1; inode <= numberOfNodes; inode++ ) {
309 coords.
at(1) = nodeTable.
at(inode, 1);
310 coords.
at(2) = nodeTable.
at(inode, 2);
311 coords.
at(3) = nodeTable.
at(inode, 3);
325 for (
int ei = 1; ei <= numberOfElements; ei++ ) {
326 numElNodes = crossSectionTable.
at(ei);
328 connectivity.
resize(numElNodes);
329 for (
int i = 1; i <= numElNodes; i++ ) {
330 connectivity.
at(i) = offset + i;
335 offset += numElNodes;
366 current = localtime(& now);
368 this->
fileStreamCross <<
"<!-- 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";
369 this->
fileStreamCross <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
373 int anyPieceNonEmpty = 0;
375 for (
int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
386 if ( anyPieceNonEmpty == 0 ) {
388 this->
fileStreamCross <<
"<Piece NumberOfPoints=\"0\" NumberOfCells=\"0\">\n";
389 this->
fileStreamCross <<
"<Cells>\n<DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\"> </DataArray>\n</Cells>\n";
409 current = localtime(& now);
411 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";
413 this->
fileStream <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">\n";
419 int anyPieceNonEmpty = 0;
424 for (
int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
445 for (
int pieceNum = 1; pieceNum <= nPiecesToExport; pieceNum++ ) {
447 for (
int i = 1; i <= elements.
giveSize(); i++ ) {
466 if ( anyPieceNonEmpty == 0 ) {
468 this->
fileStream <<
"<Piece NumberOfPoints=\"0\" NumberOfCells=\"0\">\n";
469 this->
fileStream <<
"<Cells>\n<DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\"> </DataArray>\n</Cells>\n";
473 this->
fileStream <<
"</UnstructuredGrid>\n</VTKFile>";
484 int elementNode, node;
488 int regionDofMans = 0;
489 int regionSingleCells = 0;
494 for (
int ie = 1; ie <= elements.
giveSize(); ie++ ) {
500 for (
int ielnode = 1; ielnode <= 2; ielnode++ ) {
501 if ( loc.
at(ielnode) != 0 ) {
511 regionG2LNodalNumbers.
resize(nnodes + extraNodes);
512 regionG2LNodalNumbers.
zero();
524 for (
int ie = 1; ie <= elements.
giveSize(); ie++ ) {
525 int ielem = elements.
at(ie);
549 for ( elementNode = 1; elementNode <=
elemNodes; elementNode++ ) {
554 if ( loc.
at(elementNode) != 0 ) {
557 regionG2LNodalNumbers.
at(nnodes + totalNodes) = 1;
559 if ( regionG2LNodalNumbers.
at(node) == 0 ) {
563 regionG2LNodalNumbers.
at(node) = 1;
566 if ( regionG2LNodalNumbers.
at(nnodes) == 0 ) {
567 regionG2LNodalNumbers.
at(nnodes) = 1;
578 for (
int j = nnodes + 1; j <= nnodes + uniqueNodes; j++ ) {
582 if ( dx < 1e-9 && dy < 1e-9 && dz < 1e-9 ) {
588 if ( repeatFlag == 0 ) {
599 if ( regionG2LNodalNumbers.
at(node) == 0 ) {
603 regionG2LNodalNumbers.
at(node) = 1;
613 regionDofMans = nnodes + uniqueNodes;
618 regionL2GNodalNumbers.
resize(regionDofMans);
620 for (
int i = 1; i <= regionDofMans; i++ ) {
621 if ( regionG2LNodalNumbers.
at(i) ) {
622 regionG2LNodalNumbers.
at(i) = currOffset++;
623 regionL2GNodalNumbers.
at(regionG2LNodalNumbers.
at(i) ) = i;
659 for (
int inode = 1; inode <= mapL2G.
giveSize(); inode++ ) {
660 if ( inode <= nnodes && mapL2G.
at(inode) <= nnodes && mapL2G.
at(inode) != 0 ) {
668 if ( mapL2G.
at(inode) != 0 ) {
679 if ( type == DisplacementVector ) {
680 if ( dofIdArray.
giveSize() == 3 && dofIdArray.
at(1) == E_xx && dofIdArray.
at(2) == E_yy && dofIdArray.
at(3) == G_xy ) {
682 valueArray.
at(1) = helpArray.
at(1) + unitCellSize.at(1) * switches.
at(1) * macroField.
at(1);
683 valueArray.
at(2) = helpArray.
at(2) + unitCellSize.at(2) * switches.
at(2) * macroField.
at(2) + unitCellSize.at(1) * switches.
at(1) * macroField.
at(3);
684 valueArray.
at(3) = helpArray.
at(3);
685 }
else if ( dofIdArray.
giveSize() == 1 && dofIdArray.
at(1) == E_xx ) {
687 valueArray.
at(1) = helpArray.
at(1) + unitCellSize.at(1) * switches.
at(1) * macroField.
at(1);
688 valueArray.
at(2) = helpArray.
at(2);
689 valueArray.
at(3) = helpArray.
at(3);
690 }
else if ( dofIdArray.
giveSize() == 6 && dofIdArray.
at(1) == E_xx && dofIdArray.
at(2) == E_yy && dofIdArray.
at(3) == E_zz && dofIdArray.
at(4) == G_yz && dofIdArray.
at(5) == G_xz && dofIdArray.
at(6) == G_xy ) {
692 valueArray.
at(1) = helpArray.
at(1) + unitCellSize.at(1) * switches.
at(1) * macroField.
at(1) +
693 unitCellSize.at(3) * switches.
at(3) * macroField.
at(5) + unitCellSize.at(2) * switches.
at(2) * macroField.
at(6);
694 valueArray.
at(2) = helpArray.
at(2) + unitCellSize.at(2) * switches.
at(2) * macroField.
at(2) +
695 unitCellSize.at(3) * switches.
at(3) * macroField.
at(4);
696 valueArray.
at(3) = helpArray.
at(3) + unitCellSize.at(3) * switches.
at(3) * macroField.
at(3);
727 for (
int nodeNum = 1; nodeNum <= mapL2G.
giveSize(); nodeNum++ ) {
728 if ( nodeNum <= nnodes && mapL2G.
at(nodeNum) <= nnodes && mapL2G.
at(nodeNum) != 0 ) {
735 if ( mapL2G.
at(nodeNum) != 0 ) {
746 answer.
resize(ncomponents);
748 if ( isType == IST_BeamForceMomentTensor ) {
773 this->
fileStreamCross <<
"<Piece NumberOfPoints=\"" << numNodes <<
"\" NumberOfCells=\"" << numEl <<
"\">\n";
774 this->
fileStreamCross <<
"<Points>\n <DataArray type=\"Float64\" NumberOfComponents=\"3\" format=\"ascii\"> ";
776 for (
int inode = 1; inode <= numNodes; inode++ ) {
779 for (
int i = 1; i <= coords.
giveSize(); i++ ) {
783 for (
int i = coords.
giveSize() + 1; i <= 3; i++ ) {
790 this->
fileStreamCross <<
" <DataArray type=\"Int32\" Name=\"connectivity\" format=\"ascii\"> ";
793 for (
int ielem = 1; ielem <= numEl; ielem++ ) {
796 for (
int i = 1; i <= cellNodes.
giveSize(); i++ ) {
805 this->
fileStreamCross <<
" <DataArray type=\"Int32\" Name=\"offsets\" format=\"ascii\"> ";
807 for (
int ielem = 1; ielem <= numEl; ielem++ ) {
815 this->
fileStreamCross <<
" <DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\"> ";
816 for (
int ielem = 1; ielem <= numEl; ielem++ ) {
825 std::string pointHeader, cellHeader;
837 vtkPieceCross.
clear();
853 this->
fileStreamCross <<
" <DataArray type=\"Float64\" Name=\"" << name <<
"\" NumberOfComponents=\"" << ncomponents <<
"\" format=\"ascii\"> ";
854 valueArray.
resize(ncomponents);
855 for (
int ielem = 1; ielem <= numCells; ielem++ ) {
857 for (
int i = 1; i <= valueArray.
giveSize(); i++ ) {
863#ifdef _PYBIND_BINDINGS
867 for (
int ielem = 1; ielem <= numCells; ielem++ ) {
869 vals.append(valueArray);
871 this->Py_CellVars [ name ] = vals;
#define REGISTER_ExportModule(class)
int giveNumberOfDofs() const
void giveCompleteMasterDofIDArray(IntArray &dofIDArray) const
const FloatArray & giveCoordinates() const
Dof * giveDofWithID(int dofID) const
virtual double giveUnknown(ValueModeType mode, TimeStep *tStep)=0
int giveNumberOfDofManagers() const
Returns number of dof managers in domain.
Element * giveElement(int n)
Node * giveNode(int i) const
virtual const IntArray giveLocation()
virtual bool isActivated(TimeStep *tStep)
virtual int giveNumberOfNodes() const
elementParallelMode giveParallelMode() const
virtual void recalculateCoordinates(int nodeNumber, FloatArray &coords)
double timeScale
Scaling time in output, e.g. conversion from seconds to hours.
std::string giveOutputBaseFileName(TimeStep *tStep)
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.
void setInternalVarInNode(InternalStateType type, int nodeNum, FloatArray valueArray)
void setCellType(int cellNum, int type)
FloatArray & giveCellVar(InternalStateType type, int cellNum)
void setNumberOfInternalVarsToExport(const IntArray &ists, int numNodes)
FloatArray & giveNodeCoords(int nodeNum)
void setNumberOfPrimaryVarsToExport(const IntArray &primVars, int numNodes)
void setConnectivity(int cellNum, IntArray &nodes)
void setPrimaryVarInNode(UnknownType type, int nodeNum, FloatArray valueArray)
void setOffset(int cellNum, int offset)
IntArray & giveCellConnectivity(int cellNum)
void setNumberOfCells(int numCells)
int giveCellType(int cellNum)
int giveCellOffset(int cellNum)
void setNodeCoords(int nodeNum, const FloatArray &coords)
void setNumberOfNodes(int numNodes)
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void resize(Index rows, Index cols)
double at(std::size_t i, std::size_t j) const
void resizeWithValues(int n, int allocChunk=0)
void zero()
Sets all component to zero.
const IntArray & giveElementList()
double giveTargetTime()
Returns target time.
bool isElementComposite(Element *elem)
void exportCellVars(ExportRegion &piece, Set ®ion, IntArray &cellVarsToExport, TimeStep *tStep)
Exports cell variables (typically internal variables).
void giveElementCell(IntArray &answer, Element *elem)
void getNodalVariableFromIS(FloatArray &answer, Node *node, TimeStep *tStep, InternalStateType type, Set ®ion, NodalRecoveryModel &smoother)
int giveCellType(Element *element)
void getNodalVariableFromPrimaryField(FloatArray &answer, DofManager *dman, TimeStep *tStep, UnknownType type, Set ®ion, NodalRecoveryModel &smoother)
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.
IntArray primaryVarsToExport
List of primary unknowns to export.
NodalRecoveryModel * givePrimVarSmoother()
Returns the smoother for primary variables (nodal averaging).
std::ofstream giveOutputStream(TimeStep *tStep)
Returns the output stream for given solution step.
void exportCompositeElement(ExportRegion &vtkPiece, Element *el, TimeStep *tStep)
ExportRegion defaultVTKPiece
IntArray cellVarsToExport
List of cell data to export.
bool writeVTKPieceVariables(ExportRegion &vtkPiece, TimeStep *tStep)
std::vector< ExportRegion > defaultVTKPieces
bool writeVTKPieceProlog(ExportRegion &vtkPiece, TimeStep *tStep)
NodalRecoveryModel * giveSmoother()
Returns the internal smoother.
bool writeVTKPieceEpilog(ExportRegion &vtkPiece, TimeStep *tStep)
std::unique_ptr< NodalRecoveryModel > primVarSmoother
Smoother for primary variables.
bool crossSectionExportFlag
void initializeFrom(InputRecord &ir) override
Initializes receiver according to object description stored in input record.
bool writeVTKPieceCross(ExportRegion &vtkPiece, TimeStep *tStep)
void doOutputCross(TimeStep *tStep, bool forcedOutput=false)
void giveSwitches(IntArray &answer, int location)
void doOutputNormal(TimeStep *tStep, bool forcedOutput=false)
std::string giveOutputFileNameCross(TimeStep *tStep)
void doOutput(TimeStep *tStep, bool forcedOutput=false) override
IntArray regionToUniqueMap
std::ofstream giveOutputStreamCross(TimeStep *tStep)
int initRegionNodeNumbering(ExportRegion &piece, Domain *domain, TimeStep *tStep, Set ®ion) override
void setupVTKPieceCross(ExportRegion &vtkPiece, TimeStep *tStep, Set ®ion)
void writeCellVarsCross(ExportRegion &vtkPiece)
void exportPrimaryVars(ExportRegion &piece, Set ®ion, IntArray &primaryVarsToExport, NodalRecoveryModel &smoother, TimeStep *tStep) override
void setupVTKPiece(ExportRegion &vtkPiece, TimeStep *tStep, Set ®ion) override
void exportIntVars(ExportRegion &piece, Set ®ion, IntArray &internalVarsToExport, NodalRecoveryModel &smoother, TimeStep *tStep) override
std::ofstream fileStreamCross
FloatMatrix uniqueNodeTable
VTKXMLLatticeExportModule(int n, EngngModel *e)
Constructor. Creates empty Output Manager. By default all components are selected.
virtual ~VTKXMLLatticeExportModule()
Destructor.
ExportRegion defaultVTKPieceCross
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.
InternalStateValueType giveInternalStateValueType(InternalStateType type)
#define _IFT_VTKXMLLatticeExportModule_cross