Go to the documentation of this file.
39 namespace functionObjects
91 const scalar srcMinWeight =
gMin(srcWeightsSum);
92 const scalar srcMaxWeight =
gMax(srcWeightsSum);
93 const scalar srcAveWeight =
gAverage(srcWeightsSum);
99 for (
const labelList& srcFace : srcAddress)
101 const label
n = srcFace.size();
103 srcMinNbr =
min(srcMinNbr,
n);
104 srcMaxNbr =
max(srcMaxNbr,
n);
107 reduce(srcMinNbr, minOp<label>());
108 reduce(srcMaxNbr, maxOp<label>());
112 /(
returnReduce(srcAddress.size(), sumOp<scalar>()) + ROOTVSMALL);
115 const scalar tgtMinWeight =
gMin(tgtWeightsSum);
116 const scalar tgtMaxWeight =
gMax(tgtWeightsSum);
117 const scalar tgtAveWeight =
gAverage(tgtWeightsSum);
122 scalar tgtAveNbr = 0;
123 for (
const labelList& tgtFace : tgtAddress)
125 const label
n = tgtFace.size();
127 tgtMinNbr =
min(tgtMinNbr,
n);
128 tgtMaxNbr =
max(tgtMaxNbr,
n);
131 reduce(tgtMinNbr, minOp<label>());
132 reduce(tgtMaxNbr, maxOp<label>());
136 /(
returnReduce(tgtAddress.size(), sumOp<scalar>()) + ROOTVSMALL);
139 << mesh_.time().timeName() <<
tab
141 << nbrPatchName <<
tab;
146 file() << distributed <<
tab;
150 << srcMinWeight <<
tab
151 << srcMaxWeight <<
tab
152 << srcAveWeight <<
tab
156 << tgtMinWeight <<
tab
157 << tgtMaxWeight <<
tab
158 << tgtAveWeight <<
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) << srcMinWeight
180 <<
" | " <<
setw(w) << tgtMinWeight <<
" | " <<
nl
181 <<
" max(weight) | " <<
setw(w) << srcMaxWeight
182 <<
" | " <<
setw(w) << tgtMaxWeight <<
" | " <<
nl
183 <<
" ave(weight) | " <<
setw(w) << srcAveWeight
184 <<
" | " <<
setw(w) << tgtAveWeight <<
" | " <<
nl
185 <<
" min(address) | " <<
setw(w) << srcMinNbr
186 <<
" | " <<
setw(w) << tgtMinNbr <<
" | " <<
nl
187 <<
" max(address) | " <<
setw(w) << srcMaxNbr
188 <<
" | " <<
setw(w) << tgtMaxNbr <<
" | " <<
nl
189 <<
" ave(address) | " <<
setw(w) << srcAveNbr
190 <<
" | " <<
setw(w) << tgtAveNbr <<
" | " <<
nl
193 setResult(pp.
name() +
":src", pp.
name());
194 setResult(pp.
name() +
":tgt", nbrPatchName);
195 setResult(pp.
name() +
":src:min(weight)", srcMinWeight);
196 setResult(pp.
name() +
":src:max(weight)", srcMaxWeight);
197 setResult(pp.
name() +
":src:ave(weight)", srcAveWeight);
198 setResult(pp.
name() +
":src:min(address)", srcMinNbr);
199 setResult(pp.
name() +
":src:max(address)", srcMaxNbr);
200 setResult(pp.
name() +
":src:ave(address)", srcAveNbr);
201 setResult(pp.
name() +
":tgt:min(weight)", tgtMinWeight);
202 setResult(pp.
name() +
":tgt:max(weight)", tgtMaxWeight);
203 setResult(pp.
name() +
":tgt:ave(weight)", tgtAveWeight);
204 setResult(pp.
name() +
":tgt:min(address)", tgtMinNbr);
205 setResult(pp.
name() +
":tgt:max(address)", tgtMaxNbr);
206 setResult(pp.
name() +
":tgt:ave(address)", tgtAveNbr);
232 uniqueMeshPointLabels,
242 globalFaces().gather(weightSum, mergedWeights);
244 const bool isACMI = isA<cyclicACMIPolyPatch>(cpp);
251 globalFaces().gather(pp.
mask(), mergedMask);
256 instant inst(mesh_.time().value(), mesh_.time().timeName());
262 (baseTimeDir()/cpp.
name() +
"_" + side),
270 writer.beginCellData(1 + (isACMI ? 1 : 0));
283 const cyclicAMIPolyPatch& cpp
288 writeWeightField(cpp, cpp.AMI().srcWeightsSum(),
"src");
289 writeWeightField(cpp.neighbPatch(), cpp.AMI().tgtWeightsSum(),
"tgt");
304 writeFile(mesh_,
name, typeName,
dict),
323 const auto* amicpp = isA<cyclicAMIPolyPatch>(pp);
325 if (amicpp && amicpp->owner())
331 patchIDs_ = ids.sortedToc();
333 writeFileHeader(file());
335 writeFields_ =
dict.get<
bool>(
"writeFields");
355 for (
const label patchi : patchIDs_)
364 writeWeightFields(cpp);
const labelListList & srcAddress() const
List< label > labelList
A List of labels.
virtual bool read(const dictionary &)
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
A simple wrapper around bool so that it can be read as a word: true/false, on/off,...
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Calculates points shared by more than two processor patches or cyclic patches.
virtual bool owner() const
A class for handling words, derived from Foam::string.
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO.
Type gAverage(const FieldField< Field, Type > &f)
bool read(const char *buf, int32_t &val)
virtual void write(const coordSet &, const wordList &, const List< const Field< Type > * > &, Ostream &) const =0
static bool master(const label communicator=worldComm)
virtual void reportPatch(const cyclicAMIPolyPatch &pp)
Ostream & endl(Ostream &os)
void writeWeightFields(const cyclicAMIPolyPatch &cpp) const
A HashTable with keys but without contents that is similar to std::unordered_set.
Specialization of Foam::functionObject for an Foam::fvMesh, providing a reference to the Foam::fvMesh...
label min(const labelHashSet &set, label minValue=labelMax)
Abstract base-class for Time/database function objects.
virtual void writeHeader(Ostream &os, const string &str) const
virtual bool read(const dictionary &dict)
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
Generic templated field type.
const polyBoundaryMesh & boundaryMesh() const
A patch is a list of labels that address the faces in the global face list.
void writeWeightField(const cyclicAMIPolyPatch &cpp, const scalarField &weightSum, const word &side) const
const scalarField & srcWeightsSum() const
label max(const labelHashSet &set, label maxValue=labelMin)
label singlePatchProc() const
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
virtual const cyclicAMIPolyPatch & neighbPatch() const
virtual bool read(const dictionary &dict)
OBJstream os(runTime.globalPath()/outputName)
Macros for easy insertion into run-time selection tables.
const labelListList & tgtAddress() const
Base class for graphics format writing. Entry points are.
const List< face_type > & localFaces() const
label index() const noexcept
Omanip< int > setw(const int i)
Computes the min/max/average weights of arbitrary mesh interface (AMI) patches, and optionally report...
static unsigned int defaultPrecision() noexcept
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
List< labelList > labelListList
A List of labelList.
const AMIPatchToPatchInterpolation & AMI() const
virtual void writeCommented(Ostream &os, const string &str) const
Write faces/points (optionally with fields) as a vtp file or a legacy vtk file.
addToRunTimeSelectionTable(functionObject, ObukhovLength, dictionary)
AMIWeights(const word &name, const Time &runTime, const dictionary &dict)
static bool & parRun() noexcept
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
fileName::Type type(const fileName &name, const bool followLink=true)
virtual void writeFileHeader(Ostream &os)
const word & neighbPatchName() const
bool insert(const Key &key)
defineTypeNameAndDebug(ObukhovLength, 0)
word name(const expressions::valueTypeCode typeCode)
Base class for writing single files from the function objects.
const word & name() const noexcept
An instant of time. Contains the time value and name.
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Cyclic patch for Arbitrarily Coupled Mesh Interface (ACMI).
Type gMin(const FieldField< Field, Type > &f)
const Map< label > & meshPointMap() const
const labelList & meshPoints() const
vtk::internalMeshWriter writer(topoMesh, topoCells, vtk::formatType::INLINE_ASCII, runTime.path()/"blockTopology")
const scalarField & mask() const
const scalarField & tgtWeightsSum() const
virtual void writeTabbed(Ostream &os, const string &str) const
Type gMax(const FieldField< Field, Type > &f)
Cyclic patch for Arbitrary Mesh Interface (AMI)