ENH: Added finiteArea support to foamToVTK

This commit is contained in:
Andrew Heather
2017-11-21 16:33:33 +00:00
committed by Andrew Heather
parent a14eb71160
commit c2ff8ea99e
14 changed files with 316 additions and 88 deletions

View File

@ -26,6 +26,7 @@ License
#include "vtkWrite.H"
#include "dictionary.H"
#include "Time.H"
#include "areaFields.H"
#include "foamVtkInternalWriter.H"
#include "addToRunTimeSelectionTable.H"
@ -59,12 +60,6 @@ Foam::functionObjects::vtkWrite::vtkWrite
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::functionObjects::vtkWrite::~vtkWrite()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionObjects::vtkWrite::read(const dictionary& dict)
@ -125,21 +120,6 @@ bool Foam::functionObjects::vtkWrite::execute()
bool Foam::functionObjects::vtkWrite::write()
{
// Count number of fields to be written: only needed for legacy vtk format
label nFields = 0;
if (writeOpts_.legacy())
{
nFields =
(
(writeIds_ ? 1 : 0)
+ countFields<volScalarField>()
+ countFields<volVectorField>()
+ countFields<volSphericalTensorField>()
+ countFields<volSymmTensorField>()
+ countFields<volTensorField>()
);
}
// const word timeDesc =
// useTimeName ? time_.timeName() : Foam::name(time_.timeIndex());
@ -165,55 +145,72 @@ bool Foam::functionObjects::vtkWrite::write()
}
}
// Create file and write header
const fileName outputName
(
vtkDir/vtkName
+ "_"
+ timeDesc
);
Info<< name() << " output Time: " << time_.timeName() << nl
<< " Internal : " << outputName << endl;
vtk::vtuCells vtuMeshCells
(
mesh_,
writeOpts_,
true // decompose
);
// Write mesh
vtk::internalWriter writer
(
mesh_,
vtuMeshCells,
outputName,
writeOpts_
);
// CellData
// internal mesh
{
writer.beginCellData(nFields);
const fileName outputName
(
vtkDir/vtkName
+ "_"
+ timeDesc
);
// Write cellID field
if (writeIds_)
Info<< name() << " output Time: " << time_.timeName() << nl
<< " Internal : " << outputName << endl;
// Number of fields to be written: only needed for legacy vtk format
label nVolFields = 0;
if (writeOpts_.legacy())
{
writer.writeCellIDs();
nVolFields =
(
(writeIds_ ? 1 : 0)
+ countFields<volScalarField>()
+ countFields<volVectorField>()
+ countFields<volSphericalTensorField>()
+ countFields<volSymmTensorField>()
+ countFields<volTensorField>()
);
}
// Write volFields
writeFields<volScalarField>(writer);
writeFields<volVectorField>(writer);
writeFields<volSphericalTensorField>(writer);
writeFields<volSymmTensorField>(writer);
writeFields<volTensorField>(writer);
vtk::vtuCells vtuMeshCells
(
mesh_,
writeOpts_,
true // decompose
);
writer.endCellData();
// Write mesh
vtk::internalWriter writer
(
mesh_,
vtuMeshCells,
outputName,
writeOpts_
);
// CellData
{
writer.beginCellData(nVolFields);
// Write cellID field
if (writeIds_)
{
writer.writeCellIDs();
}
// Write volFields
writeFields<volScalarField>(writer);
writeFields<volVectorField>(writer);
writeFields<volSphericalTensorField>(writer);
writeFields<volSymmTensorField>(writer);
writeFields<volTensorField>(writer);
writer.endCellData();
}
writer.writeFooter();
}
writer.writeFooter();
return true;
}

View File

@ -77,6 +77,7 @@ SourceFiles
#include "fvMeshFunctionObject.H"
#include "foamVtkInternalWriter.H"
#include "foamVtkSurfaceMeshWriter.H"
#include "wordRes.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -121,6 +122,15 @@ class vtkWrite
label writeFields(vtk::internalWriter& writer, bool verbose=true) const;
//- Write selected fields for GeoField type.
template<class GeoField>
label writeFields
(
vtk::surfaceMeshWriter& writer,
bool verbose=true
) const;
//- Disallow default bitwise copy construct
vtkWrite(const vtkWrite&) = delete;
@ -146,7 +156,7 @@ public:
//- Destructor
virtual ~vtkWrite();
virtual ~vtkWrite() = default;
// Member Functions

View File

@ -58,4 +58,29 @@ Foam::functionObjects::vtkWrite::writeFields
}
template<class GeoField>
Foam::label
Foam::functionObjects::vtkWrite::writeFields
(
vtk::surfaceMeshWriter& writer,
bool verbose
) const
{
const wordList names = obr_.sortedNames<GeoField>(selectFields_);
if (verbose && names.size())
{
Info<< " " << GeoField::typeName
<< " " << flatOutput(names) << endl;
}
for (const word& fieldName : names)
{
writer.write(obr_.lookupObject<GeoField>(fieldName));
}
return names.size();
}
// ************************************************************************* //