mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: improved sample surfaces and surface writers (#1206)
- The writers have changed from being a generic state-less set of routines to more properly conforming to the normal notion of a writer. These changes allow us to combine output fields (eg, in a single VTK/vtp file for each timestep). Parallel data reduction and any associated bookkeeping is now part of the surface writers. This improves their re-usability and avoids unnecessary and premature data reduction at the sampling stage. It is now possible to have different output formats on a per-surface basis. - A new feature of the surface sampling is the ability to "store" the sampled surfaces and fields onto a registry for reuse by other function objects. Additionally, the "store" can be triggered at the execution phase as well
This commit is contained in:
committed by
Andrew Heather
parent
16bc63864e
commit
181c974b11
@ -8,7 +8,6 @@
|
|||||||
#include "wedgePolyPatch.H"
|
#include "wedgePolyPatch.H"
|
||||||
#include "unitConversion.H"
|
#include "unitConversion.H"
|
||||||
#include "polyMeshTetDecomposition.H"
|
#include "polyMeshTetDecomposition.H"
|
||||||
#include "surfaceWriter.H"
|
|
||||||
#include "checkTools.H"
|
#include "checkTools.H"
|
||||||
#include "functionObject.H"
|
#include "functionObject.H"
|
||||||
|
|
||||||
@ -482,7 +481,7 @@ Foam::label Foam::checkGeometry
|
|||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const bool allGeometry,
|
const bool allGeometry,
|
||||||
const autoPtr<surfaceWriter>& surfWriter,
|
autoPtr<surfaceWriter>& surfWriter,
|
||||||
const autoPtr<writer<scalar>>& setWriter
|
const autoPtr<writer<scalar>>& setWriter
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -542,7 +541,7 @@ Foam::label Foam::checkGeometry
|
|||||||
nonAlignedPoints.write();
|
nonAlignedPoints.write();
|
||||||
if (setWriter.valid())
|
if (setWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(setWriter(), nonAlignedPoints);
|
mergeAndWrite(*setWriter, nonAlignedPoints);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -576,7 +575,7 @@ Foam::label Foam::checkGeometry
|
|||||||
cells.write();
|
cells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), cells);
|
mergeAndWrite(*surfWriter, cells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -592,7 +591,7 @@ Foam::label Foam::checkGeometry
|
|||||||
aspectCells.write();
|
aspectCells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), aspectCells);
|
mergeAndWrite(*surfWriter, aspectCells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -613,7 +612,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -635,7 +634,7 @@ Foam::label Foam::checkGeometry
|
|||||||
cells.write();
|
cells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), cells);
|
mergeAndWrite(*surfWriter, cells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -658,7 +657,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -680,7 +679,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -702,7 +701,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -726,7 +725,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -759,7 +758,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -784,7 +783,7 @@ Foam::label Foam::checkGeometry
|
|||||||
points.write();
|
points.write();
|
||||||
if (setWriter.valid())
|
if (setWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(setWriter(), points);
|
mergeAndWrite(*setWriter, points);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -807,7 +806,7 @@ Foam::label Foam::checkGeometry
|
|||||||
nearPoints.write();
|
nearPoints.write();
|
||||||
if (setWriter.valid())
|
if (setWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(setWriter(), nearPoints);
|
mergeAndWrite(*setWriter, nearPoints);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -831,7 +830,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -854,7 +853,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -875,7 +874,7 @@ Foam::label Foam::checkGeometry
|
|||||||
cells.write();
|
cells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), cells);
|
mergeAndWrite(*surfWriter, cells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -895,7 +894,7 @@ Foam::label Foam::checkGeometry
|
|||||||
cells.write();
|
cells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), cells);
|
mergeAndWrite(*surfWriter, cells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -916,7 +915,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -937,7 +936,7 @@ Foam::label Foam::checkGeometry
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -952,14 +951,10 @@ Foam::label Foam::checkGeometry
|
|||||||
autoPtr<surfaceWriter> patchWriter;
|
autoPtr<surfaceWriter> patchWriter;
|
||||||
if (!surfWriter.valid())
|
if (!surfWriter.valid())
|
||||||
{
|
{
|
||||||
patchWriter.reset(new vtkSurfaceWriter());
|
patchWriter.reset(new surfaceWriters::vtkWriter());
|
||||||
}
|
}
|
||||||
const surfaceWriter& wr =
|
|
||||||
(
|
surfaceWriter& wr = (surfWriter.valid() ? *surfWriter : *patchWriter);
|
||||||
surfWriter.valid()
|
|
||||||
? surfWriter()
|
|
||||||
: patchWriter()
|
|
||||||
);
|
|
||||||
|
|
||||||
// Currently only do AMI checks
|
// Currently only do AMI checks
|
||||||
|
|
||||||
@ -1017,22 +1012,22 @@ Foam::label Foam::checkGeometry
|
|||||||
|
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
wr.write
|
const word fName
|
||||||
(
|
(
|
||||||
outputDir,
|
"patch" + Foam::name(cpp.index())
|
||||||
(
|
+ "-src_" + tmName
|
||||||
"patch" + Foam::name(cpp.index())
|
|
||||||
+ "-src_" + tmName
|
|
||||||
),
|
|
||||||
meshedSurfRef
|
|
||||||
(
|
|
||||||
mergedPoints,
|
|
||||||
mergedFaces
|
|
||||||
),
|
|
||||||
"weightsSum",
|
|
||||||
mergedWeights,
|
|
||||||
false
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
wr.open
|
||||||
|
(
|
||||||
|
mergedPoints,
|
||||||
|
mergedFaces,
|
||||||
|
(outputDir / fName),
|
||||||
|
false // serial - already merged
|
||||||
|
);
|
||||||
|
|
||||||
|
wr.write("weightsSum", mergedWeights);
|
||||||
|
wr.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isA<cyclicACMIPolyPatch>(pbm[patchi]))
|
if (isA<cyclicACMIPolyPatch>(pbm[patchi]))
|
||||||
@ -1049,22 +1044,22 @@ Foam::label Foam::checkGeometry
|
|||||||
|
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
wr.write
|
const word fName
|
||||||
(
|
(
|
||||||
outputDir,
|
"patch" + Foam::name(cpp.index())
|
||||||
(
|
+ "-src_" + tmName
|
||||||
"patch" + Foam::name(cpp.index())
|
|
||||||
+ "-src_" + tmName
|
|
||||||
),
|
|
||||||
meshedSurfRef
|
|
||||||
(
|
|
||||||
mergedPoints,
|
|
||||||
mergedFaces
|
|
||||||
),
|
|
||||||
"mask",
|
|
||||||
mergedMask,
|
|
||||||
false
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
wr.open
|
||||||
|
(
|
||||||
|
mergedPoints,
|
||||||
|
mergedFaces,
|
||||||
|
(outputDir / fName),
|
||||||
|
false // serial - already merged
|
||||||
|
);
|
||||||
|
|
||||||
|
wr.write("mask", mergedMask);
|
||||||
|
wr.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1101,22 +1096,22 @@ Foam::label Foam::checkGeometry
|
|||||||
|
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
wr.write
|
const word fName
|
||||||
(
|
(
|
||||||
outputDir,
|
"patch" + Foam::name(cpp.index())
|
||||||
(
|
+ "-tgt_" + tmName
|
||||||
"patch" + Foam::name(cpp.index())
|
|
||||||
+ "-tgt_" + tmName
|
|
||||||
),
|
|
||||||
meshedSurfRef
|
|
||||||
(
|
|
||||||
mergedPoints,
|
|
||||||
mergedFaces
|
|
||||||
),
|
|
||||||
"weightsSum",
|
|
||||||
mergedWeights,
|
|
||||||
false
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
wr.open
|
||||||
|
(
|
||||||
|
mergedPoints,
|
||||||
|
mergedFaces,
|
||||||
|
(outputDir / fName),
|
||||||
|
false // serial - already merged
|
||||||
|
);
|
||||||
|
|
||||||
|
wr.write("weightsSum", mergedWeights);
|
||||||
|
wr.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isA<cyclicACMIPolyPatch>(pbm[patchi]))
|
if (isA<cyclicACMIPolyPatch>(pbm[patchi]))
|
||||||
@ -1129,24 +1124,25 @@ Foam::label Foam::checkGeometry
|
|||||||
pp.neighbPatch().mask(),
|
pp.neighbPatch().mask(),
|
||||||
mergedMask
|
mergedMask
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
wr.write
|
const word fName
|
||||||
(
|
(
|
||||||
outputDir,
|
"patch" + Foam::name(cpp.index())
|
||||||
(
|
+ "-tgt_" + tmName
|
||||||
"patch" + Foam::name(cpp.index())
|
|
||||||
+ "-tgt_" + tmName
|
|
||||||
),
|
|
||||||
meshedSurfRef
|
|
||||||
(
|
|
||||||
mergedPoints,
|
|
||||||
mergedFaces
|
|
||||||
),
|
|
||||||
"mask",
|
|
||||||
mergedMask,
|
|
||||||
false
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
wr.open
|
||||||
|
(
|
||||||
|
mergedPoints,
|
||||||
|
mergedFaces,
|
||||||
|
(outputDir / fName),
|
||||||
|
false // serial - already merged
|
||||||
|
);
|
||||||
|
|
||||||
|
wr.write("mask", mergedMask);
|
||||||
|
wr.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,7 +27,7 @@ namespace Foam
|
|||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const bool allGeometry,
|
const bool allGeometry,
|
||||||
const autoPtr<surfaceWriter>&,
|
autoPtr<surfaceWriter>& surfWriter,
|
||||||
const autoPtr<writer<scalar>>&
|
const autoPtr<writer<scalar>>& setWriter
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2017 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -67,8 +67,8 @@ Usage
|
|||||||
#include "Time.H"
|
#include "Time.H"
|
||||||
#include "fvMesh.H"
|
#include "fvMesh.H"
|
||||||
#include "globalMeshData.H"
|
#include "globalMeshData.H"
|
||||||
#include "surfaceWriter.H"
|
|
||||||
#include "vtkSetWriter.H"
|
#include "vtkSetWriter.H"
|
||||||
|
#include "vtkSurfaceWriter.H"
|
||||||
#include "IOdictionary.H"
|
#include "IOdictionary.H"
|
||||||
|
|
||||||
#include "checkTools.H"
|
#include "checkTools.H"
|
||||||
@ -149,16 +149,19 @@ int main(int argc, char *argv[])
|
|||||||
);
|
);
|
||||||
if (!writeFields && args.found("writeAllFields"))
|
if (!writeFields && args.found("writeAllFields"))
|
||||||
{
|
{
|
||||||
selectedFields.insert("nonOrthoAngle");
|
selectedFields.insert
|
||||||
selectedFields.insert("faceWeight");
|
({
|
||||||
selectedFields.insert("skewness");
|
"nonOrthoAngle",
|
||||||
selectedFields.insert("cellDeterminant");
|
"faceWeight",
|
||||||
selectedFields.insert("aspectRatio");
|
"skewness",
|
||||||
selectedFields.insert("cellShapes");
|
"cellDeterminant",
|
||||||
selectedFields.insert("cellVolume");
|
"aspectRatio",
|
||||||
selectedFields.insert("cellVolumeRatio");
|
"cellShapes",
|
||||||
selectedFields.insert("minTetVolume");
|
"cellVolume",
|
||||||
selectedFields.insert("cellRegion");
|
"cellVolumeRatio",
|
||||||
|
"minTetVolume",
|
||||||
|
"cellRegion"
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Foam::label Foam::checkMeshQuality
|
|||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const dictionary& dict,
|
const dictionary& dict,
|
||||||
const autoPtr<surfaceWriter>& writer
|
autoPtr<surfaceWriter>& writer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
label noFailedChecks = 0;
|
label noFailedChecks = 0;
|
||||||
@ -29,9 +29,10 @@ Foam::label Foam::checkMeshQuality
|
|||||||
<< " faces in error to set " << faces.name() << endl;
|
<< " faces in error to set " << faces.name() << endl;
|
||||||
faces.instance() = mesh.pointsInstance();
|
faces.instance() = mesh.pointsInstance();
|
||||||
faces.write();
|
faces.write();
|
||||||
|
|
||||||
if (writer.valid())
|
if (writer.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(writer(), faces);
|
mergeAndWrite(*writer, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,8 +6,8 @@ namespace Foam
|
|||||||
|
|
||||||
label checkMeshQuality
|
label checkMeshQuality
|
||||||
(
|
(
|
||||||
const polyMesh&,
|
const polyMesh& mesh,
|
||||||
const dictionary&,
|
const dictionary& dict,
|
||||||
const autoPtr<surfaceWriter>&
|
autoPtr<surfaceWriter>& writer
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -209,7 +209,7 @@ void Foam::printMeshStats(const polyMesh& mesh, const bool allTopology)
|
|||||||
void Foam::mergeAndWrite
|
void Foam::mergeAndWrite
|
||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const surfaceWriter& writer,
|
surfaceWriter& writer,
|
||||||
const word& name,
|
const word& name,
|
||||||
const indirectPrimitivePatch& setPatch,
|
const indirectPrimitivePatch& setPatch,
|
||||||
const fileName& outputDir
|
const fileName& outputDir
|
||||||
@ -242,37 +242,37 @@ void Foam::mergeAndWrite
|
|||||||
// Write
|
// Write
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
writer.write
|
writer.open
|
||||||
(
|
(
|
||||||
outputDir,
|
mergedPoints,
|
||||||
name,
|
mergedFaces,
|
||||||
meshedSurfRef
|
(outputDir / name),
|
||||||
(
|
false // serial - already merged
|
||||||
mergedPoints,
|
|
||||||
mergedFaces
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
writer.writeGeometry();
|
||||||
|
writer.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
writer.write
|
writer.open
|
||||||
(
|
(
|
||||||
outputDir,
|
setPatch.localPoints(),
|
||||||
name,
|
setPatch.localFaces(),
|
||||||
meshedSurfRef
|
(outputDir / name),
|
||||||
(
|
false // serial - already merged
|
||||||
setPatch.localPoints(),
|
|
||||||
setPatch.localFaces()
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
writer.writeGeometry();
|
||||||
|
writer.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::mergeAndWrite
|
void Foam::mergeAndWrite
|
||||||
(
|
(
|
||||||
const surfaceWriter& writer,
|
surfaceWriter& writer,
|
||||||
const faceSet& set
|
const faceSet& set
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -299,7 +299,7 @@ void Foam::mergeAndWrite
|
|||||||
|
|
||||||
void Foam::mergeAndWrite
|
void Foam::mergeAndWrite
|
||||||
(
|
(
|
||||||
const surfaceWriter& writer,
|
surfaceWriter& writer,
|
||||||
const cellSet& set
|
const cellSet& set
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -5,12 +5,12 @@
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
class polyMesh;
|
class polyMesh;
|
||||||
class surfaceWriter;
|
|
||||||
class pointSet;
|
class pointSet;
|
||||||
class faceSet;
|
class faceSet;
|
||||||
class cellSet;
|
class cellSet;
|
||||||
class fileName;
|
class fileName;
|
||||||
class polyMesh;
|
class polyMesh;
|
||||||
|
class surfaceWriter;
|
||||||
|
|
||||||
void printMeshStats(const polyMesh& mesh, const bool allTopology);
|
void printMeshStats(const polyMesh& mesh, const bool allTopology);
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ namespace Foam
|
|||||||
void mergeAndWrite
|
void mergeAndWrite
|
||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const surfaceWriter& writer,
|
surfaceWriter& writer,
|
||||||
const word& name,
|
const word& name,
|
||||||
const indirectPrimitivePatch& setPatch,
|
const indirectPrimitivePatch& setPatch,
|
||||||
const fileName& outputDir
|
const fileName& outputDir
|
||||||
@ -27,15 +27,15 @@ namespace Foam
|
|||||||
|
|
||||||
//- Write vtk representation of (assembled) faceSet to surface file in
|
//- Write vtk representation of (assembled) faceSet to surface file in
|
||||||
// postProcessing/ directory
|
// postProcessing/ directory
|
||||||
void mergeAndWrite(const surfaceWriter&, const faceSet&);
|
void mergeAndWrite(surfaceWriter& writer, const faceSet& set);
|
||||||
|
|
||||||
//- Write vtk representation of (assembled) cellSet to surface file in
|
//- Write vtk representation of (assembled) cellSet to surface file in
|
||||||
// postProcessing/ directory
|
// postProcessing/ directory
|
||||||
void mergeAndWrite(const surfaceWriter&, const cellSet&);
|
void mergeAndWrite(surfaceWriter& writer, const cellSet& set);
|
||||||
|
|
||||||
//- Write vtk representation of (assembled) pointSet to 'set' file in
|
//- Write vtk representation of (assembled) pointSet to 'set' file in
|
||||||
// postProcessing/ directory
|
// postProcessing/ directory
|
||||||
void mergeAndWrite(const writer<scalar>&, const pointSet&);
|
void mergeAndWrite(const writer<scalar>& writer, const pointSet& set);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
@ -35,7 +35,7 @@ License
|
|||||||
#include "IOmanip.H"
|
#include "IOmanip.H"
|
||||||
#include "emptyPolyPatch.H"
|
#include "emptyPolyPatch.H"
|
||||||
#include "processorPolyPatch.H"
|
#include "processorPolyPatch.H"
|
||||||
#include "surfaceWriter.H"
|
#include "vtkSurfaceWriter.H"
|
||||||
#include "checkTools.H"
|
#include "checkTools.H"
|
||||||
#include "treeBoundBox.H"
|
#include "treeBoundBox.H"
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ Foam::label Foam::checkTopology
|
|||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const bool allTopology,
|
const bool allTopology,
|
||||||
const bool allGeometry,
|
const bool allGeometry,
|
||||||
const autoPtr<surfaceWriter>& surfWriter,
|
autoPtr<surfaceWriter>& surfWriter,
|
||||||
const autoPtr<writer<scalar>>& setWriter
|
const autoPtr<writer<scalar>>& setWriter
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -203,7 +203,7 @@ Foam::label Foam::checkTopology
|
|||||||
cells.write();
|
cells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), cells);
|
mergeAndWrite(*surfWriter, cells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -227,7 +227,7 @@ Foam::label Foam::checkTopology
|
|||||||
points.write();
|
points.write();
|
||||||
if (setWriter.valid())
|
if (setWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(setWriter(), points);
|
mergeAndWrite(*setWriter, points);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ Foam::label Foam::checkTopology
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -269,7 +269,7 @@ Foam::label Foam::checkTopology
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -290,7 +290,7 @@ Foam::label Foam::checkTopology
|
|||||||
cells.write();
|
cells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), cells);
|
mergeAndWrite(*surfWriter, cells);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -314,7 +314,7 @@ Foam::label Foam::checkTopology
|
|||||||
faces.write();
|
faces.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), faces);
|
mergeAndWrite(*surfWriter, faces);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -369,7 +369,7 @@ Foam::label Foam::checkTopology
|
|||||||
oneCells.write();
|
oneCells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), oneCells);
|
mergeAndWrite(*surfWriter, oneCells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ Foam::label Foam::checkTopology
|
|||||||
twoCells.write();
|
twoCells.write();
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(surfWriter(), twoCells);
|
mergeAndWrite(*surfWriter, twoCells);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -530,7 +530,7 @@ Foam::label Foam::checkTopology
|
|||||||
points.write();
|
points.write();
|
||||||
if (setWriter.valid())
|
if (setWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(setWriter(), points);
|
mergeAndWrite(*setWriter, points);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -641,7 +641,7 @@ Foam::label Foam::checkTopology
|
|||||||
points.write();
|
points.write();
|
||||||
if (setWriter.valid())
|
if (setWriter.valid())
|
||||||
{
|
{
|
||||||
mergeAndWrite(setWriter(), points);
|
mergeAndWrite(*setWriter, points);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,8 +5,8 @@
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
class polyMesh;
|
class polyMesh;
|
||||||
class surfaceWriter;
|
|
||||||
class pointSet;
|
class pointSet;
|
||||||
|
class surfaceWriter;
|
||||||
|
|
||||||
template<class PatchType>
|
template<class PatchType>
|
||||||
void checkPatch
|
void checkPatch
|
||||||
@ -19,10 +19,10 @@ namespace Foam
|
|||||||
|
|
||||||
label checkTopology
|
label checkTopology
|
||||||
(
|
(
|
||||||
const polyMesh&,
|
const polyMesh& mesh,
|
||||||
const bool,
|
const bool allTopology,
|
||||||
const bool,
|
const bool allGeometry,
|
||||||
const autoPtr<surfaceWriter>&,
|
autoPtr<surfaceWriter>& surfWriter,
|
||||||
const autoPtr<writer<scalar>>&
|
const autoPtr<writer<scalar>>& setWriter
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
@ -128,7 +128,7 @@ labelList countBins
|
|||||||
|
|
||||||
void writeZoning
|
void writeZoning
|
||||||
(
|
(
|
||||||
const surfaceWriter& writer,
|
surfaceWriter& writer,
|
||||||
const triSurface& surf,
|
const triSurface& surf,
|
||||||
const labelList& faceZone,
|
const labelList& faceZone,
|
||||||
const word& fieldName,
|
const word& fieldName,
|
||||||
@ -136,43 +136,23 @@ void writeZoning
|
|||||||
const fileName& surfFileNameBase
|
const fileName& surfFileNameBase
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Info<< "Writing zoning to "
|
// Transcribe faces
|
||||||
<< fileName
|
faceList faces;
|
||||||
(
|
surf.triFaceFaces(faces);
|
||||||
surfFilePath
|
|
||||||
/ fieldName
|
|
||||||
+ '_'
|
|
||||||
+ surfFileNameBase
|
|
||||||
+ '.'
|
|
||||||
+ writer.type()
|
|
||||||
)
|
|
||||||
<< " ..." << endl << endl;
|
|
||||||
|
|
||||||
// Convert data
|
writer.open
|
||||||
scalarField scalarFaceZone(faceZone.size());
|
|
||||||
forAll(faceZone, i)
|
|
||||||
{
|
|
||||||
scalarFaceZone[i] = faceZone[i];
|
|
||||||
}
|
|
||||||
faceList faces(surf.size());
|
|
||||||
forAll(surf, i)
|
|
||||||
{
|
|
||||||
faces[i] = surf[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
writer.write
|
|
||||||
(
|
(
|
||||||
surfFilePath,
|
surf.points(),
|
||||||
surfFileNameBase,
|
faces,
|
||||||
meshedSurfRef
|
(surfFilePath / surfFileNameBase),
|
||||||
(
|
false // serial - already merged
|
||||||
surf.points(),
|
|
||||||
faces
|
|
||||||
),
|
|
||||||
fieldName,
|
|
||||||
scalarFaceZone,
|
|
||||||
false // face based data
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
fileName outputName = writer.write(fieldName, labelField(faceZone));
|
||||||
|
|
||||||
|
writer.clear();
|
||||||
|
|
||||||
|
Info<< "Wrote zoning to " << outputName << nl << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -213,7 +193,7 @@ void writeParts
|
|||||||
fileName subName
|
fileName subName
|
||||||
(
|
(
|
||||||
surfFilePath
|
surfFilePath
|
||||||
/surfFileNameBase + "_" + name(zone) + ".obj"
|
/ surfFileNameBase + "_" + name(zone) + ".obj"
|
||||||
);
|
);
|
||||||
|
|
||||||
Info<< "writing part " << zone << " size " << subSurf.size()
|
Info<< "writing part " << zone << " size " << subSurf.size()
|
||||||
@ -377,6 +357,7 @@ int main(int argc, char *argv[])
|
|||||||
if (writeSets)
|
if (writeSets)
|
||||||
{
|
{
|
||||||
surfWriter = surfaceWriter::New(surfaceFormat);
|
surfWriter = surfaceWriter::New(surfaceFormat);
|
||||||
|
|
||||||
// Option1: hard-coded format
|
// Option1: hard-coded format
|
||||||
edgeFormat = "obj";
|
edgeFormat = "obj";
|
||||||
//// Option2: same type as surface format. Problem is e.g. .obj format
|
//// Option2: same type as surface format. Problem is e.g. .obj format
|
||||||
@ -514,38 +495,29 @@ int main(int argc, char *argv[])
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
const fileName qualityName
|
|
||||||
|
// Transcribe faces
|
||||||
|
faceList faces;
|
||||||
|
subSurf.triFaceFaces(faces);
|
||||||
|
|
||||||
|
surfWriter->open
|
||||||
(
|
(
|
||||||
surfFilePath
|
subSurf.points(),
|
||||||
/ "illegal"
|
faces,
|
||||||
+ '_'
|
(surfFilePath / surfFileNameBase),
|
||||||
+ surfFileNameBase
|
false // serial - already merged
|
||||||
+ '.'
|
|
||||||
+ surfWriter().type()
|
|
||||||
);
|
);
|
||||||
Info<< "Writing illegal triangles to "
|
|
||||||
<< qualityName << " ..." << endl << endl;
|
|
||||||
|
|
||||||
// Convert data
|
fileName outputName = surfWriter->write
|
||||||
faceList faces(subSurf.size());
|
|
||||||
forAll(subSurf, i)
|
|
||||||
{
|
|
||||||
faces[i] = subSurf[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
surfWriter().write
|
|
||||||
(
|
(
|
||||||
surfFilePath,
|
|
||||||
surfFileNameBase,
|
|
||||||
meshedSurfRef
|
|
||||||
(
|
|
||||||
subSurf.points(),
|
|
||||||
faces
|
|
||||||
),
|
|
||||||
"illegal",
|
"illegal",
|
||||||
scalarField(subSurf.size(), Zero),
|
scalarField(subSurf.size(), Zero)
|
||||||
false // face based data
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
surfWriter->clear();
|
||||||
|
|
||||||
|
Info<< "Wrote illegal triangles to "
|
||||||
|
<< outputName << nl << endl;
|
||||||
}
|
}
|
||||||
else if (outputThreshold > 0)
|
else if (outputThreshold > 0)
|
||||||
{
|
{
|
||||||
@ -645,38 +617,24 @@ int main(int argc, char *argv[])
|
|||||||
// Dump for subsetting
|
// Dump for subsetting
|
||||||
if (surfWriter.valid())
|
if (surfWriter.valid())
|
||||||
{
|
{
|
||||||
const fileName qualityName
|
// Transcribe faces
|
||||||
(
|
|
||||||
surfFilePath
|
|
||||||
/ "quality"
|
|
||||||
+ '_'
|
|
||||||
+ surfFileNameBase
|
|
||||||
+ '.'
|
|
||||||
+ surfWriter().type()
|
|
||||||
);
|
|
||||||
Info<< "Writing triangle-quality to "
|
|
||||||
<< qualityName << " ..." << endl << endl;
|
|
||||||
|
|
||||||
// Convert data
|
|
||||||
faceList faces(surf.size());
|
faceList faces(surf.size());
|
||||||
forAll(surf, i)
|
surf.triFaceFaces(faces);
|
||||||
{
|
|
||||||
faces[i] = surf[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
surfWriter().write
|
surfWriter->open
|
||||||
(
|
(
|
||||||
surfFilePath,
|
surf.points(),
|
||||||
surfFileNameBase,
|
faces,
|
||||||
meshedSurfRef
|
(surfFilePath / surfFileNameBase),
|
||||||
(
|
false // serial - already merged
|
||||||
surf.points(),
|
|
||||||
faces
|
|
||||||
),
|
|
||||||
"quality",
|
|
||||||
triQ,
|
|
||||||
false // face based data
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
fileName outputName = surfWriter->write("quality", triQ);
|
||||||
|
|
||||||
|
surfWriter->clear();
|
||||||
|
|
||||||
|
Info<< "Wrote triangle-quality to "
|
||||||
|
<< outputName << nl << endl;
|
||||||
}
|
}
|
||||||
else if (outputThreshold > 0)
|
else if (outputThreshold > 0)
|
||||||
{
|
{
|
||||||
@ -926,11 +884,12 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (!surfWriter.valid())
|
if (!surfWriter.valid())
|
||||||
{
|
{
|
||||||
surfWriter.reset(new vtkSurfaceWriter());
|
surfWriter.reset(new surfaceWriters::vtkWriter());
|
||||||
}
|
}
|
||||||
|
|
||||||
writeZoning
|
writeZoning
|
||||||
(
|
(
|
||||||
surfWriter(),
|
*surfWriter,
|
||||||
surf,
|
surf,
|
||||||
faceZone,
|
faceZone,
|
||||||
"zone",
|
"zone",
|
||||||
@ -991,11 +950,12 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
if (!surfWriter.valid())
|
if (!surfWriter.valid())
|
||||||
{
|
{
|
||||||
surfWriter.reset(new vtkSurfaceWriter());
|
surfWriter.reset(new surfaceWriters::vtkWriter());
|
||||||
}
|
}
|
||||||
|
|
||||||
writeZoning
|
writeZoning
|
||||||
(
|
(
|
||||||
surfWriter(),
|
*surfWriter,
|
||||||
surf,
|
surf,
|
||||||
normalZone,
|
normalZone,
|
||||||
"normal",
|
"normal",
|
||||||
|
|||||||
@ -953,20 +953,23 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::read
|
|||||||
{
|
{
|
||||||
const word formatName(dict.get<word>("surfaceFormat"));
|
const word formatName(dict.get<word>("surfaceFormat"));
|
||||||
|
|
||||||
if (formatName != "none")
|
surfaceWriterPtr_.reset
|
||||||
{
|
(
|
||||||
surfaceWriterPtr_.reset
|
surfaceWriter::New
|
||||||
(
|
(
|
||||||
surfaceWriter::New
|
formatName,
|
||||||
(
|
dict.subOrEmptyDict("formatOptions").subOrEmptyDict(formatName)
|
||||||
formatName,
|
)
|
||||||
dict.subOrEmptyDict("formatOptions")
|
);
|
||||||
.subOrEmptyDict(formatName)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
if (surfaceWriterPtr_->enabled())
|
||||||
|
{
|
||||||
Info<< " surfaceFormat = " << formatName << nl;
|
Info<< " surfaceFormat = " << formatName << nl;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
surfaceWriterPtr_->clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Info<< nl << endl;
|
Info<< nl << endl;
|
||||||
|
|||||||
@ -384,22 +384,26 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::writeValues
|
|||||||
Field<Type> values(getFieldValues<Type>(fieldName, true));
|
Field<Type> values(getFieldValues<Type>(fieldName, true));
|
||||||
|
|
||||||
// Write raw values on surface if specified
|
// Write raw values on surface if specified
|
||||||
if (surfaceWriterPtr_.valid())
|
if (surfaceWriterPtr_.valid() && surfaceWriterPtr_->enabled())
|
||||||
{
|
{
|
||||||
Field<Type> allValues(values);
|
Field<Type> allValues(values);
|
||||||
combineFields(allValues);
|
combineFields(allValues);
|
||||||
|
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
surfaceWriterPtr_->write
|
surfaceWriterPtr_->open
|
||||||
(
|
(
|
||||||
outputDir(),
|
|
||||||
regionTypeNames_[regionType_] + ("_" + regionName_),
|
|
||||||
surfToWrite,
|
surfToWrite,
|
||||||
fieldName,
|
(
|
||||||
allValues,
|
outputDir()
|
||||||
false
|
/ regionTypeNames_[regionType_] + ("_" + regionName_)
|
||||||
|
),
|
||||||
|
false // serial - already merged
|
||||||
);
|
);
|
||||||
|
|
||||||
|
surfaceWriterPtr_->write(fieldName, allValues);
|
||||||
|
|
||||||
|
surfaceWriterPtr_->clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -28,8 +28,8 @@ License
|
|||||||
#include "FacePostProcessing.H"
|
#include "FacePostProcessing.H"
|
||||||
#include "Pstream.H"
|
#include "Pstream.H"
|
||||||
#include "ListListOps.H"
|
#include "ListListOps.H"
|
||||||
#include "surfaceWriter.H"
|
|
||||||
#include "globalIndex.H"
|
#include "globalIndex.H"
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -194,35 +194,26 @@ void Foam::FacePostProcessing<CloudType>::write()
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
autoPtr<surfaceWriter> writer
|
auto writer = surfaceWriter::New
|
||||||
(
|
(
|
||||||
surfaceWriter::New
|
surfaceFormat_,
|
||||||
(
|
this->coeffDict().subOrEmptyDict("formatOptions")
|
||||||
surfaceFormat_,
|
.subOrEmptyDict(surfaceFormat_)
|
||||||
this->coeffDict().subOrEmptyDict("formatOptions").
|
|
||||||
subOrEmptyDict(surfaceFormat_)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
writer->write
|
writer->open
|
||||||
(
|
(
|
||||||
this->writeTimeDir(),
|
allPoints,
|
||||||
fZone.name(),
|
allFaces,
|
||||||
meshedSurfRef(allPoints, allFaces),
|
(this->writeTimeDir() / fZone.name()),
|
||||||
"massTotal",
|
false // serial - already merged
|
||||||
zoneMassTotal[zoneI],
|
|
||||||
false
|
|
||||||
);
|
);
|
||||||
|
|
||||||
writer->write
|
writer->write("massTotal", zoneMassTotal[zoneI]);
|
||||||
(
|
|
||||||
this->writeTimeDir(),
|
writer->write("massFlowRate", zoneMassFlowRate[zoneI]);
|
||||||
fZone.name(),
|
|
||||||
meshedSurfRef(allPoints, allFaces),
|
writer->clear();
|
||||||
"massFlowRate",
|
|
||||||
zoneMassFlowRate[zoneI],
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2012-2017 OpenFOAM Foundation
|
| Copyright (C) 2012-2017 OpenFOAM Foundation
|
||||||
@ -462,40 +462,26 @@ void Foam::ParticleCollector<CloudType>::write()
|
|||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
|
|
||||||
if (surfaceFormat_ != "none")
|
if (surfaceFormat_ != "none" && Pstream::master())
|
||||||
{
|
{
|
||||||
if (Pstream::master())
|
auto writer = surfaceWriter::New
|
||||||
{
|
(
|
||||||
autoPtr<surfaceWriter> writer
|
surfaceFormat_,
|
||||||
(
|
this->coeffDict().subOrEmptyDict("formatOptions")
|
||||||
surfaceWriter::New
|
.subOrEmptyDict(surfaceFormat_)
|
||||||
(
|
);
|
||||||
surfaceFormat_,
|
|
||||||
this->coeffDict().subOrEmptyDict("formatOptions").
|
|
||||||
subOrEmptyDict(surfaceFormat_)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
writer->write
|
writer->open
|
||||||
(
|
(
|
||||||
this->writeTimeDir(),
|
points_,
|
||||||
"collector",
|
faces_,
|
||||||
meshedSurfRef(points_, faces_),
|
(this->writeTimeDir() / "collector"),
|
||||||
"massTotal",
|
false // serial - already merged
|
||||||
faceMassTotal,
|
);
|
||||||
false
|
|
||||||
);
|
|
||||||
|
|
||||||
writer->write
|
writer->write("massFlowRate", faceMassFlowRate);
|
||||||
(
|
|
||||||
this->writeTimeDir(),
|
writer->write("massTotal", faceMassTotal);
|
||||||
"collector",
|
|
||||||
meshedSurfRef(points_, faces_),
|
|
||||||
"massFlowRate",
|
|
||||||
faceMassFlowRate,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -275,22 +275,19 @@ Foam::scalar surfaceNoise::writeSurfaceData
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Could also have meshedSurface implement meshedSurf
|
|
||||||
if (writeSurface)
|
if (writeSurface)
|
||||||
{
|
{
|
||||||
fileName outFileName = writerPtr_->write
|
writerPtr_->open
|
||||||
(
|
(
|
||||||
outDir,
|
surf.points(),
|
||||||
fName,
|
surf.surfFaces(),
|
||||||
meshedSurfRef
|
(outDir / fName),
|
||||||
(
|
false // serial - already merged
|
||||||
surf.points(),
|
|
||||||
surf.surfFaces()
|
|
||||||
),
|
|
||||||
title,
|
|
||||||
allData,
|
|
||||||
false
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
writerPtr_->write(title, allData);
|
||||||
|
|
||||||
|
writerPtr_->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TO BE VERIFIED: area-averaged values
|
// TO BE VERIFIED: area-averaged values
|
||||||
@ -305,22 +302,19 @@ Foam::scalar surfaceNoise::writeSurfaceData
|
|||||||
{
|
{
|
||||||
const meshedSurface& surf = readerPtr_->geometry();
|
const meshedSurface& surf = readerPtr_->geometry();
|
||||||
|
|
||||||
// Could also have meshedSurface implement meshedSurf
|
|
||||||
if (writeSurface)
|
if (writeSurface)
|
||||||
{
|
{
|
||||||
writerPtr_->write
|
writerPtr_->open
|
||||||
(
|
(
|
||||||
outDir,
|
surf.points(),
|
||||||
fName,
|
surf.surfFaces(),
|
||||||
meshedSurfRef
|
(outDir / fName),
|
||||||
(
|
false // serial - already merged
|
||||||
surf.points(),
|
|
||||||
surf.surfFaces()
|
|
||||||
),
|
|
||||||
title,
|
|
||||||
data,
|
|
||||||
false
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
writerPtr_->write(title, data);
|
||||||
|
|
||||||
|
writerPtr_->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TO BE VERIFIED: area-averaged values
|
// TO BE VERIFIED: area-averaged values
|
||||||
@ -442,13 +436,12 @@ bool surfaceNoise::read(const dictionary& dict)
|
|||||||
|
|
||||||
const word writerType(dict.get<word>("writer"));
|
const word writerType(dict.get<word>("writer"));
|
||||||
|
|
||||||
dictionary optDict
|
writerPtr_ = surfaceWriter::New
|
||||||
(
|
(
|
||||||
|
writerType,
|
||||||
dict.subOrEmptyDict("writeOptions").subOrEmptyDict(writerType)
|
dict.subOrEmptyDict("writeOptions").subOrEmptyDict(writerType)
|
||||||
);
|
);
|
||||||
|
|
||||||
writerPtr_ = surfaceWriter::New(writerType, optDict);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -111,7 +111,7 @@ SeeAlso
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
// Forward declaration of classes
|
// Forward declarations
|
||||||
class surfaceReader;
|
class surfaceReader;
|
||||||
class surfaceWriter;
|
class surfaceWriter;
|
||||||
|
|
||||||
|
|||||||
@ -50,8 +50,8 @@ sampledSurface/distanceSurface/sampledDistanceSurface.C
|
|||||||
sampledSurface/sampledCuttingPlane/sampledCuttingPlane.C
|
sampledSurface/sampledCuttingPlane/sampledCuttingPlane.C
|
||||||
sampledSurface/sampledCuttingSurface/sampledCuttingSurface.C
|
sampledSurface/sampledCuttingSurface/sampledCuttingSurface.C
|
||||||
sampledSurface/sampledSurface/sampledSurface.C
|
sampledSurface/sampledSurface/sampledSurface.C
|
||||||
|
sampledSurface/sampledSurface/sampledSurfaceRegister.C
|
||||||
sampledSurface/sampledSurfaces/sampledSurfaces.C
|
sampledSurface/sampledSurfaces/sampledSurfaces.C
|
||||||
sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C
|
|
||||||
sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
|
sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
|
||||||
sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.C
|
sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMeshNormal.C
|
||||||
sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.C
|
sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.C
|
||||||
@ -59,24 +59,11 @@ sampledSurface/thresholdCellFaces/sampledThresholdCellFaces.C
|
|||||||
/* Proof-of-concept: */
|
/* Proof-of-concept: */
|
||||||
/* sampledSurface/triSurfaceMesh/sampledDiscreteSurface.C */
|
/* sampledSurface/triSurfaceMesh/sampledDiscreteSurface.C */
|
||||||
|
|
||||||
|
readers = sampledSurface/readers
|
||||||
|
|
||||||
surfWriters = sampledSurface/writers
|
$(readers)/surfaceReader.C
|
||||||
|
$(readers)/surfaceReaderNew.C
|
||||||
$(surfWriters)/surfaceWriter.C
|
$(readers)/ensight/ensightSurfaceReader.C
|
||||||
$(surfWriters)/ensight/ensightSurfaceWriter.C
|
|
||||||
$(surfWriters)/foam/foamSurfaceWriter.C
|
|
||||||
$(surfWriters)/nastran/nastranSurfaceWriter.C
|
|
||||||
$(surfWriters)/proxy/proxySurfaceWriter.C
|
|
||||||
$(surfWriters)/raw/rawSurfaceWriter.C
|
|
||||||
$(surfWriters)/starcd/starcdSurfaceWriter.C
|
|
||||||
$(surfWriters)/vtk/vtkSurfaceWriter.C
|
|
||||||
$(surfWriters)/boundaryData/boundaryDataSurfaceWriter.C
|
|
||||||
|
|
||||||
surfReaders = sampledSurface/readers
|
|
||||||
|
|
||||||
$(surfReaders)/surfaceReader.C
|
|
||||||
$(surfReaders)/surfaceReaderNew.C
|
|
||||||
$(surfReaders)/ensight/ensightSurfaceReader.C
|
|
||||||
|
|
||||||
graphField/writePatchGraph.C
|
graphField/writePatchGraph.C
|
||||||
graphField/writeCellGraph.C
|
graphField/writeCellGraph.C
|
||||||
|
|||||||
@ -38,6 +38,17 @@ namespace Foam
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const Foam::wordList Foam::sampledSurface::surfaceFieldTypes
|
||||||
|
({
|
||||||
|
"surfaceScalarField",
|
||||||
|
"surfaceVectorField",
|
||||||
|
"surfaceSphericalTensorField",
|
||||||
|
"surfaceSymmTensorField",
|
||||||
|
"surfaceTensorField"
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
void Foam::sampledSurface::clearGeom() const
|
void Foam::sampledSurface::clearGeom() const
|
||||||
@ -57,10 +68,8 @@ Foam::autoPtr<Foam::sampledSurface> Foam::sampledSurface::New
|
|||||||
{
|
{
|
||||||
const word sampleType(dict.get<word>("type"));
|
const word sampleType(dict.get<word>("type"));
|
||||||
|
|
||||||
if (debug)
|
DebugInfo
|
||||||
{
|
<< "Selecting sampledType " << sampleType << endl;
|
||||||
Info<< "Selecting sampledType " << sampleType << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto cstrIter = wordConstructorTablePtr_->cfind(sampleType);
|
auto cstrIter = wordConstructorTablePtr_->cfind(sampleType);
|
||||||
|
|
||||||
|
|||||||
@ -65,17 +65,15 @@ SourceFiles
|
|||||||
#ifndef sampledSurface_H
|
#ifndef sampledSurface_H
|
||||||
#define sampledSurface_H
|
#define sampledSurface_H
|
||||||
|
|
||||||
#include "meshedSurf.H"
|
#include "polySurface.H"
|
||||||
#include "word.H"
|
#include "surfMesh.H"
|
||||||
#include "labelList.H"
|
|
||||||
#include "faceList.H"
|
|
||||||
#include "typeInfo.H"
|
#include "typeInfo.H"
|
||||||
#include "runTimeSelectionTables.H"
|
#include "runTimeSelectionTables.H"
|
||||||
#include "autoPtr.H"
|
#include "autoPtr.H"
|
||||||
|
#include "polyMesh.H"
|
||||||
#include "volFieldsFwd.H"
|
#include "volFieldsFwd.H"
|
||||||
#include "surfaceFieldsFwd.H"
|
#include "surfaceFieldsFwd.H"
|
||||||
#include "surfaceMesh.H"
|
#include "surfaceMesh.H"
|
||||||
#include "polyMesh.H"
|
|
||||||
#include "interpolation.H"
|
#include "interpolation.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -84,18 +82,26 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class sampledSurface Declaration
|
Class sampledSurface Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
class sampledSurface
|
class sampledSurface
|
||||||
:
|
:
|
||||||
public meshedSurf
|
public meshedSurf
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Public Static Data
|
||||||
|
|
||||||
|
//- Class names for surface field types
|
||||||
|
static const wordList surfaceFieldTypes;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Private Data
|
// Private Data
|
||||||
|
|
||||||
//- Name of sample surface
|
//- The name of the sample surface
|
||||||
word name_;
|
word name_;
|
||||||
|
|
||||||
//- Reference to mesh
|
//- Reference to mesh
|
||||||
@ -104,15 +110,13 @@ private:
|
|||||||
//- Should surface sampling be enabled?
|
//- Should surface sampling be enabled?
|
||||||
bool enabled_;
|
bool enabled_;
|
||||||
|
|
||||||
//- Do we intend to interpolate the information?
|
//- Interpolate information to the nodes?
|
||||||
const bool interpolate_;
|
bool interpolate_;
|
||||||
|
|
||||||
//- Total surface area (demand-driven)
|
//- Total surface area (demand-driven)
|
||||||
mutable scalar area_;
|
mutable scalar area_;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// Protected Member Functions
|
// Protected Member Functions
|
||||||
@ -163,9 +167,7 @@ public:
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// iNew helper class
|
//- PtrList read-construction helper
|
||||||
|
|
||||||
//- Class for PtrList read-construction
|
|
||||||
class iNew
|
class iNew
|
||||||
{
|
{
|
||||||
//- Reference to the volume mesh
|
//- Reference to the volume mesh
|
||||||
@ -188,6 +190,34 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//- PtrList read-construction helper that captures dictionaries used
|
||||||
|
//- during creation.
|
||||||
|
class iNewCapture
|
||||||
|
{
|
||||||
|
//- Reference to the volume mesh
|
||||||
|
const polyMesh& mesh_;
|
||||||
|
|
||||||
|
//- Captured (recorded) dictionaries
|
||||||
|
DynamicList<dictionary>& capture_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
iNewCapture(const polyMesh& mesh, DynamicList<dictionary>& capture)
|
||||||
|
:
|
||||||
|
mesh_(mesh),
|
||||||
|
capture_(capture)
|
||||||
|
{}
|
||||||
|
|
||||||
|
autoPtr<sampledSurface> operator()(Istream& is) const
|
||||||
|
{
|
||||||
|
word name(is);
|
||||||
|
capture_.append(dictionary(is));
|
||||||
|
|
||||||
|
return sampledSurface::New(name, mesh_, capture_.last());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct from name, mesh
|
//- Construct from name, mesh
|
||||||
@ -245,13 +275,13 @@ public:
|
|||||||
return name_;
|
return name_;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Sampling is enabled
|
//- Surface is enabled
|
||||||
bool enabled() const
|
bool enabled() const
|
||||||
{
|
{
|
||||||
return enabled_;
|
return enabled_;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Interpolation requested for surface
|
//- interpolation to nodes requested for surface
|
||||||
bool interpolate() const
|
bool interpolate() const
|
||||||
{
|
{
|
||||||
return interpolate_;
|
return interpolate_;
|
||||||
@ -301,6 +331,99 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// General registry storage (optional)
|
||||||
|
|
||||||
|
//- Get surface from registry if available.
|
||||||
|
// \param obr The objectRegistry to use
|
||||||
|
// \param lookupName Optional lookup name, use surface name if empty
|
||||||
|
// \return surface or nullptr
|
||||||
|
polySurface* getRegistrySurface
|
||||||
|
(
|
||||||
|
const objectRegistry& obr,
|
||||||
|
word lookupName = ""
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Copy surface into registry.
|
||||||
|
// \param obr The objectRegistry to use
|
||||||
|
// \param lookupName Optional lookup name, use surface name if empty
|
||||||
|
// \return surface or nullptr it surface should not be stored
|
||||||
|
polySurface* storeRegistrySurface
|
||||||
|
(
|
||||||
|
objectRegistry& obr,
|
||||||
|
word lookupName = ""
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Remove surface from registry.
|
||||||
|
// \param obr The objectRegistry to use
|
||||||
|
// \param lookupName Optional lookup name, use surface name if empty
|
||||||
|
// \return True if surface existed and was removed
|
||||||
|
bool removeRegistrySurface
|
||||||
|
(
|
||||||
|
objectRegistry& obr,
|
||||||
|
word lookupName = ""
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Copy/store sampled field onto registered surface (if it exists)
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool storeRegistryField
|
||||||
|
(
|
||||||
|
const objectRegistry& obr,
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
const Field<Type>& values,
|
||||||
|
word lookupName = ""
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Move/store sampled field onto registered surface (if it exists)
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool storeRegistryField
|
||||||
|
(
|
||||||
|
const objectRegistry& obr,
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
Field<Type>&& values,
|
||||||
|
word lookupName = ""
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
// Specialized surfMesh storage (optional)
|
||||||
|
|
||||||
|
//- Get surface from registry if available.
|
||||||
|
// \param lookupName Optional lookup name, use surface name if empty
|
||||||
|
// \return surface or nullptr
|
||||||
|
surfMesh* getSurfMesh(word lookupName = "") const;
|
||||||
|
|
||||||
|
//- Copy surface into registry.
|
||||||
|
// \param lookupName Optional lookup name, use surface name if empty
|
||||||
|
// \return surface or nullptr it surface should not be stored
|
||||||
|
surfMesh* storeSurfMesh(word lookupName = "") const;
|
||||||
|
|
||||||
|
//- Remove surface from registry.
|
||||||
|
// \param lookupName Optional lookup name, use surface name if empty
|
||||||
|
// \return True if surface existed and was removed
|
||||||
|
bool removeSurfMesh(word lookupName = "") const;
|
||||||
|
|
||||||
|
//- Copy/store sampled Face field onto surfMesh (if it exists)
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool storeSurfMeshField
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
const Field<Type>& values,
|
||||||
|
word lookupName = ""
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Move/store sampled Face field onto surfMesh (if it exists)
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool storeSurfMeshField
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
Field<Type>&& values,
|
||||||
|
word lookupName = ""
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
// Sample (faces)
|
// Sample (faces)
|
||||||
|
|
||||||
//- Sample volume field onto surface faces
|
//- Sample volume field onto surface faces
|
||||||
|
|||||||
@ -2,10 +2,8 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2004-2010, 2018-2019 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -26,200 +24,12 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "sampledSurface.H"
|
#include "sampledSurface.H"
|
||||||
#include "polyMesh.H"
|
#include "fvMesh.H"
|
||||||
|
#include "MeshedSurface.H"
|
||||||
#include "demandDrivenData.H"
|
#include "demandDrivenData.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(sampledSurface, 0);
|
|
||||||
defineRunTimeSelectionTable(sampledSurface, word);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const Foam::wordList Foam::sampledSurface::surfaceFieldTypes
|
|
||||||
({
|
|
||||||
"surfaceScalarField",
|
|
||||||
"surfaceVectorField",
|
|
||||||
"surfaceSphericalTensorField",
|
|
||||||
"surfaceSymmTensorField",
|
|
||||||
"surfaceTensorField"
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void Foam::sampledSurface::clearGeom() const
|
|
||||||
{
|
|
||||||
area_ = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::autoPtr<Foam::sampledSurface> Foam::sampledSurface::New
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const polyMesh& mesh,
|
|
||||||
const dictionary& dict
|
|
||||||
)
|
|
||||||
{
|
|
||||||
const word sampleType(dict.get<word>("type"));
|
|
||||||
|
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
Info<< "Selecting sampledType " << sampleType << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto cstrIter = wordConstructorTablePtr_->cfind(sampleType);
|
|
||||||
|
|
||||||
if (!cstrIter.found())
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "Unknown sample type "
|
|
||||||
<< sampleType << nl << nl
|
|
||||||
<< "Valid sample types :" << endl
|
|
||||||
<< wordConstructorTablePtr_->sortedToc()
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
return autoPtr<sampledSurface>(cstrIter()(name, mesh, dict));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::sampledSurface::sampledSurface(const word& name, std::nullptr_t)
|
|
||||||
:
|
|
||||||
name_(name),
|
|
||||||
mesh_(NullObjectRef<polyMesh>()),
|
|
||||||
enabled_(true),
|
|
||||||
interpolate_(false),
|
|
||||||
area_(-1),
|
|
||||||
writerType_(),
|
|
||||||
formatOptions_()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::sampledSurface::sampledSurface
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const polyMesh& mesh,
|
|
||||||
const bool interpolate
|
|
||||||
)
|
|
||||||
:
|
|
||||||
name_(name),
|
|
||||||
mesh_(mesh),
|
|
||||||
enabled_(true),
|
|
||||||
interpolate_(interpolate),
|
|
||||||
area_(-1),
|
|
||||||
writerType_(),
|
|
||||||
formatOptions_()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::sampledSurface::sampledSurface
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const polyMesh& mesh,
|
|
||||||
const dictionary& dict
|
|
||||||
)
|
|
||||||
:
|
|
||||||
name_(dict.lookupOrDefault<word>("name", name)),
|
|
||||||
mesh_(mesh),
|
|
||||||
enabled_(dict.lookupOrDefault("enabled", true)),
|
|
||||||
interpolate_(dict.lookupOrDefault("interpolate", false)),
|
|
||||||
area_(-1),
|
|
||||||
writerType_(dict.lookupOrDefault<word>("surfaceFormat", "")),
|
|
||||||
formatOptions_(dict.subOrEmptyDict("formatOptions"))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::sampledSurface::~sampledSurface()
|
|
||||||
{
|
|
||||||
clearGeom();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::scalar Foam::sampledSurface::area() const
|
|
||||||
{
|
|
||||||
if (area_ < 0)
|
|
||||||
{
|
|
||||||
area_ = gSum(magSf());
|
|
||||||
}
|
|
||||||
|
|
||||||
return area_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::sampledSurface::withSurfaceFields() const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::scalarField> Foam::sampledSurface::sample
|
|
||||||
(
|
|
||||||
const surfaceScalarField& sField
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
NotImplemented;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::vectorField> Foam::sampledSurface::sample
|
|
||||||
(
|
|
||||||
const surfaceVectorField& sField
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
NotImplemented;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::sphericalTensorField> Foam::sampledSurface::sample
|
|
||||||
(
|
|
||||||
const surfaceSphericalTensorField& sField
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
NotImplemented;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::symmTensorField> Foam::sampledSurface::sample
|
|
||||||
(
|
|
||||||
const surfaceSymmTensorField& sField
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
NotImplemented;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tmp<Foam::tensorField> Foam::sampledSurface::sample
|
|
||||||
(
|
|
||||||
const surfaceTensorField& sField
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
NotImplemented;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::sampledSurface::print(Ostream& os) const
|
|
||||||
{
|
|
||||||
os << type();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::polySurface* Foam::sampledSurface::getRegistrySurface
|
Foam::polySurface* Foam::sampledSurface::getRegistrySurface
|
||||||
(
|
(
|
||||||
const objectRegistry& obr,
|
const objectRegistry& obr,
|
||||||
@ -250,15 +60,11 @@ Foam::polySurface* Foam::sampledSurface::storeRegistrySurface
|
|||||||
|
|
||||||
if (!surfptr)
|
if (!surfptr)
|
||||||
{
|
{
|
||||||
surfptr = new polySurface
|
// Construct null and add to registry (owned by registry)
|
||||||
(
|
surfptr = new polySurface(lookupName, obr, true);
|
||||||
lookupName,
|
|
||||||
obr,
|
|
||||||
true // Add to registry - owned by registry
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
surfptr->deepCopy(*this); // Copy in geometry (removes old fields)
|
surfptr->copySurface(*this); // Copy in geometry (removes old fields)
|
||||||
|
|
||||||
return surfptr;
|
return surfptr;
|
||||||
}
|
}
|
||||||
@ -281,13 +87,50 @@ bool Foam::sampledSurface::removeRegistrySurface
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
|
Foam::surfMesh* Foam::sampledSurface::getSurfMesh(word lookupName) const
|
||||||
|
|
||||||
Foam::Ostream& Foam::operator<<(Ostream& os, const sampledSurface& s)
|
|
||||||
{
|
{
|
||||||
s.print(os);
|
if (lookupName.empty())
|
||||||
os.check(FUNCTION_NAME);
|
{
|
||||||
return os;
|
lookupName = this->name();
|
||||||
|
}
|
||||||
|
|
||||||
|
return mesh().getObjectPtr<surfMesh>(lookupName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfMesh* Foam::sampledSurface::storeSurfMesh(word lookupName) const
|
||||||
|
{
|
||||||
|
if (lookupName.empty())
|
||||||
|
{
|
||||||
|
lookupName = this->name();
|
||||||
|
}
|
||||||
|
|
||||||
|
surfMesh* surfptr = getSurfMesh();
|
||||||
|
|
||||||
|
if (!surfptr)
|
||||||
|
{
|
||||||
|
// Construct null and add owned by registry
|
||||||
|
surfptr = new surfMesh(lookupName, mesh());
|
||||||
|
|
||||||
|
surfptr->store(); // Add to registry - owned by registry
|
||||||
|
}
|
||||||
|
|
||||||
|
surfptr->copySurface(*this); // Copy in geometry (removes old fields)
|
||||||
|
|
||||||
|
return surfptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::sampledSurface::removeSurfMesh(word lookupName) const
|
||||||
|
{
|
||||||
|
surfMesh* surfptr = getSurfMesh(lookupName);
|
||||||
|
|
||||||
|
if (surfptr)
|
||||||
|
{
|
||||||
|
return mesh().checkOut(*surfptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2018-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
@ -116,4 +116,100 @@ Foam::sampledSurface::pointAverage
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool Foam::sampledSurface::storeRegistryField
|
||||||
|
(
|
||||||
|
const objectRegistry& obr,
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
const Field<Type>& values,
|
||||||
|
word lookupName
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
polySurface* surfptr = this->getRegistrySurface(obr, lookupName);
|
||||||
|
|
||||||
|
if (surfptr)
|
||||||
|
{
|
||||||
|
surfptr->storeField<Type, GeoMeshType>
|
||||||
|
(
|
||||||
|
fieldName, dims, values
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool Foam::sampledSurface::storeRegistryField
|
||||||
|
(
|
||||||
|
const objectRegistry& obr,
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
Field<Type>&& values,
|
||||||
|
word lookupName
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
polySurface* surfptr = this->getRegistrySurface(obr, lookupName);
|
||||||
|
|
||||||
|
if (surfptr)
|
||||||
|
{
|
||||||
|
surfptr->storeField<Type, GeoMeshType>
|
||||||
|
(
|
||||||
|
fieldName, dims, std::move(values)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool Foam::sampledSurface::storeSurfMeshField
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
const Field<Type>& values,
|
||||||
|
word lookupName
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
surfMesh* surfptr = this->getSurfMesh(lookupName);
|
||||||
|
|
||||||
|
if (surfptr)
|
||||||
|
{
|
||||||
|
surfptr->storeField<Type, GeoMeshType>
|
||||||
|
(
|
||||||
|
fieldName, dims, values
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool Foam::sampledSurface::storeSurfMeshField
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const dimensionSet& dims,
|
||||||
|
Field<Type>&& values,
|
||||||
|
word lookupName
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
surfMesh* surfptr = this->getSurfMesh(lookupName);
|
||||||
|
|
||||||
|
if (surfptr)
|
||||||
|
{
|
||||||
|
surfptr->storeField<Type, GeoMeshType>
|
||||||
|
(
|
||||||
|
fieldName, dims, std::move(values)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -26,15 +26,15 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "sampledSurfaces.H"
|
#include "sampledSurfaces.H"
|
||||||
#include "volFields.H"
|
#include "polySurface.H"
|
||||||
#include "dictionary.H"
|
|
||||||
#include "Time.H"
|
|
||||||
#include "IOmanip.H"
|
|
||||||
#include "interpolationCell.H"
|
|
||||||
#include "volPointInterpolation.H"
|
|
||||||
#include "PatchTools.H"
|
|
||||||
#include "mapPolyMesh.H"
|
#include "mapPolyMesh.H"
|
||||||
#include "sampledTriSurfaceMesh.H"
|
#include "stringListOps.H"
|
||||||
|
#include "volFields.H"
|
||||||
|
#include "HashOps.H"
|
||||||
|
#include "PstreamCombineReduceOps.H"
|
||||||
|
#include "Time.H"
|
||||||
|
#include "UIndirectList.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
@ -51,66 +51,154 @@ namespace Foam
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Foam::sampledSurfaces::verbose_ = false;
|
|
||||||
Foam::scalar Foam::sampledSurfaces::mergeTol_ = 1e-10;
|
Foam::scalar Foam::sampledSurfaces::mergeTol_ = 1e-10;
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
void Foam::sampledSurfaces::writeGeometry() const
|
Foam::polySurface* Foam::sampledSurfaces::getRegistrySurface
|
||||||
|
(
|
||||||
|
const sampledSurface& s
|
||||||
|
) const
|
||||||
{
|
{
|
||||||
// Write to time directory under outputPath_
|
return s.getRegistrySurface
|
||||||
// Skip surfaces without faces (eg, a failed cut-plane)
|
(
|
||||||
|
storedObjects(),
|
||||||
|
IOobject::groupName(name(), s.name())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const fileName outputDir = outputPath_/time_.timeName();
|
|
||||||
|
|
||||||
forAll(*this, surfi)
|
Foam::polySurface* Foam::sampledSurfaces::storeRegistrySurface
|
||||||
|
(
|
||||||
|
const sampledSurface& s
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return s.storeRegistrySurface
|
||||||
|
(
|
||||||
|
storedObjects(),
|
||||||
|
IOobject::groupName(name(), s.name())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::sampledSurfaces::removeRegistrySurface
|
||||||
|
(
|
||||||
|
const sampledSurface& s
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return s.removeRegistrySurface
|
||||||
|
(
|
||||||
|
storedObjects(),
|
||||||
|
IOobject::groupName(name(), s.name())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::sampledSurfaces::countFields()
|
||||||
|
{
|
||||||
|
wordList allFields; // Just needed for warnings
|
||||||
|
HashTable<wordHashSet> selected;
|
||||||
|
|
||||||
|
if (loadFromFiles_)
|
||||||
{
|
{
|
||||||
const sampledSurface& s = operator[](surfi);
|
// Check files for a particular time
|
||||||
|
IOobjectList objects(obr_, obr_.time().timeName());
|
||||||
|
|
||||||
if (Pstream::parRun())
|
allFields = objects.names();
|
||||||
|
selected = objects.classes(fieldSelection_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Check currently available fields
|
||||||
|
allFields = obr_.names();
|
||||||
|
selected = obr_.classes(fieldSelection_);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Pstream::parRun())
|
||||||
|
{
|
||||||
|
Pstream::mapCombineGather(selected, HashSetOps::plusEqOp<word>());
|
||||||
|
Pstream::mapCombineScatter(selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DynamicList<label> missed(fieldSelection_.size());
|
||||||
|
|
||||||
|
// Detect missing fields
|
||||||
|
forAll(fieldSelection_, i)
|
||||||
|
{
|
||||||
|
if (findStrings(fieldSelection_[i], allFields).empty())
|
||||||
{
|
{
|
||||||
if (Pstream::master() && mergedList_[surfi].size())
|
missed.append(i);
|
||||||
{
|
|
||||||
formatter_->write
|
|
||||||
(
|
|
||||||
outputDir,
|
|
||||||
s.name(),
|
|
||||||
mergedList_[surfi]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (s.faces().size())
|
}
|
||||||
|
|
||||||
|
if (missed.size())
|
||||||
|
{
|
||||||
|
WarningInFunction
|
||||||
|
<< nl
|
||||||
|
<< "Cannot find "
|
||||||
|
<< (loadFromFiles_ ? "field file" : "registered field")
|
||||||
|
<< " matching "
|
||||||
|
<< UIndirectList<wordRe>(fieldSelection_, missed) << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Currently only support volume and surface field types
|
||||||
|
label nVolumeFields = 0;
|
||||||
|
label nSurfaceFields = 0;
|
||||||
|
|
||||||
|
forAllConstIters(selected, iter)
|
||||||
|
{
|
||||||
|
const word& clsName = iter.key();
|
||||||
|
const label n = iter.val().size();
|
||||||
|
|
||||||
|
if (fieldTypes::volume.found(clsName))
|
||||||
{
|
{
|
||||||
formatter_->write(outputDir, s.name(), s);
|
nVolumeFields += n;
|
||||||
}
|
}
|
||||||
|
else if (sampledSurface::surfaceFieldTypes.found(clsName))
|
||||||
|
{
|
||||||
|
nSurfaceFields += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now propagate field counts (per surface)
|
||||||
|
|
||||||
|
label surfi = 0;
|
||||||
|
|
||||||
|
for (const sampledSurface& s : surfaces())
|
||||||
|
{
|
||||||
|
writers_[surfi].nFields() =
|
||||||
|
(
|
||||||
|
nVolumeFields
|
||||||
|
+ (s.withSurfaceFields() ? nSurfaceFields : 0)
|
||||||
|
+ ((s.hasFaceIds() && !s.interpolate()) ? 1 : 0)
|
||||||
|
);
|
||||||
|
|
||||||
|
++surfi;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::sampledSurfaces::writeOriginalIds()
|
Foam::autoPtr<Foam::surfaceWriter> Foam::sampledSurfaces::newWriter
|
||||||
|
(
|
||||||
|
word writeType,
|
||||||
|
const dictionary& formatOptions,
|
||||||
|
const dictionary& surfDict
|
||||||
|
)
|
||||||
{
|
{
|
||||||
const word fieldName = "Ids";
|
// Per-surface adjustment
|
||||||
const fileName outputDir = outputPath_/time_.timeName();
|
surfDict.readIfPresent<word>("surfaceFormat", writeType);
|
||||||
|
|
||||||
forAll(*this, surfi)
|
dictionary options = formatOptions.subOrEmptyDict(writeType);
|
||||||
{
|
|
||||||
const sampledSurface& s = operator[](surfi);
|
|
||||||
|
|
||||||
if (s.hasFaceIds())
|
options.merge
|
||||||
{
|
(
|
||||||
const labelList& idLst = s.originalIds();
|
surfDict.subOrEmptyDict("formatOptions").subOrEmptyDict(writeType)
|
||||||
|
);
|
||||||
|
|
||||||
// Transcribe from label to scalar
|
return surfaceWriter::New(writeType, options);
|
||||||
Field<scalar> ids(idLst.size());
|
|
||||||
forAll(idLst, i)
|
|
||||||
{
|
|
||||||
ids[i] = idLst[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
writeSurface(ids, surfi, fieldName, outputDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -126,6 +214,8 @@ Foam::sampledSurfaces::sampledSurfaces
|
|||||||
functionObjects::fvMeshFunctionObject(name, runTime, dict),
|
functionObjects::fvMeshFunctionObject(name, runTime, dict),
|
||||||
PtrList<sampledSurface>(),
|
PtrList<sampledSurface>(),
|
||||||
loadFromFiles_(false),
|
loadFromFiles_(false),
|
||||||
|
verbose_(false),
|
||||||
|
onExecute_(false),
|
||||||
outputPath_
|
outputPath_
|
||||||
(
|
(
|
||||||
time_.globalPath()/functionObject::outputPrefix/name
|
time_.globalPath()/functionObject::outputPrefix/name
|
||||||
@ -133,9 +223,9 @@ Foam::sampledSurfaces::sampledSurfaces
|
|||||||
fieldSelection_(),
|
fieldSelection_(),
|
||||||
sampleFaceScheme_(),
|
sampleFaceScheme_(),
|
||||||
sampleNodeScheme_(),
|
sampleNodeScheme_(),
|
||||||
mergedList_(),
|
writers_(),
|
||||||
changedGeom_(),
|
actions_(),
|
||||||
formatter_(nullptr)
|
nFaces_()
|
||||||
{
|
{
|
||||||
outputPath_.clean(); // Remove unneeded ".."
|
outputPath_.clean(); // Remove unneeded ".."
|
||||||
|
|
||||||
@ -154,6 +244,8 @@ Foam::sampledSurfaces::sampledSurfaces
|
|||||||
functionObjects::fvMeshFunctionObject(name, obr, dict),
|
functionObjects::fvMeshFunctionObject(name, obr, dict),
|
||||||
PtrList<sampledSurface>(),
|
PtrList<sampledSurface>(),
|
||||||
loadFromFiles_(loadFromFiles),
|
loadFromFiles_(loadFromFiles),
|
||||||
|
verbose_(false),
|
||||||
|
onExecute_(false),
|
||||||
outputPath_
|
outputPath_
|
||||||
(
|
(
|
||||||
time_.globalPath()/functionObject::outputPrefix/name
|
time_.globalPath()/functionObject::outputPrefix/name
|
||||||
@ -161,9 +253,9 @@ Foam::sampledSurfaces::sampledSurfaces
|
|||||||
fieldSelection_(),
|
fieldSelection_(),
|
||||||
sampleFaceScheme_(),
|
sampleFaceScheme_(),
|
||||||
sampleNodeScheme_(),
|
sampleNodeScheme_(),
|
||||||
mergedList_(),
|
writers_(),
|
||||||
changedGeom_(),
|
actions_(),
|
||||||
formatter_(nullptr)
|
nFaces_()
|
||||||
{
|
{
|
||||||
outputPath_.clean(); // Remove unneeded ".."
|
outputPath_.clean(); // Remove unneeded ".."
|
||||||
|
|
||||||
@ -179,60 +271,19 @@ void Foam::sampledSurfaces::verbose(const bool verbosity)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Foam::sampledSurfaces::execute()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::sampledSurfaces::write()
|
|
||||||
{
|
|
||||||
if (empty())
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Finalize surfaces, merge points etc.
|
|
||||||
update();
|
|
||||||
|
|
||||||
const label nFields = classifyFields();
|
|
||||||
|
|
||||||
// Write geometry first if required,
|
|
||||||
// or when no fields would otherwise be written
|
|
||||||
if (formatter_->separateGeometry() || !nFields)
|
|
||||||
{
|
|
||||||
writeGeometry();
|
|
||||||
changedGeom_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const IOobjectList objects(obr_, obr_.time().timeName());
|
|
||||||
|
|
||||||
sampleAndWrite<volScalarField>(objects);
|
|
||||||
sampleAndWrite<volVectorField>(objects);
|
|
||||||
sampleAndWrite<volSphericalTensorField>(objects);
|
|
||||||
sampleAndWrite<volSymmTensorField>(objects);
|
|
||||||
sampleAndWrite<volTensorField>(objects);
|
|
||||||
|
|
||||||
sampleAndWrite<surfaceScalarField>(objects);
|
|
||||||
sampleAndWrite<surfaceVectorField>(objects);
|
|
||||||
sampleAndWrite<surfaceSphericalTensorField>(objects);
|
|
||||||
sampleAndWrite<surfaceSymmTensorField>(objects);
|
|
||||||
sampleAndWrite<surfaceTensorField>(objects);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::sampledSurfaces::read(const dictionary& dict)
|
bool Foam::sampledSurfaces::read(const dictionary& dict)
|
||||||
{
|
{
|
||||||
fvMeshFunctionObject::read(dict);
|
fvMeshFunctionObject::read(dict);
|
||||||
|
|
||||||
PtrList<sampledSurface>::clear();
|
PtrList<sampledSurface>::clear();
|
||||||
mergedList_.clear();
|
writers_.clear();
|
||||||
changedGeom_.clear();
|
actions_.clear();
|
||||||
|
nFaces_.clear();
|
||||||
fieldSelection_.clear();
|
fieldSelection_.clear();
|
||||||
|
|
||||||
|
verbose_ = dict.lookupOrDefault("verbose", false);
|
||||||
|
onExecute_ = dict.lookupOrDefault("sampleOnExecute", false);
|
||||||
|
|
||||||
sampleFaceScheme_ =
|
sampleFaceScheme_ =
|
||||||
dict.lookupOrDefault<word>("sampleScheme", "cell");
|
dict.lookupOrDefault<word>("sampleScheme", "cell");
|
||||||
|
|
||||||
@ -241,82 +292,160 @@ bool Foam::sampledSurfaces::read(const dictionary& dict)
|
|||||||
|
|
||||||
const entry* eptr = dict.findEntry("surfaces");
|
const entry* eptr = dict.findEntry("surfaces");
|
||||||
|
|
||||||
|
// Surface writer type and format options
|
||||||
|
const word writerType =
|
||||||
|
(eptr ? dict.get<word>("surfaceFormat") : word::null);
|
||||||
|
|
||||||
|
const dictionary formatOptions(dict.subOrEmptyDict("formatOptions"));
|
||||||
|
|
||||||
|
// Store on registry?
|
||||||
|
const bool dfltStore = dict.lookupOrDefault("store", false);
|
||||||
|
|
||||||
if (eptr && eptr->isDict())
|
if (eptr && eptr->isDict())
|
||||||
{
|
{
|
||||||
PtrList<sampledSurface> surfs(eptr->dict().size());
|
PtrList<sampledSurface> surfs(eptr->dict().size());
|
||||||
|
|
||||||
|
actions_.resize(surfs.size(), ACTION_WRITE); // Default action
|
||||||
|
writers_.resize(surfs.size());
|
||||||
|
nFaces_.resize(surfs.size(), Zero);
|
||||||
|
|
||||||
label surfi = 0;
|
label surfi = 0;
|
||||||
|
|
||||||
for (const entry& dEntry : eptr->dict())
|
for (const entry& dEntry : eptr->dict())
|
||||||
{
|
{
|
||||||
if (dEntry.isDict())
|
if (!dEntry.isDict())
|
||||||
{
|
{
|
||||||
autoPtr<sampledSurface> surf =
|
continue;
|
||||||
sampledSurface::New
|
|
||||||
(
|
|
||||||
dEntry.keyword(),
|
|
||||||
mesh_,
|
|
||||||
dEntry.dict()
|
|
||||||
);
|
|
||||||
|
|
||||||
if (surf.valid() && surf->enabled())
|
|
||||||
{
|
|
||||||
surfs.set(surfi, surf);
|
|
||||||
++surfi;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dictionary& surfDict = dEntry.dict();
|
||||||
|
|
||||||
|
autoPtr<sampledSurface> surf =
|
||||||
|
sampledSurface::New
|
||||||
|
(
|
||||||
|
dEntry.keyword(),
|
||||||
|
mesh_,
|
||||||
|
surfDict
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!surf.valid() || !surf->enabled())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define the surface
|
||||||
|
surfs.set(surfi, surf);
|
||||||
|
|
||||||
|
// Define additional action(s)
|
||||||
|
if (surfDict.lookupOrDefault("store", dfltStore))
|
||||||
|
{
|
||||||
|
actions_[surfi] |= ACTION_STORE;
|
||||||
|
}
|
||||||
|
if (surfDict.lookupOrDefault("surfMeshStore", false))
|
||||||
|
{
|
||||||
|
actions_[surfi] |= ACTION_SURF_MESH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define surface writer, but do NOT yet attach a surface
|
||||||
|
writers_.set
|
||||||
|
(
|
||||||
|
surfi,
|
||||||
|
newWriter(writerType, formatOptions, surfDict)
|
||||||
|
);
|
||||||
|
|
||||||
|
writers_[surfi].isPointData() = surfs[surfi].interpolate();
|
||||||
|
|
||||||
|
// Use outputDir/TIME/surface-name
|
||||||
|
writers_[surfi].useTimeDir() = true;
|
||||||
|
writers_[surfi].verbose() = verbose_;
|
||||||
|
|
||||||
|
++surfi;
|
||||||
}
|
}
|
||||||
|
|
||||||
surfs.resize(surfi);
|
surfs.resize(surfi);
|
||||||
|
actions_.resize(surfi);
|
||||||
|
writers_.resize(surfi);
|
||||||
surfaces().transfer(surfs);
|
surfaces().transfer(surfs);
|
||||||
}
|
}
|
||||||
else if (eptr)
|
else if (eptr)
|
||||||
{
|
{
|
||||||
PtrList<sampledSurface> surfs
|
// This is slightly trickier.
|
||||||
|
// We want access to the individual dictionaries used for construction
|
||||||
|
|
||||||
|
DynamicList<dictionary> capture;
|
||||||
|
|
||||||
|
PtrList<sampledSurface> input
|
||||||
(
|
(
|
||||||
eptr->stream(),
|
eptr->stream(),
|
||||||
sampledSurface::iNew(mesh_)
|
sampledSurface::iNewCapture(mesh_, capture)
|
||||||
);
|
);
|
||||||
|
|
||||||
forAll(surfs, surfi)
|
PtrList<sampledSurface> surfs(input.size());
|
||||||
|
|
||||||
|
actions_.resize(surfs.size(), ACTION_WRITE); // Default action
|
||||||
|
writers_.resize(surfs.size());
|
||||||
|
nFaces_.resize(surfs.size(), Zero);
|
||||||
|
|
||||||
|
label surfi = 0;
|
||||||
|
|
||||||
|
forAll(input, inputi)
|
||||||
{
|
{
|
||||||
if (!surfs[surfi].enabled())
|
const dictionary& surfDict = capture[inputi];
|
||||||
|
|
||||||
|
autoPtr<sampledSurface> surf = input.set(inputi, nullptr);
|
||||||
|
|
||||||
|
if (!surf.valid() || !surf->enabled())
|
||||||
{
|
{
|
||||||
surfs.set(surfi, nullptr);
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Define the surface
|
||||||
|
surfs.set(surfi, surf);
|
||||||
|
|
||||||
|
// Define additional action(s)
|
||||||
|
if (surfDict.lookupOrDefault("store", dfltStore))
|
||||||
|
{
|
||||||
|
actions_[surfi] |= ACTION_STORE;
|
||||||
|
}
|
||||||
|
if (surfDict.lookupOrDefault("surfMeshStore", false))
|
||||||
|
{
|
||||||
|
actions_[surfi] |= ACTION_SURF_MESH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define surface writer, but do NOT yet attach a surface
|
||||||
|
writers_.set
|
||||||
|
(
|
||||||
|
surfi,
|
||||||
|
newWriter(writerType, formatOptions, surfDict)
|
||||||
|
);
|
||||||
|
|
||||||
|
writers_[surfi].isPointData() = surfs[surfi].interpolate();
|
||||||
|
|
||||||
|
// Use outputDir/TIME/surface-name
|
||||||
|
writers_[surfi].useTimeDir() = true;
|
||||||
|
writers_[surfi].verbose() = verbose_;
|
||||||
|
|
||||||
|
++surfi;
|
||||||
}
|
}
|
||||||
|
|
||||||
surfs.resize(surfs.squeezeNull());
|
surfs.resize(surfi);
|
||||||
|
actions_.resize(surfi);
|
||||||
|
writers_.resize(surfi);
|
||||||
surfaces().transfer(surfs);
|
surfaces().transfer(surfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const auto& surfs = surfaces();
|
const auto& surfs = surfaces();
|
||||||
|
|
||||||
|
// Have some surfaces, so sort out which fields are needed and report
|
||||||
|
|
||||||
if (surfs.size())
|
if (surfs.size())
|
||||||
{
|
{
|
||||||
|
nFaces_.resize(surfs.size(), Zero);
|
||||||
|
|
||||||
dict.readEntry("fields", fieldSelection_);
|
dict.readEntry("fields", fieldSelection_);
|
||||||
fieldSelection_.uniq();
|
fieldSelection_.uniq();
|
||||||
|
|
||||||
// The surface writer and format options
|
|
||||||
const word writerType(dict.get<word>("surfaceFormat"));
|
|
||||||
|
|
||||||
// Define the surface formatter
|
|
||||||
// Optionally defined extra controls for the output formats
|
|
||||||
formatter_ = surfaceWriter::New
|
|
||||||
(
|
|
||||||
writerType,
|
|
||||||
dict.subOrEmptyDict("formatOptions").subOrEmptyDict(writerType)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (Pstream::parRun())
|
|
||||||
{
|
|
||||||
mergedList_.resize(size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure all surfaces and merge information are expired
|
|
||||||
expire();
|
|
||||||
|
|
||||||
label surfi = 0;
|
label surfi = 0;
|
||||||
for (const sampledSurface& s : surfs)
|
for (const sampledSurface& s : surfs)
|
||||||
{
|
{
|
||||||
@ -324,7 +453,18 @@ bool Foam::sampledSurfaces::read(const dictionary& dict)
|
|||||||
{
|
{
|
||||||
Info<< "Sampled surface:" << nl;
|
Info<< "Sampled surface:" << nl;
|
||||||
}
|
}
|
||||||
Info<< " " << s.name() << " -> " << writerType << nl;
|
|
||||||
|
Info<< " " << s.name() << " -> " << writers_[surfi].type();
|
||||||
|
if (actions_[surfi] & ACTION_STORE)
|
||||||
|
{
|
||||||
|
Info<< ", store on registry ("
|
||||||
|
<< IOobject::groupName(name(), s.name()) << ')';
|
||||||
|
}
|
||||||
|
if (actions_[surfi] & ACTION_SURF_MESH)
|
||||||
|
{
|
||||||
|
Info<< ", store as surfMesh (deprecated)";
|
||||||
|
}
|
||||||
|
Info<< nl;
|
||||||
|
|
||||||
++surfi;
|
++surfi;
|
||||||
}
|
}
|
||||||
@ -334,24 +474,171 @@ bool Foam::sampledSurfaces::read(const dictionary& dict)
|
|||||||
if (debug && Pstream::master())
|
if (debug && Pstream::master())
|
||||||
{
|
{
|
||||||
Pout<< "sample fields:" << fieldSelection_ << nl
|
Pout<< "sample fields:" << fieldSelection_ << nl
|
||||||
<< "sample surfaces:" << nl << "(" << nl;
|
<< "sample surfaces:" << nl << '(' << nl;
|
||||||
|
|
||||||
for (const sampledSurface& s : surfaces())
|
for (const sampledSurface& s : surfaces())
|
||||||
{
|
{
|
||||||
Pout<< " " << s << nl;
|
Pout<< " " << s << nl;
|
||||||
}
|
}
|
||||||
|
Pout<< ')' << endl;
|
||||||
Pout<< ")" << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// New geometry
|
// Ensure all surfaces and merge information are expired
|
||||||
changedGeom_.resize(size());
|
expire();
|
||||||
changedGeom_ = true;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::sampledSurfaces::performAction(unsigned request)
|
||||||
|
{
|
||||||
|
if
|
||||||
|
(
|
||||||
|
empty()
|
||||||
|
|| (request == ACTION_NONE)
|
||||||
|
|| !testAny
|
||||||
|
(
|
||||||
|
actions_,
|
||||||
|
[=] (unsigned action) { return (request & action); }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Finalize surfaces, update information, writer associations etc.
|
||||||
|
update();
|
||||||
|
|
||||||
|
bool noFaces = true;
|
||||||
|
for (const label n : nFaces_)
|
||||||
|
{
|
||||||
|
if (n) noFaces = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noFaces)
|
||||||
|
{
|
||||||
|
// No surfaces with faces at all.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine the per-surface number of fields, including Ids etc.
|
||||||
|
// Only seems to be needed for VTK legacy
|
||||||
|
countFields();
|
||||||
|
|
||||||
|
|
||||||
|
forAll(*this, surfi)
|
||||||
|
{
|
||||||
|
const sampledSurface& s = (*this)[surfi];
|
||||||
|
|
||||||
|
if (!nFaces_[surfi])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_STORE)
|
||||||
|
{
|
||||||
|
storeRegistrySurface(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_SURF_MESH)
|
||||||
|
{
|
||||||
|
s.storeSurfMesh();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_WRITE)
|
||||||
|
{
|
||||||
|
// Output writers
|
||||||
|
surfaceWriter& outWriter = writers_[surfi];
|
||||||
|
|
||||||
|
if (outWriter.needsUpdate())
|
||||||
|
{
|
||||||
|
outWriter.setSurface(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
outWriter.open(outputPath_/s.name());
|
||||||
|
|
||||||
|
outWriter.beginTime(obr_.time());
|
||||||
|
|
||||||
|
|
||||||
|
// Write geometry if no fields would otherwise be written
|
||||||
|
if (!outWriter.nFields() || outWriter.separateGeometry())
|
||||||
|
{
|
||||||
|
outWriter.writeGeometry();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write original ids - as label or scalar field
|
||||||
|
|
||||||
|
const word fieldName("Ids");
|
||||||
|
if (s.hasFaceIds() && !s.interpolate())
|
||||||
|
{
|
||||||
|
writeSurface
|
||||||
|
(
|
||||||
|
outWriter,
|
||||||
|
Field<label>(s.originalIds()),
|
||||||
|
fieldName
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const IOobjectList objects(obr_, obr_.time().timeName());
|
||||||
|
|
||||||
|
performAction<volScalarField>(objects, request);
|
||||||
|
performAction<volVectorField>(objects, request);
|
||||||
|
performAction<volSphericalTensorField>(objects, request);
|
||||||
|
performAction<volSymmTensorField>(objects, request);
|
||||||
|
performAction<volTensorField>(objects, request);
|
||||||
|
|
||||||
|
// Only bother with surface fields if a sampler supports them
|
||||||
|
if
|
||||||
|
(
|
||||||
|
testAny
|
||||||
|
(
|
||||||
|
surfaces(),
|
||||||
|
[] (const sampledSurface& s) { return s.withSurfaceFields(); }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
performAction<surfaceScalarField>(objects, request);
|
||||||
|
performAction<surfaceVectorField>(objects, request);
|
||||||
|
performAction<surfaceSphericalTensorField>(objects, request);
|
||||||
|
performAction<surfaceSymmTensorField>(objects, request);
|
||||||
|
performAction<surfaceTensorField>(objects, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Finish this time step
|
||||||
|
forAll(writers_, surfi)
|
||||||
|
{
|
||||||
|
if ((request & actions_[surfi]) & ACTION_WRITE)
|
||||||
|
{
|
||||||
|
writers_[surfi].endTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::sampledSurfaces::execute()
|
||||||
|
{
|
||||||
|
if (onExecute_)
|
||||||
|
{
|
||||||
|
return performAction(ACTION_ALL & ~ACTION_WRITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::sampledSurfaces::write()
|
||||||
|
{
|
||||||
|
return performAction(ACTION_ALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::sampledSurfaces::updateMesh(const mapPolyMesh& mpm)
|
void Foam::sampledSurfaces::updateMesh(const mapPolyMesh& mpm)
|
||||||
{
|
{
|
||||||
if (&mpm.mesh() == &mesh_)
|
if (&mpm.mesh() == &mesh_)
|
||||||
@ -383,9 +670,9 @@ void Foam::sampledSurfaces::readUpdate(const polyMesh::readUpdateState state)
|
|||||||
|
|
||||||
bool Foam::sampledSurfaces::needsUpdate() const
|
bool Foam::sampledSurfaces::needsUpdate() const
|
||||||
{
|
{
|
||||||
forAll(*this, surfi)
|
for (const sampledSurface& s : surfaces())
|
||||||
{
|
{
|
||||||
if (operator[](surfi).needsUpdate())
|
if (s.needsUpdate())
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -397,26 +684,29 @@ bool Foam::sampledSurfaces::needsUpdate() const
|
|||||||
|
|
||||||
bool Foam::sampledSurfaces::expire()
|
bool Foam::sampledSurfaces::expire()
|
||||||
{
|
{
|
||||||
bool justExpired = false;
|
// Dimension as fraction of mesh bounding box
|
||||||
|
const scalar mergeDim = mergeTol_ * mesh_.bounds().mag();
|
||||||
|
|
||||||
forAll(*this, surfi)
|
label nChanged = 0;
|
||||||
|
|
||||||
|
label surfi = 0;
|
||||||
|
|
||||||
|
for (sampledSurface& s : surfaces())
|
||||||
{
|
{
|
||||||
if (operator[](surfi).expire())
|
if (s.expire())
|
||||||
{
|
{
|
||||||
justExpired = true;
|
++nChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear merge information
|
writers_[surfi].expire();
|
||||||
if (Pstream::parRun())
|
writers_[surfi].mergeDim() = mergeDim;
|
||||||
{
|
nFaces_[surfi] = 0;
|
||||||
mergedList_[surfi].clear();
|
|
||||||
}
|
++surfi;
|
||||||
}
|
}
|
||||||
|
|
||||||
changedGeom_ = true;
|
// True if any surfaces just expired
|
||||||
|
return nChanged;
|
||||||
// true if any surfaces just expired
|
|
||||||
return justExpired;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -427,48 +717,24 @@ bool Foam::sampledSurfaces::update()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool updated = false;
|
label nUpdated = 0;
|
||||||
|
|
||||||
// Serial: quick and easy, no merging required
|
label surfi = 0;
|
||||||
if (!Pstream::parRun())
|
|
||||||
|
for (sampledSurface& s : surfaces())
|
||||||
{
|
{
|
||||||
forAll(*this, surfi)
|
|
||||||
{
|
|
||||||
sampledSurface& s = operator[](surfi);
|
|
||||||
|
|
||||||
if (s.update())
|
|
||||||
{
|
|
||||||
updated = true;
|
|
||||||
changedGeom_[surfi] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return updated;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Dimension as fraction of mesh bounding box
|
|
||||||
const scalar mergeDim = mergeTol_*mesh_.bounds().mag();
|
|
||||||
|
|
||||||
if (Pstream::master() && debug)
|
|
||||||
{
|
|
||||||
Pout<< nl << "Merging all points within "
|
|
||||||
<< mergeDim << " metre" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
forAll(*this, surfi)
|
|
||||||
{
|
|
||||||
sampledSurface& s = operator[](surfi);
|
|
||||||
|
|
||||||
if (s.update())
|
if (s.update())
|
||||||
{
|
{
|
||||||
updated = true;
|
++nUpdated;
|
||||||
changedGeom_[surfi] = true;
|
writers_[surfi].expire();
|
||||||
mergedList_[surfi].merge(s, mergeDim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nFaces_[surfi] = returnReduce(s.faces().size(), sumOp<label>());
|
||||||
|
|
||||||
|
++surfi;
|
||||||
}
|
}
|
||||||
|
|
||||||
return updated;
|
return nUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -53,8 +53,12 @@ Description
|
|||||||
// (only used if interpolate=true for the surfaces below)
|
// (only used if interpolate=true for the surfaces below)
|
||||||
interpolationScheme cell;
|
interpolationScheme cell;
|
||||||
|
|
||||||
|
// Optional: registry storage
|
||||||
|
store true
|
||||||
|
|
||||||
// Output surface format
|
// Output surface format
|
||||||
surfaceFormat vtk;
|
surfaceFormat vtk;
|
||||||
|
|
||||||
formatOptions
|
formatOptions
|
||||||
{
|
{
|
||||||
vtk
|
vtk
|
||||||
@ -76,6 +80,12 @@ Description
|
|||||||
|
|
||||||
// Optional: generate values on points instead of faces
|
// Optional: generate values on points instead of faces
|
||||||
interpolate true;
|
interpolate true;
|
||||||
|
|
||||||
|
// Optional: alternative output type
|
||||||
|
surfaceFormat ensight;
|
||||||
|
|
||||||
|
// Optional: registry storage
|
||||||
|
store true
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -84,13 +94,24 @@ Description
|
|||||||
Entries:
|
Entries:
|
||||||
\table
|
\table
|
||||||
Property | Description | Required | Default
|
Property | Description | Required | Default
|
||||||
type | surfaces | yes |
|
type | Type-name: surfaces | yes |
|
||||||
surfaces | list or dictionary of sample surfaces | recommended |
|
surfaces | Dictionary or list of sample surfaces | expected |
|
||||||
fields | word/regex list of fields to sampled | yes |
|
fields | word/regex list of fields to sample | yes |
|
||||||
sampleScheme | scheme to obtain face centre value | no | cell
|
sampleScheme | scheme to obtain face centre value | no | cell
|
||||||
interpolationScheme | scheme to obtain node values | no | cellPoint
|
interpolationScheme | scheme to obtain node values | no | cellPoint
|
||||||
surfaceFormat | output surface format | yes |
|
surfaceFormat | output surface format | yes |
|
||||||
formatOptions | dictionary of format options | no |
|
formatOptions | dictionary of format options | no |
|
||||||
|
sampleOnExecute | Sample (store) on execution as well | no | false
|
||||||
|
store | Store surface/fields on registry | no | false
|
||||||
|
\endtable
|
||||||
|
|
||||||
|
Additional per-surface entries:
|
||||||
|
\table
|
||||||
|
Property | Description | Required | Default
|
||||||
|
store | Store surface/fields on registry | no |
|
||||||
|
surfaceFormat | output surface format | no |
|
||||||
|
formatOptions | dictionary of format options | no |
|
||||||
|
surfMeshStore | Store surface/fields as surfMesh (transitional) | no |
|
||||||
\endtable
|
\endtable
|
||||||
|
|
||||||
Note
|
Note
|
||||||
@ -111,10 +132,8 @@ SourceFiles
|
|||||||
#include "fvMeshFunctionObject.H"
|
#include "fvMeshFunctionObject.H"
|
||||||
#include "sampledSurface.H"
|
#include "sampledSurface.H"
|
||||||
#include "surfaceWriter.H"
|
#include "surfaceWriter.H"
|
||||||
#include "mergedSurf.H"
|
|
||||||
#include "volFieldsFwd.H"
|
#include "volFieldsFwd.H"
|
||||||
#include "surfaceFieldsFwd.H"
|
#include "surfaceFieldsFwd.H"
|
||||||
#include "wordRes.H"
|
|
||||||
#include "IOobjectList.H"
|
#include "IOobjectList.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -122,6 +141,9 @@ SourceFiles
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Forward Declarations
|
||||||
|
class polySurface;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class sampledSurfaces Declaration
|
Class sampledSurfaces Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
@ -133,23 +155,36 @@ class sampledSurfaces
|
|||||||
{
|
{
|
||||||
// Static Data Members
|
// Static Data Members
|
||||||
|
|
||||||
//- Output verbosity
|
|
||||||
static bool verbose_;
|
|
||||||
|
|
||||||
//- Tolerance for merging points (fraction of mesh bounding box)
|
//- Tolerance for merging points (fraction of mesh bounding box)
|
||||||
static scalar mergeTol_;
|
static scalar mergeTol_;
|
||||||
|
|
||||||
|
//- Local control for sampling actions
|
||||||
|
enum sampleActionType : unsigned
|
||||||
|
{
|
||||||
|
ACTION_NONE = 0,
|
||||||
|
ACTION_WRITE = 0x1,
|
||||||
|
ACTION_STORE = 0x2,
|
||||||
|
ACTION_SURF_MESH = 0x4,
|
||||||
|
ACTION_ALL = 0xF
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Private Data
|
// Private Data
|
||||||
|
|
||||||
//- Load fields from files (not from objectRegistry)
|
//- Load fields from files (not from objectRegistry)
|
||||||
const bool loadFromFiles_;
|
const bool loadFromFiles_;
|
||||||
|
|
||||||
|
//- Output verbosity
|
||||||
|
bool verbose_;
|
||||||
|
|
||||||
|
//- Perform sample/store actions on execute as well
|
||||||
|
bool onExecute_;
|
||||||
|
|
||||||
//- Output path
|
//- Output path
|
||||||
fileName outputPath_;
|
fileName outputPath_;
|
||||||
|
|
||||||
|
|
||||||
// Read from dictonary
|
// Read from dictionary
|
||||||
|
|
||||||
//- Names of fields to sample
|
//- Names of fields to sample
|
||||||
wordRes fieldSelection_;
|
wordRes fieldSelection_;
|
||||||
@ -161,19 +196,16 @@ class sampledSurfaces
|
|||||||
word sampleNodeScheme_;
|
word sampleNodeScheme_;
|
||||||
|
|
||||||
|
|
||||||
// Surfaces
|
// Output control
|
||||||
|
|
||||||
//- Merged meshed surfaces (parallel only)
|
//- Surface writers (one per surface)
|
||||||
List<mergedSurf> mergedList_;
|
PtrList<surfaceWriter> writers_;
|
||||||
|
|
||||||
//- Track which surfaces have changed
|
//- Per-surface selection of store/write actions
|
||||||
List<bool> changedGeom_;
|
List<unsigned> actions_;
|
||||||
|
|
||||||
|
//- Cached values of the global number of faces per-surface
|
||||||
// Calculated
|
labelList nFaces_;
|
||||||
|
|
||||||
//- Surface formatter
|
|
||||||
autoPtr<surfaceWriter> formatter_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
@ -190,42 +222,82 @@ class sampledSurfaces
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Return number of fields
|
//- A new surfaceWriter, with per-surface formatOptions
|
||||||
label classifyFields();
|
static autoPtr<surfaceWriter> newWriter
|
||||||
|
(
|
||||||
|
word writeType,
|
||||||
|
const dictionary& formatOptions,
|
||||||
|
const dictionary& surfDict
|
||||||
|
);
|
||||||
|
|
||||||
//- Write geometry only
|
|
||||||
void writeGeometry() const;
|
|
||||||
|
|
||||||
//- Write scalar field with original ids
|
//- Perform sampling action with store/write
|
||||||
void writeOriginalIds();
|
bool performAction(unsigned request);
|
||||||
|
|
||||||
|
//- Count selected/sampled fields per surface
|
||||||
|
void countFields();
|
||||||
|
|
||||||
//- Write sampled fieldName on surface and on outputDir path
|
//- Write sampled fieldName on surface and on outputDir path
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void writeSurface
|
void writeSurface
|
||||||
(
|
(
|
||||||
|
surfaceWriter& writer,
|
||||||
const Field<Type>& values,
|
const Field<Type>& values,
|
||||||
const label surfi,
|
const word& fieldName
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Sample and store/write a specific volume field
|
||||||
|
template<class Type>
|
||||||
|
void performAction
|
||||||
|
(
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& fld,
|
||||||
|
unsigned request
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Sample and store/write a specific surface field
|
||||||
|
template<class Type>
|
||||||
|
void performAction
|
||||||
|
(
|
||||||
|
const GeometricField<Type, fvsPatchField, surfaceMesh>& fld,
|
||||||
|
unsigned request
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Sample and write all applicable sampled fields
|
||||||
|
template<class GeoField>
|
||||||
|
void performAction
|
||||||
|
(
|
||||||
|
const IOobjectList& objects,
|
||||||
|
unsigned request
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Get surface from registry if available.
|
||||||
|
// \return surface or nullptr
|
||||||
|
polySurface* getRegistrySurface(const sampledSurface& s) const;
|
||||||
|
|
||||||
|
//- Put surface onto registry, when enabled.
|
||||||
|
// \return surface or nullptr it surface should not be stored
|
||||||
|
polySurface* storeRegistrySurface(const sampledSurface& s);
|
||||||
|
|
||||||
|
//- Remove surface from registry.
|
||||||
|
// \return True if surface existed and was removed
|
||||||
|
bool removeRegistrySurface(const sampledSurface& s);
|
||||||
|
|
||||||
|
|
||||||
|
//- Store sampled field onto surface registry if it exists
|
||||||
|
template<class Type, class GeoMeshType>
|
||||||
|
bool storeRegistryField
|
||||||
|
(
|
||||||
|
const sampledSurface& s,
|
||||||
const word& fieldName,
|
const word& fieldName,
|
||||||
const fileName& outputDir
|
const dimensionSet& dims,
|
||||||
|
Field<Type>&& values
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Sample and write a particular volume field
|
|
||||||
template<class Type>
|
|
||||||
void sampleAndWrite
|
|
||||||
(
|
|
||||||
const GeometricField<Type, fvPatchField, volMesh>& vField
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Sample and write a particular surface field
|
|
||||||
template<class Type>
|
|
||||||
void sampleAndWrite
|
|
||||||
(
|
|
||||||
const GeometricField<Type, fvsPatchField, surfaceMesh>& sField
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Sample and write all sampled fields
|
|
||||||
template<class Type> void sampleAndWrite(const IOobjectList& objects);
|
|
||||||
|
|
||||||
|
//- Test surfaces for condition
|
||||||
|
template<class Container, class Predicate>
|
||||||
|
static bool testAny(const Container& items, const Predicate& pred);
|
||||||
|
|
||||||
//- No copy construct
|
//- No copy construct
|
||||||
sampledSurfaces(const sampledSurfaces&) = delete;
|
sampledSurfaces(const sampledSurfaces&) = delete;
|
||||||
|
|||||||
@ -1,89 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2015 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "sampledSurfaces.H"
|
|
||||||
#include "IOobjectList.H"
|
|
||||||
#include "UIndirectList.H"
|
|
||||||
#include "ListOps.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::label Foam::sampledSurfaces::classifyFields()
|
|
||||||
{
|
|
||||||
label nFields = 0;
|
|
||||||
|
|
||||||
wordList allFields; // Just needed for warnings
|
|
||||||
HashTable<wordHashSet> available;
|
|
||||||
|
|
||||||
if (loadFromFiles_)
|
|
||||||
{
|
|
||||||
// Check files for a particular time
|
|
||||||
IOobjectList objects(obr_, obr_.time().timeName());
|
|
||||||
|
|
||||||
allFields = objects.names();
|
|
||||||
available = objects.classes(fieldSelection_);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Check currently available fields
|
|
||||||
allFields = obr_.names();
|
|
||||||
available = obr_.classes(fieldSelection_);
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicList<label> missed(fieldSelection_.size());
|
|
||||||
|
|
||||||
// Detect missing fields
|
|
||||||
forAll(fieldSelection_, i)
|
|
||||||
{
|
|
||||||
if (!ListOps::found(allFields, fieldSelection_[i]))
|
|
||||||
{
|
|
||||||
missed.append(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (missed.size())
|
|
||||||
{
|
|
||||||
WarningInFunction
|
|
||||||
<< nl
|
|
||||||
<< "Cannot find "
|
|
||||||
<< (loadFromFiles_ ? "field file" : "registered field")
|
|
||||||
<< " matching "
|
|
||||||
<< UIndirectList<wordRe>(fieldSelection_, missed) << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Total number selected
|
|
||||||
forAllConstIters(available, iter)
|
|
||||||
{
|
|
||||||
nFields += iter.val().size();
|
|
||||||
}
|
|
||||||
|
|
||||||
return nFields;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -28,110 +28,61 @@ License
|
|||||||
#include "sampledSurfaces.H"
|
#include "sampledSurfaces.H"
|
||||||
#include "volFields.H"
|
#include "volFields.H"
|
||||||
#include "surfaceFields.H"
|
#include "surfaceFields.H"
|
||||||
#include "globalIndex.H"
|
#include "polySurface.H"
|
||||||
#include "stringListOps.H"
|
#include "polySurfaceFields.H"
|
||||||
|
#include "polySurfacePointFields.H"
|
||||||
|
#include "surfMesh.H"
|
||||||
|
#include "surfGeoMesh.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void Foam::sampledSurfaces::writeSurface
|
void Foam::sampledSurfaces::writeSurface
|
||||||
(
|
(
|
||||||
|
surfaceWriter& writer,
|
||||||
const Field<Type>& values,
|
const Field<Type>& values,
|
||||||
const label surfi,
|
const word& fieldName
|
||||||
const word& fieldName,
|
|
||||||
const fileName& outputDir
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const sampledSurface& s = operator[](surfi);
|
fileName outputName = writer.write(fieldName, values);
|
||||||
|
|
||||||
if (changedGeom_[surfi])
|
// Case-local file name with "<case>" to make relocatable
|
||||||
{
|
|
||||||
// Trigger any changes
|
|
||||||
formatter_->updateMesh(outputDir, s.name());
|
|
||||||
changedGeom_[surfi] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Pstream::parRun())
|
dictionary propsDict;
|
||||||
{
|
propsDict.add
|
||||||
// Gather all values into single field
|
(
|
||||||
Field<Type> allValues;
|
"file",
|
||||||
|
time_.relativePath(outputName, true)
|
||||||
|
);
|
||||||
|
setProperty(fieldName, propsDict);
|
||||||
|
}
|
||||||
|
|
||||||
globalIndex::gatherOp(values, allValues);
|
|
||||||
|
|
||||||
fileName sampleFile;
|
template<class Type, class GeoMeshType>
|
||||||
if (Pstream::master())
|
bool Foam::sampledSurfaces::storeRegistryField
|
||||||
{
|
(
|
||||||
// Renumber (point data) to correspond to merged points
|
const sampledSurface& s,
|
||||||
if (mergedList_[surfi].pointsMap().size() == allValues.size())
|
const word& fieldName,
|
||||||
{
|
const dimensionSet& dims,
|
||||||
inplaceReorder(mergedList_[surfi].pointsMap(), allValues);
|
Field<Type>&& values
|
||||||
allValues.resize(mergedList_[surfi].points().size());
|
)
|
||||||
}
|
{
|
||||||
|
return s.storeRegistryField<Type, GeoMeshType>
|
||||||
// Write to time directory under outputPath_
|
(
|
||||||
// skip surface without faces (eg, a failed cut-plane)
|
storedObjects(),
|
||||||
if (mergedList_[surfi].size())
|
fieldName,
|
||||||
{
|
dims,
|
||||||
sampleFile = formatter_->write
|
std::move(values),
|
||||||
(
|
IOobject::groupName(name(), s.name())
|
||||||
outputDir,
|
);
|
||||||
s.name(),
|
|
||||||
mergedList_[surfi],
|
|
||||||
fieldName,
|
|
||||||
allValues,
|
|
||||||
s.interpolate()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Pstream::scatter(sampleFile);
|
|
||||||
if (sampleFile.size())
|
|
||||||
{
|
|
||||||
// Case-local file name with "<case>" to make relocatable
|
|
||||||
|
|
||||||
dictionary propsDict;
|
|
||||||
propsDict.add
|
|
||||||
(
|
|
||||||
"file",
|
|
||||||
time_.relativePath(sampleFile, true)
|
|
||||||
);
|
|
||||||
setProperty(fieldName, propsDict);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Write to time directory under outputPath_
|
|
||||||
// skip surface without faces (eg, a failed cut-plane)
|
|
||||||
if (s.faces().size())
|
|
||||||
{
|
|
||||||
fileName fName = formatter_->write
|
|
||||||
(
|
|
||||||
outputDir,
|
|
||||||
s.name(),
|
|
||||||
s,
|
|
||||||
fieldName,
|
|
||||||
values,
|
|
||||||
s.interpolate()
|
|
||||||
);
|
|
||||||
|
|
||||||
// Case-local file name with "<case>" to make relocatable
|
|
||||||
|
|
||||||
dictionary propsDict;
|
|
||||||
propsDict.add
|
|
||||||
(
|
|
||||||
"file",
|
|
||||||
time_.relativePath(fName, true)
|
|
||||||
);
|
|
||||||
setProperty(fieldName, propsDict);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void Foam::sampledSurfaces::sampleAndWrite
|
void Foam::sampledSurfaces::performAction
|
||||||
(
|
(
|
||||||
const GeometricField<Type, fvPatchField, volMesh>& vField
|
const GeometricField<Type, fvPatchField, volMesh>& fld,
|
||||||
|
unsigned request
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// The sampler for this field
|
// The sampler for this field
|
||||||
@ -140,13 +91,20 @@ void Foam::sampledSurfaces::sampleAndWrite
|
|||||||
// The interpolator for this field
|
// The interpolator for this field
|
||||||
autoPtr<interpolation<Type>> interpPtr;
|
autoPtr<interpolation<Type>> interpPtr;
|
||||||
|
|
||||||
const word& fieldName = vField.name();
|
const word& fieldName = fld.name();
|
||||||
const fileName outputDir = outputPath_/vField.time().timeName();
|
|
||||||
|
const dimensionSet& dims = fld.dimensions();
|
||||||
|
|
||||||
forAll(*this, surfi)
|
forAll(*this, surfi)
|
||||||
{
|
{
|
||||||
const sampledSurface& s = operator[](surfi);
|
const sampledSurface& s = operator[](surfi);
|
||||||
|
|
||||||
|
// Skip surface without faces (eg, failed cut-plane)
|
||||||
|
if (!nFaces_[surfi])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Field<Type> values;
|
Field<Type> values;
|
||||||
|
|
||||||
if (s.interpolate())
|
if (s.interpolate())
|
||||||
@ -156,7 +114,7 @@ void Foam::sampledSurfaces::sampleAndWrite
|
|||||||
interpPtr = interpolation<Type>::New
|
interpPtr = interpolation<Type>::New
|
||||||
(
|
(
|
||||||
sampleNodeScheme_,
|
sampleNodeScheme_,
|
||||||
vField
|
fld
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,56 +127,117 @@ void Foam::sampledSurfaces::sampleAndWrite
|
|||||||
samplePtr = interpolation<Type>::New
|
samplePtr = interpolation<Type>::New
|
||||||
(
|
(
|
||||||
sampleFaceScheme_,
|
sampleFaceScheme_,
|
||||||
vField
|
fld
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
values = s.sample(*samplePtr);
|
values = s.sample(*samplePtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
writeSurface<Type>(values, surfi, fieldName, outputDir);
|
if ((request & actions_[surfi]) & ACTION_WRITE)
|
||||||
|
{
|
||||||
|
writeSurface<Type>(writers_[surfi], values, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_SURF_MESH)
|
||||||
|
{
|
||||||
|
// Face fields only!
|
||||||
|
s.storeSurfMeshField<Type, surfGeoMesh>
|
||||||
|
(
|
||||||
|
fieldName, dims, values
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_STORE)
|
||||||
|
{
|
||||||
|
if (s.interpolate())
|
||||||
|
{
|
||||||
|
storeRegistryField<Type, polySurfacePointGeoMesh>
|
||||||
|
(
|
||||||
|
s, fieldName, dims, std::move(values)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
storeRegistryField<Type, polySurfaceGeoMesh>
|
||||||
|
(
|
||||||
|
s, fieldName, dims, std::move(values)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void Foam::sampledSurfaces::sampleAndWrite
|
void Foam::sampledSurfaces::performAction
|
||||||
(
|
(
|
||||||
const GeometricField<Type, fvsPatchField, surfaceMesh>& sField
|
const GeometricField<Type, fvsPatchField, surfaceMesh>& fld,
|
||||||
|
unsigned request
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const word& fieldName = sField.name();
|
const word& fieldName = fld.name();
|
||||||
const fileName outputDir = outputPath_/sField.time().timeName();
|
|
||||||
|
const dimensionSet& dims = fld.dimensions();
|
||||||
|
|
||||||
forAll(*this, surfi)
|
forAll(*this, surfi)
|
||||||
{
|
{
|
||||||
const sampledSurface& s = operator[](surfi);
|
const sampledSurface& s = (*this)[surfi];
|
||||||
Field<Type> values(s.sample(sField));
|
|
||||||
writeSurface<Type>(values, surfi, fieldName, outputDir);
|
// Skip surface without faces (eg, failed cut-plane)
|
||||||
|
if (!nFaces_[surfi])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Field<Type> values(s.sample(fld));
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_WRITE)
|
||||||
|
{
|
||||||
|
writeSurface<Type>(writers_[surfi], values, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_SURF_MESH)
|
||||||
|
{
|
||||||
|
s.storeSurfMeshField<Type, surfGeoMesh>
|
||||||
|
(
|
||||||
|
fieldName, dims, values
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((request & actions_[surfi]) & ACTION_STORE)
|
||||||
|
{
|
||||||
|
storeRegistryField<Type, polySurfaceGeoMesh>
|
||||||
|
(
|
||||||
|
s, fieldName, dims, std::move(values)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class GeoField>
|
template<class GeoField>
|
||||||
void Foam::sampledSurfaces::sampleAndWrite(const IOobjectList& objects)
|
void Foam::sampledSurfaces::performAction
|
||||||
|
(
|
||||||
|
const IOobjectList& objects,
|
||||||
|
unsigned request
|
||||||
|
)
|
||||||
{
|
{
|
||||||
wordList fieldNames;
|
wordList fieldNames;
|
||||||
if (loadFromFiles_)
|
if (loadFromFiles_)
|
||||||
{
|
{
|
||||||
fieldNames = objects.sortedNames(GeoField::typeName, fieldSelection_);
|
fieldNames = objects.sortedNames<GeoField>(fieldSelection_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fieldNames = mesh_.thisDb().sortedNames<GeoField>(fieldSelection_);
|
fieldNames = mesh_.thisDb().sortedNames<GeoField>(fieldSelection_);
|
||||||
|
|
||||||
writeOriginalIds();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const word& fieldName : fieldNames)
|
for (const word& fieldName : fieldNames)
|
||||||
{
|
{
|
||||||
if (verbose_)
|
if (verbose_)
|
||||||
{
|
{
|
||||||
Info<< "sampleAndWrite: " << fieldName << endl;
|
Info<< "sampleWrite: " << fieldName << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loadFromFiles_)
|
if (loadFromFiles_)
|
||||||
@ -235,17 +254,37 @@ void Foam::sampledSurfaces::sampleAndWrite(const IOobjectList& objects)
|
|||||||
mesh_
|
mesh_
|
||||||
);
|
);
|
||||||
|
|
||||||
sampleAndWrite(fld);
|
performAction(fld, request);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sampleAndWrite
|
performAction
|
||||||
(
|
(
|
||||||
mesh_.thisDb().lookupObject<GeoField>(fieldName)
|
mesh_.thisDb().lookupObject<GeoField>(fieldName),
|
||||||
|
request
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Container, class Predicate>
|
||||||
|
bool Foam::sampledSurfaces::testAny
|
||||||
|
(
|
||||||
|
const Container& items,
|
||||||
|
const Predicate& pred
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (const auto& item : items)
|
||||||
|
{
|
||||||
|
if (pred(item))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -1,116 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2015 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "boundaryDataSurfaceWriter.H"
|
|
||||||
#include "makeSurfaceWriterMethods.H"
|
|
||||||
#include "argList.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
makeSurfaceWriterType(boundaryDataSurfaceWriter);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// Field writing implementation
|
|
||||||
#include "boundaryDataSurfaceWriterImpl.C"
|
|
||||||
|
|
||||||
// Field writing methods
|
|
||||||
defineSurfaceWriterWriteFields(Foam::boundaryDataSurfaceWriter);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::fileName Foam::boundaryDataSurfaceWriter::write
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// geometry: rootdir/surfaceName/"points"
|
|
||||||
// field: rootdir/surfaceName/time/field
|
|
||||||
|
|
||||||
const fileName baseDir(outputDir.path()/surfaceName);
|
|
||||||
const fileName timeName(outputDir.name());
|
|
||||||
|
|
||||||
const pointField& points = surf.points();
|
|
||||||
|
|
||||||
// Dummy time to use as an objectRegistry
|
|
||||||
const fileName caseDir(argList::envGlobalPath());
|
|
||||||
|
|
||||||
Time dummyTime
|
|
||||||
(
|
|
||||||
caseDir.path(), // root-path,
|
|
||||||
caseDir.name(), // case-name,
|
|
||||||
"system", //
|
|
||||||
"constant", //
|
|
||||||
false // no function objects
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Write points
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing points to " << baseDir/"points" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
pointIOField pts
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
baseDir/"points",
|
|
||||||
dummyTime,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE,
|
|
||||||
false
|
|
||||||
),
|
|
||||||
points
|
|
||||||
);
|
|
||||||
|
|
||||||
{
|
|
||||||
// Do like regIOobject::writeObject but don't do instance() adaptation
|
|
||||||
// since this would write to e.g. 0/ instead of postProcessing/
|
|
||||||
|
|
||||||
// Try opening an OFstream for object
|
|
||||||
mkDir(pts.path());
|
|
||||||
OFstream os(pts.objectPath());
|
|
||||||
|
|
||||||
//pts.writeHeader(os);
|
|
||||||
pts.writeData(os);
|
|
||||||
//pts.writeEndDivider(os);
|
|
||||||
}
|
|
||||||
|
|
||||||
return baseDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,231 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::boundaryDataSurfaceWriter
|
|
||||||
|
|
||||||
Description
|
|
||||||
A surfaceWriter for outputting to a form useable for the
|
|
||||||
timeVaryingMapped boundary condition. This reads the data from
|
|
||||||
constant/boundaryData/\<patch\> directory
|
|
||||||
|
|
||||||
Typical way of working:
|
|
||||||
- use a sampledSurface of type 'patch' (to sample a patch):
|
|
||||||
\verbatim
|
|
||||||
surfaces
|
|
||||||
{
|
|
||||||
type surfaces;
|
|
||||||
surfaceFormat boundaryData;
|
|
||||||
fields ( p );
|
|
||||||
surfaces
|
|
||||||
(
|
|
||||||
outlet
|
|
||||||
{
|
|
||||||
type patch;
|
|
||||||
patches (outlet);
|
|
||||||
interpolate false;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
- write using this writer.
|
|
||||||
- move postProcessing/surfaces/outlet to constant/boundaryData/outlet
|
|
||||||
in your destination case.
|
|
||||||
- use a timeVaryingMappedFixedValue condition to read and interpolate
|
|
||||||
the profile:
|
|
||||||
type timeVaryingMappedFixedValue;
|
|
||||||
setAverage false; // do not use read average
|
|
||||||
offset 0; // do not apply offset to values
|
|
||||||
|
|
||||||
Note:
|
|
||||||
- with 'interpolate false' the data is on the face centres of the
|
|
||||||
patch. Take care that a 2D geometry will only have a single row
|
|
||||||
of face centres so might not provide a valid triangulation
|
|
||||||
(this is what timeVaryingMappedFixedValue uses to do interpolation)
|
|
||||||
(Alternatively use timeVaryingMappedFixedValue with mapMethod 'nearest')
|
|
||||||
|
|
||||||
\heading Output file locations
|
|
||||||
|
|
||||||
The \c rootdir normally corresponds to something like
|
|
||||||
\c postProcessing/\<name\>
|
|
||||||
|
|
||||||
where the geometry is written as:
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- surfaceName
|
|
||||||
`-- "points"
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
and field data:
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- surfaceName
|
|
||||||
|-- "points"
|
|
||||||
`-- timeName
|
|
||||||
`-- field
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
boundaryDataSurfaceWriter.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef boundaryDataSurfaceWriter_H
|
|
||||||
#define boundaryDataSurfaceWriter_H
|
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class boundaryDataSurfaceWriter Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class boundaryDataSurfaceWriter
|
|
||||||
:
|
|
||||||
public surfaceWriter
|
|
||||||
{
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Templated write operation
|
|
||||||
template<class Type>
|
|
||||||
fileName writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("boundaryData");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
boundaryDataSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~boundaryDataSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
|
||||||
//- Write scalarField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,132 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2015 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify i
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "OFstream.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
#include "IOmanip.H"
|
|
||||||
#include "Time.H"
|
|
||||||
#include "pointIOField.H"
|
|
||||||
#include "primitivePatch.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
Foam::fileName Foam::boundaryDataSurfaceWriter::writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values,
|
|
||||||
const bool isNodeValues,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// geometry: rootdir/surfaceName/"points"
|
|
||||||
// field: rootdir/surfaceName/time/field
|
|
||||||
|
|
||||||
const fileName baseDir(outputDir.path()/surfaceName);
|
|
||||||
const fileName timeName(outputDir.name());
|
|
||||||
|
|
||||||
const pointField& points = surf.points();
|
|
||||||
const faceList& faces = surf.faces();
|
|
||||||
|
|
||||||
// Dummy time to use as an objectRegistry
|
|
||||||
const fileName caseDir(argList::envGlobalPath());
|
|
||||||
|
|
||||||
Time dummyTime
|
|
||||||
(
|
|
||||||
caseDir.path(), // root-path
|
|
||||||
caseDir.name(), // case-name
|
|
||||||
"system", //
|
|
||||||
"constant", //
|
|
||||||
false // no function objects
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Write points
|
|
||||||
|
|
||||||
pointIOField pts
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
baseDir/"points",
|
|
||||||
dummyTime,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE,
|
|
||||||
false
|
|
||||||
),
|
|
||||||
label(0)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isNodeValues)
|
|
||||||
{
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing points to " << baseDir/"points" << endl;
|
|
||||||
}
|
|
||||||
pts = points;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing face centres to " << baseDir/"points" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
primitivePatch pp(SubList<face>(faces, faces.size()), points);
|
|
||||||
|
|
||||||
pts = pp.faceCentres();
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
// Do like regIOobject::writeObject but don't do instance() adaptation
|
|
||||||
// since this would write to e.g. 0/ instead of postProcessing/
|
|
||||||
|
|
||||||
// Try opening an OFstream for object
|
|
||||||
mkDir(pts.path());
|
|
||||||
OFstream os(pts.objectPath());
|
|
||||||
|
|
||||||
//pts.writeHeader(os);
|
|
||||||
pts.writeData(os);
|
|
||||||
//pts.writeEndDivider(os);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Write field
|
|
||||||
{
|
|
||||||
fileName valsDir(baseDir/timeName);
|
|
||||||
mkDir(valsDir);
|
|
||||||
OFstream os(valsDir/fieldName);
|
|
||||||
os << values;
|
|
||||||
}
|
|
||||||
|
|
||||||
return baseDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,259 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::ensightSurfaceWriter
|
|
||||||
|
|
||||||
Description
|
|
||||||
A surfaceWriter for Ensight format.
|
|
||||||
|
|
||||||
\verbatim
|
|
||||||
formatOptions
|
|
||||||
{
|
|
||||||
ensight
|
|
||||||
{
|
|
||||||
format ascii;
|
|
||||||
collateTimes true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
Format options:
|
|
||||||
\table
|
|
||||||
Property | Description | Required | Default
|
|
||||||
format | ascii/binary | no | ascii
|
|
||||||
collateTimes | use common geometry for times | no | true
|
|
||||||
\endtable
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
ensightSurfaceWriter.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef ensightSurfaceWriter_H
|
|
||||||
#define ensightSurfaceWriter_H
|
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class ensightSurfaceWriter Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class ensightSurfaceWriter
|
|
||||||
:
|
|
||||||
public surfaceWriter
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Write option (default: IOstream::ASCII)
|
|
||||||
IOstream::streamFormat writeFormat_;
|
|
||||||
|
|
||||||
//- Collate times (default: true)
|
|
||||||
bool collateTimes_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Print time-set for ensight case file
|
|
||||||
static void printTimeset
|
|
||||||
(
|
|
||||||
OSstream& os,
|
|
||||||
const label ts,
|
|
||||||
const scalar& timeValue
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Print time-set for ensight case file
|
|
||||||
static void printTimeset
|
|
||||||
(
|
|
||||||
OSstream& os,
|
|
||||||
const label ts,
|
|
||||||
const UList<scalar>& times
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Templated write operation - one file per timestep
|
|
||||||
template<class Type>
|
|
||||||
fileName writeCollated
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
//- Templated write operation - all time steps in single file
|
|
||||||
template<class Type>
|
|
||||||
fileName writeUncollated
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
//- Templated write operation
|
|
||||||
template<class Type>
|
|
||||||
fileName writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("ensight");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
ensightSurfaceWriter();
|
|
||||||
|
|
||||||
//- Construct with some output options
|
|
||||||
ensightSurfaceWriter(const dictionary& options);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~ensightSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- True if the surface format supports geometry in a separate file.
|
|
||||||
// False if geometry and field must be in a single file
|
|
||||||
virtual bool separateGeometry() const;
|
|
||||||
|
|
||||||
//- Trigger for geometry changes.
|
|
||||||
// \note this is a stop-gap solution
|
|
||||||
virtual void updateMesh
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName //!< Name of surface
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
|
||||||
//- Write scalarField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,531 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "IOmanip.H"
|
|
||||||
#include "Fstream.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
|
|
||||||
#include "ensightCase.H"
|
|
||||||
#include "ensightPartFaces.H"
|
|
||||||
#include "ensightOutput.H"
|
|
||||||
#include "ensightPTraits.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
Foam::fileName Foam::ensightSurfaceWriter::writeUncollated
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values,
|
|
||||||
const bool isNodeValues,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const ensight::FileName surfName(surfaceName);
|
|
||||||
const ensight::VarName varName(fieldName);
|
|
||||||
|
|
||||||
// geometry: rootdir/time/<field>/surfaceName.case
|
|
||||||
// geometry: rootdir/time/<field>/surfaceName.<index>.mesh
|
|
||||||
// field: rootdir/time/<field>/surfaceName.<index>.field
|
|
||||||
|
|
||||||
// Variable name as sub-directory for results
|
|
||||||
// eg, something like this:
|
|
||||||
// - VAR1/SURF1.case
|
|
||||||
// - VAR1/SURF1.0000.mesh
|
|
||||||
// - VAR1/SURF1.0001.VAR1
|
|
||||||
// - VAR1/SURF2.case
|
|
||||||
// - VAR1/SURF2.0000.mesh
|
|
||||||
// - VAR1/SURF2.0001.VAR1
|
|
||||||
// and
|
|
||||||
// - VAR2/SURF1.case
|
|
||||||
// - VAR2/SURF1.0000.mesh
|
|
||||||
// - VAR2/SURF1.0001.VAR2
|
|
||||||
|
|
||||||
const fileName baseDir = outputDir/varName;
|
|
||||||
const fileName timeDir = outputDir.name();
|
|
||||||
// Convert timeDir to a value (if possible - use 0.0 otherwise)
|
|
||||||
scalar timeValue = 0.0;
|
|
||||||
readScalar(timeDir, timeValue);
|
|
||||||
|
|
||||||
|
|
||||||
if (!isDir(baseDir))
|
|
||||||
{
|
|
||||||
mkDir(baseDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
OFstream osCase(baseDir/surfName + ".case", IOstream::ASCII);
|
|
||||||
|
|
||||||
// Format options
|
|
||||||
osCase.setf(ios_base::left);
|
|
||||||
osCase.setf(ios_base::scientific, ios_base::floatfield);
|
|
||||||
osCase.precision(5);
|
|
||||||
|
|
||||||
ensightGeoFile osGeom
|
|
||||||
(
|
|
||||||
baseDir,
|
|
||||||
surfName + ".00000000.mesh",
|
|
||||||
writeFormat_
|
|
||||||
);
|
|
||||||
ensightFile osField
|
|
||||||
(
|
|
||||||
baseDir,
|
|
||||||
surfName + ".00000000." + varName,
|
|
||||||
writeFormat_
|
|
||||||
);
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing case file to " << osCase.name() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
osCase
|
|
||||||
<< "FORMAT" << nl
|
|
||||||
<< "type: ensight gold" << nl
|
|
||||||
<< nl
|
|
||||||
<< "GEOMETRY" << nl
|
|
||||||
<< "model: 1 " << osGeom.name().name() << nl
|
|
||||||
<< nl
|
|
||||||
<< "VARIABLE" << nl
|
|
||||||
<< ensightPTraits<Type>::typeName
|
|
||||||
<<
|
|
||||||
(
|
|
||||||
isNodeValues
|
|
||||||
? " per node: 1 " // time-set 1
|
|
||||||
: " per element: 1 " // time-set 1
|
|
||||||
)
|
|
||||||
<< setw(15) << varName << ' '
|
|
||||||
<< surfName.c_str() << ".********." << varName << nl;
|
|
||||||
|
|
||||||
osCase
|
|
||||||
<< nl
|
|
||||||
<< "TIME" << nl;
|
|
||||||
|
|
||||||
printTimeset(osCase, 1, timeValue);
|
|
||||||
osCase << "# end" << nl;
|
|
||||||
|
|
||||||
|
|
||||||
ensightPartFaces ensPart
|
|
||||||
(
|
|
||||||
0,
|
|
||||||
osGeom.name().name(),
|
|
||||||
surf.points(),
|
|
||||||
surf.faces(),
|
|
||||||
true // contiguous points
|
|
||||||
);
|
|
||||||
osGeom << ensPart;
|
|
||||||
|
|
||||||
// Write field
|
|
||||||
osField.writeKeyword(ensightPTraits<Type>::typeName);
|
|
||||||
|
|
||||||
if (isNodeValues)
|
|
||||||
{
|
|
||||||
ensightOutput::Serial::writePointField
|
|
||||||
(
|
|
||||||
values,
|
|
||||||
ensPart,
|
|
||||||
osField
|
|
||||||
// false // serial
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ensightOutput::Detail::writeFaceField
|
|
||||||
(
|
|
||||||
values,
|
|
||||||
ensPart,
|
|
||||||
osField,
|
|
||||||
false // serial
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return osCase.name();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
Foam::fileName Foam::ensightSurfaceWriter::writeCollated
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values,
|
|
||||||
const bool isNodeValues,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const ensight::FileName surfName(surfaceName);
|
|
||||||
const ensight::VarName varName(fieldName);
|
|
||||||
|
|
||||||
// geometry: rootdir/surfaceName/surfaceName.case
|
|
||||||
// geometry: rootdir/surfaceName/surfaceName/data/<index>/geometry
|
|
||||||
// field: rootdir/surfaceName/surfaceName/data/<index>/field
|
|
||||||
|
|
||||||
// Use surface name as sub-directory for results
|
|
||||||
// eg, something like this:
|
|
||||||
// - SURF1/SURF1.case
|
|
||||||
// - SURF1/SURF1/data/00000000/geometry
|
|
||||||
// - SURF1/SURF1/data/00000000/VAR1
|
|
||||||
// - SURF1/SURF1/data/00000000/VAR2
|
|
||||||
// and
|
|
||||||
// - SURF2/SURF2.case
|
|
||||||
// - SURF2/SURF2/data/00000000/geometry
|
|
||||||
// - SURF2/SURF2/data/00000000/VAR1
|
|
||||||
// - SURF2/SURF2/data/00000000/VAR2
|
|
||||||
|
|
||||||
// Names "data" and "geometry" as per ensightCase:
|
|
||||||
const char* fmt = "%08d";
|
|
||||||
const char* mask = "data/********/";
|
|
||||||
|
|
||||||
const fileName baseDir = outputDir.path()/surfName;
|
|
||||||
const fileName timeDir = outputDir.name();
|
|
||||||
// Convert timeDir to a value (if possible - use 0.0 otherwise)
|
|
||||||
scalar timeValue = 0.0;
|
|
||||||
readScalar(timeDir, timeValue);
|
|
||||||
|
|
||||||
scalar meshValue = 0;
|
|
||||||
|
|
||||||
if (!isDir(baseDir))
|
|
||||||
{
|
|
||||||
mkDir(baseDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
label meshIndex = 0;
|
|
||||||
label timeIndex = 0;
|
|
||||||
|
|
||||||
fileName geometryName;
|
|
||||||
|
|
||||||
// Do case file
|
|
||||||
{
|
|
||||||
dictionary dict;
|
|
||||||
scalarList meshes;
|
|
||||||
scalarList times;
|
|
||||||
bool stateChanged = false;
|
|
||||||
|
|
||||||
if (isFile(baseDir/"fieldsDict"))
|
|
||||||
{
|
|
||||||
IFstream is(baseDir/"fieldsDict");
|
|
||||||
if (is.good() && dict.read(is))
|
|
||||||
{
|
|
||||||
dict.readIfPresent("meshes", meshes);
|
|
||||||
dict.readIfPresent("times", times);
|
|
||||||
|
|
||||||
timeIndex = 1+findLower(times, timeValue);
|
|
||||||
|
|
||||||
if (dict.readIfPresent("updateMesh", meshValue))
|
|
||||||
{
|
|
||||||
meshIndex = 1+findLower(meshes, meshValue);
|
|
||||||
|
|
||||||
dict.remove("updateMesh");
|
|
||||||
stateChanged = true;
|
|
||||||
}
|
|
||||||
else if (meshes.size())
|
|
||||||
{
|
|
||||||
meshIndex = meshes.size()-1;
|
|
||||||
meshValue = meshes.last();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
meshIndex = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update stored times list
|
|
||||||
meshes.resize(meshIndex+1, -1);
|
|
||||||
times.resize(timeIndex+1, -1);
|
|
||||||
|
|
||||||
if (meshes[meshIndex] != meshValue)
|
|
||||||
{
|
|
||||||
stateChanged = true;
|
|
||||||
}
|
|
||||||
if (times[timeIndex] != timeValue)
|
|
||||||
{
|
|
||||||
stateChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
meshes[meshIndex] = meshValue;
|
|
||||||
times[timeIndex] = timeValue;
|
|
||||||
|
|
||||||
geometryName =
|
|
||||||
"data"/word::printf(fmt, meshIndex)/ensightCase::geometryName;
|
|
||||||
|
|
||||||
|
|
||||||
// Add my information to dictionary
|
|
||||||
{
|
|
||||||
dict.set("meshes", meshes);
|
|
||||||
dict.set("times", times);
|
|
||||||
if (dict.found("fields"))
|
|
||||||
{
|
|
||||||
dictionary& fieldsDict = dict.subDict("fields");
|
|
||||||
if (!fieldsDict.found(fieldName))
|
|
||||||
{
|
|
||||||
dictionary fieldDict;
|
|
||||||
fieldDict.set("type", ensightPTraits<Type>::typeName);
|
|
||||||
fieldDict.set("name", varName); // ensight variable name
|
|
||||||
|
|
||||||
fieldsDict.set(fieldName, fieldDict);
|
|
||||||
|
|
||||||
stateChanged = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dictionary fieldDict;
|
|
||||||
fieldDict.set("type", ensightPTraits<Type>::typeName);
|
|
||||||
fieldDict.set("name", varName); // ensight variable name
|
|
||||||
|
|
||||||
dictionary fieldsDict;
|
|
||||||
fieldsDict.set(fieldName, fieldDict);
|
|
||||||
|
|
||||||
dict.set("fields", fieldsDict);
|
|
||||||
|
|
||||||
stateChanged = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (stateChanged)
|
|
||||||
{
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing state file to fieldsDict" << endl;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
OFstream os(baseDir/"fieldsDict");
|
|
||||||
os << "// Summary of Ensight fields, times" << nl << nl;
|
|
||||||
dict.write(os, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
OFstream osCase(baseDir/surfName + ".case", IOstream::ASCII);
|
|
||||||
|
|
||||||
// Format options
|
|
||||||
osCase.setf(ios_base::left);
|
|
||||||
osCase.setf(ios_base::scientific, ios_base::floatfield);
|
|
||||||
osCase.precision(5);
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing case file to " << osCase.name() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The geometry can be any of the following:
|
|
||||||
// 0: constant/static
|
|
||||||
// 1: moving, with the same frequency as the data
|
|
||||||
// 2: moving, with different frequency as the data
|
|
||||||
|
|
||||||
const label tsGeom =
|
|
||||||
(meshes.size() == 1 ? 0 : meshes == times ? 1 : 2);
|
|
||||||
|
|
||||||
osCase
|
|
||||||
<< "FORMAT" << nl
|
|
||||||
<< "type: ensight gold" << nl
|
|
||||||
<< nl
|
|
||||||
<< "GEOMETRY" << nl;
|
|
||||||
|
|
||||||
|
|
||||||
if (tsGeom)
|
|
||||||
{
|
|
||||||
// moving
|
|
||||||
osCase
|
|
||||||
<< "model: " << tsGeom << " " // time-set (1|2)
|
|
||||||
<< mask << geometryName.name() << nl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// steady
|
|
||||||
osCase
|
|
||||||
<< "model: "
|
|
||||||
<< geometryName.c_str() << nl;
|
|
||||||
}
|
|
||||||
|
|
||||||
osCase
|
|
||||||
<< nl
|
|
||||||
<< "VARIABLE" << nl;
|
|
||||||
|
|
||||||
const dictionary& fieldsDict = dict.subDict("fields");
|
|
||||||
for (const entry& dEntry : fieldsDict)
|
|
||||||
{
|
|
||||||
const dictionary& subDict = dEntry.dict();
|
|
||||||
|
|
||||||
const word fieldType(subDict.get<word>("type"));
|
|
||||||
const word varName = subDict.lookupOrDefault
|
|
||||||
(
|
|
||||||
"name",
|
|
||||||
dEntry.keyword() // fieldName as fallback
|
|
||||||
);
|
|
||||||
|
|
||||||
osCase
|
|
||||||
<< fieldType
|
|
||||||
<<
|
|
||||||
(
|
|
||||||
isNodeValues
|
|
||||||
? " per node: 1 " // time-set 1
|
|
||||||
: " per element: 1 " // time-set 1
|
|
||||||
)
|
|
||||||
<< setw(15) << varName << ' '
|
|
||||||
<< mask << varName << nl;
|
|
||||||
}
|
|
||||||
|
|
||||||
osCase
|
|
||||||
<< nl
|
|
||||||
<< "TIME" << nl;
|
|
||||||
|
|
||||||
printTimeset(osCase, 1, times);
|
|
||||||
if (tsGeom == 2)
|
|
||||||
{
|
|
||||||
printTimeset(osCase, 2, meshes);
|
|
||||||
}
|
|
||||||
|
|
||||||
osCase << "# end" << nl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Location for data (and possibly the geometry as well)
|
|
||||||
fileName dataDir = baseDir/"data"/word::printf(fmt, timeIndex);
|
|
||||||
|
|
||||||
// As per mkdir -p "data/00000000"
|
|
||||||
mkDir(dataDir);
|
|
||||||
|
|
||||||
|
|
||||||
const fileName meshFile(baseDir/geometryName);
|
|
||||||
|
|
||||||
// Write geometry
|
|
||||||
ensightPartFaces ensPart
|
|
||||||
(
|
|
||||||
0,
|
|
||||||
meshFile.name(),
|
|
||||||
surf.points(),
|
|
||||||
surf.faces(),
|
|
||||||
true // contiguous points
|
|
||||||
);
|
|
||||||
if (!exists(meshFile))
|
|
||||||
{
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing mesh file to " << meshFile.name() << endl;
|
|
||||||
}
|
|
||||||
// Use two-argument form for path-name to avoid validating the base-dir
|
|
||||||
ensightGeoFile osGeom(meshFile.path(), meshFile.name(), writeFormat_);
|
|
||||||
osGeom << ensPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write field
|
|
||||||
ensightFile osField
|
|
||||||
(
|
|
||||||
dataDir,
|
|
||||||
varName,
|
|
||||||
writeFormat_
|
|
||||||
);
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing field file to " << osField.name() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write field
|
|
||||||
osField.writeKeyword(ensightPTraits<Type>::typeName);
|
|
||||||
|
|
||||||
if (isNodeValues)
|
|
||||||
{
|
|
||||||
ensightOutput::Serial::writePointField
|
|
||||||
(
|
|
||||||
values,
|
|
||||||
ensPart,
|
|
||||||
osField
|
|
||||||
// serial
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ensightOutput::Detail::writeFaceField
|
|
||||||
(
|
|
||||||
values,
|
|
||||||
ensPart,
|
|
||||||
osField,
|
|
||||||
false // serial
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Place a timestamp in the directory for future reference
|
|
||||||
{
|
|
||||||
OFstream timeStamp(dataDir/"time");
|
|
||||||
timeStamp
|
|
||||||
<< "# timestep time" << nl
|
|
||||||
<< dataDir.name() << " " << timeValue << nl;
|
|
||||||
}
|
|
||||||
|
|
||||||
return baseDir/surfName + ".case";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
Foam::fileName Foam::ensightSurfaceWriter::writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values,
|
|
||||||
const bool isNodeValues,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
if (collateTimes_)
|
|
||||||
{
|
|
||||||
return writeCollated
|
|
||||||
(
|
|
||||||
outputDir,
|
|
||||||
surfaceName,
|
|
||||||
surf,
|
|
||||||
fieldName,
|
|
||||||
values,
|
|
||||||
isNodeValues,
|
|
||||||
verbose
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return writeUncollated
|
|
||||||
(
|
|
||||||
outputDir,
|
|
||||||
surfaceName,
|
|
||||||
surf,
|
|
||||||
fieldName,
|
|
||||||
values,
|
|
||||||
isNodeValues,
|
|
||||||
verbose
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,98 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "foamSurfaceWriter.H"
|
|
||||||
#include "OFstream.H"
|
|
||||||
#include "makeSurfaceWriterMethods.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
makeSurfaceWriterType(foamSurfaceWriter);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// Field writing implementation
|
|
||||||
#include "foamSurfaceWriterImpl.C"
|
|
||||||
|
|
||||||
// Field writing methods
|
|
||||||
defineSurfaceWriterWriteFields(Foam::foamSurfaceWriter);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::fileName Foam::foamSurfaceWriter::write
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// Output:
|
|
||||||
// - rootdir/time/surfaceName/{points,faces}
|
|
||||||
|
|
||||||
fileName surfaceDir(outputDir/surfaceName);
|
|
||||||
|
|
||||||
if (!isDir(surfaceDir))
|
|
||||||
{
|
|
||||||
mkDir(surfaceDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing geometry to " << surfaceDir << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
const pointField& points = surf.points();
|
|
||||||
const faceList& faces = surf.faces();
|
|
||||||
|
|
||||||
// Points
|
|
||||||
OFstream(surfaceDir/"points")() << points;
|
|
||||||
|
|
||||||
// Faces
|
|
||||||
OFstream(surfaceDir/"faces")() << faces;
|
|
||||||
|
|
||||||
// Face centers. Not really necessary but very handy when reusing as inputs
|
|
||||||
// for e.g. timeVaryingMapped bc.
|
|
||||||
pointField faceCentres(faces.size(), Zero);
|
|
||||||
|
|
||||||
forAll(faces, facei)
|
|
||||||
{
|
|
||||||
faceCentres[facei] = faces[facei].centre(points);
|
|
||||||
}
|
|
||||||
|
|
||||||
OFstream(surfaceDir/"faceCentres")() << faceCentres;
|
|
||||||
|
|
||||||
return surfaceDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,209 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::foamSurfaceWriter
|
|
||||||
|
|
||||||
Description
|
|
||||||
A surfaceWriter for OpenFOAM surfaces
|
|
||||||
|
|
||||||
\heading Output file locations
|
|
||||||
|
|
||||||
The \c rootdir normally corresponds to something like
|
|
||||||
\c postProcessing/\<name\>
|
|
||||||
|
|
||||||
\subheading Geometry
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
`-- surfaceName
|
|
||||||
|-- "points"
|
|
||||||
|-- "faceCentres"
|
|
||||||
`-- "faces"
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\subheading Fields
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
`-- surfaceName
|
|
||||||
|-- scalarField
|
|
||||||
| |-- field
|
|
||||||
| `-- field
|
|
||||||
|-- vectorField
|
|
||||||
|-- field
|
|
||||||
`-- field
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
foamSurfaceWriter.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef foamSurfaceWriter_H
|
|
||||||
#define foamSurfaceWriter_H
|
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class foamSurfaceWriter Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class foamSurfaceWriter
|
|
||||||
:
|
|
||||||
public surfaceWriter
|
|
||||||
{
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Templated write operation
|
|
||||||
template<class Type>
|
|
||||||
fileName writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("foam");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
foamSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~foamSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- True if the surface format supports geometry in a separate file.
|
|
||||||
// False if geometry and field must be in a single file
|
|
||||||
virtual bool separateGeometry() const
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
|
||||||
//- Write scalarField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,77 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "OFstream.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
Foam::fileName Foam::foamSurfaceWriter::writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values,
|
|
||||||
const bool isNodeValues,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// Geometry should already have been written
|
|
||||||
// Values to separate directory (e.g. "scalarField/p")
|
|
||||||
|
|
||||||
// field: rootdir/time/surfaceName/fieldType/field
|
|
||||||
|
|
||||||
const word fieldTypeName
|
|
||||||
(
|
|
||||||
word(pTraits<Type>::typeName) + FieldBase::typeName
|
|
||||||
);
|
|
||||||
|
|
||||||
const fileName base(outputDir/surfaceName);
|
|
||||||
const fileName outputFile(base / fieldTypeName / fieldName);
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing field " << fieldName << " to " << base << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (!isDir(outputFile.path()))
|
|
||||||
{
|
|
||||||
mkDir(outputFile.path());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write field
|
|
||||||
OFstream os(outputFile);
|
|
||||||
os << values;
|
|
||||||
|
|
||||||
return os.name();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,136 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "rawSurfaceWriter.H"
|
|
||||||
#include "OFstream.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
#include "makeSurfaceWriterMethods.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
makeSurfaceWriterType(rawSurfaceWriter);
|
|
||||||
addToRunTimeSelectionTable(surfaceWriter, rawSurfaceWriter, wordDict);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
// Emit x,y,z
|
|
||||||
static inline void writePoint(Ostream& os, const point& p)
|
|
||||||
{
|
|
||||||
os << p.x() << ' ' << p.y() << ' ' << p.z();
|
|
||||||
}
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// Field writing implementation
|
|
||||||
#include "rawSurfaceWriterImpl.C"
|
|
||||||
|
|
||||||
// Field writing methods
|
|
||||||
defineSurfaceWriterWriteFields(Foam::rawSurfaceWriter);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::rawSurfaceWriter::rawSurfaceWriter()
|
|
||||||
:
|
|
||||||
surfaceWriter(),
|
|
||||||
writeCompression_(IOstream::UNCOMPRESSED)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::rawSurfaceWriter::rawSurfaceWriter(const dictionary& options)
|
|
||||||
:
|
|
||||||
surfaceWriter(),
|
|
||||||
writeCompression_(IOstream::UNCOMPRESSED)
|
|
||||||
{
|
|
||||||
if (options.found("compression"))
|
|
||||||
{
|
|
||||||
writeCompression_ =
|
|
||||||
IOstream::compressionEnum(options.get<word>("compression"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::fileName Foam::rawSurfaceWriter::write
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// geometry: rootdir/time/surfaceName.raw
|
|
||||||
|
|
||||||
const pointField& points = surf.points();
|
|
||||||
const faceList& faces = surf.faces();
|
|
||||||
|
|
||||||
|
|
||||||
if (!isDir(outputDir))
|
|
||||||
{
|
|
||||||
mkDir(outputDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
OFstream os
|
|
||||||
(
|
|
||||||
outputDir/surfaceName + ".raw",
|
|
||||||
IOstream::ASCII,
|
|
||||||
IOstream::currentVersion,
|
|
||||||
writeCompression_
|
|
||||||
);
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing geometry to " << os.name() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Header
|
|
||||||
os << "# geometry NO_DATA " << faces.size() << nl
|
|
||||||
<< "# x y z" << nl;
|
|
||||||
|
|
||||||
// Write faces centres
|
|
||||||
for (const face& f : faces)
|
|
||||||
{
|
|
||||||
writePoint(os, f.centre(points));
|
|
||||||
os << nl;
|
|
||||||
}
|
|
||||||
|
|
||||||
os << nl;
|
|
||||||
|
|
||||||
return os.name();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,220 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::rawSurfaceWriter
|
|
||||||
|
|
||||||
Description
|
|
||||||
A surfaceWriter for raw output.
|
|
||||||
|
|
||||||
The formatOptions for raw:
|
|
||||||
\table
|
|
||||||
Property | Description | Required | Default
|
|
||||||
compression | on / off | no | off
|
|
||||||
\endtable
|
|
||||||
|
|
||||||
For example,
|
|
||||||
\verbatim
|
|
||||||
formatOptions
|
|
||||||
{
|
|
||||||
raw
|
|
||||||
{
|
|
||||||
compression on;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\heading Output file locations
|
|
||||||
|
|
||||||
The \c rootdir normally corresponds to something like
|
|
||||||
\c postProcessing/\<name\>
|
|
||||||
|
|
||||||
\subheading Geometry
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
`-- surfaceName.{raw}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\subheading Fields
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
|-- <field0>_surfaceName.{raw}
|
|
||||||
`-- <field1>_surfaceName.{raw}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
rawSurfaceWriter.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef rawSurfaceWriter_H
|
|
||||||
#define rawSurfaceWriter_H
|
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class rawSurfaceWriter Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class rawSurfaceWriter
|
|
||||||
:
|
|
||||||
public surfaceWriter
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Output compression (default: uncompressed)
|
|
||||||
IOstream::compressionType writeCompression_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Templated write operation
|
|
||||||
template<class Type>
|
|
||||||
fileName writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("raw");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
rawSurfaceWriter();
|
|
||||||
|
|
||||||
//- Construct with some output options
|
|
||||||
rawSurfaceWriter(const dictionary& options);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~rawSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
|
||||||
//- Write scalarField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,215 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::starcdSurfaceWriter
|
|
||||||
|
|
||||||
Description
|
|
||||||
A surfaceWriter for STARCD files.
|
|
||||||
|
|
||||||
The geometry is written via the MeshedSurfaceProxy, the fields
|
|
||||||
are written in a trivial ASCII format with ID and VALUE as
|
|
||||||
so-called user data. These \c .usr files can be read into proSTAR
|
|
||||||
with these types of commands. For element data:
|
|
||||||
\verbatim
|
|
||||||
getuser FILENAME.usr cell scalar free
|
|
||||||
getuser FILENAME.usr cell vector free
|
|
||||||
\endverbatim
|
|
||||||
and for vertex data:
|
|
||||||
\verbatim
|
|
||||||
getuser FILENAME.usr vertex scalar free
|
|
||||||
getuser FILENAME.usr vertex vector free
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\heading Output file locations
|
|
||||||
|
|
||||||
The \c rootdir normally corresponds to something like
|
|
||||||
\c postProcessing/\<name\>
|
|
||||||
|
|
||||||
\subheading Geometry
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
`-- surfaceName.{cel,vrt,inp}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\subheading Fields
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
|-- <field0>_surfaceName.{usr}
|
|
||||||
`-- <field1>_surfaceName.{usr}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
starcdSurfaceWriter.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef starcdSurfaceWriter_H
|
|
||||||
#define starcdSurfaceWriter_H
|
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class starcdSurfaceWriter Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class starcdSurfaceWriter
|
|
||||||
:
|
|
||||||
public surfaceWriter
|
|
||||||
{
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Templated write operation
|
|
||||||
template<class Type>
|
|
||||||
fileName writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("starcd");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
starcdSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~starcdSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- True if the surface format supports geometry in a separate file.
|
|
||||||
// False if geometry and field must be in a single file
|
|
||||||
virtual bool separateGeometry() const
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
|
||||||
//- Write scalarField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,94 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "OFstream.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
// Emit each component
|
|
||||||
template<class Type>
|
|
||||||
static inline void writeData(Ostream& os, const Type& val)
|
|
||||||
{
|
|
||||||
const direction ncmpt = pTraits<Type>::nComponents;
|
|
||||||
for (direction cmpt=0; cmpt < ncmpt; ++cmpt)
|
|
||||||
{
|
|
||||||
os << ' ' << component(val, cmpt);
|
|
||||||
}
|
|
||||||
os << nl;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
Foam::fileName Foam::starcdSurfaceWriter::writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf&,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values,
|
|
||||||
const bool isNodeValues,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// field: rootdir/time/<field>_surfaceName.usr
|
|
||||||
|
|
||||||
if (!isDir(outputDir))
|
|
||||||
{
|
|
||||||
mkDir(outputDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
OFstream os(outputDir/fieldName + '_' + surfaceName + ".usr");
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing field " << fieldName << " to " << os.name() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1-based ids
|
|
||||||
label elemId = 1;
|
|
||||||
|
|
||||||
// No header, just write values
|
|
||||||
for (const Type& val : values)
|
|
||||||
{
|
|
||||||
os << elemId;
|
|
||||||
writeData(os, val);
|
|
||||||
|
|
||||||
++elemId;
|
|
||||||
}
|
|
||||||
|
|
||||||
return os.name();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,126 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2015 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
|
|
||||||
#include "MeshedSurfaceProxy.H"
|
|
||||||
#include "proxySurfaceWriter.H"
|
|
||||||
|
|
||||||
#include "HashTable.H"
|
|
||||||
#include "word.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
defineTypeNameAndDebug(surfaceWriter, 0);
|
|
||||||
defineRunTimeSelectionTable(surfaceWriter, word);
|
|
||||||
defineRunTimeSelectionTable(surfaceWriter, wordDict);
|
|
||||||
addNamedToRunTimeSelectionTable
|
|
||||||
(
|
|
||||||
surfaceWriter,
|
|
||||||
surfaceWriter,
|
|
||||||
word,
|
|
||||||
null
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::autoPtr<Foam::surfaceWriter>
|
|
||||||
Foam::surfaceWriter::New(const word& writeType)
|
|
||||||
{
|
|
||||||
const auto cstrIter = wordConstructorTablePtr_->cfind(writeType);
|
|
||||||
|
|
||||||
if (cstrIter.found())
|
|
||||||
{
|
|
||||||
return autoPtr<surfaceWriter>(cstrIter()());
|
|
||||||
}
|
|
||||||
else if (MeshedSurfaceProxy<face>::canWriteType(writeType))
|
|
||||||
{
|
|
||||||
// Unknown, but proxy handler can manage it
|
|
||||||
return autoPtr<surfaceWriter>(new proxySurfaceWriter(writeType));
|
|
||||||
}
|
|
||||||
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "Unknown write type \"" << writeType << "\"\n\n"
|
|
||||||
<< "Valid types : "
|
|
||||||
<< wordConstructorTablePtr_->sortedToc() << nl
|
|
||||||
<< "Valid proxy types : "
|
|
||||||
<< MeshedSurfaceProxy<face>::writeTypes() << endl
|
|
||||||
<< exit(FatalError);
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::autoPtr<Foam::surfaceWriter>
|
|
||||||
Foam::surfaceWriter::New(const word& writeType, const dictionary& options)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
// Constructor with options (dictionary)
|
|
||||||
const auto cstrIter = wordDictConstructorTablePtr_->cfind(writeType);
|
|
||||||
|
|
||||||
if (cstrIter.found())
|
|
||||||
{
|
|
||||||
return autoPtr<surfaceWriter>(cstrIter()(options));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Drop through to version without options
|
|
||||||
|
|
||||||
const auto cstrIter = wordConstructorTablePtr_->cfind(writeType);
|
|
||||||
|
|
||||||
if (cstrIter.found())
|
|
||||||
{
|
|
||||||
return autoPtr<surfaceWriter>(cstrIter()());
|
|
||||||
}
|
|
||||||
else if (MeshedSurfaceProxy<face>::canWriteType(writeType))
|
|
||||||
{
|
|
||||||
// Unknown, but proxy handler can manage it
|
|
||||||
return autoPtr<surfaceWriter>
|
|
||||||
(
|
|
||||||
new proxySurfaceWriter(writeType, options)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "Unknown write type \"" << writeType << "\"\n\n"
|
|
||||||
<< "Valid types : "
|
|
||||||
<< wordConstructorTablePtr_->sortedToc() << nl
|
|
||||||
<< "Valid proxy types : "
|
|
||||||
<< MeshedSurfaceProxy<face>::writeTypes() << endl
|
|
||||||
<< exit(FatalError);
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,230 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2012 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::surfaceWriter
|
|
||||||
|
|
||||||
Description
|
|
||||||
Base class for surface writers
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
surfaceWriter.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef surfaceWriter_H
|
|
||||||
#define surfaceWriter_H
|
|
||||||
|
|
||||||
#include "typeInfo.H"
|
|
||||||
#include "autoPtr.H"
|
|
||||||
#include "fileName.H"
|
|
||||||
#include "meshedSurfRef.H"
|
|
||||||
#include "runTimeSelectionTables.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class surfaceWriter Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class surfaceWriter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("surfaceWriter");
|
|
||||||
|
|
||||||
// Declare run-time constructor selection table
|
|
||||||
|
|
||||||
declareRunTimeSelectionTable
|
|
||||||
(
|
|
||||||
autoPtr,
|
|
||||||
surfaceWriter,
|
|
||||||
word,
|
|
||||||
(),
|
|
||||||
()
|
|
||||||
);
|
|
||||||
|
|
||||||
declareRunTimeSelectionTable
|
|
||||||
(
|
|
||||||
autoPtr,
|
|
||||||
surfaceWriter,
|
|
||||||
wordDict,
|
|
||||||
(
|
|
||||||
const dictionary& options
|
|
||||||
),
|
|
||||||
(options)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Selectors
|
|
||||||
|
|
||||||
//- Return a reference to the selected surfaceWriter
|
|
||||||
static autoPtr<surfaceWriter> New(const word& writeType);
|
|
||||||
|
|
||||||
//- Return a reference to the selected surfaceWriter
|
|
||||||
// Select with extra write option
|
|
||||||
static autoPtr<surfaceWriter> New
|
|
||||||
(
|
|
||||||
const word& writeType,
|
|
||||||
const dictionary& writeOptions
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
surfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~surfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- True if the surface format supports geometry in a separate file.
|
|
||||||
// False if geometry and field must be in a single file
|
|
||||||
virtual bool separateGeometry() const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Trigger for geometry changes.
|
|
||||||
// \note this is a stop-gap solution until the writing infrastructure
|
|
||||||
// is improved.
|
|
||||||
virtual void updateMesh
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName //!< Name of surface
|
|
||||||
) const
|
|
||||||
{}
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return fileName::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write scalarField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return fileName::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return fileName::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return fileName::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return fileName::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return fileName::null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,192 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "vtkSurfaceWriter.H"
|
|
||||||
#include "foamVtkOutputOptions.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
#include <fstream>
|
|
||||||
#include "makeSurfaceWriterMethods.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
makeSurfaceWriterType(vtkSurfaceWriter);
|
|
||||||
addToRunTimeSelectionTable(surfaceWriter, vtkSurfaceWriter, wordDict);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field writing implementation
|
|
||||||
#include "vtkSurfaceWriterImpl.C"
|
|
||||||
|
|
||||||
// Field writing methods
|
|
||||||
defineSurfaceWriterWriteFields(Foam::vtkSurfaceWriter);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void Foam::vtkSurfaceWriter::writeGeometry
|
|
||||||
(
|
|
||||||
vtk::formatter& format,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
std::string title
|
|
||||||
)
|
|
||||||
{
|
|
||||||
const pointField& points = surf.points();
|
|
||||||
const faceList& faces = surf.faces();
|
|
||||||
|
|
||||||
if (title.empty())
|
|
||||||
{
|
|
||||||
title = "sampleSurface";
|
|
||||||
}
|
|
||||||
|
|
||||||
vtk::legacy::fileHeader
|
|
||||||
(
|
|
||||||
format,
|
|
||||||
title,
|
|
||||||
vtk::fileTag::POLY_DATA
|
|
||||||
);
|
|
||||||
|
|
||||||
vtk::legacy::beginPoints(format.os(), points.size());
|
|
||||||
|
|
||||||
vtk::writeList(format, points);
|
|
||||||
format.flush();
|
|
||||||
|
|
||||||
// Write faces
|
|
||||||
// connectivity count without additional storage (done internally)
|
|
||||||
label nConnectivity = 0;
|
|
||||||
for (const face& f : faces)
|
|
||||||
{
|
|
||||||
nConnectivity += f.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
vtk::legacy::beginPolys
|
|
||||||
(
|
|
||||||
format.os(),
|
|
||||||
faces.size(),
|
|
||||||
nConnectivity
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const face& f : faces)
|
|
||||||
{
|
|
||||||
format.write(f.size()); // The size prefix
|
|
||||||
vtk::writeList(format, f);
|
|
||||||
}
|
|
||||||
|
|
||||||
format.flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::vtkSurfaceWriter::vtkSurfaceWriter()
|
|
||||||
:
|
|
||||||
surfaceWriter(),
|
|
||||||
fmtType_(unsigned(vtk::formatType::LEGACY_ASCII)),
|
|
||||||
precision_(IOstream::defaultPrecision())
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::vtkSurfaceWriter::vtkSurfaceWriter(const dictionary& options)
|
|
||||||
:
|
|
||||||
surfaceWriter(),
|
|
||||||
fmtType_(static_cast<unsigned>(vtk::formatType::LEGACY_ASCII)),
|
|
||||||
precision_(IOstream::defaultPrecision())
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
// Future
|
|
||||||
// format: ascii | binary
|
|
||||||
// legacy true | false
|
|
||||||
|
|
||||||
vtk::outputOptions opts(static_cast<vtk::formatType>(fmtType_));
|
|
||||||
|
|
||||||
const word formatName = options.lookupOrDefault<word>("format", "");
|
|
||||||
if (formatName.size())
|
|
||||||
{
|
|
||||||
opts.ascii
|
|
||||||
(
|
|
||||||
IOstream::formatEnum(formatName) == IOstream::ASCII
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.lookupOrDefault("legacy", false))
|
|
||||||
{
|
|
||||||
opts.legacy(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert back to raw data type
|
|
||||||
fmtType_ = static_cast<unsigned>(opts.fmt());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The write precision for ASCII formatters
|
|
||||||
precision_ =
|
|
||||||
options.lookupOrDefaultCompat
|
|
||||||
(
|
|
||||||
"precision", {{"writePrecision", -1806}},
|
|
||||||
IOstream::defaultPrecision()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::fileName Foam::vtkSurfaceWriter::write
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// geometry: rootdir/time/surfaceName.{vtk|vtp}
|
|
||||||
|
|
||||||
fileName outputFile(outputDir/surfaceName + ".vtk");
|
|
||||||
|
|
||||||
if (!isDir(outputDir))
|
|
||||||
{
|
|
||||||
mkDir(outputDir);
|
|
||||||
}
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing geometry to " << outputFile << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// As vtk::outputOptions
|
|
||||||
vtk::outputOptions opts(static_cast<vtk::formatType>(fmtType_));
|
|
||||||
opts.legacy(true);
|
|
||||||
opts.precision(precision_);
|
|
||||||
|
|
||||||
std::ofstream os(outputFile);
|
|
||||||
|
|
||||||
auto format = opts.newFormatter(os);
|
|
||||||
|
|
||||||
writeGeometry(*format, surf, surfaceName);
|
|
||||||
|
|
||||||
return outputFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,251 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::vtkSurfaceWriter
|
|
||||||
|
|
||||||
Description
|
|
||||||
A surfaceWriter for VTK legacy format.
|
|
||||||
|
|
||||||
The formatOptions for vtk:
|
|
||||||
\table
|
|
||||||
Property | Description | Required | Default
|
|
||||||
format | [FUTURE] ascii or binary format | no | ascii
|
|
||||||
legacy | [FUTURE] Legacy VTK output | no | true
|
|
||||||
precision | Write precision in ascii | no | same as IOstream
|
|
||||||
\endtable
|
|
||||||
|
|
||||||
For example,
|
|
||||||
\verbatim
|
|
||||||
formatOptions
|
|
||||||
{
|
|
||||||
vtk
|
|
||||||
{
|
|
||||||
precision 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\heading Output file locations
|
|
||||||
|
|
||||||
The \c rootdir normally corresponds to something like
|
|
||||||
\c postProcessing/\<name\>
|
|
||||||
|
|
||||||
\subheading Geometry
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
`-- surfaceName.{vtk}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\subheading Fields
|
|
||||||
\verbatim
|
|
||||||
rootdir
|
|
||||||
`-- timeName
|
|
||||||
`-- <field>_surfaceName.{vtk}
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
Note
|
|
||||||
Uses ASCII-only output.
|
|
||||||
All data are written as \c double due to portability issues
|
|
||||||
(paraview on window).
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
vtkSurfaceWriter.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef vtkSurfaceWriter_H
|
|
||||||
#define vtkSurfaceWriter_H
|
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
namespace vtk
|
|
||||||
{
|
|
||||||
// Forward declarations
|
|
||||||
class formatter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class vtkSurfaceWriter Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class vtkSurfaceWriter
|
|
||||||
:
|
|
||||||
public surfaceWriter
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- The VTK output format type.
|
|
||||||
// Stored as a raw value to avoid a dependency on fileFormats
|
|
||||||
unsigned fmtType_;
|
|
||||||
|
|
||||||
//- ASCII write precision
|
|
||||||
unsigned precision_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
static void writeGeometry
|
|
||||||
(
|
|
||||||
vtk::formatter& format,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
std::string title = ""
|
|
||||||
);
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
static void writeField
|
|
||||||
(
|
|
||||||
vtk::formatter& format,
|
|
||||||
const Field<Type>& values
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
//- Templated write operation
|
|
||||||
template<class Type>
|
|
||||||
fileName writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<Type>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Runtime type information
|
|
||||||
TypeName("vtk");
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
vtkSurfaceWriter();
|
|
||||||
|
|
||||||
//- Construct with some output options
|
|
||||||
explicit vtkSurfaceWriter(const dictionary& options);
|
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
|
||||||
virtual ~vtkSurfaceWriter() = default;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
|
||||||
//- Write scalarField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "foamVtkOutputOptions.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
template<class Type>
|
|
||||||
static inline void beginFloatField
|
|
||||||
(
|
|
||||||
vtk::formatter& format,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// Use 'double' instead of 'float' for ASCII output (issue #891)
|
|
||||||
if (format.opts().ascii())
|
|
||||||
{
|
|
||||||
format.os()
|
|
||||||
<< fieldName << ' '
|
|
||||||
<< int(pTraits<Type>::nComponents) << ' '
|
|
||||||
<< values.size() << " double" << nl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
format.os()
|
|
||||||
<< fieldName << ' '
|
|
||||||
<< int(pTraits<Type>::nComponents) << ' '
|
|
||||||
<< values.size() << " float" << nl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// // Unspecialized (unknown) data type - map as zeros
|
|
||||||
// void Foam::vtkSurfaceWriter::writeZeros
|
|
||||||
// (
|
|
||||||
// vtk::formatter& format,
|
|
||||||
// const label count
|
|
||||||
// )
|
|
||||||
// {
|
|
||||||
// const float val(0);
|
|
||||||
//
|
|
||||||
// for (label i=0; i < count; ++i)
|
|
||||||
// {
|
|
||||||
// format.write(val);
|
|
||||||
// }
|
|
||||||
// format.flush();
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
void Foam::vtkSurfaceWriter::writeField
|
|
||||||
(
|
|
||||||
vtk::formatter& format,
|
|
||||||
const Field<Type>& values
|
|
||||||
)
|
|
||||||
{
|
|
||||||
vtk::writeList(format, values);
|
|
||||||
format.flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
|
||||||
Foam::fileName Foam::vtkSurfaceWriter::writeTemplate
|
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
|
||||||
const Field<Type>& values,
|
|
||||||
const bool isNodeValues,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// field: rootdir/time/<field>_surfaceName.{vtk|vtp}
|
|
||||||
|
|
||||||
fileName outputFile(outputDir/fieldName + '_' + surfaceName + ".vtk");
|
|
||||||
|
|
||||||
if (!isDir(outputDir))
|
|
||||||
{
|
|
||||||
mkDir(outputDir);
|
|
||||||
}
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing field " << fieldName << " to "
|
|
||||||
<< outputFile << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// As vtk::outputOptions
|
|
||||||
vtk::outputOptions opts(static_cast<vtk::formatType>(fmtType_));
|
|
||||||
opts.legacy(true);
|
|
||||||
opts.precision(precision_);
|
|
||||||
|
|
||||||
std::ofstream os(outputFile);
|
|
||||||
|
|
||||||
auto format = opts.newFormatter(os);
|
|
||||||
|
|
||||||
writeGeometry(*format, surf);
|
|
||||||
|
|
||||||
if (isNodeValues)
|
|
||||||
{
|
|
||||||
format->os()
|
|
||||||
<< "POINT_DATA "
|
|
||||||
<< values.size() << nl
|
|
||||||
<< "FIELD attributes 1" << nl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
format->os()
|
|
||||||
<< "CELL_DATA "
|
|
||||||
<< values.size() << nl
|
|
||||||
<< "FIELD attributes 1" << nl;
|
|
||||||
}
|
|
||||||
|
|
||||||
beginFloatField(*format, fieldName, values);
|
|
||||||
writeField(*format, values);
|
|
||||||
|
|
||||||
return outputFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -243,6 +243,7 @@ bool Foam::surfMeshSamplers::read(const dictionary& dict)
|
|||||||
surfaces().transfer(surfs);
|
surfaces().transfer(surfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
auto& surfs = surfaces();
|
auto& surfs = surfaces();
|
||||||
if (surfs.size())
|
if (surfs.size())
|
||||||
{
|
{
|
||||||
@ -252,9 +253,6 @@ bool Foam::surfMeshSamplers::read(const dictionary& dict)
|
|||||||
Info<< type() << " fields: " << flatOutput(fieldSelection_) << nl;
|
Info<< type() << " fields: " << flatOutput(fieldSelection_) << nl;
|
||||||
Info<< nl;
|
Info<< nl;
|
||||||
|
|
||||||
// Ensure all surfaces and merge information are expired
|
|
||||||
expire();
|
|
||||||
|
|
||||||
// Need to initialize corresponding surfMesh for others in the chain.
|
// Need to initialize corresponding surfMesh for others in the chain.
|
||||||
// This can simply be a zero-sized placeholder, or the real surface with
|
// This can simply be a zero-sized placeholder, or the real surface with
|
||||||
// faces.
|
// faces.
|
||||||
@ -346,18 +344,18 @@ bool Foam::surfMeshSamplers::needsUpdate() const
|
|||||||
|
|
||||||
bool Foam::surfMeshSamplers::expire()
|
bool Foam::surfMeshSamplers::expire()
|
||||||
{
|
{
|
||||||
bool justExpired = false;
|
label nChanged = 0;
|
||||||
|
|
||||||
for (surfMeshSample& s : surfaces())
|
for (surfMeshSample& s : surfaces())
|
||||||
{
|
{
|
||||||
if (s.expire())
|
if (s.expire())
|
||||||
{
|
{
|
||||||
justExpired = true;
|
++nChanged;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// True if any surfaces just expired
|
// True if any surfaces just expired
|
||||||
return justExpired;
|
return nChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -368,16 +366,17 @@ bool Foam::surfMeshSamplers::update()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool updated = false;
|
label nUpdated = 0;
|
||||||
|
|
||||||
for (surfMeshSample& s : surfaces())
|
for (surfMeshSample& s : surfaces())
|
||||||
{
|
{
|
||||||
if (s.update())
|
if (s.update())
|
||||||
{
|
{
|
||||||
updated = true;
|
++nUpdated;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return updated;
|
return nUpdated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -57,4 +57,20 @@ triSurface/fields/triSurfaceFields.C
|
|||||||
triSurface/patches/geometricSurfacePatch.C
|
triSurface/patches/geometricSurfacePatch.C
|
||||||
triSurface/patches/surfacePatch.C
|
triSurface/patches/surfacePatch.C
|
||||||
|
|
||||||
|
|
||||||
|
writers = writers
|
||||||
|
|
||||||
|
$(writers)/surfaceWriter.C
|
||||||
|
$(writers)/boundaryData/boundaryDataSurfaceWriter.C
|
||||||
|
$(writers)/ensight/ensightSurfaceWriter.C
|
||||||
|
$(writers)/foam/foamSurfaceWriter.C
|
||||||
|
$(writers)/nastran/nastranSurfaceWriter.C
|
||||||
|
$(writers)/null/nullSurfaceWriter.C
|
||||||
|
$(writers)/proxy/proxySurfaceWriter.C
|
||||||
|
$(writers)/raw/rawSurfaceWriter.C
|
||||||
|
$(writers)/starcd/starcdSurfaceWriter.C
|
||||||
|
$(writers)/vtk/vtkSurfaceWriter.C
|
||||||
|
/* $(writers)/x3d/x3dSurfaceWriter.C */
|
||||||
|
|
||||||
|
|
||||||
LIB = $(FOAM_LIBBIN)/libsurfMesh
|
LIB = $(FOAM_LIBBIN)/libsurfMesh
|
||||||
|
|||||||
275
src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.C
Normal file
275
src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.C
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2015 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "boundaryDataSurfaceWriter.H"
|
||||||
|
#include "argList.H"
|
||||||
|
#include "OFstream.H"
|
||||||
|
#include "OSspecific.H"
|
||||||
|
#include "IOmanip.H"
|
||||||
|
#include "Time.H"
|
||||||
|
#include "pointIOField.H"
|
||||||
|
#include "primitivePatch.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
defineTypeName(boundaryDataWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, boundaryDataWriter, word);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::surfaceWriters::boundaryDataWriter::boundaryDataWriter()
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::boundaryDataWriter::boundaryDataWriter
|
||||||
|
(
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(options)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::boundaryDataWriter::boundaryDataWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
boundaryDataWriter(options)
|
||||||
|
{
|
||||||
|
open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::boundaryDataWriter::boundaryDataWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
boundaryDataWriter(options)
|
||||||
|
{
|
||||||
|
open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::boundaryDataWriter::write()
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
// Geometry: rootdir/surfaceName/"points"
|
||||||
|
// Field: rootdir/surfaceName/<TIME>/field
|
||||||
|
|
||||||
|
fileName surfaceDir = outputPath_;
|
||||||
|
|
||||||
|
// Write points
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing points to " << surfaceDir/"points" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Dummy time to use as an objectRegistry
|
||||||
|
const fileName caseDir(argList::envGlobalPath());
|
||||||
|
|
||||||
|
Time dummyTime
|
||||||
|
(
|
||||||
|
caseDir.path(), // root-path,
|
||||||
|
caseDir.name(), // case-name,
|
||||||
|
"system", //
|
||||||
|
"constant", //
|
||||||
|
false, // no function objects
|
||||||
|
false // no libs
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
if (!isDir(surfaceDir))
|
||||||
|
{
|
||||||
|
mkDir(surfaceDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
pointIOField pts
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
surfaceDir/"points",
|
||||||
|
dummyTime,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
surf.points()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Do like regIOobject::writeObject but don't do instance() adaptation
|
||||||
|
// since this would write to e.g. 0/ instead of postProcessing/
|
||||||
|
|
||||||
|
// Try opening an OFstream for object
|
||||||
|
OFstream os(pts.objectPath());
|
||||||
|
|
||||||
|
//pts.writeHeader(os);
|
||||||
|
pts.writeData(os);
|
||||||
|
//pts.writeEndDivider(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfaceDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::fileName Foam::surfaceWriters::boundaryDataWriter::writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const Field<Type>& localValues
|
||||||
|
)
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
// Geometry: rootdir/surfaceName/"points"
|
||||||
|
// Field: rootdir/surfaceName/<TIME>/field
|
||||||
|
|
||||||
|
fileName surfaceDir = outputPath_;
|
||||||
|
|
||||||
|
const fileName outputFile(surfaceDir/timeName()/fieldName);
|
||||||
|
|
||||||
|
|
||||||
|
// Dummy time to use as an objectRegistry
|
||||||
|
const fileName caseDir(argList::envGlobalPath());
|
||||||
|
|
||||||
|
Time dummyTime
|
||||||
|
(
|
||||||
|
caseDir.path(), // root-path,
|
||||||
|
caseDir.name(), // case-name,
|
||||||
|
"system", //
|
||||||
|
"constant", //
|
||||||
|
false, // no function objects
|
||||||
|
false // no libs
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Geometry merge() implicit
|
||||||
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
const pointField& points = surf.points();
|
||||||
|
const faceList& faces = surf.faces();
|
||||||
|
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
pointIOField pts
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
surfaceDir/"points",
|
||||||
|
dummyTime,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
label(0)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this->isPointData())
|
||||||
|
{
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing points to "
|
||||||
|
<< surfaceDir/"points" << endl;
|
||||||
|
}
|
||||||
|
pts = points;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing face centres to "
|
||||||
|
<< surfaceDir/"points" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitivePatch pp(SubList<face>(faces, faces.size()), points);
|
||||||
|
|
||||||
|
pts = pp.faceCentres();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Do like regIOobject::writeObject but don't do instance()
|
||||||
|
// adaptation
|
||||||
|
// since this would write to e.g. 0/ instead of postProcessing/
|
||||||
|
|
||||||
|
// Try opening an OFstream for object
|
||||||
|
OFstream os(pts.objectPath());
|
||||||
|
|
||||||
|
//pts.writeHeader(os);
|
||||||
|
pts.writeData(os);
|
||||||
|
//pts.writeEndDivider(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Write field
|
||||||
|
OFstream(outputFile)() << tfield();
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfaceDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Field writing methods
|
||||||
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::boundaryDataWriter);
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
187
src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H
Normal file
187
src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriters::boundaryDataWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
A surfaceWriter for outputting to a form useable for the
|
||||||
|
timeVaryingMapped boundary condition. This reads the data from
|
||||||
|
constant/boundaryData/\<patch\> directory
|
||||||
|
|
||||||
|
Typical way of working:
|
||||||
|
- use a sampledSurface of type 'patch' (to sample a patch):
|
||||||
|
\verbatim
|
||||||
|
surfaces
|
||||||
|
{
|
||||||
|
type surfaces;
|
||||||
|
surfaceFormat boundaryData;
|
||||||
|
fields ( p );
|
||||||
|
surfaces
|
||||||
|
(
|
||||||
|
outlet
|
||||||
|
{
|
||||||
|
type patch;
|
||||||
|
patches (outlet);
|
||||||
|
interpolate false;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
- write using this writer.
|
||||||
|
- move postProcessing/surfaces/outlet to constant/boundaryData/outlet
|
||||||
|
in your destination case.
|
||||||
|
- use a timeVaryingMappedFixedValue condition to read and interpolate
|
||||||
|
the profile:
|
||||||
|
type timeVaryingMappedFixedValue;
|
||||||
|
setAverage false; // do not use read average
|
||||||
|
offset 0; // do not apply offset to values
|
||||||
|
|
||||||
|
Note:
|
||||||
|
- with 'interpolate false' the data is on the face centres of the
|
||||||
|
patch. Take care that a 2D geometry will only have a single row
|
||||||
|
of face centres so might not provide a valid triangulation
|
||||||
|
(this is what timeVaryingMappedFixedValue uses to do interpolation)
|
||||||
|
(Alternatively use timeVaryingMappedFixedValue with mapMethod 'nearest')
|
||||||
|
|
||||||
|
\heading Output file locations
|
||||||
|
|
||||||
|
The \c rootdir normally corresponds to something like
|
||||||
|
\c postProcessing/\<name\>
|
||||||
|
|
||||||
|
where the geometry is written as:
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- surfaceName
|
||||||
|
`-- "points"
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
and field data:
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- surfaceName
|
||||||
|
|-- "points"
|
||||||
|
`-- timeName
|
||||||
|
`-- field
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
boundaryDataSurfaceWriter.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef boundaryDataSurfaceWriter_H
|
||||||
|
#define boundaryDataSurfaceWriter_H
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class boundaryDataWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class boundaryDataWriter
|
||||||
|
:
|
||||||
|
public surfaceWriter
|
||||||
|
{
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Templated write field operation
|
||||||
|
template<class Type>
|
||||||
|
fileName writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeNameNoDebug("boundaryData");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
boundaryDataWriter();
|
||||||
|
|
||||||
|
//- Construct with some output options
|
||||||
|
boundaryDataWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
boundaryDataWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
boundaryDataWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~boundaryDataWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Write surface geometry to file.
|
||||||
|
virtual fileName write(); // override
|
||||||
|
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,10 +2,10 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2013 OpenFOAM Foundation
|
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -26,29 +26,32 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "ensightSurfaceWriter.H"
|
#include "ensightSurfaceWriter.H"
|
||||||
|
#include "IOmanip.H"
|
||||||
|
#include "Fstream.H"
|
||||||
|
#include "OSspecific.H"
|
||||||
|
#include "ensightCase.H"
|
||||||
#include "ensightPartFaces.H"
|
#include "ensightPartFaces.H"
|
||||||
#include "makeSurfaceWriterMethods.H"
|
#include "ensightOutput.H"
|
||||||
|
#include "ensightPTraits.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
makeSurfaceWriterType(ensightSurfaceWriter);
|
namespace surfaceWriters
|
||||||
addToRunTimeSelectionTable(surfaceWriter, ensightSurfaceWriter, wordDict);
|
{
|
||||||
|
defineTypeName(ensightWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, ensightWriter, word);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, ensightWriter, wordDict);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// Field writing implementation
|
|
||||||
#include "ensightSurfaceWriterImpl.C"
|
|
||||||
|
|
||||||
// Field writing methods
|
|
||||||
defineSurfaceWriterWriteFields(Foam::ensightSurfaceWriter);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||||
|
|
||||||
void Foam::ensightSurfaceWriter::printTimeset
|
void Foam::surfaceWriters::ensightWriter::printTimeset
|
||||||
(
|
(
|
||||||
OSstream& os,
|
OSstream& os,
|
||||||
const label ts,
|
const label ts,
|
||||||
@ -69,7 +72,7 @@ void Foam::ensightSurfaceWriter::printTimeset
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::ensightSurfaceWriter::printTimeset
|
void Foam::surfaceWriters::ensightWriter::printTimeset
|
||||||
(
|
(
|
||||||
OSstream& os,
|
OSstream& os,
|
||||||
const label ts,
|
const label ts,
|
||||||
@ -100,10 +103,9 @@ void Foam::ensightSurfaceWriter::printTimeset
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::ensightSurfaceWriter::ensightSurfaceWriter()
|
Foam::surfaceWriters::ensightWriter::ensightWriter()
|
||||||
:
|
:
|
||||||
surfaceWriter(),
|
surfaceWriter(),
|
||||||
writeFormat_(IOstream::ASCII),
|
writeFormat_(IOstream::ASCII),
|
||||||
@ -111,9 +113,12 @@ Foam::ensightSurfaceWriter::ensightSurfaceWriter()
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
Foam::ensightSurfaceWriter::ensightSurfaceWriter(const dictionary& options)
|
Foam::surfaceWriters::ensightWriter::ensightWriter
|
||||||
|
(
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
:
|
:
|
||||||
surfaceWriter(),
|
surfaceWriter(options),
|
||||||
writeFormat_
|
writeFormat_
|
||||||
(
|
(
|
||||||
IOstreamOption::formatNames.lookupOrDefault
|
IOstreamOption::formatNames.lookupOrDefault
|
||||||
@ -128,6 +133,35 @@ Foam::ensightSurfaceWriter::ensightSurfaceWriter(const dictionary& options)
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::ensightWriter::ensightWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
ensightWriter(options)
|
||||||
|
{
|
||||||
|
open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::ensightWriter::ensightWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
ensightWriter(options)
|
||||||
|
{
|
||||||
|
open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
// Note that ensight does supports geometry in a separate file,
|
// Note that ensight does supports geometry in a separate file,
|
||||||
@ -135,114 +169,53 @@ Foam::ensightSurfaceWriter::ensightSurfaceWriter(const dictionary& options)
|
|||||||
// (when there are fields).
|
// (when there are fields).
|
||||||
//
|
//
|
||||||
// Make this false to let the field writers take back control
|
// Make this false to let the field writers take back control
|
||||||
bool Foam::ensightSurfaceWriter::separateGeometry() const
|
bool Foam::surfaceWriters::ensightWriter::separateGeometry() const
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::ensightSurfaceWriter::updateMesh
|
Foam::fileName Foam::surfaceWriters::ensightWriter::write()
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
if (collateTimes_ && Pstream::master())
|
// if (collateTimes_)
|
||||||
|
// {
|
||||||
|
// return writeCollated();
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// return writeUncollated();
|
||||||
|
// }
|
||||||
|
return writeUncollated();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "ensightSurfaceWriterCollated.C"
|
||||||
|
#include "ensightSurfaceWriterUncollated.C"
|
||||||
|
|
||||||
|
|
||||||
|
// Field writing implementations
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::fileName Foam::surfaceWriters::ensightWriter::writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const Field<Type>& localValues
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (collateTimes_)
|
||||||
{
|
{
|
||||||
const ensight::FileName surfName(surfaceName);
|
return writeCollated(fieldName, localValues);
|
||||||
|
}
|
||||||
const fileName baseDir = outputDir.path()/surfName;
|
else
|
||||||
const fileName timeDir = outputDir.name();
|
{
|
||||||
|
return writeUncollated(fieldName, localValues);
|
||||||
// Convert timeDir to a value (if possible - use 0.0 otherwise)
|
|
||||||
scalar timeValue = 0.0;
|
|
||||||
readScalar(timeDir, timeValue);
|
|
||||||
|
|
||||||
if (!isDir(baseDir))
|
|
||||||
{
|
|
||||||
mkDir(baseDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
dictionary dict;
|
|
||||||
|
|
||||||
if (isFile(baseDir/"fieldsDict"))
|
|
||||||
{
|
|
||||||
IFstream is(baseDir/"fieldsDict");
|
|
||||||
if (is.good() && dict.read(is))
|
|
||||||
{
|
|
||||||
// ... any futher actions
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dict.set("updateMesh", timeValue);
|
|
||||||
|
|
||||||
{
|
|
||||||
OFstream os(baseDir/"fieldsDict");
|
|
||||||
os << "// Summary of Ensight fields, times" << nl << nl;
|
|
||||||
dict.write(os, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::fileName Foam::ensightSurfaceWriter::write
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::ensightWriter);
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const ensight::FileName surfName(surfaceName);
|
|
||||||
|
|
||||||
// Uncollated
|
|
||||||
// ==========
|
|
||||||
// geometry: rootdir/time/surfaceName.case
|
|
||||||
// geometry: rootdir/time/surfaceName.00000000.mesh
|
|
||||||
|
|
||||||
if (!isDir(outputDir))
|
|
||||||
{
|
|
||||||
mkDir(outputDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
OFstream osCase(outputDir/surfName + ".case");
|
|
||||||
ensightGeoFile osGeom
|
|
||||||
(
|
|
||||||
outputDir,
|
|
||||||
surfName + ".00000000.mesh",
|
|
||||||
writeFormat_
|
|
||||||
);
|
|
||||||
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
Info<< "Writing case file to " << osCase.name() << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
const pointField& points = surf.points();
|
|
||||||
const faceList& faces = surf.faces();
|
|
||||||
|
|
||||||
osCase
|
|
||||||
<< "FORMAT" << nl
|
|
||||||
<< "type: ensight gold" << nl
|
|
||||||
<< nl
|
|
||||||
<< "GEOMETRY" << nl
|
|
||||||
<< "model: 1 " << osGeom.name().name() << nl
|
|
||||||
<< nl
|
|
||||||
<< "TIME" << nl;
|
|
||||||
|
|
||||||
printTimeset(osCase, 1, 0.0);
|
|
||||||
|
|
||||||
ensightPartFaces ensPart(0, osGeom.name().name(), points, faces, true);
|
|
||||||
osGeom << ensPart;
|
|
||||||
|
|
||||||
return osCase.name();
|
|
||||||
|
|
||||||
|
|
||||||
// Collated?
|
|
||||||
// ========
|
|
||||||
// geometry: rootdir/surfaceName/surfaceName.case
|
|
||||||
// geometry: rootdir/surfaceName/surfaceName.mesh
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
198
src/surfMesh/writers/ensight/ensightSurfaceWriter.H
Normal file
198
src/surfMesh/writers/ensight/ensightSurfaceWriter.H
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2010-2011, 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriters::ensightWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
A surfaceWriter for Ensight format.
|
||||||
|
|
||||||
|
\verbatim
|
||||||
|
formatOptions
|
||||||
|
{
|
||||||
|
ensight
|
||||||
|
{
|
||||||
|
format ascii;
|
||||||
|
collateTimes true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
Format options:
|
||||||
|
\table
|
||||||
|
Property | Description | Required | Default
|
||||||
|
format | ascii/binary | no | ascii
|
||||||
|
collateTimes | use common geometry for times | no | true
|
||||||
|
\endtable
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
ensightSurfaceWriter.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef ensightSurfaceWriter_H
|
||||||
|
#define ensightSurfaceWriter_H
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class ensightWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ensightWriter
|
||||||
|
:
|
||||||
|
public surfaceWriter
|
||||||
|
{
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
//- Write option (default: IOstream::ASCII)
|
||||||
|
IOstream::streamFormat writeFormat_;
|
||||||
|
|
||||||
|
//- Collate times (default: true)
|
||||||
|
bool collateTimes_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Print time-set for ensight case file
|
||||||
|
static void printTimeset
|
||||||
|
(
|
||||||
|
OSstream& os,
|
||||||
|
const label ts,
|
||||||
|
const scalar& timeValue
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Print time-set for ensight case file
|
||||||
|
static void printTimeset
|
||||||
|
(
|
||||||
|
OSstream& os,
|
||||||
|
const label ts,
|
||||||
|
const UList<scalar>& times
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Write geometry
|
||||||
|
fileName writeCollated();
|
||||||
|
|
||||||
|
//- Write geometry
|
||||||
|
fileName writeUncollated();
|
||||||
|
|
||||||
|
//- Templated write operation - one file per timestep
|
||||||
|
template<class Type>
|
||||||
|
fileName writeCollated
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Templated write operation - all time steps in single file
|
||||||
|
template<class Type>
|
||||||
|
fileName writeUncollated
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Templated write operation
|
||||||
|
template<class Type>
|
||||||
|
fileName writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeNameNoDebug("ensight");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
ensightWriter();
|
||||||
|
|
||||||
|
//- Construct with some output options
|
||||||
|
explicit ensightWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
ensightWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
ensightWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~ensightWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- True if the surface format supports geometry in a separate file.
|
||||||
|
// False if geometry and field must be in a single file
|
||||||
|
virtual bool separateGeometry() const;
|
||||||
|
|
||||||
|
//- Write single surface geometry to file.
|
||||||
|
virtual fileName write(); // override
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
376
src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
Normal file
376
src/surfMesh/writers/ensight/ensightSurfaceWriterCollated.C
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::ensightWriter::writeCollated()
|
||||||
|
{
|
||||||
|
// Collated?
|
||||||
|
// ========
|
||||||
|
// Geometry: rootdir/surfaceName/surfaceName.case
|
||||||
|
// Geometry: rootdir/surfaceName/surfaceName.mesh
|
||||||
|
|
||||||
|
return fileName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::fileName Foam::surfaceWriters::ensightWriter::writeCollated
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const Field<Type>& localValues
|
||||||
|
)
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
const ensight::FileName surfName(outputPath_.name());
|
||||||
|
const ensight::VarName varName(fieldName);
|
||||||
|
|
||||||
|
|
||||||
|
// Collated
|
||||||
|
// ========
|
||||||
|
// Geometry: rootdir/surfaceName/surfaceName.case
|
||||||
|
// Geometry: rootdir/surfaceName/data/<index>/geometry
|
||||||
|
// Field: rootdir/surfaceName/data/<index>/field
|
||||||
|
|
||||||
|
// Use surface name as sub-directory for results. Eg,
|
||||||
|
// - SURF1/SURF1.case
|
||||||
|
// - SURF1/data/00000000/geometry
|
||||||
|
// - SURF1/data/00000000/VAR1
|
||||||
|
// - SURF1/data/00000000/VAR2
|
||||||
|
|
||||||
|
// Names "data" and "geometry" as per ensightCase:
|
||||||
|
const char* fmt = "%08d";
|
||||||
|
const char* mask = "data/********/";
|
||||||
|
|
||||||
|
|
||||||
|
// Ignore the useTimeDir setting - manage ourselves
|
||||||
|
const fileName baseDir = outputPath_;
|
||||||
|
|
||||||
|
const word timeDir = timeName();
|
||||||
|
const scalar timeValue = currTime_.value();
|
||||||
|
|
||||||
|
const fileName outputFile = baseDir / surfName + ".case";
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing case file to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Mesh changed since last output? Do before any merging.
|
||||||
|
const bool meshChanged = (!upToDate_);
|
||||||
|
|
||||||
|
// geometry merge() implicit
|
||||||
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
scalar meshValue = 0;
|
||||||
|
label meshIndex = 0;
|
||||||
|
label timeIndex = 0;
|
||||||
|
|
||||||
|
fileName geometryName;
|
||||||
|
|
||||||
|
// Do case file
|
||||||
|
{
|
||||||
|
dictionary dict;
|
||||||
|
scalarList meshes;
|
||||||
|
scalarList times;
|
||||||
|
bool stateChanged = meshChanged;
|
||||||
|
|
||||||
|
if (isFile(baseDir/"fieldsDict"))
|
||||||
|
{
|
||||||
|
IFstream is(baseDir/"fieldsDict");
|
||||||
|
if (is.good() && dict.read(is))
|
||||||
|
{
|
||||||
|
dict.readIfPresent("meshes", meshes);
|
||||||
|
dict.readIfPresent("times", times);
|
||||||
|
|
||||||
|
timeIndex = 1+findLower(times, timeValue);
|
||||||
|
|
||||||
|
if (meshChanged)
|
||||||
|
{
|
||||||
|
meshValue = timeValue;
|
||||||
|
meshIndex = 1+findLower(meshes, meshValue);
|
||||||
|
}
|
||||||
|
else if (meshes.size())
|
||||||
|
{
|
||||||
|
meshIndex = meshes.size()-1;
|
||||||
|
meshValue = meshes.last();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meshIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update stored times list
|
||||||
|
meshes.resize(meshIndex+1, -1);
|
||||||
|
times.resize(timeIndex+1, -1);
|
||||||
|
|
||||||
|
if (meshes[meshIndex] != meshValue)
|
||||||
|
{
|
||||||
|
stateChanged = true;
|
||||||
|
}
|
||||||
|
if (times[timeIndex] != timeValue)
|
||||||
|
{
|
||||||
|
stateChanged = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
meshes[meshIndex] = meshValue;
|
||||||
|
times[timeIndex] = timeValue;
|
||||||
|
|
||||||
|
geometryName =
|
||||||
|
"data"/word::printf(fmt, meshIndex)/ensightCase::geometryName;
|
||||||
|
|
||||||
|
|
||||||
|
// Add my information to dictionary
|
||||||
|
{
|
||||||
|
dict.set("meshes", meshes);
|
||||||
|
dict.set("times", times);
|
||||||
|
if (dict.found("fields"))
|
||||||
|
{
|
||||||
|
dictionary& fieldsDict = dict.subDict("fields");
|
||||||
|
if (!fieldsDict.found(fieldName))
|
||||||
|
{
|
||||||
|
dictionary fieldDict;
|
||||||
|
fieldDict.set("type", ensightPTraits<Type>::typeName);
|
||||||
|
fieldDict.set("name", varName); // ensight variable name
|
||||||
|
|
||||||
|
fieldsDict.set(fieldName, fieldDict);
|
||||||
|
|
||||||
|
stateChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dictionary fieldDict;
|
||||||
|
fieldDict.set("type", ensightPTraits<Type>::typeName);
|
||||||
|
fieldDict.set("name", varName); // ensight variable name
|
||||||
|
|
||||||
|
dictionary fieldsDict;
|
||||||
|
fieldsDict.set(fieldName, fieldDict);
|
||||||
|
|
||||||
|
dict.set("fields", fieldsDict);
|
||||||
|
|
||||||
|
stateChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (stateChanged)
|
||||||
|
{
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing state file to fieldsDict" << endl;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
OFstream os(baseDir/"fieldsDict");
|
||||||
|
os << "// Summary of Ensight fields, times" << nl << nl;
|
||||||
|
dict.write(os, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
OFstream osCase(outputFile, IOstream::ASCII);
|
||||||
|
|
||||||
|
// Format options
|
||||||
|
osCase.setf(ios_base::left);
|
||||||
|
osCase.setf(ios_base::scientific, ios_base::floatfield);
|
||||||
|
osCase.precision(5);
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing case file to " << osCase.name() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The geometry can be any of the following:
|
||||||
|
// 0: constant/static
|
||||||
|
// 1: moving, with the same frequency as the data
|
||||||
|
// 2: moving, with different frequency as the data
|
||||||
|
|
||||||
|
const label tsGeom =
|
||||||
|
(meshes.size() == 1 ? 0 : meshes == times ? 1 : 2);
|
||||||
|
|
||||||
|
osCase
|
||||||
|
<< "FORMAT" << nl
|
||||||
|
<< "type: ensight gold" << nl
|
||||||
|
<< nl
|
||||||
|
<< "GEOMETRY" << nl;
|
||||||
|
|
||||||
|
|
||||||
|
if (tsGeom)
|
||||||
|
{
|
||||||
|
// moving
|
||||||
|
osCase
|
||||||
|
<< "model: " << tsGeom << " " // time-set (1|2)
|
||||||
|
<< mask << geometryName.name() << nl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// steady
|
||||||
|
osCase
|
||||||
|
<< "model: "
|
||||||
|
<< geometryName.c_str() << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
osCase
|
||||||
|
<< nl
|
||||||
|
<< "VARIABLE" << nl;
|
||||||
|
|
||||||
|
const dictionary& fieldsDict = dict.subDict("fields");
|
||||||
|
for (const entry& dEntry : fieldsDict)
|
||||||
|
{
|
||||||
|
const dictionary& subDict = dEntry.dict();
|
||||||
|
|
||||||
|
const word fieldType(subDict.get<word>("type"));
|
||||||
|
const word varName = subDict.lookupOrDefault
|
||||||
|
(
|
||||||
|
"name",
|
||||||
|
dEntry.keyword() // fieldName as fallback
|
||||||
|
);
|
||||||
|
|
||||||
|
osCase
|
||||||
|
<< fieldType
|
||||||
|
<<
|
||||||
|
(
|
||||||
|
this->isPointData()
|
||||||
|
? " per node: 1 " // time-set 1
|
||||||
|
: " per element: 1 " // time-set 1
|
||||||
|
)
|
||||||
|
<< setw(15) << varName << ' '
|
||||||
|
<< mask << varName << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
osCase
|
||||||
|
<< nl
|
||||||
|
<< "TIME" << nl;
|
||||||
|
|
||||||
|
printTimeset(osCase, 1, times);
|
||||||
|
if (tsGeom == 2)
|
||||||
|
{
|
||||||
|
printTimeset(osCase, 2, meshes);
|
||||||
|
}
|
||||||
|
|
||||||
|
osCase << "# end" << nl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Location for data (and possibly the geometry as well)
|
||||||
|
fileName dataDir = baseDir/"data"/word::printf(fmt, timeIndex);
|
||||||
|
|
||||||
|
// As per mkdir -p "data/00000000"
|
||||||
|
mkDir(dataDir);
|
||||||
|
|
||||||
|
|
||||||
|
const fileName meshFile(baseDir/geometryName);
|
||||||
|
|
||||||
|
// Write geometry
|
||||||
|
ensightPartFaces ensPart
|
||||||
|
(
|
||||||
|
0,
|
||||||
|
meshFile.name(),
|
||||||
|
surf.points(),
|
||||||
|
surf.faces(),
|
||||||
|
true // contiguous points
|
||||||
|
);
|
||||||
|
if (!exists(meshFile))
|
||||||
|
{
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing mesh file to " << meshFile.name() << endl;
|
||||||
|
}
|
||||||
|
// Use two-argument form for path-name to avoid validating base-dir
|
||||||
|
ensightGeoFile osGeom
|
||||||
|
(
|
||||||
|
meshFile.path(),
|
||||||
|
meshFile.name(),
|
||||||
|
writeFormat_
|
||||||
|
);
|
||||||
|
osGeom << ensPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write field
|
||||||
|
ensightFile osField
|
||||||
|
(
|
||||||
|
dataDir,
|
||||||
|
varName,
|
||||||
|
writeFormat_
|
||||||
|
);
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing field file to " << osField.name() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write field
|
||||||
|
osField.writeKeyword(ensightPTraits<Type>::typeName);
|
||||||
|
|
||||||
|
if (this->isPointData())
|
||||||
|
{
|
||||||
|
ensightOutput::Serial::writePointField
|
||||||
|
(
|
||||||
|
tfield(),
|
||||||
|
ensPart,
|
||||||
|
osField
|
||||||
|
// serial
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ensightOutput::Detail::writeFaceField
|
||||||
|
(
|
||||||
|
tfield(),
|
||||||
|
ensPart,
|
||||||
|
osField,
|
||||||
|
false // serial
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place a timestamp in the directory for future reference
|
||||||
|
{
|
||||||
|
OFstream timeStamp(dataDir/"time");
|
||||||
|
timeStamp
|
||||||
|
<< "# timestep time" << nl
|
||||||
|
<< dataDir.name() << " " << timeValue << nl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
252
src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
Normal file
252
src/surfMesh/writers/ensight/ensightSurfaceWriterUncollated.C
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::ensightWriter::writeUncollated()
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
const ensight::FileName surfName(outputPath_.name());
|
||||||
|
|
||||||
|
|
||||||
|
// Uncollated
|
||||||
|
// ==========
|
||||||
|
// Geometry: rootdir/<TIME>/surfaceName.case
|
||||||
|
// Geometry: rootdir/<TIME>/surfaceName.00000000.mesh
|
||||||
|
|
||||||
|
fileName outputDir;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
outputDir = outputPath_.path() / timeName();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outputDir = outputPath_.path();
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileName outputFile = outputDir / surfName + ".case";
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing case file to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
if (!isDir(outputDir))
|
||||||
|
{
|
||||||
|
mkDir(outputDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
OFstream osCase(outputFile);
|
||||||
|
ensightGeoFile osGeom
|
||||||
|
(
|
||||||
|
outputDir,
|
||||||
|
surfName + ".00000000.mesh",
|
||||||
|
writeFormat_
|
||||||
|
);
|
||||||
|
|
||||||
|
osCase
|
||||||
|
<< "FORMAT" << nl
|
||||||
|
<< "type: ensight gold" << nl
|
||||||
|
<< nl
|
||||||
|
<< "GEOMETRY" << nl
|
||||||
|
<< "model: 1 " << osGeom.name().name() << nl
|
||||||
|
<< nl
|
||||||
|
<< "TIME" << nl;
|
||||||
|
|
||||||
|
printTimeset(osCase, 1, 0.0);
|
||||||
|
|
||||||
|
ensightPartFaces ensPart
|
||||||
|
(
|
||||||
|
0,
|
||||||
|
osGeom.name().name(),
|
||||||
|
surf.points(),
|
||||||
|
surf.faces(),
|
||||||
|
true // contiguous points
|
||||||
|
);
|
||||||
|
osGeom << ensPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::fileName Foam::surfaceWriters::ensightWriter::writeUncollated
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const Field<Type>& localValues
|
||||||
|
)
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
const ensight::FileName surfName(outputPath_.name());
|
||||||
|
const ensight::VarName varName(fieldName);
|
||||||
|
|
||||||
|
|
||||||
|
// Uncollated
|
||||||
|
// ==========
|
||||||
|
// geometry: rootdir/time/<field>/surfaceName.case
|
||||||
|
// geometry: rootdir/time/<field>/surfaceName.<index>.mesh
|
||||||
|
// field: rootdir/time/<field>/surfaceName.<index>.<field>
|
||||||
|
|
||||||
|
// Variable name as sub-directory for results. Eg,
|
||||||
|
// - VAR1/SURF1.case
|
||||||
|
// - VAR1/SURF1.00000000.mesh
|
||||||
|
// - VAR1/SURF1.00000001.VAR1
|
||||||
|
// and
|
||||||
|
// - VAR2/SURF1.case
|
||||||
|
// - VAR2/SURF1.00000000.mesh
|
||||||
|
// - VAR2/SURF1.00000001.VAR2
|
||||||
|
|
||||||
|
fileName outputDir;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
outputDir = outputPath_.path() / timeName();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outputDir = outputPath_.path();
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileName baseDir = outputDir / varName;
|
||||||
|
const word timeDir = timeName();
|
||||||
|
const scalar timeValue = currTime_.value();
|
||||||
|
|
||||||
|
const fileName outputFile = baseDir / surfName + ".case";
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing case file to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// geometry merge() implicit
|
||||||
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
OFstream osCase(outputFile, IOstream::ASCII);
|
||||||
|
|
||||||
|
// Format options
|
||||||
|
osCase.setf(ios_base::left);
|
||||||
|
osCase.setf(ios_base::scientific, ios_base::floatfield);
|
||||||
|
osCase.precision(5);
|
||||||
|
|
||||||
|
ensightGeoFile osGeom
|
||||||
|
(
|
||||||
|
baseDir,
|
||||||
|
surfName + ".00000000.mesh",
|
||||||
|
writeFormat_
|
||||||
|
);
|
||||||
|
ensightFile osField
|
||||||
|
(
|
||||||
|
baseDir,
|
||||||
|
surfName + ".00000000." + varName,
|
||||||
|
writeFormat_
|
||||||
|
);
|
||||||
|
|
||||||
|
osCase
|
||||||
|
<< "FORMAT" << nl
|
||||||
|
<< "type: ensight gold" << nl
|
||||||
|
<< nl
|
||||||
|
<< "GEOMETRY" << nl
|
||||||
|
<< "model: 1 " << osGeom.name().name() << nl
|
||||||
|
<< nl
|
||||||
|
<< "VARIABLE" << nl
|
||||||
|
<< ensightPTraits<Type>::typeName
|
||||||
|
<<
|
||||||
|
(
|
||||||
|
this->isPointData()
|
||||||
|
? " per node: 1 " // time-set 1
|
||||||
|
: " per element: 1 " // time-set 1
|
||||||
|
)
|
||||||
|
<< setw(15) << varName << ' '
|
||||||
|
<< surfName.c_str() << ".********." << varName << nl;
|
||||||
|
|
||||||
|
osCase
|
||||||
|
<< nl
|
||||||
|
<< "TIME" << nl;
|
||||||
|
|
||||||
|
printTimeset(osCase, 1, timeValue);
|
||||||
|
osCase << "# end" << nl;
|
||||||
|
|
||||||
|
|
||||||
|
ensightPartFaces ensPart
|
||||||
|
(
|
||||||
|
0,
|
||||||
|
osGeom.name().name(),
|
||||||
|
surf.points(),
|
||||||
|
surf.faces(),
|
||||||
|
true // contiguous points
|
||||||
|
);
|
||||||
|
osGeom << ensPart;
|
||||||
|
|
||||||
|
// Write field
|
||||||
|
osField.writeKeyword(ensightPTraits<Type>::typeName);
|
||||||
|
|
||||||
|
if (this->isPointData())
|
||||||
|
{
|
||||||
|
ensightOutput::Serial::writePointField
|
||||||
|
(
|
||||||
|
tfield(),
|
||||||
|
ensPart,
|
||||||
|
osField
|
||||||
|
// serial
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ensightOutput::Detail::writeFaceField
|
||||||
|
(
|
||||||
|
tfield(),
|
||||||
|
ensPart,
|
||||||
|
osField,
|
||||||
|
false // serial
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
208
src/surfMesh/writers/foam/foamSurfaceWriter.C
Normal file
208
src/surfMesh/writers/foam/foamSurfaceWriter.C
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "foamSurfaceWriter.H"
|
||||||
|
#include "OFstream.H"
|
||||||
|
#include "OSspecific.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
defineTypeName(foamWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, foamWriter, word);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::surfaceWriters::foamWriter::foamWriter()
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::foamWriter::foamWriter
|
||||||
|
(
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(options)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::foamWriter::foamWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
foamWriter(options)
|
||||||
|
{
|
||||||
|
open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::foamWriter::foamWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
foamWriter(options)
|
||||||
|
{
|
||||||
|
open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::foamWriter::write()
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
// Geometry:
|
||||||
|
// - rootdir/<TIME>/surfaceName/{points,faces}
|
||||||
|
|
||||||
|
fileName surfaceDir = outputPath_;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
surfaceDir = outputPath_.path() / timeName() / outputPath_.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing geometry to " << surfaceDir << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
const pointField& points = surf.points();
|
||||||
|
const faceList& faces = surf.faces();
|
||||||
|
|
||||||
|
if (!isDir(surfaceDir))
|
||||||
|
{
|
||||||
|
mkDir(surfaceDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Points
|
||||||
|
OFstream(surfaceDir/"points")() << points;
|
||||||
|
|
||||||
|
// Faces
|
||||||
|
OFstream(surfaceDir/"faces")() << faces;
|
||||||
|
|
||||||
|
// Face centers.
|
||||||
|
// Not really necessary but very handy when reusing as inputs
|
||||||
|
// for e.g. timeVaryingMapped bc.
|
||||||
|
pointField faceCentres(faces.size(), Zero);
|
||||||
|
|
||||||
|
forAll(faces, facei)
|
||||||
|
{
|
||||||
|
faceCentres[facei] = faces[facei].centre(points);
|
||||||
|
}
|
||||||
|
|
||||||
|
OFstream(surfaceDir/"faceCentres")() << faceCentres;
|
||||||
|
}
|
||||||
|
|
||||||
|
return surfaceDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::fileName Foam::surfaceWriters::foamWriter::writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const Field<Type>& localValues
|
||||||
|
)
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
// Geometry should already have been written
|
||||||
|
// Values to separate directory (e.g. "scalarField/p")
|
||||||
|
|
||||||
|
// Field: rootdir/<TIME>/surfaceName/fieldType/field
|
||||||
|
//?? -> or rootdir/surfaceName/fieldType/<TIME>/field
|
||||||
|
|
||||||
|
fileName surfaceDir = outputPath_;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
surfaceDir = outputPath_.path() / timeName() / outputPath_.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileName outputFile
|
||||||
|
(
|
||||||
|
surfaceDir
|
||||||
|
/ (word(pTraits<Type>::typeName) + FieldBase::typeName)
|
||||||
|
/ fieldName
|
||||||
|
);
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing field " << fieldName << " to " << surfaceDir << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// geometry merge() implicit
|
||||||
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
|
|
||||||
|
if (Pstream::master())
|
||||||
|
{
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write field
|
||||||
|
OFstream(outputFile)() << tfield();
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Field writing methods
|
||||||
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::foamWriter);
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
163
src/surfMesh/writers/foam/foamSurfaceWriter.H
Normal file
163
src/surfMesh/writers/foam/foamSurfaceWriter.H
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriters::foamWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
A surfaceWriter for OpenFOAM surfaces
|
||||||
|
|
||||||
|
\heading Output file locations
|
||||||
|
|
||||||
|
The \c rootdir normally corresponds to something like
|
||||||
|
\c postProcessing/\<name\>
|
||||||
|
|
||||||
|
\subheading Geometry
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- timeName
|
||||||
|
`-- surfaceName
|
||||||
|
|-- "points"
|
||||||
|
|-- "faceCentres"
|
||||||
|
`-- "faces"
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\subheading Fields
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- timeName
|
||||||
|
`-- surfaceName
|
||||||
|
|-- scalarField
|
||||||
|
| |-- field
|
||||||
|
| `-- field
|
||||||
|
|-- vectorField
|
||||||
|
|-- field
|
||||||
|
`-- field
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
foamSurfaceWriter.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef foamSurfaceWriter_H
|
||||||
|
#define foamSurfaceWriter_H
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class foamWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class foamWriter
|
||||||
|
:
|
||||||
|
public surfaceWriter
|
||||||
|
{
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Templated write operation
|
||||||
|
template<class Type>
|
||||||
|
fileName writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeNameNoDebug("foam");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
foamWriter();
|
||||||
|
|
||||||
|
//- Construct with some output options
|
||||||
|
explicit foamWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
foamWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
foamWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~foamWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- The surface format has geometry in a separate file.
|
||||||
|
virtual bool separateGeometry() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Write surface geometry to file.
|
||||||
|
virtual fileName write(); // override
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2012-2016 OpenFOAM Foundation
|
| Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||||
@ -26,17 +26,22 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "nastranSurfaceWriter.H"
|
#include "nastranSurfaceWriter.H"
|
||||||
#include "IOmanip.H"
|
|
||||||
#include "Pair.H"
|
#include "Pair.H"
|
||||||
#include "HashSet.H"
|
#include "IOmanip.H"
|
||||||
#include "makeSurfaceWriterMethods.H"
|
#include "OSspecific.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
makeSurfaceWriterType(nastranSurfaceWriter);
|
namespace surfaceWriters
|
||||||
addToRunTimeSelectionTable(surfaceWriter, nastranSurfaceWriter, wordDict);
|
{
|
||||||
|
defineTypeName(nastranWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, nastranWriter, word);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, nastranWriter, wordDict);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -45,11 +50,12 @@ namespace Foam
|
|||||||
#include "nastranSurfaceWriterImpl.C"
|
#include "nastranSurfaceWriterImpl.C"
|
||||||
|
|
||||||
// Field writing methods
|
// Field writing methods
|
||||||
defineSurfaceWriterWriteFields(Foam::nastranSurfaceWriter);
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::nastranWriter);
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::Ostream& Foam::nastranSurfaceWriter::writeKeyword
|
Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeKeyword
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const word& keyword
|
const word& keyword
|
||||||
@ -59,7 +65,7 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeKeyword
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::nastranSurfaceWriter::writeCoord
|
void Foam::surfaceWriters::nastranWriter::writeCoord
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const point& pt,
|
const point& pt,
|
||||||
@ -117,7 +123,7 @@ void Foam::nastranSurfaceWriter::writeCoord
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::nastranSurfaceWriter::writeFace
|
void Foam::surfaceWriters::nastranWriter::writeFace
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const word& faceType,
|
const word& faceType,
|
||||||
@ -193,7 +199,7 @@ void Foam::nastranSurfaceWriter::writeFace
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::nastranSurfaceWriter::writeGeometry
|
void Foam::surfaceWriters::nastranWriter::writeGeometry
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const meshedSurf& surf,
|
const meshedSurf& surf,
|
||||||
@ -257,13 +263,13 @@ void Foam::nastranSurfaceWriter::writeGeometry
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::Ostream& Foam::nastranSurfaceWriter::writeFooter
|
Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFooter
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const meshedSurf& surf
|
const meshedSurf& surf
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// zone id have been used for the PID. Find unique values.
|
// Zone id have been used for the PID. Find unique values.
|
||||||
|
|
||||||
labelList pidsUsed = labelHashSet(surf.zoneIds()).sortedToc();
|
labelList pidsUsed = labelHashSet(surf.zoneIds()).sortedToc();
|
||||||
if (pidsUsed.empty())
|
if (pidsUsed.empty())
|
||||||
@ -286,7 +292,7 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFooter
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// use single material ID
|
// Use single material ID
|
||||||
|
|
||||||
const label MID = 1;
|
const label MID = 1;
|
||||||
|
|
||||||
@ -307,7 +313,7 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFooter
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::nastranSurfaceWriter::nastranSurfaceWriter()
|
Foam::surfaceWriters::nastranWriter::nastranWriter()
|
||||||
:
|
:
|
||||||
surfaceWriter(),
|
surfaceWriter(),
|
||||||
writeFormat_(fieldFormat::SHORT),
|
writeFormat_(fieldFormat::SHORT),
|
||||||
@ -317,9 +323,12 @@ Foam::nastranSurfaceWriter::nastranSurfaceWriter()
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
Foam::nastranSurfaceWriter::nastranSurfaceWriter(const dictionary& options)
|
Foam::surfaceWriters::nastranWriter::nastranWriter
|
||||||
|
(
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
:
|
:
|
||||||
surfaceWriter(),
|
surfaceWriter(options),
|
||||||
writeFormat_
|
writeFormat_
|
||||||
(
|
(
|
||||||
fileFormats::NASCore::fieldFormatNames.lookupOrDefault
|
fileFormats::NASCore::fieldFormatNames.lookupOrDefault
|
||||||
@ -353,43 +362,82 @@ Foam::nastranSurfaceWriter::nastranSurfaceWriter(const dictionary& options)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::nastranWriter::nastranWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
nastranWriter(options)
|
||||||
|
{
|
||||||
|
open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::nastranWriter::nastranWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
nastranWriter(options)
|
||||||
|
{
|
||||||
|
open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::fileName Foam::nastranSurfaceWriter::write
|
Foam::fileName Foam::surfaceWriters::nastranWriter::write()
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
// geometry: rootdir/time/surfaceName.nas
|
checkOpen();
|
||||||
|
|
||||||
if (!isDir(outputDir))
|
// Geometry: rootdir/<TIME>/surfaceName.nas
|
||||||
|
|
||||||
|
fileName outputFile = outputPath_;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
{
|
{
|
||||||
mkDir(outputDir);
|
// Splice in time-directory
|
||||||
|
outputFile = outputPath_.path() / timeName() / outputPath_.name();
|
||||||
|
}
|
||||||
|
outputFile.ext("nas");
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing nastran geometry to " << outputFile << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
OFstream os(outputDir/surfaceName + ".nas");
|
|
||||||
fileFormats::NASCore::setPrecision(os, writeFormat_);
|
|
||||||
|
|
||||||
if (verbose)
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
{
|
{
|
||||||
Info<< "Writing nastran file to " << os.name() << endl;
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
OFstream os(outputFile);
|
||||||
|
fileFormats::NASCore::setPrecision(os, writeFormat_);
|
||||||
|
|
||||||
|
os << "TITLE=OpenFOAM " << outputPath_.name()
|
||||||
|
<< " mesh" << nl
|
||||||
|
<< "$" << nl
|
||||||
|
<< "BEGIN BULK" << nl;
|
||||||
|
|
||||||
|
List<DynamicList<face>> decomposedFaces;
|
||||||
|
writeGeometry(os, surf, decomposedFaces);
|
||||||
|
|
||||||
|
writeFooter(os, surf)
|
||||||
|
<< "ENDDATA" << nl;
|
||||||
}
|
}
|
||||||
|
|
||||||
os << "TITLE=OpenFOAM " << surfaceName.c_str()
|
return outputFile;
|
||||||
<< " mesh" << nl
|
|
||||||
<< "$" << nl
|
|
||||||
<< "BEGIN BULK" << nl;
|
|
||||||
|
|
||||||
List<DynamicList<face>> decomposedFaces;
|
|
||||||
writeGeometry(os, surf, decomposedFaces);
|
|
||||||
|
|
||||||
writeFooter(os, surf)
|
|
||||||
<< "ENDDATA" << nl;
|
|
||||||
|
|
||||||
return os.name();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2017 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2012-2016 OpenFOAM Foundation
|
| Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||||
@ -24,7 +24,7 @@ License
|
|||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Class
|
Class
|
||||||
Foam::nastranSurfaceWriter
|
Foam::surfaceWriters::nastranWriter
|
||||||
|
|
||||||
Description
|
Description
|
||||||
A surface writer for the Nastran file format - both surface mesh and fields
|
A surface writer for the Nastran file format - both surface mesh and fields
|
||||||
@ -82,7 +82,7 @@ Description
|
|||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
nastranSurfaceWriter.C
|
nastranSurfaceWriter.C
|
||||||
nastranSurfaceWriterTemplates.C
|
nastranSurfaceWriterImpl.C
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
@ -97,12 +97,14 @@ SourceFiles
|
|||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class nastranSurfaceWriter Declaration
|
Class nastranWriter Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
class nastranSurfaceWriter
|
class nastranWriter
|
||||||
:
|
:
|
||||||
public surfaceWriter
|
public surfaceWriter
|
||||||
{
|
{
|
||||||
@ -117,7 +119,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
//- Field format (width and separator)
|
//- Field format (width and separator)
|
||||||
fieldFormat writeFormat_;
|
fieldFormat writeFormat_;
|
||||||
@ -189,123 +191,68 @@ private:
|
|||||||
template<class Type>
|
template<class Type>
|
||||||
fileName writeTemplate
|
fileName writeTemplate
|
||||||
(
|
(
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
const word& fieldName, //!< Name of field
|
||||||
const Field<Type>& values, //!< Field values to write
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
);
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
TypeName("nastran");
|
TypeNameNoDebug("nastran");
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct null
|
//- Construct null
|
||||||
nastranSurfaceWriter();
|
nastranWriter();
|
||||||
|
|
||||||
//- Construct with some output options
|
//- Construct with some output options
|
||||||
nastranSurfaceWriter(const dictionary& options);
|
explicit nastranWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
nastranWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
nastranWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~nastranSurfaceWriter() = default;
|
virtual ~nastranWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
//- True if the surface format supports geometry in a separate file.
|
// Write
|
||||||
// False if geometry and field must be in a single file
|
|
||||||
virtual bool separateGeometry() const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
//- Write surface geometry to file.
|
||||||
virtual fileName write
|
virtual fileName write(); // override
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
//- Write scalarField for a single surface to file.
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
// One value per face or vertex.
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
virtual fileName write
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
(
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
const fileName& outputDir, //!< output-dir
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<scalar>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write vectorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<vector>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write sphericalTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<sphericalTensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write symmTensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<symmTensor>& values,//!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
|
|
||||||
//- Write tensorField for a single surface to file.
|
|
||||||
// One value per face or vertex.
|
|
||||||
virtual fileName write
|
|
||||||
(
|
|
||||||
const fileName& outputDir, //!< output-dir
|
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const word& fieldName, //!< Name of field
|
|
||||||
const Field<tensor>& values, //!< Field values to write
|
|
||||||
const bool isNodeValues = false,//!< Values are per-vertex
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
|
||||||
) const; // override
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
} // End namespace Foam
|
} // End namespace Foam
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2017 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2012-2016 OpenFOAM Foundation
|
| Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||||
@ -32,7 +32,7 @@ License
|
|||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::Ostream& Foam::nastranSurfaceWriter::writeValue
|
Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeValue
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const Type& value
|
const Type& value
|
||||||
@ -64,7 +64,7 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeValue
|
|||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::Ostream& Foam::nastranSurfaceWriter::writeFaceValue
|
Foam::Ostream& Foam::surfaceWriters::nastranWriter::writeFaceValue
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const loadFormat format,
|
const loadFormat format,
|
||||||
@ -144,17 +144,14 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFaceValue
|
|||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
|
Foam::fileName Foam::surfaceWriters::nastranWriter::writeTemplate
|
||||||
(
|
(
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
const word& fieldName,
|
||||||
const Field<Type>& values,
|
const Field<Type>& localValues
|
||||||
const bool isNodeValues,
|
)
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
if (!fieldMap_.found(fieldName))
|
if (!fieldMap_.found(fieldName))
|
||||||
{
|
{
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
@ -168,74 +165,97 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
|
|||||||
|
|
||||||
const loadFormat& format(fieldMap_[fieldName]);
|
const loadFormat& format(fieldMap_[fieldName]);
|
||||||
|
|
||||||
// field: rootdir/time/field/surfaceName.nas
|
// Field: rootdir/<TIME>/field/surfaceName.nas
|
||||||
|
|
||||||
|
fileName outputFile = outputPath_.path();
|
||||||
if (!isDir(outputDir/fieldName))
|
if (useTimeDir() && !timeName().empty())
|
||||||
{
|
{
|
||||||
mkDir(outputDir/fieldName);
|
// Splice in time-directory
|
||||||
|
outputFile /= timeName();
|
||||||
|
}
|
||||||
|
outputFile /= fieldName / outputPath_.name();
|
||||||
|
outputFile.ext("nas");
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing field " << fieldName << " to " << outputFile << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// const scalar timeValue = Foam::name(this->mesh().time().timeValue());
|
|
||||||
const scalar timeValue = 0.0;
|
|
||||||
|
|
||||||
OFstream os(outputDir/fieldName/surfaceName + ".nas");
|
// geometry merge() implicit
|
||||||
fileFormats::NASCore::setPrecision(os, writeFormat_);
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
|
|
||||||
if (verbose)
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
{
|
{
|
||||||
Info<< "Writing nastran file to " << os.name() << endl;
|
const auto& values = tfield();
|
||||||
}
|
|
||||||
|
|
||||||
os << "TITLE=OpenFOAM " << surfaceName.c_str()
|
if (!isDir(outputFile.path()))
|
||||||
<< " " << fieldName << " data" << nl
|
|
||||||
<< "$" << nl
|
|
||||||
<< "TIME " << timeValue << nl
|
|
||||||
<< "$" << nl
|
|
||||||
<< "BEGIN BULK" << nl;
|
|
||||||
|
|
||||||
List<DynamicList<face>> decomposedFaces;
|
|
||||||
writeGeometry(os, surf, decomposedFaces);
|
|
||||||
|
|
||||||
os << "$" << nl
|
|
||||||
<< "$ Field data" << nl
|
|
||||||
<< "$" << nl;
|
|
||||||
|
|
||||||
label elemId = 0;
|
|
||||||
|
|
||||||
if (isNodeValues)
|
|
||||||
{
|
|
||||||
for (const DynamicList<face>& dFaces : decomposedFaces)
|
|
||||||
{
|
{
|
||||||
for (const face& f : dFaces)
|
mkDir(outputFile.path());
|
||||||
{
|
}
|
||||||
Type v = Zero;
|
|
||||||
|
|
||||||
for (const label verti : f)
|
const scalar timeValue = 0.0;
|
||||||
|
|
||||||
|
OFstream os(outputFile);
|
||||||
|
fileFormats::NASCore::setPrecision(os, writeFormat_);
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing nastran file to " << os.name() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << "TITLE=OpenFOAM " << outputFile.name()
|
||||||
|
<< " " << fieldName << " data" << nl
|
||||||
|
<< "$" << nl
|
||||||
|
<< "TIME " << timeValue << nl
|
||||||
|
<< "$" << nl
|
||||||
|
<< "BEGIN BULK" << nl;
|
||||||
|
|
||||||
|
List<DynamicList<face>> decomposedFaces;
|
||||||
|
writeGeometry(os, surf, decomposedFaces);
|
||||||
|
|
||||||
|
os << "$" << nl
|
||||||
|
<< "$ Field data" << nl
|
||||||
|
<< "$" << nl;
|
||||||
|
|
||||||
|
label elemId = 0;
|
||||||
|
|
||||||
|
if (this->isPointData())
|
||||||
|
{
|
||||||
|
for (const DynamicList<face>& dFaces : decomposedFaces)
|
||||||
|
{
|
||||||
|
for (const face& f : dFaces)
|
||||||
{
|
{
|
||||||
v += values[verti];
|
Type v = Zero;
|
||||||
|
|
||||||
|
for (const label verti : f)
|
||||||
|
{
|
||||||
|
v += values[verti];
|
||||||
|
}
|
||||||
|
v /= f.size();
|
||||||
|
|
||||||
|
writeFaceValue(os, format, v, ++elemId);
|
||||||
}
|
}
|
||||||
v /= f.size();
|
|
||||||
|
|
||||||
writeFaceValue(os, format, v, ++elemId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
|
||||||
{
|
|
||||||
for (const DynamicList<face>& dFaces : decomposedFaces)
|
|
||||||
{
|
{
|
||||||
forAll(dFaces, facei)
|
for (const DynamicList<face>& dFaces : decomposedFaces)
|
||||||
{
|
{
|
||||||
writeFaceValue(os, format, values[facei], ++elemId);
|
forAll(dFaces, facei)
|
||||||
|
{
|
||||||
|
writeFaceValue(os, format, values[facei], ++elemId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
writeFooter(os, surf)
|
||||||
|
<< "ENDDATA" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
writeFooter(os, surf)
|
return outputFile;
|
||||||
<< "ENDDATA" << endl;
|
|
||||||
|
|
||||||
return os.name();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
121
src/surfMesh/writers/null/nullSurfaceWriter.C
Normal file
121
src/surfMesh/writers/null/nullSurfaceWriter.C
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "nullSurfaceWriter.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
defineTypeName(nullWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, nullWriter, word);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, nullWriter, wordDict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::surfaceWriters::nullWriter::nullWriter()
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::nullWriter::nullWriter(const dictionary& options)
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::nullWriter::nullWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::nullWriter::nullWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
bool Foam::surfaceWriters::nullWriter::needsUpdate() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::surfaceWriters::nullWriter::enabled() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriters::nullWriter::setSurface
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
bool parallel
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriters::nullWriter::setSurface
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
bool parallel
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriters::nullWriter::open(const fileName& outputPath)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// Field writing methods
|
||||||
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::nullWriter);
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
149
src/surfMesh/writers/null/nullSurfaceWriter.H
Normal file
149
src/surfMesh/writers/null/nullSurfaceWriter.H
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriters::nullWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
Suppresses output of geometry and fields
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
nullSurfaceWriter.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef nullSurfaceWriter_H
|
||||||
|
#define nullSurfaceWriter_H
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class nullWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class nullWriter
|
||||||
|
:
|
||||||
|
public surfaceWriter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeNameNoDebug("none");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct for a given extension
|
||||||
|
nullWriter();
|
||||||
|
|
||||||
|
//- Construct for a given extension
|
||||||
|
explicit nullWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
nullWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
nullWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~nullWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Capability
|
||||||
|
|
||||||
|
//- Never needs an update.
|
||||||
|
virtual bool needsUpdate() const;
|
||||||
|
|
||||||
|
//- The null writer is always disabled, which lets the caller
|
||||||
|
//- skip various (possibly expensive) preparatory operations.
|
||||||
|
virtual bool enabled() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Surface association
|
||||||
|
|
||||||
|
//- Change association with a surface (no-op).
|
||||||
|
virtual void setSurface
|
||||||
|
(
|
||||||
|
const meshedSurf& s,
|
||||||
|
bool parallel = Pstream::parRun()
|
||||||
|
); // override
|
||||||
|
|
||||||
|
//- Change association with a surface (no-op).
|
||||||
|
virtual void setSurface
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
bool parallel = Pstream::parRun()
|
||||||
|
); // override
|
||||||
|
|
||||||
|
|
||||||
|
// Output
|
||||||
|
|
||||||
|
//- Open for output on specified path, using existing surface (no-op)
|
||||||
|
virtual void open(const fileName& outputPath); // override
|
||||||
|
|
||||||
|
|
||||||
|
// Write
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011 OpenFOAM Foundation
|
| Copyright (C) 2011 OpenFOAM Foundation
|
||||||
@ -28,78 +28,129 @@ License
|
|||||||
#include "proxySurfaceWriter.H"
|
#include "proxySurfaceWriter.H"
|
||||||
#include "MeshedSurfaceProxy.H"
|
#include "MeshedSurfaceProxy.H"
|
||||||
#include "OSspecific.H"
|
#include "OSspecific.H"
|
||||||
#include "makeSurfaceWriterMethods.H"
|
#include "surfaceWriterMethods.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
defineTypeNameAndDebug(proxySurfaceWriter, 0);
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
defineTypeName(proxyWriter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::proxySurfaceWriter::proxySurfaceWriter(const word& fileExt)
|
Foam::surfaceWriters::proxyWriter::proxyWriter(const word& fileExt)
|
||||||
:
|
:
|
||||||
surfaceWriter(),
|
surfaceWriter(),
|
||||||
fileExtension_(fileExt)
|
fileExtension_(fileExt)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
Foam::proxySurfaceWriter::proxySurfaceWriter
|
Foam::surfaceWriters::proxyWriter::proxyWriter
|
||||||
(
|
(
|
||||||
const word& fileExt,
|
const word& fileExt,
|
||||||
const dictionary& options
|
const dictionary& options
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
surfaceWriter(),
|
surfaceWriter(options),
|
||||||
fileExtension_(fileExt),
|
fileExtension_(fileExt),
|
||||||
options_(options)
|
options_(options)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::proxyWriter::proxyWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
proxyWriter(outputPath.ext(), options)
|
||||||
|
{
|
||||||
|
surfaceWriter::open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::proxyWriter::proxyWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
proxyWriter(outputPath.ext(), options)
|
||||||
|
{
|
||||||
|
surfaceWriter::open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::fileName Foam::proxySurfaceWriter::write
|
void Foam::surfaceWriters::proxyWriter::open
|
||||||
(
|
(
|
||||||
const fileName& outputDir,
|
const fileName& outputPath
|
||||||
const fileName& surfaceName,
|
)
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
|
fileExtension_ = outputPath.ext();
|
||||||
|
surfaceWriter::open(outputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::proxyWriter::write()
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
// Avoid bad values
|
// Avoid bad values
|
||||||
if (fileExtension_.empty())
|
if (fileExtension_.empty())
|
||||||
{
|
{
|
||||||
return fileName::null;
|
return fileName::null;
|
||||||
}
|
}
|
||||||
|
|
||||||
fileName outputFile(outputDir/surfaceName + '.' + fileExtension_);
|
// Geometry: rootdir/<TIME>/surfaceName.{extension}
|
||||||
|
|
||||||
if (!isDir(outputFile.path()))
|
fileName outputFile = outputPath_;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
{
|
{
|
||||||
mkDir(outputFile.path());
|
// Splice in time-directory
|
||||||
|
outputFile = outputPath_.path() / timeName() / outputPath_.name();
|
||||||
}
|
}
|
||||||
|
outputFile.ext(fileExtension_);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose_)
|
||||||
{
|
{
|
||||||
Info<< "Writing geometry to " << outputFile << endl;
|
Info<< "Writing geometry to " << outputFile << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
MeshedSurfaceProxy<face>
|
const meshedSurf& surf = surface();
|
||||||
(
|
|
||||||
surf.points(),
|
if (Pstream::master() || !parallel_)
|
||||||
surf.faces()
|
{
|
||||||
).write
|
if (!isDir(outputFile.path()))
|
||||||
(
|
{
|
||||||
outputFile,
|
mkDir(outputFile.path());
|
||||||
fileExtension_,
|
}
|
||||||
options_
|
|
||||||
);
|
MeshedSurfaceProxy<face>(surf.points(), surf.faces()).write
|
||||||
|
(
|
||||||
|
outputFile,
|
||||||
|
fileExtension_,
|
||||||
|
options_
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return outputFile;
|
return outputFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Field writing methods
|
||||||
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::proxyWriter);
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011 OpenFOAM Foundation
|
| Copyright (C) 2011 OpenFOAM Foundation
|
||||||
@ -24,11 +24,11 @@ License
|
|||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Class
|
Class
|
||||||
Foam::proxySurfaceWriter
|
Foam::surfaceWriters::proxyWriter
|
||||||
|
|
||||||
Description
|
Description
|
||||||
A surfaceWriter that writes the geometry via the MeshedSurfaceProxy, but
|
A surfaceWriter that writes the geometry via the MeshedSurfaceProxy,
|
||||||
which does not support any fields.
|
but which does not support any fields.
|
||||||
|
|
||||||
\heading Output file locations
|
\heading Output file locations
|
||||||
|
|
||||||
@ -59,16 +59,18 @@ SourceFiles
|
|||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class proxySurfaceWriter Declaration
|
Class proxyWriter Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
class proxySurfaceWriter
|
class proxyWriter
|
||||||
:
|
:
|
||||||
public surfaceWriter
|
public surfaceWriter
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
//- The file extension associated with the proxy
|
//- The file extension associated with the proxy
|
||||||
word fileExtension_;
|
word fileExtension_;
|
||||||
@ -80,46 +82,75 @@ class proxySurfaceWriter
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
TypeName("proxy");
|
TypeNameNoDebug("proxy");
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct for a given extension
|
//- Construct for a given extension
|
||||||
explicit proxySurfaceWriter(const word& fileExt);
|
explicit proxyWriter(const word& fileExt);
|
||||||
|
|
||||||
//- Construct for a given extension, with some output options
|
//- Construct for a given extension, with some output options
|
||||||
proxySurfaceWriter(const word& fileExt, const dictionary& options);
|
proxyWriter(const word& fileExt, const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components, taking extension from outputPath
|
||||||
|
proxyWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components, taking extension from outputPath
|
||||||
|
proxyWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~proxySurfaceWriter() = default;
|
virtual ~proxyWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
|
// Capability
|
||||||
|
|
||||||
//- True if the surface format supports geometry in a separate file.
|
//- A separate file is required for geometry.
|
||||||
// False if geometry and field must be in a single file
|
|
||||||
virtual bool separateGeometry() const
|
virtual bool separateGeometry() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//- Write single surface geometry to file.
|
// Output
|
||||||
virtual fileName write
|
|
||||||
(
|
//- Open for output on specified path, using existing surface
|
||||||
const fileName& outputDir, //!< output-dir
|
virtual void open(const fileName& outputPath); // override
|
||||||
const fileName& surfaceName, //!< Name of surface
|
|
||||||
const meshedSurf& surf, //!< Surface geometry
|
|
||||||
const bool verbose = false //!< Additional verbosity
|
// Write
|
||||||
) const; // override
|
|
||||||
|
//- Write surface geometry to file.
|
||||||
|
virtual fileName write(); // override
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
} // End namespace Foam
|
} // End namespace Foam
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
185
src/surfMesh/writers/raw/rawSurfaceWriter.C
Normal file
185
src/surfMesh/writers/raw/rawSurfaceWriter.C
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2008-2011, 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "rawSurfaceWriter.H"
|
||||||
|
#include "OFstream.H"
|
||||||
|
#include "OSspecific.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
defineTypeName(rawWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, rawWriter, word);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, rawWriter, wordDict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
// Emit x,y,z
|
||||||
|
static inline void writePoint(Foam::Ostream& os, const Foam::point& p)
|
||||||
|
{
|
||||||
|
os << p.x() << ' ' << p.y() << ' ' << p.z();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
// Field writing implementation
|
||||||
|
#include "rawSurfaceWriterImpl.C"
|
||||||
|
|
||||||
|
// Field writing methods
|
||||||
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::rawWriter);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::surfaceWriters::rawWriter::rawWriter()
|
||||||
|
:
|
||||||
|
surfaceWriter(),
|
||||||
|
writeCompression_(IOstream::UNCOMPRESSED)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::rawWriter::rawWriter
|
||||||
|
(
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(options),
|
||||||
|
writeCompression_
|
||||||
|
(
|
||||||
|
IOstream::compressionEnum
|
||||||
|
(
|
||||||
|
options.lookupOrDefault<word>("compression", "false")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::rawWriter::rawWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
rawWriter(options)
|
||||||
|
{
|
||||||
|
open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::rawWriter::rawWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
rawWriter(options)
|
||||||
|
{
|
||||||
|
open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::rawWriter::write()
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
// Geometry: rootdir/<TIME>/surfaceName.raw
|
||||||
|
|
||||||
|
fileName outputFile = outputPath_;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
outputFile = outputPath_.path() / timeName() / outputPath_.name();
|
||||||
|
}
|
||||||
|
outputFile.ext("raw");
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing geometry to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
const pointField& points = surf.points();
|
||||||
|
const faceList& faces = surf.faces();
|
||||||
|
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
OFstream os
|
||||||
|
(
|
||||||
|
outputFile,
|
||||||
|
IOstream::ASCII,
|
||||||
|
IOstream::currentVersion,
|
||||||
|
writeCompression_
|
||||||
|
);
|
||||||
|
|
||||||
|
// Header
|
||||||
|
{
|
||||||
|
os << "# geometry NO_DATA " << faces.size() << nl
|
||||||
|
<< "# x y z" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write faces centres
|
||||||
|
for (const face& f : faces)
|
||||||
|
{
|
||||||
|
writePoint(os, f.centre(points));
|
||||||
|
os << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
172
src/surfMesh/writers/raw/rawSurfaceWriter.H
Normal file
172
src/surfMesh/writers/raw/rawSurfaceWriter.H
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2008-2011, 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriters::rawWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
A surfaceWriter for raw output.
|
||||||
|
|
||||||
|
The formatOptions for raw:
|
||||||
|
\table
|
||||||
|
Property | Description | Required | Default
|
||||||
|
compression | on / off | no | off
|
||||||
|
\endtable
|
||||||
|
|
||||||
|
For example,
|
||||||
|
\verbatim
|
||||||
|
formatOptions
|
||||||
|
{
|
||||||
|
raw
|
||||||
|
{
|
||||||
|
compression on;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\heading Output file locations
|
||||||
|
|
||||||
|
The \c rootdir normally corresponds to something like
|
||||||
|
\c postProcessing/\<name\>
|
||||||
|
|
||||||
|
\subheading Geometry
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- timeName
|
||||||
|
`-- surfaceName.{raw}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\subheading Fields
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- timeName
|
||||||
|
|-- <field0>_surfaceName.{raw}
|
||||||
|
`-- <field1>_surfaceName.{raw}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
rawSurfaceWriter.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef rawSurfaceWriter_H
|
||||||
|
#define rawSurfaceWriter_H
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class rawWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class rawWriter
|
||||||
|
:
|
||||||
|
public surfaceWriter
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Output compression (default: uncompressed)
|
||||||
|
IOstream::compressionType writeCompression_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Templated write operation
|
||||||
|
template<class Type>
|
||||||
|
fileName writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeNameNoDebug("raw");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
rawWriter();
|
||||||
|
|
||||||
|
//- Construct with some output options
|
||||||
|
explicit rawWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
rawWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
rawWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~rawWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Write surface geometry to file.
|
||||||
|
virtual fileName write(); // override
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2008-2011, 2015-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
| Copyright (C) 2011-2014 OpenFOAM Foundation
|
||||||
@ -47,6 +47,13 @@ namespace Foam
|
|||||||
template<class Type>
|
template<class Type>
|
||||||
static inline void writeHeader(Ostream& os, const word& fieldName) {}
|
static inline void writeHeader(Ostream& os, const word& fieldName) {}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void writeHeader<label>(Ostream& os, const word& fieldName)
|
||||||
|
{
|
||||||
|
os << "# x y z"
|
||||||
|
<< " " << fieldName << nl;
|
||||||
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
void writeHeader<scalar>(Ostream& os, const word& fieldName)
|
void writeHeader<scalar>(Ostream& os, const word& fieldName)
|
||||||
{
|
{
|
||||||
@ -101,69 +108,96 @@ namespace Foam
|
|||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::fileName Foam::rawSurfaceWriter::writeTemplate
|
Foam::fileName Foam::surfaceWriters::rawWriter::writeTemplate
|
||||||
(
|
(
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const word& fieldName,
|
const word& fieldName,
|
||||||
const Field<Type>& values,
|
const Field<Type>& localValues
|
||||||
const bool isNodeValues,
|
)
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
// field: rootdir/time/<field>_surfaceName.raw
|
checkOpen();
|
||||||
|
|
||||||
const pointField& points = surf.points();
|
// Field: rootdir/<TIME>/<field>_surfaceName.raw
|
||||||
const faceList& faces = surf.faces();
|
|
||||||
|
|
||||||
if (!isDir(outputDir))
|
fileName outputFile = outputPath_.path();
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
{
|
{
|
||||||
mkDir(outputDir);
|
// Splice in time-directory
|
||||||
|
outputFile /= timeName();
|
||||||
}
|
}
|
||||||
|
|
||||||
OFstream os(outputDir/fieldName + '_' + surfaceName + ".raw");
|
// Append <field>_surfaceName.raw
|
||||||
|
outputFile /= fieldName + '_' + outputPath_.name();
|
||||||
|
outputFile.ext("raw");
|
||||||
|
|
||||||
if (verbose)
|
if (verbose_)
|
||||||
{
|
{
|
||||||
Info<< "Writing field " << fieldName << " to " << os.name() << endl;
|
Info<< "Writing field " << fieldName << " to " << outputFile << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header
|
|
||||||
os << "# " << fieldName;
|
|
||||||
if (isNodeValues)
|
|
||||||
{
|
|
||||||
os << " POINT_DATA " << values.size() << nl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
os << " FACE_DATA " << values.size() << nl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Header
|
// geometry merge() implicit
|
||||||
// # x y z field
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
writeHeader<Type>(os, fieldName);
|
|
||||||
|
|
||||||
if (isNodeValues)
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
{
|
{
|
||||||
// Node values
|
const auto& values = tfield();
|
||||||
forAll(values, elemi)
|
const pointField& points = surf.points();
|
||||||
|
const faceList& faces = surf.faces();
|
||||||
|
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
{
|
{
|
||||||
writePoint(os, points[elemi]);
|
mkDir(outputFile.path());
|
||||||
writeData(os, values[elemi]);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
OFstream os
|
||||||
{
|
(
|
||||||
// Face values
|
outputFile,
|
||||||
forAll(values, elemi)
|
IOstream::ASCII,
|
||||||
|
IOstream::currentVersion,
|
||||||
|
writeCompression_
|
||||||
|
);
|
||||||
|
|
||||||
|
// Header
|
||||||
{
|
{
|
||||||
writePoint(os, faces[elemi].centre(points));
|
os << "# " << fieldName;
|
||||||
writeData(os, values[elemi]);
|
if (this->isPointData())
|
||||||
|
{
|
||||||
|
os << " POINT_DATA ";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
os << " FACE_DATA ";
|
||||||
|
}
|
||||||
|
os << values.size() << nl;
|
||||||
|
|
||||||
|
// # x y z field
|
||||||
|
writeHeader<Type>(os, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (this->isPointData())
|
||||||
|
{
|
||||||
|
// Node values
|
||||||
|
forAll(values, elemi)
|
||||||
|
{
|
||||||
|
writePoint(os, points[elemi]);
|
||||||
|
writeData(os, values[elemi]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Face values
|
||||||
|
forAll(values, elemi)
|
||||||
|
{
|
||||||
|
writePoint(os, faces[elemi].centre(points));
|
||||||
|
writeData(os, values[elemi]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return os.name();
|
return outputFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
217
src/surfMesh/writers/starcd/starcdSurfaceWriter.C
Normal file
217
src/surfMesh/writers/starcd/starcdSurfaceWriter.C
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2008-2011, 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "starcdSurfaceWriter.H"
|
||||||
|
#include "OFstream.H"
|
||||||
|
#include "OSspecific.H"
|
||||||
|
#include "MeshedSurfaceProxy.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
defineTypeName(starcdWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, starcdWriter, word);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
// Emit each component
|
||||||
|
template<class Type>
|
||||||
|
static inline void writeData(Ostream& os, const Type& val)
|
||||||
|
{
|
||||||
|
const direction ncmpt = pTraits<Type>::nComponents;
|
||||||
|
for (direction cmpt=0; cmpt < ncmpt; ++cmpt)
|
||||||
|
{
|
||||||
|
os << ' ' << component(val, cmpt);
|
||||||
|
}
|
||||||
|
os << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::surfaceWriters::starcdWriter::starcdWriter()
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::starcdWriter::starcdWriter
|
||||||
|
(
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(options)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::starcdWriter::starcdWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
starcdWriter(options)
|
||||||
|
{
|
||||||
|
open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::starcdWriter::starcdWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
starcdWriter(options)
|
||||||
|
{
|
||||||
|
open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::starcdWriter::write()
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
// Geometry: rootdir/<TIME>/surfaceName.{inp,cel,vrt}
|
||||||
|
|
||||||
|
fileName outputFile = outputPath_;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
outputFile = outputPath_.path() / timeName() / outputPath_.name();
|
||||||
|
}
|
||||||
|
outputFile.ext("inp");
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing geometry to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
MeshedSurfaceProxy<face>
|
||||||
|
(
|
||||||
|
surf.points(),
|
||||||
|
surf.faces()
|
||||||
|
).write(outputFile, "inp");
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::fileName Foam::surfaceWriters::starcdWriter::writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const Field<Type>& localValues
|
||||||
|
)
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
// Field: rootdir/<TIME>/<field>_surfaceName.usr
|
||||||
|
|
||||||
|
fileName outputFile = outputPath_.path();
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
outputFile /= timeName();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append <field>_surfaceName.usr
|
||||||
|
outputFile /= fieldName + '_' + outputPath_.name();
|
||||||
|
outputFile.ext("usr");
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing field " << fieldName << " to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// geometry merge() implicit
|
||||||
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
const auto& values = tfield();
|
||||||
|
|
||||||
|
if (!isDir(outputFile.path()))
|
||||||
|
{
|
||||||
|
mkDir(outputFile.path());
|
||||||
|
}
|
||||||
|
|
||||||
|
OFstream os(outputFile);
|
||||||
|
|
||||||
|
// 1-based ids
|
||||||
|
label elemId = 1;
|
||||||
|
|
||||||
|
// No header, just write values
|
||||||
|
for (const Type& val : values)
|
||||||
|
{
|
||||||
|
os << elemId;
|
||||||
|
writeData(os, val);
|
||||||
|
|
||||||
|
++elemId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Field writing methods
|
||||||
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::starcdWriter);
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
170
src/surfMesh/writers/starcd/starcdSurfaceWriter.H
Normal file
170
src/surfMesh/writers/starcd/starcdSurfaceWriter.H
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2008-2011, 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriters::starcdWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
A surfaceWriter for STARCD files.
|
||||||
|
|
||||||
|
The geometry is written via the MeshedSurfaceProxy, the fields
|
||||||
|
are written in a trivial ASCII format with ID and VALUE as
|
||||||
|
so-called user data. These \c .usr files can be read into proSTAR
|
||||||
|
with these types of commands. For element data:
|
||||||
|
\verbatim
|
||||||
|
getuser FILENAME.usr cell scalar free
|
||||||
|
getuser FILENAME.usr cell vector free
|
||||||
|
\endverbatim
|
||||||
|
and for vertex data:
|
||||||
|
\verbatim
|
||||||
|
getuser FILENAME.usr vertex scalar free
|
||||||
|
getuser FILENAME.usr vertex vector free
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\heading Output file locations
|
||||||
|
|
||||||
|
The \c rootdir normally corresponds to something like
|
||||||
|
\c postProcessing/\<name\>
|
||||||
|
|
||||||
|
\subheading Geometry
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- timeName
|
||||||
|
`-- surfaceName.{cel,vrt,inp}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\subheading Fields
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- timeName
|
||||||
|
|-- <field0>_surfaceName.{usr}
|
||||||
|
`-- <field1>_surfaceName.{usr}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
starcdSurfaceWriter.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef starcdSurfaceWriter_H
|
||||||
|
#define starcdSurfaceWriter_H
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class starcdWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class starcdWriter
|
||||||
|
:
|
||||||
|
public surfaceWriter
|
||||||
|
{
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Templated write operation
|
||||||
|
template<class Type>
|
||||||
|
fileName writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeNameNoDebug("starcd");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
starcdWriter();
|
||||||
|
|
||||||
|
//- Construct with some output options
|
||||||
|
explicit starcdWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
starcdWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
starcdWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~starcdWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- True if the surface format supports geometry in a separate file.
|
||||||
|
// False if geometry and field must be in a single file
|
||||||
|
virtual bool separateGeometry() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Write single surface geometry to file.
|
||||||
|
virtual fileName write(); // override
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
458
src/surfMesh/writers/surfaceWriter.C
Normal file
458
src/surfMesh/writers/surfaceWriter.C
Normal file
@ -0,0 +1,458 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
#include "proxySurfaceWriter.H"
|
||||||
|
#include "MeshedSurfaceProxy.H"
|
||||||
|
|
||||||
|
#include "Time.H"
|
||||||
|
#include "globalIndex.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(surfaceWriter, 0);
|
||||||
|
defineRunTimeSelectionTable(surfaceWriter, word);
|
||||||
|
defineRunTimeSelectionTable(surfaceWriter, wordDict);
|
||||||
|
}
|
||||||
|
|
||||||
|
Foam::scalar Foam::surfaceWriter::defaultMergeDim = 1e-8;
|
||||||
|
|
||||||
|
const Foam::meshedSurf::emptySurface Foam::surfaceWriter::emptySurface_;
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
bool Foam::surfaceWriter::supportedType(const word& writeType)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(
|
||||||
|
wordConstructorTablePtr_->found(writeType)
|
||||||
|
|| wordDictConstructorTablePtr_->found(writeType)
|
||||||
|
|| MeshedSurfaceProxy<face>::canWriteType(writeType)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::autoPtr<Foam::surfaceWriter>
|
||||||
|
Foam::surfaceWriter::New(const word& writeType)
|
||||||
|
{
|
||||||
|
// Constructors without dictionary options
|
||||||
|
auto cstrIter = wordConstructorTablePtr_->cfind(writeType);
|
||||||
|
|
||||||
|
if (!cstrIter.found())
|
||||||
|
{
|
||||||
|
if (MeshedSurfaceProxy<face>::canWriteType(writeType))
|
||||||
|
{
|
||||||
|
// Generally unknown, but handle via 'proxy' handler
|
||||||
|
return autoPtr<surfaceWriter>
|
||||||
|
(
|
||||||
|
new surfaceWriters::proxyWriter(writeType)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< "Unknown write type \"" << writeType << "\"\n\n"
|
||||||
|
<< "Valid write types : "
|
||||||
|
<< flatOutput(wordConstructorTablePtr_->sortedToc()) << nl
|
||||||
|
<< "Valid proxy types : "
|
||||||
|
<< MeshedSurfaceProxy<face>::writeTypes() << endl
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return autoPtr<surfaceWriter>(cstrIter()());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::autoPtr<Foam::surfaceWriter>
|
||||||
|
Foam::surfaceWriter::New
|
||||||
|
(
|
||||||
|
const word& writeType,
|
||||||
|
const dictionary& writeOpts
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Constructors with dictionary options
|
||||||
|
auto cstrIter2 = wordDictConstructorTablePtr_->cfind(writeType);
|
||||||
|
|
||||||
|
if (cstrIter2.found())
|
||||||
|
{
|
||||||
|
return autoPtr<surfaceWriter>(cstrIter2()(writeOpts));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constructors without dictionary options
|
||||||
|
auto cstrIter = wordConstructorTablePtr_->cfind(writeType);
|
||||||
|
|
||||||
|
if (!cstrIter.found())
|
||||||
|
{
|
||||||
|
if (MeshedSurfaceProxy<face>::canWriteType(writeType))
|
||||||
|
{
|
||||||
|
// Generally unknown, but handle via 'proxy' handler
|
||||||
|
return autoPtr<surfaceWriter>
|
||||||
|
(
|
||||||
|
new surfaceWriters::proxyWriter(writeType, writeOpts)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< "Unknown write type \"" << writeType << "\"\n\n"
|
||||||
|
<< "Valid write types : "
|
||||||
|
<< wordConstructorTablePtr_->sortedToc() << nl
|
||||||
|
<< "Valid proxy types : "
|
||||||
|
<< MeshedSurfaceProxy<face>::writeTypes() << endl
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return autoPtr<surfaceWriter>(cstrIter()());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::surfaceWriter::surfaceWriter()
|
||||||
|
:
|
||||||
|
surf_(std::cref<meshedSurf>(emptySurface_)),
|
||||||
|
upToDate_(false),
|
||||||
|
parallel_(true),
|
||||||
|
useTimeDir_(false),
|
||||||
|
isPointData_(false),
|
||||||
|
verbose_(false),
|
||||||
|
nFields_(0),
|
||||||
|
mergeDim_(defaultMergeDim),
|
||||||
|
merged_(),
|
||||||
|
currTime_(),
|
||||||
|
outputPath_()
|
||||||
|
{
|
||||||
|
surfaceWriter::close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriter::surfaceWriter(const dictionary& options)
|
||||||
|
:
|
||||||
|
surfaceWriter()
|
||||||
|
{
|
||||||
|
options.readIfPresent("verbose", verbose_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriter::surfaceWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(options)
|
||||||
|
{
|
||||||
|
setSurface(surf, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriter::surfaceWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(options)
|
||||||
|
{
|
||||||
|
setSurface(points, faces, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::setTime(const instant& inst)
|
||||||
|
{
|
||||||
|
currTime_ = inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::setTime(scalar timeValue)
|
||||||
|
{
|
||||||
|
currTime_ = instant(timeValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::setTime(scalar timeValue, const word& timeName)
|
||||||
|
{
|
||||||
|
currTime_.value() = timeValue;
|
||||||
|
currTime_.name() = timeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::unsetTime()
|
||||||
|
{
|
||||||
|
currTime_.value() = 0;
|
||||||
|
currTime_.name().clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::beginTime(const Time& t)
|
||||||
|
{
|
||||||
|
setTime(t.value(), t.timeName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::beginTime(const instant& inst)
|
||||||
|
{
|
||||||
|
setTime(inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::endTime()
|
||||||
|
{
|
||||||
|
unsetTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::open(const fileName& outputPath)
|
||||||
|
{
|
||||||
|
outputPath_ = outputPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::open
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel
|
||||||
|
)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
setSurface(surf, parallel);
|
||||||
|
open(outputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::open
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel
|
||||||
|
)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
setSurface(points, faces, parallel);
|
||||||
|
open(outputPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::close()
|
||||||
|
{
|
||||||
|
outputPath_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::clear()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
expire();
|
||||||
|
surf_ = std::cref<meshedSurf>(emptySurface_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::setSurface
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
bool parallel
|
||||||
|
)
|
||||||
|
{
|
||||||
|
expire();
|
||||||
|
surf_ = std::cref<meshedSurf>(surf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriter::setSurface
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
bool parallel
|
||||||
|
)
|
||||||
|
{
|
||||||
|
expire();
|
||||||
|
setSurface(meshedSurfRef(points, faces), parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::surfaceWriter::needsUpdate() const
|
||||||
|
{
|
||||||
|
return !upToDate_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::surfaceWriter::expire()
|
||||||
|
{
|
||||||
|
const bool changed = upToDate_;
|
||||||
|
|
||||||
|
upToDate_ = false;
|
||||||
|
nFields_ = 0;
|
||||||
|
merged_.clear();
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::surfaceWriter::hasSurface() const
|
||||||
|
{
|
||||||
|
return (&emptySurface_ != &(surf_.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::surfaceWriter::empty() const
|
||||||
|
{
|
||||||
|
const bool value = surf_.get().faces().empty();
|
||||||
|
|
||||||
|
return (parallel_ ? returnReduce(value, andOp<bool>()) : value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::label Foam::surfaceWriter::size() const
|
||||||
|
{
|
||||||
|
const label value = surf_.get().faces().size();
|
||||||
|
|
||||||
|
return (parallel_ ? returnReduce(value, sumOp<label>()) : value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::surfaceWriter::checkOpen() const
|
||||||
|
{
|
||||||
|
if (outputPath_.empty())
|
||||||
|
{
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< type() << " : Attempted to write without a path" << nl
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return !outputPath_.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::surfaceWriter::merge() const
|
||||||
|
{
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
if (parallel_ && Pstream::parRun() && !upToDate_)
|
||||||
|
{
|
||||||
|
changed = merged_.merge(surf_.get(), mergeDim_);
|
||||||
|
}
|
||||||
|
upToDate_ = true;
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const Foam::meshedSurf& Foam::surfaceWriter::surface() const
|
||||||
|
{
|
||||||
|
merge();
|
||||||
|
|
||||||
|
if (parallel_ && Pstream::parRun())
|
||||||
|
{
|
||||||
|
return merged_;
|
||||||
|
}
|
||||||
|
|
||||||
|
return surf_.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type>> Foam::surfaceWriter::mergeFieldTemplate
|
||||||
|
(
|
||||||
|
const Field<Type>& fld
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (parallel_ && Pstream::parRun())
|
||||||
|
{
|
||||||
|
// Ensure geometry is also merged
|
||||||
|
merge();
|
||||||
|
|
||||||
|
// Gather all values
|
||||||
|
auto tfield = tmp<Field<Type>>::New();
|
||||||
|
auto& allFld = tfield.ref();
|
||||||
|
|
||||||
|
globalIndex::gatherOp(fld, allFld);
|
||||||
|
|
||||||
|
// Renumber (point data) to correspond to merged points
|
||||||
|
if (Pstream::master() && this->isPointData())
|
||||||
|
{
|
||||||
|
inplaceReorder(merged_.pointsMap(), allFld);
|
||||||
|
allFld.resize(merged_.points().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
return tfield;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark that any geometry changes have been taken care of
|
||||||
|
upToDate_ = true;
|
||||||
|
|
||||||
|
return fld;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define defineSurfaceWriterMergeMethod(ThisClass, Type) \
|
||||||
|
Foam::tmp<Foam::Field<Type>> \
|
||||||
|
ThisClass::mergeField(const Field<Type>& fld) const \
|
||||||
|
{ \
|
||||||
|
return mergeFieldTemplate(fld); \
|
||||||
|
}
|
||||||
|
|
||||||
|
defineSurfaceWriterMergeMethod(Foam::surfaceWriter, Foam::label);
|
||||||
|
defineSurfaceWriterMergeMethod(Foam::surfaceWriter, Foam::scalar);
|
||||||
|
defineSurfaceWriterMergeMethod(Foam::surfaceWriter, Foam::vector);
|
||||||
|
defineSurfaceWriterMergeMethod(Foam::surfaceWriter, Foam::sphericalTensor);
|
||||||
|
defineSurfaceWriterMergeMethod(Foam::surfaceWriter, Foam::symmTensor);
|
||||||
|
defineSurfaceWriterMergeMethod(Foam::surfaceWriter, Foam::tensor)
|
||||||
|
|
||||||
|
#undef defineSurfaceWriterMergeMethod
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::Ostream& Foam::operator<<
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const InfoProxy<surfaceWriter>& ip
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const surfaceWriter& w = ip.t_;
|
||||||
|
|
||||||
|
os << "surfaceWriter:"
|
||||||
|
<< " upToDate: " << w.upToDate_
|
||||||
|
<< " PointData: " << w.isPointData_
|
||||||
|
<< " nFields: " << w.nFields_
|
||||||
|
<< " time: " << w.currTime_
|
||||||
|
<< " path: " << w.outputPath_ << endl;
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
491
src/surfMesh/writers/surfaceWriter.H
Normal file
491
src/surfMesh/writers/surfaceWriter.H
Normal file
@ -0,0 +1,491 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Namespace
|
||||||
|
Foam::surfaceWriters
|
||||||
|
|
||||||
|
Description
|
||||||
|
Namespace for surface writers
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
Base class for surface writers.
|
||||||
|
|
||||||
|
The surfaceWriter interface is rather large since we need a writer that
|
||||||
|
can either be initially defined without a surface association
|
||||||
|
and have that added at a later stage, or be defined with a surface
|
||||||
|
association.
|
||||||
|
|
||||||
|
\verbatim
|
||||||
|
formatOptions
|
||||||
|
{
|
||||||
|
someFormat // Eg, ensight, vtk, etc
|
||||||
|
{
|
||||||
|
verbose true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
Format options:
|
||||||
|
\table
|
||||||
|
Property | Description | Required | Default
|
||||||
|
verbose | Additional output verbosity | no | no
|
||||||
|
\endtable
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
sampledWriter.C
|
||||||
|
sampledWriterI.H
|
||||||
|
sampledWriterImpl.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef surfaceWriter_H
|
||||||
|
#define surfaceWriter_H
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include "typeInfo.H"
|
||||||
|
#include "autoPtr.H"
|
||||||
|
#include "tmp.H"
|
||||||
|
#include "Field.H"
|
||||||
|
#include "fileName.H"
|
||||||
|
#include "instant.H"
|
||||||
|
#include "mergedSurf.H"
|
||||||
|
#include "meshedSurfRef.H"
|
||||||
|
#include "InfoProxy.H"
|
||||||
|
#include "runTimeSelectionTables.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// Forward declarations
|
||||||
|
class Time;
|
||||||
|
class surfaceWriter;
|
||||||
|
|
||||||
|
Ostream& operator<<(Ostream& os, const InfoProxy<surfaceWriter>& ip);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class surfaceWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class surfaceWriter
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Static data members
|
||||||
|
|
||||||
|
//- Placeholder
|
||||||
|
static const meshedSurf::emptySurface emptySurface_;
|
||||||
|
|
||||||
|
|
||||||
|
// Protected data
|
||||||
|
|
||||||
|
//- Reference to the surface
|
||||||
|
std::reference_wrapper<const meshedSurf> surf_;
|
||||||
|
|
||||||
|
//- The topology/surface is up-to-date?
|
||||||
|
mutable bool upToDate_;
|
||||||
|
|
||||||
|
//- Writing in parallel (vai master)
|
||||||
|
bool parallel_;
|
||||||
|
|
||||||
|
//- Writer should do something funny
|
||||||
|
bool useTimeDir_;
|
||||||
|
|
||||||
|
//- Is point vs cell data
|
||||||
|
bool isPointData_;
|
||||||
|
|
||||||
|
//- Additional output verbosity
|
||||||
|
bool verbose_;
|
||||||
|
|
||||||
|
//- The number of fields
|
||||||
|
label nFields_;
|
||||||
|
|
||||||
|
//- Dimension for merging
|
||||||
|
scalar mergeDim_;
|
||||||
|
|
||||||
|
//- Merging information and the resulting merged surface (parallel)
|
||||||
|
mutable mergedSurf merged_;
|
||||||
|
|
||||||
|
//- The current time value/name
|
||||||
|
instant currTime_;
|
||||||
|
|
||||||
|
//- The full output directory and file (surface) name
|
||||||
|
fileName outputPath_;
|
||||||
|
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Verify that the outputPath_ has been set or FatalError
|
||||||
|
bool checkOpen() const;
|
||||||
|
|
||||||
|
//- Merge surfaces if they are not already upToDate (parallel)
|
||||||
|
//- or simply mark the surface as being up-to-date
|
||||||
|
virtual bool merge() const;
|
||||||
|
|
||||||
|
//- Merge surfaces (if not upToDate) and return merged or
|
||||||
|
//- the regular surface
|
||||||
|
const meshedSurf& surface() const;
|
||||||
|
|
||||||
|
|
||||||
|
//- Gather (merge) fields with renumbering and shrinking for point data
|
||||||
|
template<class Type>
|
||||||
|
tmp<Field<Type>> mergeFieldTemplate(const Field<Type>& fld) const;
|
||||||
|
|
||||||
|
#undef declareSurfaceWriterMergeMethod
|
||||||
|
#define declareSurfaceWriterMergeMethod(Type) \
|
||||||
|
tmp<Field<Type>> mergeField(const Field<Type>& fld) const;
|
||||||
|
|
||||||
|
declareSurfaceWriterMergeMethod(label);
|
||||||
|
declareSurfaceWriterMergeMethod(scalar);
|
||||||
|
declareSurfaceWriterMergeMethod(vector);
|
||||||
|
declareSurfaceWriterMergeMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterMergeMethod(symmTensor);
|
||||||
|
declareSurfaceWriterMergeMethod(tensor);
|
||||||
|
|
||||||
|
#undef declareSurfaceWriterMergeMethod
|
||||||
|
|
||||||
|
//- Dummy templated write operation
|
||||||
|
template<class Type>
|
||||||
|
fileName writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return fileName::null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Public data
|
||||||
|
|
||||||
|
//- The default merge dimension (1e-8)
|
||||||
|
static scalar defaultMergeDim;
|
||||||
|
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("surfaceWriter");
|
||||||
|
|
||||||
|
|
||||||
|
// Declare run-time constructor selection table
|
||||||
|
declareRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
autoPtr,
|
||||||
|
surfaceWriter,
|
||||||
|
word,
|
||||||
|
(),
|
||||||
|
()
|
||||||
|
);
|
||||||
|
|
||||||
|
declareRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
autoPtr,
|
||||||
|
surfaceWriter,
|
||||||
|
wordDict,
|
||||||
|
(
|
||||||
|
const dictionary& writeOpts
|
||||||
|
),
|
||||||
|
(writeOpts)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Selectors
|
||||||
|
|
||||||
|
//- True if New is likely to succeed for this writeType
|
||||||
|
static bool supportedType(const word& writeType);
|
||||||
|
|
||||||
|
//- Return a reference to the selected surfaceWriter
|
||||||
|
static autoPtr<surfaceWriter> New(const word& writeType);
|
||||||
|
|
||||||
|
//- Return a reference to the selected surfaceWriter
|
||||||
|
// Select with extra write option
|
||||||
|
static autoPtr<surfaceWriter> New
|
||||||
|
(
|
||||||
|
const word& writeType,
|
||||||
|
const dictionary& writeOptions
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
surfaceWriter();
|
||||||
|
|
||||||
|
//- Construct null with specified options
|
||||||
|
explicit surfaceWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
explicit surfaceWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
surfaceWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~surfaceWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Capability
|
||||||
|
|
||||||
|
//- The writer is enabled. If the writer is not enabled, it may be
|
||||||
|
//- possible for the caller to skip various preparatory operations.
|
||||||
|
// This method is primarily useful for the null writer
|
||||||
|
virtual bool enabled() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- True if the surface format requires geometry in a separate file.
|
||||||
|
virtual bool separateGeometry() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Bookkeeping
|
||||||
|
|
||||||
|
//- Does the writer need an update (eg, lagging behind surface changes)
|
||||||
|
virtual bool needsUpdate() const;
|
||||||
|
|
||||||
|
//- Mark that surface changed and the writer will need an update,
|
||||||
|
//- and set nFields = 0.
|
||||||
|
// May also free up unneeded data.
|
||||||
|
// Return false if it was previously already expired.
|
||||||
|
virtual bool expire();
|
||||||
|
|
||||||
|
//- Close any open output, remove association with a surface and
|
||||||
|
//- expire the writer. The parallel flag remains untouched.
|
||||||
|
virtual void clear();
|
||||||
|
|
||||||
|
|
||||||
|
// Surface association
|
||||||
|
|
||||||
|
//- Change association with a surface and expire the writer
|
||||||
|
virtual void setSurface
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
bool parallel = Pstream::parRun()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Change association with a surface and expire the writer
|
||||||
|
virtual void setSurface
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
bool parallel = Pstream::parRun()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Queries, Access
|
||||||
|
|
||||||
|
//- Writer is associated with a surface
|
||||||
|
bool hasSurface() const;
|
||||||
|
|
||||||
|
//- The surface to write is empty if the global number of faces is zero
|
||||||
|
bool empty() const;
|
||||||
|
|
||||||
|
//- The global number of faces for the associated surface
|
||||||
|
label size() const;
|
||||||
|
|
||||||
|
//- The number of expected output fields.
|
||||||
|
// Currently only used by the legacy VTK format.
|
||||||
|
inline label nFields() const;
|
||||||
|
|
||||||
|
//- The number of expected output fields.
|
||||||
|
// Currently only used by the legacy VTK format.
|
||||||
|
inline label& nFields();
|
||||||
|
|
||||||
|
//- Are the field data to be treated as point data?
|
||||||
|
inline bool isPointData() const;
|
||||||
|
|
||||||
|
//- Set handling of field data to face/point data.
|
||||||
|
inline bool& isPointData();
|
||||||
|
|
||||||
|
//- Should a time directory be spliced into the output path?
|
||||||
|
inline bool useTimeDir() const;
|
||||||
|
|
||||||
|
//- Change handling of spliced output path.
|
||||||
|
inline bool& useTimeDir();
|
||||||
|
|
||||||
|
//- Get output verbosity
|
||||||
|
inline bool verbose() const;
|
||||||
|
|
||||||
|
//- Set output verbosity
|
||||||
|
inline bool& verbose();
|
||||||
|
|
||||||
|
//- The current value of the point merge dimension (metre)
|
||||||
|
inline scalar mergeDim() const;
|
||||||
|
|
||||||
|
//- The current value of the point merge dimension (metre)
|
||||||
|
inline scalar& mergeDim();
|
||||||
|
|
||||||
|
|
||||||
|
// Time
|
||||||
|
|
||||||
|
//- True if there is a known time
|
||||||
|
inline bool hasTime() const;
|
||||||
|
|
||||||
|
//- The current time value/name
|
||||||
|
inline const word& timeName() const;
|
||||||
|
|
||||||
|
//- The current time value/name
|
||||||
|
inline scalar timeValue() const;
|
||||||
|
|
||||||
|
|
||||||
|
//- Set the current time
|
||||||
|
void setTime(const instant& inst);
|
||||||
|
|
||||||
|
//- Set current time from timeValue, auto generating the name
|
||||||
|
void setTime(scalar timeValue);
|
||||||
|
|
||||||
|
//- Set current time from timeValue and timeName
|
||||||
|
void setTime(scalar timeValue, const word& timeName);
|
||||||
|
|
||||||
|
//- Clear the current time
|
||||||
|
void unsetTime();
|
||||||
|
|
||||||
|
|
||||||
|
//- Begin a time-step
|
||||||
|
virtual void beginTime(const Time& t);
|
||||||
|
|
||||||
|
//- Begin a time-step
|
||||||
|
virtual void beginTime(const instant& inst);
|
||||||
|
|
||||||
|
//- End a time-step
|
||||||
|
virtual void endTime();
|
||||||
|
|
||||||
|
|
||||||
|
// Output
|
||||||
|
|
||||||
|
//- Open for output on specified path, using existing surface
|
||||||
|
virtual void open(const fileName& outputPath);
|
||||||
|
|
||||||
|
//- Open from components
|
||||||
|
virtual void open
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Open from components
|
||||||
|
virtual void open
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Finish output, performing any necessary cleanup
|
||||||
|
virtual void close();
|
||||||
|
|
||||||
|
|
||||||
|
// Write
|
||||||
|
|
||||||
|
//- Write single surface geometry to file.
|
||||||
|
virtual fileName writeGeometry() const
|
||||||
|
{
|
||||||
|
return fileName::null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#undef declareSurfaceWriterWriteMethod
|
||||||
|
#define declareSurfaceWriterWriteMethod(Type) \
|
||||||
|
/**! Write field of Type (per face or vertex) */ \
|
||||||
|
virtual fileName write \
|
||||||
|
( \
|
||||||
|
const word& fieldName, /*!< Name of field */ \
|
||||||
|
const Field<Type>& values /*!< Field values to write */ \
|
||||||
|
) = 0
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
|
||||||
|
|
||||||
|
#undef declareSurfaceWriterWriteMethod
|
||||||
|
#define declareSurfaceWriterWriteMethod(Type) \
|
||||||
|
\
|
||||||
|
/**! Write field of Type (per face or vertex) */ \
|
||||||
|
virtual fileName write \
|
||||||
|
( \
|
||||||
|
const word& fieldName, /*!< Name of field */ \
|
||||||
|
const Field<Type>& values /*!< Field values to write */ \
|
||||||
|
) // override
|
||||||
|
|
||||||
|
|
||||||
|
// Other IO
|
||||||
|
|
||||||
|
//- Return info proxy.
|
||||||
|
virtual InfoProxy<surfaceWriter> info() const
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Output info proxy
|
||||||
|
friend Ostream& operator<<
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const InfoProxy<surfaceWriter>& ip
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "surfaceWriterI.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -2,10 +2,8 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -25,56 +23,83 @@ License
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "starcdSurfaceWriter.H"
|
|
||||||
#include "MeshedSurfaceProxy.H"
|
|
||||||
#include "OFstream.H"
|
|
||||||
#include "OSspecific.H"
|
|
||||||
#include "makeSurfaceWriterMethods.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
makeSurfaceWriterType(starcdSurfaceWriter);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Field writing implementation
|
|
||||||
#include "starcdSurfaceWriterImpl.C"
|
|
||||||
|
|
||||||
// Field writing methods
|
|
||||||
defineSurfaceWriterWriteFields(Foam::starcdSurfaceWriter);
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::fileName Foam::starcdSurfaceWriter::write
|
inline Foam::label Foam::surfaceWriter::nFields() const
|
||||||
(
|
|
||||||
const fileName& outputDir,
|
|
||||||
const fileName& surfaceName,
|
|
||||||
const meshedSurf& surf,
|
|
||||||
const bool verbose
|
|
||||||
) const
|
|
||||||
{
|
{
|
||||||
// geometry: rootdir/time/surfaceName.{raw,vrt,inp}
|
return nFields_;
|
||||||
|
}
|
||||||
|
|
||||||
fileName outputFile(outputDir/surfaceName + ".inp");
|
|
||||||
|
|
||||||
if (verbose)
|
inline Foam::label& Foam::surfaceWriter::nFields()
|
||||||
{
|
{
|
||||||
Info<< "Writing geometry to " << outputFile << endl;
|
return nFields_;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isDir(outputFile.path()))
|
|
||||||
{
|
|
||||||
mkDir(outputFile.path());
|
|
||||||
}
|
|
||||||
|
|
||||||
MeshedSurfaceProxy<face>(surf.points(), surf.faces()).write
|
inline bool Foam::surfaceWriter::isPointData() const
|
||||||
(
|
{
|
||||||
outputFile
|
return isPointData_;
|
||||||
);
|
}
|
||||||
|
|
||||||
return outputFile;
|
|
||||||
|
inline bool& Foam::surfaceWriter::isPointData()
|
||||||
|
{
|
||||||
|
return isPointData_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::surfaceWriter::useTimeDir() const
|
||||||
|
{
|
||||||
|
return useTimeDir_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool& Foam::surfaceWriter::useTimeDir()
|
||||||
|
{
|
||||||
|
return useTimeDir_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::surfaceWriter::verbose() const
|
||||||
|
{
|
||||||
|
return verbose_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool& Foam::surfaceWriter::verbose()
|
||||||
|
{
|
||||||
|
return verbose_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalar Foam::surfaceWriter::mergeDim() const
|
||||||
|
{
|
||||||
|
return mergeDim_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalar& Foam::surfaceWriter::mergeDim()
|
||||||
|
{
|
||||||
|
return mergeDim_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::surfaceWriter::hasTime() const
|
||||||
|
{
|
||||||
|
return currTime_.name().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::word& Foam::surfaceWriter::timeName() const
|
||||||
|
{
|
||||||
|
return currTime_.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalar Foam::surfaceWriter::timeValue() const
|
||||||
|
{
|
||||||
|
return currTime_.name().empty() ? 0 : currTime_.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2,10 +2,8 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -24,56 +22,35 @@ License
|
|||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
InClass
|
InClass
|
||||||
Foam::makeSurfaceWriterMethods
|
Foam::surfaceWriterMethods
|
||||||
|
|
||||||
Description
|
Description
|
||||||
Convenience macros for instantiating writer methods for surfaceWriter
|
Convenience macros for instantiating surfaceWriter methods.
|
||||||
classes.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef makeSurfaceWriterMethods_H
|
#ifndef surfaceWriterMethods_H
|
||||||
#define makeSurfaceWriterMethods_H
|
#define surfaceWriterMethods_H
|
||||||
|
|
||||||
#include "surfaceWriter.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
#define makeSurfaceWriterType(ThisClass) \
|
// Instantiate templated method for standard types
|
||||||
defineTypeNameAndDebug(ThisClass, 0); \
|
|
||||||
addToRunTimeSelectionTable(surfaceWriter, ThisClass, word)
|
|
||||||
|
|
||||||
|
|
||||||
#define defineSurfaceWriterWriteField(ThisClass, FieldType) \
|
#define defineSurfaceWriterWriteField(ThisClass, FieldType) \
|
||||||
Foam::fileName ThisClass::write \
|
Foam::fileName ThisClass::write \
|
||||||
( \
|
( \
|
||||||
const fileName& outputDir, \
|
|
||||||
const fileName& surfaceName, \
|
|
||||||
const meshedSurf& surf, \
|
|
||||||
const word& fieldName, \
|
const word& fieldName, \
|
||||||
const Field<FieldType>& values, \
|
const Field<FieldType>& values \
|
||||||
const bool isNodeValues, \
|
) \
|
||||||
const bool verbose \
|
|
||||||
) const \
|
|
||||||
{ \
|
{ \
|
||||||
return writeTemplate \
|
return writeTemplate(fieldName, values); \
|
||||||
( \
|
|
||||||
outputDir, \
|
|
||||||
surfaceName, \
|
|
||||||
surf, \
|
|
||||||
fieldName, \
|
|
||||||
values, \
|
|
||||||
isNodeValues, \
|
|
||||||
verbose \
|
|
||||||
); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define defineSurfaceWriterWriteFields(ThisClass) \
|
#define defineSurfaceWriterWriteFields(ThisClass) \
|
||||||
|
defineSurfaceWriterWriteField(ThisClass, label); \
|
||||||
defineSurfaceWriterWriteField(ThisClass, scalar); \
|
defineSurfaceWriterWriteField(ThisClass, scalar); \
|
||||||
defineSurfaceWriterWriteField(ThisClass, vector); \
|
defineSurfaceWriterWriteField(ThisClass, vector); \
|
||||||
defineSurfaceWriterWriteField(ThisClass, sphericalTensor); \
|
defineSurfaceWriterWriteField(ThisClass, sphericalTensor); \
|
||||||
291
src/surfMesh/writers/vtk/vtkSurfaceWriter.C
Normal file
291
src/surfMesh/writers/vtk/vtkSurfaceWriter.C
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "vtkSurfaceWriter.H"
|
||||||
|
#include "foamVtkSurfaceWriter.H"
|
||||||
|
#include "surfaceWriterMethods.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
defineTypeName(vtkWriter);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, vtkWriter, word);
|
||||||
|
addToRunTimeSelectionTable(surfaceWriter, vtkWriter, wordDict);
|
||||||
|
|
||||||
|
// Accept vtp ending as well
|
||||||
|
addNamedToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
surfaceWriter,
|
||||||
|
vtkWriter,
|
||||||
|
word,
|
||||||
|
vtp
|
||||||
|
);
|
||||||
|
addNamedToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
surfaceWriter,
|
||||||
|
vtkWriter,
|
||||||
|
wordDict,
|
||||||
|
vtp
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::surfaceWriters::vtkWriter::vtkWriter()
|
||||||
|
:
|
||||||
|
surfaceWriter(),
|
||||||
|
fmtType_(static_cast<unsigned>(vtk::formatType::INLINE_BASE64)),
|
||||||
|
precision_(IOstream::defaultPrecision()),
|
||||||
|
writer_(nullptr)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::vtkWriter::vtkWriter
|
||||||
|
(
|
||||||
|
const vtk::outputOptions& opts
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(),
|
||||||
|
fmtType_(static_cast<unsigned>(opts.fmt())),
|
||||||
|
precision_(opts.precision()),
|
||||||
|
writer_(nullptr)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::vtkWriter::vtkWriter
|
||||||
|
(
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
surfaceWriter(options),
|
||||||
|
fmtType_(static_cast<unsigned>(vtk::formatType::INLINE_BASE64)),
|
||||||
|
precision_
|
||||||
|
(
|
||||||
|
options.lookupOrDefaultCompat
|
||||||
|
(
|
||||||
|
"precision", {{"writePrecision", 1806}},
|
||||||
|
IOstream::defaultPrecision()
|
||||||
|
)
|
||||||
|
),
|
||||||
|
writer_(nullptr)
|
||||||
|
{
|
||||||
|
// format: ascii | binary
|
||||||
|
// legacy: true | false
|
||||||
|
|
||||||
|
vtk::outputOptions opts(vtk::formatType::INLINE_BASE64);
|
||||||
|
|
||||||
|
const word formatName = options.lookupOrDefault<word>("format", "");
|
||||||
|
if (formatName.size())
|
||||||
|
{
|
||||||
|
opts.ascii
|
||||||
|
(
|
||||||
|
IOstream::formatEnum(formatName) == IOstream::ASCII
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.lookupOrDefault("legacy", false))
|
||||||
|
{
|
||||||
|
opts.legacy(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert back to raw data type
|
||||||
|
fmtType_ = static_cast<unsigned>(opts.fmt());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::vtkWriter::vtkWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
vtkWriter(options)
|
||||||
|
{
|
||||||
|
open(surf, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::surfaceWriters::vtkWriter::vtkWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel,
|
||||||
|
const dictionary& options
|
||||||
|
)
|
||||||
|
:
|
||||||
|
vtkWriter(options)
|
||||||
|
{
|
||||||
|
open(points, faces, outputPath, parallel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::surfaceWriters::vtkWriter::close()
|
||||||
|
{
|
||||||
|
writer_.clear();
|
||||||
|
surfaceWriter::close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriters::vtkWriter::beginTime(const Time& t)
|
||||||
|
{
|
||||||
|
writer_.clear();
|
||||||
|
surfaceWriter::beginTime(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriters::vtkWriter::beginTime(const instant& inst)
|
||||||
|
{
|
||||||
|
writer_.clear();
|
||||||
|
surfaceWriter::beginTime(inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::surfaceWriters::vtkWriter::endTime()
|
||||||
|
{
|
||||||
|
writer_.clear();
|
||||||
|
surfaceWriter::endTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::fileName Foam::surfaceWriters::vtkWriter::write()
|
||||||
|
{
|
||||||
|
checkOpen();
|
||||||
|
|
||||||
|
if (needsUpdate())
|
||||||
|
{
|
||||||
|
writer_.clear();
|
||||||
|
}
|
||||||
|
merge();
|
||||||
|
|
||||||
|
// From raw unsigned values to vtk::outputOptions
|
||||||
|
vtk::outputOptions opts(static_cast<vtk::formatType>(fmtType_), precision_);
|
||||||
|
|
||||||
|
|
||||||
|
// Geometry: rootdir/<TIME>/surfaceName.{vtk|vtp}
|
||||||
|
|
||||||
|
fileName outputFile = outputPath_;
|
||||||
|
if (useTimeDir() && !timeName().empty())
|
||||||
|
{
|
||||||
|
// Splice in time-directory
|
||||||
|
outputFile = outputPath_.path() / timeName() / outputPath_.name();
|
||||||
|
}
|
||||||
|
outputFile.ext(vtk::surfaceWriter::ext(opts));
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing geometry to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
const meshedSurf& surf = surface();
|
||||||
|
|
||||||
|
if (writer_.empty() && (Pstream::master() || !parallel_))
|
||||||
|
{
|
||||||
|
writer_.reset
|
||||||
|
(
|
||||||
|
new vtk::surfaceWriter
|
||||||
|
(
|
||||||
|
surf.points(),
|
||||||
|
surf.faces(),
|
||||||
|
opts,
|
||||||
|
outputFile,
|
||||||
|
false // serial!
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this->hasTime())
|
||||||
|
{
|
||||||
|
// Time name in title
|
||||||
|
writer_->setTime(currTime_);
|
||||||
|
writer_->writeTimeValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Surface name in title
|
||||||
|
writer_->beginFile(outputPath_.nameLessExt());
|
||||||
|
}
|
||||||
|
|
||||||
|
writer_->writeGeometry();
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::fileName Foam::surfaceWriters::vtkWriter::writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName,
|
||||||
|
const Field<Type>& localValues
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Field: rootdir/<TIME>/surfaceName.{vtk|vtp}
|
||||||
|
|
||||||
|
// Open file, writing geometry (if required)
|
||||||
|
fileName outputFile = this->write();
|
||||||
|
|
||||||
|
if (verbose_)
|
||||||
|
{
|
||||||
|
Info<< "Writing field " << fieldName << " to " << outputFile << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// geometry merge() implicit
|
||||||
|
tmp<Field<Type>> tfield = mergeField(localValues);
|
||||||
|
|
||||||
|
if (Pstream::master() || !parallel_)
|
||||||
|
{
|
||||||
|
if (this->isPointData())
|
||||||
|
{
|
||||||
|
writer_->beginPointData(nFields_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
writer_->beginCellData(nFields_);
|
||||||
|
}
|
||||||
|
|
||||||
|
writer_->write(fieldName, tfield());
|
||||||
|
}
|
||||||
|
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Field writing methods
|
||||||
|
defineSurfaceWriterWriteFields(Foam::surfaceWriters::vtkWriter);
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
203
src/surfMesh/writers/vtk/vtkSurfaceWriter.H
Normal file
203
src/surfMesh/writers/vtk/vtkSurfaceWriter.H
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2008-2011, 2015-2019 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
| Copyright (C) 2011 OpenFOAM Foundation
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::surfaceWriters::vtkWriter
|
||||||
|
|
||||||
|
Description
|
||||||
|
A surfaceWriter for VTK legacy (.vtk) or XML (.vtp) format.
|
||||||
|
|
||||||
|
The formatOptions for vtk:
|
||||||
|
\table
|
||||||
|
Property | Description | Required | Default
|
||||||
|
format | ascii or binary format | no | binary
|
||||||
|
legacy | Legacy VTK output | no | false
|
||||||
|
precision | Write precision in ascii | no | same as IOstream
|
||||||
|
\endtable
|
||||||
|
|
||||||
|
For example,
|
||||||
|
\verbatim
|
||||||
|
formatOptions
|
||||||
|
{
|
||||||
|
vtk
|
||||||
|
{
|
||||||
|
format binary;
|
||||||
|
legacy false;
|
||||||
|
precision 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\heading Output file locations
|
||||||
|
|
||||||
|
The \c rootdir normally corresponds to something like
|
||||||
|
\c postProcessing/\<name\>
|
||||||
|
|
||||||
|
\subheading Geometry and Fields
|
||||||
|
\verbatim
|
||||||
|
rootdir
|
||||||
|
`-- timeName
|
||||||
|
`-- surfaceName.{vtk,vtp}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
vtkSurfaceWriter.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef vtkSurfaceWriter_H
|
||||||
|
#define vtkSurfaceWriter_H
|
||||||
|
|
||||||
|
#include "surfaceWriter.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace vtk
|
||||||
|
{
|
||||||
|
// Forward declarations
|
||||||
|
class outputOptions;
|
||||||
|
class surfaceWriter;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace surfaceWriters
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class vtkWriter Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class vtkWriter
|
||||||
|
:
|
||||||
|
public surfaceWriter
|
||||||
|
{
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
//- The VTK output format type.
|
||||||
|
// Stored as a raw value to avoid a header dependency on fileFormats
|
||||||
|
unsigned fmtType_;
|
||||||
|
|
||||||
|
//- ASCII write precision
|
||||||
|
unsigned precision_;
|
||||||
|
|
||||||
|
//- Backend writer - master only
|
||||||
|
autoPtr<Foam::vtk::surfaceWriter> writer_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Templated write field operation
|
||||||
|
template<class Type>
|
||||||
|
fileName writeTemplate
|
||||||
|
(
|
||||||
|
const word& fieldName, //!< Name of field
|
||||||
|
const Field<Type>& localValues //!< Local field values to write
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeNameNoDebug("vtk");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
vtkWriter();
|
||||||
|
|
||||||
|
//- Construct with some output options
|
||||||
|
explicit vtkWriter(const vtk::outputOptions& opts);
|
||||||
|
|
||||||
|
//- Construct with some output options
|
||||||
|
explicit vtkWriter(const dictionary& options);
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
// The file name is with/without an extension.
|
||||||
|
vtkWriter
|
||||||
|
(
|
||||||
|
const meshedSurf& surf,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from components with specified output path.
|
||||||
|
// The file name is with/without an extension.
|
||||||
|
vtkWriter
|
||||||
|
(
|
||||||
|
const pointField& points,
|
||||||
|
const faceList& faces,
|
||||||
|
const fileName& outputPath,
|
||||||
|
bool parallel = Pstream::parRun(),
|
||||||
|
const dictionary& options = dictionary()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~vtkWriter() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Finish output, clears backend.
|
||||||
|
virtual void close(); // override
|
||||||
|
|
||||||
|
//- Begin time step. Clears existing backend.
|
||||||
|
virtual void beginTime(const Time& t); // override
|
||||||
|
|
||||||
|
//- Begin time step. Clears existing backend.
|
||||||
|
virtual void beginTime(const instant& inst); // override
|
||||||
|
|
||||||
|
//- End time step. Clears existing backend.
|
||||||
|
virtual void endTime(); // override
|
||||||
|
|
||||||
|
|
||||||
|
// Write
|
||||||
|
|
||||||
|
//- Write surface geometry to file.
|
||||||
|
virtual fileName write(); // override
|
||||||
|
|
||||||
|
declareSurfaceWriterWriteMethod(label);
|
||||||
|
declareSurfaceWriterWriteMethod(scalar);
|
||||||
|
declareSurfaceWriterWriteMethod(vector);
|
||||||
|
declareSurfaceWriterWriteMethod(sphericalTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(symmTensor);
|
||||||
|
declareSurfaceWriterWriteMethod(tensor);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace surfaceWriters
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user