ENH: refactor coordSet writers (#2347)

- the very old 'writer' class was fully stateless and always templated
  on an particular output type.

  This is now replaced with a 'coordSetWriter' with similar concepts
  as previously introduced for surface writers (#1206).

  - writers change from being a generic state-less set of routines to
    more properly conforming to the normal notion of a writer.

  - Parallel data is done *outside* of the writers, since they are used
    in a wide variety of contexts and the caller is currently still in
    a better position for deciding how to combine parallel data.

ENH: update sampleSets to sample on per-field basis (#2347)

- sample/write a field in a single step.

- support for 'sampleOnExecute' to obtain values at execution
  intervals without writing.

- support 'sets' input as a dictionary entry (as well as a list),
  which is similar to the changes for sampled-surface and permits use
  of changeDictionary to modify content.

- globalIndex for gather to reduce parallel communication, less code

- qualify the sampleSet results (properties) with the name of the set.
  The sample results were previously without a qualifier, which meant
  that only the last property value was actually saved (previous ones
  overwritten).

  For example,
  ```
    sample1
    {
        scalar
        {
            average(line,T) 349.96521;
            min(line,T)     349.9544281;
            max(line,T)     350;
            average(cells,T) 349.9854619;
            min(cells,T)    349.6589286;
            max(cells,T)    350.4967271;
            average(line,epsilon) 0.04947733869;
            min(line,epsilon) 0.04449639927;
            max(line,epsilon) 0.06452856475;
        }
        label
        {
            size(line,T)    79;
            size(cells,T)   1720;
            size(line,epsilon) 79;
        }
    }
  ```

ENH: update particleTracks application

- use globalIndex to manage original parcel addressing and
  for gathering. Simplify code by introducing a helper class,
  storing intermediate fields in hash tables instead of
  separate lists.

ADDITIONAL NOTES:

- the regionSizeDistribution largely retains separate writers since
  the utility of placing sum/dev/count for all fields into a single file
  is questionable.

- the streamline writing remains a "soft" upgrade, which means that
  scalar and vector fields are still collected a priori and not
  on-the-fly.  This is due to how the streamline infrastructure is
  currently handled (should be upgraded in the future).
This commit is contained in:
Mark Olesen
2022-02-25 14:50:01 +01:00
parent 8a9ae839ce
commit c3e14ffdd5
96 changed files with 8735 additions and 5178 deletions

View File

@ -11,7 +11,7 @@
#include "checkTools.H"
#include "functionObject.H"
#include "vtkSetWriter.H"
#include "vtkCoordSetWriter.H"
#include "vtkSurfaceWriter.H"
#include "cyclicACMIPolyPatch.H"
@ -537,7 +537,7 @@ Foam::label Foam::checkGeometry
const polyMesh& mesh,
const bool allGeometry,
autoPtr<surfaceWriter>& surfWriter,
const autoPtr<writer<scalar>>& setWriter
autoPtr<coordSetWriter>& setWriter
)
{
label noFailedChecks = 0;
@ -594,7 +594,7 @@ Foam::label Foam::checkGeometry
<< nonAlignedPoints.name() << endl;
nonAlignedPoints.instance() = mesh.pointsInstance();
nonAlignedPoints.write();
if (setWriter)
if (setWriter && setWriter->enabled())
{
mergeAndWrite(*setWriter, nonAlignedPoints);
}
@ -628,7 +628,7 @@ Foam::label Foam::checkGeometry
<< " non closed cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance();
cells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, cells);
}
@ -644,7 +644,7 @@ Foam::label Foam::checkGeometry
<< aspectCells.name() << endl;
aspectCells.instance() = mesh.pointsInstance();
aspectCells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, aspectCells);
}
@ -665,7 +665,7 @@ Foam::label Foam::checkGeometry
<< " zero area faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -687,7 +687,7 @@ Foam::label Foam::checkGeometry
<< " zero volume cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance();
cells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, cells);
}
@ -710,7 +710,7 @@ Foam::label Foam::checkGeometry
<< " non-orthogonal faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -732,7 +732,7 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -754,7 +754,7 @@ Foam::label Foam::checkGeometry
<< " skew faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -778,7 +778,7 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -811,7 +811,7 @@ Foam::label Foam::checkGeometry
<< "decomposition tets to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -836,7 +836,7 @@ Foam::label Foam::checkGeometry
<< endl;
points.instance() = mesh.pointsInstance();
points.write();
if (setWriter)
if (setWriter && setWriter->enabled())
{
mergeAndWrite(*setWriter, points);
}
@ -859,7 +859,7 @@ Foam::label Foam::checkGeometry
<< " apart) points to set " << nearPoints.name() << endl;
nearPoints.instance() = mesh.pointsInstance();
nearPoints.write();
if (setWriter)
if (setWriter && setWriter->enabled())
{
mergeAndWrite(*setWriter, nearPoints);
}
@ -883,7 +883,7 @@ Foam::label Foam::checkGeometry
<< endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -906,7 +906,7 @@ Foam::label Foam::checkGeometry
<< " warped faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -927,7 +927,7 @@ Foam::label Foam::checkGeometry
<< " under-determined cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance();
cells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, cells);
}
@ -947,7 +947,7 @@ Foam::label Foam::checkGeometry
<< " concave cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance();
cells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, cells);
}
@ -968,7 +968,7 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -989,7 +989,7 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}

View File

@ -7,7 +7,7 @@ namespace Foam
// Forward Declarations
class polyMesh;
class wedgePolyPatch;
template<class T> class writer;
class coordSetWriter;
class surfaceWriter;
label findOppositeWedge(const polyMesh&, const wedgePolyPatch&);
@ -47,6 +47,6 @@ namespace Foam
const polyMesh& mesh,
const bool allGeometry,
autoPtr<surfaceWriter>& surfWriter,
const autoPtr<writer<scalar>>& setWriter
autoPtr<coordSetWriter>& setWriter
);
}

View File

@ -74,7 +74,7 @@ Usage
#include "Time.H"
#include "fvMesh.H"
#include "globalMeshData.H"
#include "vtkSetWriter.H"
#include "vtkCoordSetWriter.H"
#include "vtkSurfaceWriter.H"
#include "IOdictionary.H"
#include "regionProperties.H"
@ -262,11 +262,11 @@ int main(int argc, char *argv[])
autoPtr<surfaceWriter> surfWriter;
autoPtr<writer<scalar>> setWriter;
autoPtr<coordSetWriter> setWriter;
if (writeSets)
{
surfWriter = surfaceWriter::New(surfaceFormat);
setWriter = writer<scalar>::New(vtkSetWriter<scalar>::typeName);
setWriter = coordSetWriter::New(coordSetWriters::vtkWriter::typeName);
}

View File

@ -41,7 +41,7 @@ License
#include "faceSet.H"
#include "cellSet.H"
#include "Time.H"
#include "writer.H"
#include "coordSetWriter.H"
#include "surfaceWriter.H"
#include "syncTools.H"
#include "globalIndex.H"
@ -417,7 +417,7 @@ void Foam::mergeAndWrite
void Foam::mergeAndWrite
(
const writer<scalar>& writer,
coordSetWriter& writer,
const pointSet& set
)
{
@ -441,39 +441,26 @@ void Foam::mergeAndWrite
}
// Write with scalar pointID
// Write with pointID
if (Pstream::master())
{
scalarField scalarPointIDs(mergedIDs.size());
forAll(mergedIDs, i)
{
scalarPointIDs[i] = 1.0*mergedIDs[i];
}
coordSet coords(set.name(), "distance", mergedPts, mag(mergedPts));
coordSet points(set.name(), "distance", mergedPts, mag(mergedPts));
// Output. E.g. pointSet p0 -> postProcessing/<time>/p0.vtk
List<const scalarField*> flds(1, &scalarPointIDs);
wordList fldNames(1, "pointID");
// Output e.g. pointSet p0 to
// postProcessing/<time>/p0.vtk
fileName outputDir
fileName outputPath
(
set.time().globalPath()
/ functionObject::outputPrefix
/ mesh.pointsInstance()
// set.name()
/ set.name()
);
outputDir.clean(); // Remove unneeded ".."
mkDir(outputDir);
outputPath.clean(); // Remove unneeded ".."
fileName outputFile(outputDir/writer.getFileName(points, wordList()));
//fileName outputFile(outputDir/set.name());
OFstream os(outputFile);
writer.write(points, fldNames, flds, os);
writer.open(coords, outputPath);
writer.nFields(1);
writer.write("pointID", mergedIDs);
writer.close(true);
}
}

View File

@ -10,7 +10,7 @@ namespace Foam
class cellSet;
class fileName;
class polyMesh;
template<class T> class writer;
class coordSetWriter;
class surfaceWriter;
void printMeshStats(const polyMesh& mesh, const bool allTopology);
@ -36,7 +36,7 @@ namespace Foam
//- Write vtk representation of (assembled) pointSet to 'set' file in
// postProcessing/ directory
void mergeAndWrite(const writer<scalar>& writer, const pointSet& set);
void mergeAndWrite(coordSetWriter& writer, const pointSet& set);
}

View File

@ -36,7 +36,7 @@ License
#include "IOmanip.H"
#include "emptyPolyPatch.H"
#include "processorPolyPatch.H"
#include "vtkSetWriter.H"
#include "vtkCoordSetWriter.H"
#include "vtkSurfaceWriter.H"
#include "checkTools.H"
#include "treeBoundBox.H"
@ -117,7 +117,7 @@ Foam::label Foam::checkTopology
const bool allTopology,
const bool allGeometry,
autoPtr<surfaceWriter>& surfWriter,
const autoPtr<writer<scalar>>& setWriter
autoPtr<coordSetWriter>& setWriter
)
{
label noFailedChecks = 0;
@ -203,7 +203,7 @@ Foam::label Foam::checkTopology
<< " illegal cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance();
cells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, cells);
}
@ -227,7 +227,7 @@ Foam::label Foam::checkTopology
<< " unused points to set " << points.name() << endl;
points.instance() = mesh.pointsInstance();
points.write();
if (setWriter)
if (setWriter && setWriter->enabled())
{
mergeAndWrite(*setWriter, points);
}
@ -249,7 +249,7 @@ Foam::label Foam::checkTopology
<< " unordered faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -269,7 +269,7 @@ Foam::label Foam::checkTopology
<< faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -290,11 +290,10 @@ Foam::label Foam::checkTopology
<< endl;
cells.instance() = mesh.pointsInstance();
cells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, cells);
}
}
}
@ -314,7 +313,7 @@ Foam::label Foam::checkTopology
<< faces.name() << endl;
faces.instance() = mesh.pointsInstance();
faces.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, faces);
}
@ -369,7 +368,7 @@ Foam::label Foam::checkTopology
<< endl;
oneCells.instance() = mesh.pointsInstance();
oneCells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, oneCells);
}
@ -385,7 +384,7 @@ Foam::label Foam::checkTopology
<< endl;
twoCells.instance() = mesh.pointsInstance();
twoCells.write();
if (surfWriter)
if (surfWriter && surfWriter->enabled())
{
mergeAndWrite(*surfWriter, twoCells);
}
@ -530,7 +529,7 @@ Foam::label Foam::checkTopology
<< " points that are in multiple regions to set "
<< points.name() << endl;
points.write();
if (setWriter)
if (setWriter && setWriter->enabled())
{
mergeAndWrite(*setWriter, points);
}
@ -641,7 +640,7 @@ Foam::label Foam::checkTopology
<< " conflicting points to set " << points.name() << endl;
points.instance() = mesh.pointsInstance();
points.write();
if (setWriter)
if (setWriter && setWriter->enabled())
{
mergeAndWrite(*setWriter, points);
}

View File

@ -6,7 +6,7 @@ namespace Foam
// Forward Declarations
class polyMesh;
class pointSet;
template<class T> class writer;
class coordSetWriter;
class surfaceWriter;
template<class PatchType>
@ -24,6 +24,6 @@ namespace Foam
const bool allTopology,
const bool allGeometry,
autoPtr<surfaceWriter>& surfWriter,
const autoPtr<writer<scalar>>& setWriter
autoPtr<coordSetWriter>& setWriter
);
}