ENH: preserve globalIndex merge information within mergedSurf

- for later reuse with fields (for example)

ENH: use 'scheduled' for surfaceWriter field merging (#2402)

- in tests with merging fields (surfaceWriter), 'scheduled' was
  generally faster than 'nonBlocking' for scalars, minorly faster for
  vectors.
  Thus make 'scheduled' the default for the surfaceWriter but with a
  user-option to adjust as required. Previously simply relied on
  whichever default globalIndex had (currently nonBlocking).

  Reuse globalIndex information from mergedSurf instead of
  globalIndex::gatherOp to avoid an extra MPI call to gather sizes
  each time.

  These changes will not be noticable unless surface sampling is done
  very frequently (eg, every iteration) and with large core counts.
This commit is contained in:
Mark Olesen 2022-11-07 17:34:38 +01:00 committed by Andrew Heather
parent 799d247142
commit b7592c1ee8
7 changed files with 124 additions and 85 deletions

View File

@ -27,7 +27,6 @@ License
#include "mergedSurf.H"
#include "PatchTools.H"
#include "globalIndex.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
@ -36,8 +35,6 @@ Foam::mergedSurf::mergedSurf
const meshedSurf& unmergedSurface,
const scalar mergeDim
)
:
mergedSurf()
{
merge(unmergedSurface, mergeDim);
}
@ -49,8 +46,6 @@ Foam::mergedSurf::mergedSurf
const faceList& unmergedFaces,
const scalar mergeDim
)
:
mergedSurf()
{
merge(unmergedPoints, unmergedFaces, mergeDim);
}
@ -64,8 +59,6 @@ Foam::mergedSurf::mergedSurf
const labelList& origFaceIds,
const scalar mergeDim
)
:
mergedSurf()
{
merge
(
@ -80,12 +73,6 @@ Foam::mergedSurf::mergedSurf
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::mergedSurf::use()
{
return Pstream::parRun();
}
void Foam::mergedSurf::clear()
{
points_.clear();
@ -94,6 +81,9 @@ void Foam::mergedSurf::clear()
zoneIds_.clear();
faceIds_.clear();
pointGlobalIndex_.clear();
faceGlobalIndex_.clear();
}
@ -127,8 +117,8 @@ bool Foam::mergedSurf::merge
(
unmergedPoints,
unmergedFaces,
labelList(),
labelList(),
labelList::null(),
labelList::null(),
mergeDim
);
}
@ -143,9 +133,9 @@ bool Foam::mergedSurf::merge
const scalar mergeDim
)
{
if (!use())
if (!UPstream::parRun())
{
clear(); // Extra safety?
clear(); // Safety
return false;
}
@ -155,14 +145,25 @@ bool Foam::mergedSurf::merge
primitivePatch(SubList<face>(unmergedFaces), unmergedPoints),
points_,
faces_,
pointGlobalIndex_,
faceGlobalIndex_,
pointsMap_
);
// Now handle per-face information
// The zone/ids information is either *exactly* the same size as
// the number of faces, or zero-sized everywhere.
// However, use gatherOp anyhow, which has redundant overhead,
// but safer if there are any size mis-matches
globalIndex::gatherOp(origZoneIds, zoneIds_);
globalIndex::gatherOp(origFaceIds, faceIds_);
if (notNull(origZoneIds))
{
globalIndex::gatherOp(origZoneIds, zoneIds_);
}
if (notNull(origFaceIds))
{
globalIndex::gatherOp(origFaceIds, faceIds_);
}
return true;
}

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2016-2020 OpenCFD Ltd.
Copyright (C) 2016-2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -36,10 +36,12 @@ SourceFiles
\*---------------------------------------------------------------------------*/
#ifndef mergedSurf_H
#define mergedSurf_H
#ifndef Foam_mergedSurf_H
#define Foam_mergedSurf_H
#include "meshedSurf.H"
#include "globalIndex.H"
#include "stdFoam.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -54,20 +56,28 @@ class mergedSurf
:
public meshedSurf
{
pointField points_;
faceList faces_;
labelList pointsMap_;
// Private Data
labelList zoneIds_;
labelList faceIds_;
pointField points_;
faceList faces_;
labelList pointsMap_;
labelList zoneIds_;
labelList faceIds_;
//- Gather/merge information (points)
globalIndex pointGlobalIndex_;
//- Gather/merge information (faces)
globalIndex faceGlobalIndex_;
public:
// Constructors
// Generated Methods
//- Default construct
mergedSurf() = default;
mergedSurf() noexcept = default;
//- Copy construct
mergedSurf(const mergedSurf&) = default;
@ -75,14 +85,23 @@ public:
//- Move construct
mergedSurf(mergedSurf&&) = default;
//- Construct and merge
//- Copy assignment
mergedSurf& operator=(const mergedSurf&) = default;
//- Move assignment
mergedSurf& operator=(mergedSurf&&) = default;
// Constructors
//- Construct from surface, and merge
mergedSurf
(
const meshedSurf& unmergedSurface,
const scalar mergeDim
);
//- Construct and merge
//- Construct from points/faces, and merge
mergedSurf
(
const pointField& unmergedPoints,
@ -90,7 +109,7 @@ public:
const scalar mergeDim
);
//- Construct and merge
//- Construct from points/faces/zones/face-ids, and merge
mergedSurf
(
const pointField& unmergedPoints,
@ -105,47 +124,56 @@ public:
virtual ~mergedSurf() = default;
// Access Member Functions
//- Can use (parallel only)
static bool use();
// Access
//- Number of faces
label size() const
label size() const noexcept
{
return faces_.size();
}
//- Const access to (global) points used for the surface
virtual const pointField& points() const
virtual const pointField& points() const noexcept
{
return points_;
}
//- Const access to the surface faces
virtual const faceList& faces() const
virtual const faceList& faces() const noexcept
{
return faces_;
}
//- Per-face zone/region information
virtual const labelList& zoneIds() const
virtual const labelList& zoneIds() const noexcept
{
return zoneIds_;
}
//- Per-face identifier (eg, element Id)
virtual const labelList& faceIds() const
virtual const labelList& faceIds() const noexcept
{
return faceIds_;
}
//- Map for reordered points (old-to-new)
const labelList& pointsMap() const
const labelList& pointsMap() const noexcept
{
return pointsMap_;
}
//- Const access to globalIndex used for points gathering
const globalIndex& pointGlobalIndex() const noexcept
{
return pointGlobalIndex_;
}
//- Const access to globalIndex used for faces gathering
const globalIndex& faceGlobalIndex() const noexcept
{
return faceGlobalIndex_;
}
// Edit
@ -176,15 +204,6 @@ public:
const labelList& origFaceIds,
const scalar mergeDim
);
// Member Operators
//- Copy assignment
mergedSurf& operator=(const mergedSurf&) = default;
//- Move assignment
mergedSurf& operator=(mergedSurf&&) = default;
};

View File

@ -114,11 +114,14 @@ public:
// Member Functions
//- Contains a valid reference?
bool valid() const
bool good() const
{
return (surf_ || notNull(points_.get()));
}
//- Contains a valid reference?
bool valid() const { return good(); }
//- The original points used for the surface
const pointField& points0() const
{

View File

@ -30,7 +30,6 @@ License
#include "MeshedSurfaceProxy.H"
#include "Time.H"
#include "globalIndex.H"
#include "coordinateRotation.H"
#include "transformField.H"
#include "addToRunTimeSelectionTable.H"
@ -152,6 +151,7 @@ Foam::surfaceWriter::surfaceWriter()
useTimeDir_(false),
isPointData_(false),
verbose_(false),
commType_(UPstream::commsTypes::scheduled),
nFields_(0),
currTime_(),
outputPath_(),
@ -168,6 +168,8 @@ Foam::surfaceWriter::surfaceWriter(const dictionary& options)
{
options.readIfPresent("verbose", verbose_);
UPstream::commsTypeNames.readIfPresent("commsType", options, commType_);
geometryScale_ = 1;
geometryCentre_ = Zero;
geometryTransform_.clear();
@ -188,6 +190,13 @@ Foam::surfaceWriter::surfaceWriter(const dictionary& options)
fieldLevel_ = options.subOrEmptyDict("fieldLevel");
fieldScale_ = options.subOrEmptyDict("fieldScale");
if (verbose_)
{
Info<< "Create surfaceWriter ("
<< (this->isPointData() ? "point" : "face") << " data):"
<< " commsType=" << UPstream::commsTypeNames[commType_] << endl;
}
}
@ -393,7 +402,7 @@ bool Foam::surfaceWriter::expire()
bool Foam::surfaceWriter::hasSurface() const
{
return surf_.valid();
return surf_.good();
}
@ -430,6 +439,7 @@ bool Foam::surfaceWriter::merge() const
if (!upToDate_)
{
// Similar to expire
adjustedSurf_.clear();
if (parallel_ && Pstream::parRun())
@ -473,7 +483,7 @@ const Foam::meshedSurfRef& Foam::surfaceWriter::adjustSurface() const
adjustedSurf_.clear();
}
if (!adjustedSurf_.valid())
if (!adjustedSurf_.good())
{
adjustedSurf_.reset(surface());
@ -538,7 +548,23 @@ Foam::tmp<Foam::Field<Type>> Foam::surfaceWriter::mergeFieldTemplate
auto tfield = tmp<Field<Type>>::New();
auto& allFld = tfield.ref();
globalIndex::gatherOp(fld, allFld);
// Update any expired global index (as required)
const globalIndex& globIndex =
(
this->isPointData()
? mergedSurf_.pointGlobalIndex()
: mergedSurf_.faceGlobalIndex()
);
globIndex.gather
(
fld,
allFld,
UPstream::msgType(),
commType_,
UPstream::worldComm
);
// Renumber (point data) to correspond to merged points
if

View File

@ -71,10 +71,11 @@ Description
}
\endverbatim
Format options:
Format options:
\table
Property | Description | Reqd | Default
verbose | Additional output verbosity | no | no
commsType | Communication type | no | scheduled
scale | Output geometry scaling | no | 1
transform | Output coordinate transform | no |
fieldLevel | Subtract field level before scaling | no | empty dict
@ -108,6 +109,7 @@ SourceFiles
#include "instant.H"
#include "mergedSurf.H"
#include "meshedSurfRef.H"
#include "UPstream.H"
#include "InfoProxy.H"
#include "runTimeSelectionTables.H"
@ -180,6 +182,9 @@ protected:
//- Additional output verbosity
bool verbose_;
//- Communication type (for field merging)
UPstream::commsTypes commType_;
//- The number of fields
label nFields_;

View File

@ -82,17 +82,23 @@ Foam::surfaceWriters::debugWriter::mergeField
fld,
allFld,
UPstream::worldComm,
commType_,
(UPstream::msgType() + msgTag_)
commType_
);
}
else
{
globalIndex::gatherOp
const globalIndex& globIndex =
(
this->isPointData()
? mergedSurf_.pointGlobalIndex()
: mergedSurf_.faceGlobalIndex()
);
globIndex.gather
(
fld,
allFld,
(UPstream::msgType() + msgTag_),
UPstream::msgType(),
commType_,
UPstream::worldComm
);
@ -125,11 +131,9 @@ Foam::surfaceWriters::debugWriter::mergeField
Foam::surfaceWriters::debugWriter::debugWriter()
:
surfaceWriter(),
commType_(UPstream::commsTypes::nonBlocking),
mpiGatherv_(false),
enableWrite_(false),
header_(true),
msgTag_(0),
streamOpt_(IOstreamOption::BINARY)
{}
@ -140,25 +144,14 @@ Foam::surfaceWriters::debugWriter::debugWriter
)
:
surfaceWriter(options),
commType_
(
UPstream::commsTypeNames.getOrDefault
(
"commsType",
options,
UPstream::commsTypes::nonBlocking
)
),
mpiGatherv_(options.getOrDefault("gatherv", false)),
enableWrite_(options.getOrDefault("write", false)),
header_(true),
msgTag_(options.getOrDefault<int>("msgTag", 0)),
streamOpt_(IOstreamOption::BINARY)
{
Info<< "Using debug surface writer ("
<< (this->isPointData() ? "point" : "face") << " data):"
<< " commsType=" << UPstream::commsTypeNames[commType_]
<< " msgTag=" << msgTag_
<< " gatherv=" << Switch::name(mpiGatherv_)
<< " write=" << Switch::name(enableWrite_) << endl;
}

View File

@ -43,10 +43,9 @@ Description
Format options:
\table
Property | Description | Required | Default
write | Write boundaryData (binary with header) | no | false
commsType | blocking/nonBlocking/scheduled | no | nonBlocking
msgTag | increment for the message tag | no | 0
commsType | blocking/nonBlocking/scheduled | no | scheduled
gatherv | Use MPI gatherv when merging | no | false
write | Write boundaryData (binary + header) | no | false
\endtable
SourceFiles
@ -58,7 +57,6 @@ SourceFiles
#define Foam_debugSurfaceWriter_H
#include "surfaceWriter.H"
#include "UPstream.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -81,9 +79,6 @@ class debugWriter
{
// Private Data
//- Communication type for merging
UPstream::commsTypes commType_;
//- Use MPI gatherv in globalIndex gathering
bool mpiGatherv_;
@ -93,9 +88,6 @@ class debugWriter
//- Output files with FoamFile header
bool header_;
//- Increment for the message tag
int msgTag_;
//- Output stream option
IOstreamOption streamOpt_;