39 namespace functionObjects
86 const word& nbrPatchName =
pp.neighbPatchName();
88 const Switch distributed =
pp.AMI().distributed();
91 const auto srcWeightLimits =
gMinMax(srcWeightsSum);
92 const auto srcWeightAvg =
gAverage(srcWeightsSum);
98 for (
const labelList& srcFace : srcAddress)
100 const label
n = srcFace.size();
107 reduce(srcNbrLimits, sumOp<labelMinMax>());
109 label
count = srcAddress.size();
111 srcNbrAvg /= (
count + ROOTVSMALL);
115 const auto tgtWeightLimits =
gMinMax(tgtWeightsSum);
116 const auto tgtWeightAvg =
gAverage(tgtWeightsSum);
122 for (
const labelList& tgtFace : tgtAddress)
124 const label
n = tgtFace.size();
131 reduce(tgtNbrLimits, sumOp<labelMinMax>());
133 label
count = tgtAddress.size();
135 tgtNbrAvg /= (
count + ROOTVSMALL);
139 << mesh_.time().timeName() <<
tab 141 << nbrPatchName <<
tab;
146 file() << distributed <<
tab;
150 << srcWeightLimits.min() <<
tab 151 << srcWeightLimits.max() <<
tab 152 << srcWeightAvg <<
tab 153 << srcNbrLimits.
min() <<
tab 154 << srcNbrLimits.
max() <<
tab 156 << tgtWeightLimits.min() <<
tab 157 << tgtWeightLimits.max() <<
tab 158 << tgtWeightAvg <<
tab 159 << tgtNbrLimits.min() <<
tab 160 << tgtNbrLimits.max() <<
tab 164 Log <<
" Patches: " <<
nl 165 <<
" Source: " <<
pp.name() <<
nl 166 <<
" Target: " << nbrPatchName <<
nl;
170 Log <<
" Parallel distributed: " << distributed <<
nl;
178 <<
" | " <<
setw(w) << nbrPatchName <<
" | " <<
nl 179 <<
" min(weight) | " <<
setw(w) << srcWeightLimits.min()
180 <<
" | " <<
setw(w) << tgtWeightLimits.min() <<
" | " <<
nl 181 <<
" max(weight) | " <<
setw(w) << srcWeightLimits.max()
182 <<
" | " <<
setw(w) << tgtWeightLimits.max() <<
" | " <<
nl 183 <<
" ave(weight) | " <<
setw(w) << srcWeightAvg
184 <<
" | " <<
setw(w) << tgtWeightAvg <<
" | " <<
nl 185 <<
" min(address) | " <<
setw(w) << srcNbrLimits.
min()
186 <<
" | " <<
setw(w) << tgtNbrLimits.min() <<
" | " <<
nl 187 <<
" max(address) | " <<
setw(w) << srcNbrLimits.
max()
188 <<
" | " <<
setw(w) << tgtNbrLimits.max() <<
" | " <<
nl 189 <<
" ave(address) | " <<
setw(w) << srcNbrAvg
190 <<
" | " <<
setw(w) << tgtNbrAvg <<
" | " <<
nl 193 setResult(
pp.name() +
":src",
pp.name());
194 setResult(
pp.name() +
":tgt", nbrPatchName);
195 setResult(
pp.name() +
":src:min(weight)", srcWeightLimits.min());
196 setResult(
pp.name() +
":src:max(weight)", srcWeightLimits.max());
197 setResult(
pp.name() +
":src:ave(weight)", srcWeightAvg);
198 setResult(
pp.name() +
":src:min(address)", srcNbrLimits.
min());
199 setResult(
pp.name() +
":src:max(address)", srcNbrLimits.
max());
200 setResult(
pp.name() +
":src:ave(address)", srcNbrAvg);
201 setResult(
pp.name() +
":tgt:min(weight)", tgtWeightLimits.min());
202 setResult(
pp.name() +
":tgt:max(weight)", tgtWeightLimits.max());
203 setResult(
pp.name() +
":tgt:ave(weight)", tgtWeightAvg);
204 setResult(
pp.name() +
":tgt:min(address)", tgtNbrLimits.min());
205 setResult(
pp.name() +
":tgt:max(address)", tgtNbrLimits.max());
206 setResult(
pp.name() +
":tgt:ave(address)", tgtNbrAvg);
232 uniqueMeshPointLabels,
241 scalarField mergedWeights = globalFaces().gather(weightSum);
243 const bool isACMI = isA<cyclicACMIPolyPatch>(cpp);
250 mergedMask = globalFaces().gather(
pp.mask());
255 instant inst(mesh_.time().value(), mesh_.time().timeName());
261 (baseTimeDir()/cpp.
name() +
"_" + side),
269 writer.beginCellData(1 + (isACMI ? 1 : 0));
270 writer.write(
"weightsSum", mergedWeights);
282 const cyclicAMIPolyPatch& cpp
287 writeWeightField(cpp, cpp.AMI().srcWeightsSum(),
"src");
288 writeWeightField(cpp.neighbPatch(), cpp.AMI().tgtWeightsSum(),
"tgt");
303 writeFile(mesh_,
name, typeName,
dict),
322 const auto* amicpp = isA<cyclicAMIPolyPatch>(
pp);
324 if (amicpp && amicpp->owner())
332 writeFileHeader(file());
334 writeFields_ =
dict.get<
bool>(
"writeFields");
354 for (
const label patchi : patchIDs_)
363 writeWeightFields(cpp);
Computes the min/max/average weights of arbitrary mesh interface (AMI) patches, and optionally report...
const polyBoundaryMesh & pbm
const List< face_type > & localFaces() const
Return patch faces addressing into local point list.
Cyclic patch for Arbitrarily Coupled Mesh Interface (ACMI).
defineTypeNameAndDebug(ObukhovLength, 0)
virtual void writeHeader(Ostream &os, const string &str) const
Write a commented header to stream.
vtk::lineWriter writer(edgeCentres, edgeList::null(), fileName(aMesh.time().globalPath()/"finiteArea-edgesCentres"))
A list of keyword definitions, which are a keyword followed by a number of values (eg...
constexpr char nl
The newline '\n' character (0x0a)
A min/max value pair with additional methods. In addition to conveniently storing values...
Write faces/points (optionally with fields) as a vtp file or a legacy vtk file.
Ostream & endl(Ostream &os)
Add newline and flush stream.
static bool & parRun() noexcept
Test if this a parallel run.
AMIWeights(const word &name, const Time &runTime, const dictionary &dict)
Construct from Time and dictionary.
A simple wrapper around bool so that it can be read as a word: true/false, on/off, yes/no, any/none. Also accepts 0/1 as a string and shortcuts t/f, y/n.
static unsigned int defaultPrecision() noexcept
Return the default precision.
const T & min() const noexcept
The min value.
constexpr char tab
The tab '\t' character(0x09)
Abstract base-class for Time/database function objects.
bool insert(const Key &key)
Insert a new entry, not overwriting existing entries.
List< labelList > labelListList
List of labelList.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Macros for easy insertion into run-time selection tables.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
void writeWeightField(const cyclicAMIPolyPatch &cpp, const scalarField &weightSum, const word &side) const
Write weight field.
bool read(const char *buf, int32_t &val)
Same as readInt32.
void reduce(T &value, [[maybe_unused]] BinaryOp bop, [[maybe_unused]] const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce)
labelList patchIDs_
List of AMI patch IDs.
#define forAll(list, i)
Loop across all elements in list.
void writeWeightFields(const cyclicAMIPolyPatch &cpp) const
Write weight fields if writeFields=true.
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
virtual void writeCommented(Ostream &os, const string &str) const
Write a commented string to stream.
unsigned int count(const UList< bool > &bools, const bool val=true)
Count number of 'true' entries.
const Map< label > & meshPointMap() const
Mesh point map.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
A class for handling words, derived from Foam::string.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
virtual void writeFileHeader(Ostream &os)
Output file header information.
MinMax< Type > gMinMax(const FieldField< Field, Type > &f)
virtual void reportPatch(const cyclicAMIPolyPatch &pp)
Helper function to report patch information.
MinMax< label > labelMinMax
A label min/max range.
Cyclic patch for Arbitrary Mesh Interface (AMI)
A polyBoundaryMesh is a polyPatch list with registered IO, a reference to the associated polyMesh...
const word & name() const noexcept
The patch name.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
MinMax< T > & add(const MinMax &other)
Extend the range to include the other min/max range.
Type gAverage(const FieldField< Field, Type > &f, const label comm)
The global arithmetic average of a FieldField.
OBJstream os(runTime.globalPath()/outputName)
addToRunTimeSelectionTable(functionObject, ObukhovLength, dictionary)
virtual bool read(const dictionary &dict)
Read.
virtual bool read(const dictionary &)
Read the field min/max data.
An instant of time. Contains the time value and name. Uses Foam::Time when formatting the name...
Calculates points shared by more than two processor patches or cyclic patches.
virtual bool write()
Write the AMIWeights.
List< Key > sortedToc() const
The table of contents (the keys) in sorted order.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
const T & max() const noexcept
The max value.
void sumReduce(T &value, CountType &count, [[maybe_unused]] const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce) the sum of value and counter (eg, for averaging) ...
virtual bool read(const dictionary &dict)
Read optional controls.
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
Omanip< int > setw(const int i)
List< label > labelList
A List of labels.
A patch is a list of labels that address the faces in the global face list.
virtual bool execute()
Execute, currently does nothing.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
virtual void writeTabbed(Ostream &os, const string &str) const
Write a tabbed string to stream.