76 pName += mesh0.
name();
78 pName += mesh1.
name();
85 const word& entryName,
86 const word& AMIMethod,
121 const auto& ppi =
meshes[meshi].boundaryMesh()[patchesi[i]];
125 const auto& ppj =
meshes[meshj].boundaryMesh()[patchesj[j]];
130 AMPtr->calculate(ppi, ppj,
nullptr);
133 gAverage(AMPtr->tgtWeightsSum()) > SMALL
134 ||
gAverage(AMPtr->srcWeightsSum()) > SMALL
137 const label inti = interfaceMesh0.
size();
139 Info<<
"Introducing interface " << inti <<
" between" 140 <<
" mesh " <<
meshes[meshi].name()
142 <<
" patch " << ppi.name()
143 <<
" and mesh " <<
meshes[meshj].name()
145 <<
" patch " << ppj.name()
151 auto& intMesh0 = interfaceMesh0.
emplace_back(nSourcei, -1);
152 intMesh0[sourcei] = meshi;
156 auto& intPatch0 = interfacePatch0.
emplace_back(nSourcei, -1);
157 intPatch0[sourcei] = ppi.index();
159 auto& intNames0 = interfaceNames0.
emplace_back(nSourcei);
167 auto& intMesh1 = interfaceMesh1.
emplace_back(nSourcej, -1);
168 intMesh1[sourcej] = meshj;
172 auto& intPatch1 = interfacePatch1.
emplace_back(nSourcej, -1);
173 intPatch1[sourcej] = ppj.index();
175 auto& intNames1 = interfaceNames1.
emplace_back(nSourcej);
179 auto& intFaces0 = interfaceFaces0.
emplace_back(nSourcei);
183 auto& intFaces1 = interfaceFaces1.
emplace_back(nSourcej);
198 const scalarField& weights = AMPtr->srcWeightsSum();
202 const scalar
sum = weights[facei];
210 targetMask = AMPtr->interpolateToTarget(mask);
215 const scalarField& weights = AMPtr->tgtWeightsSum();
219 const scalar
sum = weights[facei];
227 sourceMask = AMPtr->interpolateToSource(mask);
231 const scalarField& weights = AMPtr->srcWeightsSum();
234 if (weights[facei] > 0.5 || sourceMask[facei] > SMALL)
241 const scalarField& weights = AMPtr->tgtWeightsSum();
244 if (weights[facei] > 0.5 || targetMask[facei] > SMALL)
261 const bool includeOwn,
287 const label meshjStart(includeOwn ? meshi : meshi+1);
289 for (label meshj = meshjStart; meshj <
meshes.
size(); meshj++)
293 for (
const label sourcei : interRegionSources[meshi])
295 const labelList& patchesi = allPatchesi[sourcei];
297 for (
const label sourcej : interRegionSources[meshj])
299 const labelList& patchesj = allPatchesj[sourcej];
309 AMIMethods[meshi][sourcei].size()
310 ? AMIMethods[meshi][sourcei]
311 : faceAreaWeightAMI2D::typeName
313 patchInfoDicts[meshi][sourcei],
355 bool zoneFlip =
false;
387 bitSet& isRepatchedBoundary,
397 <<
" is not an external face of the mesh." <<
endl 398 <<
"This application can only repatch" 404 static label nWarnings = 0;
407 const label newPatchi = meshMod.
region()[facei];
412 <<
" marked for patch " <<
patchID 414 <<
" is already marked for patch " << newPatchi
416 <<
". Suppressing further warnings" 435 if (cpp && cpp->
owner())
437 const auto& cycPatch = *cpp;
442 OFstream str(prefix+cycPatch.name()+
".obj");
443 Pout<<
"Dumping " << cycPatch.
name()
444 <<
" faces to " << str.
name() <<
endl;
454 OFstream str(prefix+nbrPatch.name()+
".obj");
455 Pout<<
"Dumping " << nbrPatch.
name()
456 <<
" faces to " << str.
name() <<
endl;
467 OFstream str(prefix+cycPatch.name()+nbrPatch.name()+
"_match.obj");
470 Pout<<
"Dumping cyclic match as lines between face centres to " 482 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
495 if (separation.
size() == 1)
501 field[i] += separation[0];
504 else if (separation.
size() ==
field.size())
508 field[i] += separation[i];
514 <<
"Sizes of field and transformation not equal. field:" 515 <<
field.size() <<
" transformation:" << separation.
size()
522 template<
class CombineOp>
527 const CombineOp& cop,
528 const point& nullValue
535 <<
" is not equal to the number of points in the mesh " 542 bool hasTransformation =
false;
549 for (
const label patchi : procPatches)
552 const auto& procPatch = refCast<const processorPolyPatch>(
pp);
557 pointField patchInfo(procPatch.nPoints(), nullValue);
559 const labelList& meshPts = procPatch.meshPoints();
560 const labelList& nbrPts = procPatch.neighbPoints();
564 label nbrPointi = nbrPts[pointi];
565 if (nbrPointi >= 0 && nbrPointi < patchInfo.size())
567 patchInfo[nbrPointi] =
points[meshPts[pointi]];
574 procPatch.neighbProcNo()
583 for (
const label patchi : procPatches)
586 const auto& procPatch = refCast<const processorPolyPatch>(
pp);
597 procPatch.neighbProcNo()
599 fromNbr >> nbrPatchInfo;
602 nbrPatchInfo.setSize(procPatch.nPoints(), nullValue);
604 if (!procPatch.parallel())
606 hasTransformation =
true;
609 else if (procPatch.separated())
611 hasTransformation =
true;
612 separateList(-procPatch.separation(), nbrPatchInfo);
615 const labelList& meshPts = procPatch.meshPoints();
619 label meshPointi = meshPts[pointi];
620 points[meshPointi] = nbrPatchInfo[pointi];
631 if (cpp && cpp->
owner())
635 const auto& cycPatch = *cpp;
638 const edgeList& coupledPoints = cycPatch.coupledPoints();
639 const labelList& meshPts = cycPatch.meshPoints();
640 const labelList& nbrMeshPts = nbrPatch.meshPoints();
646 const edge&
e = coupledPoints[i];
647 label point0 = meshPts[
e[0]];
648 half0Values[i] =
points[point0];
651 if (!cycPatch.parallel())
653 hasTransformation =
true;
656 else if (cycPatch.separated())
658 hasTransformation =
true;
659 separateList(cycPatch.separation(), half0Values);
664 const edge&
e = coupledPoints[i];
665 label point1 = nbrMeshPts[
e[1]];
666 points[point1] = half0Values[i];
680 if (hasTransformation)
683 <<
"There are decomposed cyclics in this mesh with" 684 <<
" transformations." <<
endl 685 <<
"This is not supported. The result will be incorrect" 715 int main(
int argc,
char *argv[])
719 "Create patches out of selected boundary faces, which are either" 720 " from existing patches or from a faceSet" 730 "Write obj files showing the cyclic matching process" 739 const bool overwrite =
args.
found(
"overwrite");
743 const bool writeObj =
args.
found(
"writeObj");
771 const auto&
dict = dicts[meshi];
774 matchPatchIDs[meshi].
setSize(patchSources.size());
775 matchMethods[meshi].setSize(patchSources.size());
776 patchInfoDicts[meshi].setSize(patchSources.size());
779 forAll(patchSources, sourcei)
781 const auto& pDict = patchSources[sourcei];
789 patchInfoDicts[meshi].set
794 dictionary& patchDict = patchInfoDicts[meshi][sourcei];
795 if (patchDict.
found(
"AMIMethod"))
797 matchMethods[meshi][sourcei] = patchDict.
get<
word>(
"AMIMethod");
800 patchDict.
add(
"requireMatch",
false);
806 matchPatchIDs[meshi][sourcei] =
810 if (pDict.get<
word>(
"constructFrom") ==
"autoPatch")
812 interRegionSources[meshi].push_back(sourcei);
892 bool noFields =
true;
893 for (
const auto& d : patchInfoDicts[meshi])
895 if (d.found(
"patchFields"))
938 dumpCyclicMatch(
"initial_",
mesh);
948 forAll(patchSources, sourcei)
962 dictionary patchDict(patchInfoDicts[meshi][sourcei]);
963 patchDict.
set(
"nFaces", 0);
964 patchDict.
set(
"startFace", 0);
967 if (sourceType ==
"autoPatch")
972 forAll(interfaceMesh0, inti)
974 const labelList& allMeshes0 = interfaceMesh0[inti];
975 const wordList& allNames0 = interfaceNames0[inti];
976 const labelList& allMeshes1 = interfaceMesh1[inti];
977 const wordList& allNames1 = interfaceNames1[inti];
981 interfaceSource0[inti] == sourcei
982 && allMeshes0[sourcei] == meshi
986 const label sourcej = interfaceSource1[inti];
987 const word& patchName = allNames0[sourcei];
991 const auto& mesh1 =
meshes[allMeshes1[sourcej]];
992 allDict.
set(
"sampleRegion", mesh1.
name());
993 const auto& destPatch = allNames1[sourcej];
994 allDict.
set(
"samplePatch", destPatch);
995 allDict.set(
"neighbourPatch", destPatch);
997 Info<<
"Adding new patch " << patchName
998 <<
" from " << allDict <<
endl;
1022 forAll(interfaceMesh1, inti)
1024 const labelList& allMeshes0 = interfaceMesh0[inti];
1025 const wordList& allNames0 = interfaceNames0[inti];
1026 const labelList& allMeshes1 = interfaceMesh1[inti];
1027 const wordList& allNames1 = interfaceNames1[inti];
1031 interfaceSource1[inti] == sourcei
1032 && allMeshes1[sourcei] == meshi
1037 const label sourcej = interfaceSource0[inti];
1038 const word& patchName = allNames1[sourcei];
1042 const auto& destPatch = allNames0[sourcej];
1043 const auto& mesh0 =
meshes[allMeshes0[sourcej]];
1044 allDict.
set(
"sampleRegion", mesh0.
name());
1045 allDict.
set(
"samplePatch", destPatch);
1046 allDict.set(
"neighbourPatch", destPatch);
1048 Info<<
"Adding new patch " << patchName
1049 <<
" from " << allDict <<
endl;
1077 Info<<
"Adding new patch " << patchName
1078 <<
" from " << patchDict <<
endl;
1120 const bool pointSync(
dict.
get<
bool>(
"pointSync"));
1132 forAll(patchSources, sourcei)
1135 const word patchName
1146 if (sourceType ==
"autoPatch")
1148 forAll(interfaceMesh0, inti)
1150 const labelList& allMeshes0 = interfaceMesh0[inti];
1151 const wordList& allNames0 = interfaceNames0[inti];
1152 const auto& allFaces0 = interfaceFaces0[inti];
1154 const labelList& allMeshes1 = interfaceMesh1[inti];
1155 const wordList& allNames1 = interfaceNames1[inti];
1156 const auto& allFaces1 = interfaceFaces1[inti];
1160 interfaceSource0[inti] == sourcei
1161 && allMeshes0[sourcei] == meshi
1166 const label destPatchi =
1180 isRepatchedBoundary,
1186 interfaceSource1[inti] == sourcei
1187 && allMeshes1[sourcei] == meshi
1192 const label destPatchi =
1206 isRepatchedBoundary,
1212 else if (sourceType ==
"patches")
1221 for (
const label patchi : patchSources)
1225 Info<<
"Moving faces from patch " <<
pp.name()
1226 <<
" to patch " << destPatchi <<
endl;
1233 isRepatchedBoundary,
1238 else if (sourceType ==
"set")
1246 <<
" faces from faceSet " <<
set.name() <<
endl;
1256 isRepatchedBoundary,
1263 <<
"Invalid source type " << sourceType <<
endl 1264 <<
"Valid source types are 'patches' 'set'" 1272 Info<<
"Doing topology modification to order faces." <<
nl <<
endl;
1275 if (map().hasMotionPoints())
1291 const auto& oldToNew = map().reverseFaceMap();
1292 forAll(interfaceMesh0, inti)
1294 const labelList& allMeshes0 = interfaceMesh0[inti];
1295 forAll(allMeshes0, sourcei)
1297 if (allMeshes0[sourcei] == meshi)
1303 forAll(interfaceMesh1, inti)
1305 const labelList& allMeshes1 = interfaceMesh1[inti];
1306 forAll(allMeshes1, sourcei)
1308 if (allMeshes1[sourcei] == meshi)
1318 dumpCyclicMatch(
"coupled_",
mesh);
1324 Info<<
"Not synchronising points." <<
nl <<
endl;
1328 Info<<
"Synchronising points." <<
nl <<
endl;
1341 if (
pp.size() && isA<coupledPolyPatch>(
pp))
1344 refCast<const coupledPolyPatch>(
pp);
1348 Info<<
"On coupled patch " <<
pp.name()
1349 <<
" separation[0] was " 1352 if (isA<cyclicPolyPatch>(
pp) &&
pp.size())
1355 refCast<const cyclicPolyPatch>(
pp);
1364 Info<<
"On cyclic translation patch " 1366 <<
" forcing uniform separation of " 1367 << cycpp.separationVector() <<
endl;
1373 const auto& nbr = cycpp.neighbPatch();
1383 Info<<
"On coupled patch " <<
pp.name()
1384 <<
" forcing uniform separation of " 1389 Info<<
"On coupled patch " <<
pp.name()
1390 <<
" forcing uniform rotation of " 1402 Info<<
"On coupled patch " <<
pp.name()
1403 <<
" forcing uniform rotation of " 1409 Info<<
"Synchronising points." <<
endl;
1418 point(GREAT, GREAT, GREAT)
1432 Info<<
"Removing patches with no faces in them." <<
nl <<
endl;
1436 forAll(oldPatchNames, patchi)
1438 const word& pName = oldPatchNames[patchi];
1441 Info<<
"Removed zero-sized patch " << pName
1442 <<
" type " << oldPatchTypes[patchi]
1443 <<
" at position " << patchi <<
endl;
1450 dumpCyclicMatch(
"final_",
mesh);
label findPatchID(const word &patchName, const bool allowNotFound=true) const
Find patch index given a name, return -1 if not found.
const labelList & sharedPointLabels() const
Return indices of local points that are globally shared.
ITstream & lookup(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find and return an entry data stream. FatalIOError if not found, or not a stream. ...
void clearOut()
Clear all geometry and addressing.
label nPoints() const
Number of points supporting patch faces.
scalar diff(const triad &A, const triad &B)
Return a quantity of the difference between two triads.
static void noFunctionObjects(bool addWithOption=false)
Remove '-noFunctionObjects' option and ignore any occurrences.
static void addNote(const string ¬e)
Add extra notes for the usage information.
void size(const label n)
Older name for setAddressableSize.
static void removeFiles(const polyMesh &mesh)
Helper: remove all procAddressing files from mesh instance.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &f1)
"blocking" : (MPI_Bsend, MPI_Recv)
void set(const bitSet &bitset)
Set specified bits from another bitset.
A class for handling file names.
wordList ReadFields(const typename GeoMesh::Mesh &mesh, const IOobjectList &objects, PtrList< GeometricField< Type, PatchField, GeoMesh >> &fields, const bool syncPar=true, const bool readOldTime=false)
Read Geometric fields of templated type.
virtual bool separated() const
Are the planes separated.
List of IOobjects with searching and retrieving facilities. Implemented as a HashTable, so the various sorted methods should be used if traversing in parallel.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Class describing modification of a face.
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
label nPoints() const noexcept
Number of mesh points.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const word & name() const noexcept
Return the object name.
labelHashSet patchSet(const UList< wordRe > &select, const bool warnNotFound=true, const bool useGroups=true) const
Return the set of patch IDs corresponding to the given names.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
std::enable_if< std::is_same< bool, TypeT >::value, bool >::type set(const label i, bool val=true)
A bitSet::set() method for a list of bool.
Various mesh related information for a parallel run. Upon construction, constructs all info using par...
Output to file stream, using an OSstream.
const labelList & processorPatches() const noexcept
Return list of processor patch labels.
constexpr char nl
The newline '\n' character (0x0a)
const word dictName("faMeshDefinition")
const DynamicList< label > & region() const
Ostream & endl(Ostream &os)
Add newline and flush stream.
virtual void movePoints(const pointField &)
Move points, returns volumes swept by faces in motion.
static bool & parRun() noexcept
Test if this a parallel run.
static unsigned int defaultPrecision() noexcept
Return the default precision.
static void addBoolOption(const word &optName, const string &usage="", bool advanced=false)
Add a bool option to validOptions with usage information.
The coupledPolyPatch is an abstract base class for patches that couple regions of the computational d...
void setCapacity(const label len)
Alter the size of the underlying storage.
entry * add(entry *entryPtr, bool mergeEntry=false)
Add a new entry.
label whichFace(const label globalCellID) const
Helper function to re-direct to zone::localID(...)
Field reading functions for post-processing utilities.
T get(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T. FatalIOError if not found, or if the number of tokens is incorrect.
wordList types() const
Return a list of patch types.
autoPtr< mapPolyMesh > changeMesh(polyMesh &mesh, const labelUList &patchMap, const bool inflate, const bool syncParallel=true, const bool orderCells=false, const bool orderPoints=false)
Inplace changes mesh without change of patches.
virtual const fileName & name() const override
Get the name of the output serial stream. (eg, the name of the Fstream file name) ...
labelList faceLabels(nFaceLabels)
T returnReduce(const T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Perform reduction on a copy, using specified binary operation.
virtual const vectorField & separation() const
If the planes are separated the separation vector.
bool isInternalFace(const label faceIndex) const noexcept
Return true if given face label is internal to the mesh.
virtual const tensorField & forwardT() const
Return face transformation tensor.
bool found(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry (const access) with the given keyword.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
virtual const pointField & points() const
Return raw points.
#define forAll(list, i)
Loop across all elements in list.
Input inter-processor communications stream.
points setSize(newPointi)
virtual bool parallel() const
Are the cyclic planes parallel.
virtual bool owner() const
Does this side own the patch ?
static void removeFiles(const polyMesh &)
Helper: remove all sets files from mesh instance.
label nGlobalPoints() const
Return number of globally shared points.
vectorField pointField
pointField is a vectorField.
const dimensionedScalar e
Elementary charge.
const fileName & pointsInstance() const
Return the current instance directory for points.
void setSize(const label n)
Alias for resize()
virtual void updateMesh(const mapPolyMesh &mpm)
Update mesh corresponding to the given map.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
A 1D vector of objects of type <T> that resizes itself as necessary to accept the new objects...
An edge is a list of two vertex labels. This can correspond to a directed graph edge or an edge on a ...
labelList identity(const label len, label start=0)
Return an identity map of the given length with (map[i] == i), works like std::iota() but returning a...
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
A class for handling words, derived from Foam::string.
T & emplace_back(Args &&... args)
Construct an element at the end of the list, return reference to the new list element.
wordList names() const
Return a list of patch names.
label size() const noexcept
The number of entries in the list.
wordList patchNames(nPatches)
Foam::PtrList< Foam::fvMesh > meshes(regionNames.size())
virtual const labelList & faceOwner() const
Return face owner.
static const word null
An empty word.
A List of wordRe with additional matching capabilities.
static void addOption(const word &optName, const string ¶m="", const string &usage="", bool advanced=false)
Add an option to validOptions with usage information.
const globalMeshData & globalData() const
Return parallel info (demand-driven)
label nInternalFaces() const noexcept
Number of internal faces.
virtual const faceList & faces() const
Return raw faces.
errorManip< error > abort(error &err)
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie...
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
virtual bool write(const bool writeOnProc=true) const
Write mesh using IO settings from time.
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO...
bool checkParallelSync(const bool report=false) const
Check whether all procs have all patches and in same order.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
static word timeName(const scalar t, const int precision=precision_)
Return a time name for the given scalar time value formatted with the given precision.
static std::string name(const std::string &str)
Return basename (part beyond last /), including its extension.
Type gMax(const FieldField< Field, Type > &f)
DynamicList< T, SizeMin > & shrink()
Calls shrink_to_fit() and returns a reference to the DynamicList.
const faceZoneMesh & faceZones() const noexcept
Return face zone mesh.
defineTemplateTypeNameAndDebug(faScalarMatrix, 0)
void clear() noexcept
Clear the addressed list, i.e. set the size to zero.
dictionary subOrEmptyDict(const word &keyword, enum keyType::option matchOpt=keyType::REGEX, const bool mandatory=false) const
Find and return a sub-dictionary as a copy, otherwise return an empty dictionary. ...
Output inter-processor communications stream.
void push_back(const T &val)
Copy append an element to the end of this list.
const fileName & instance() const noexcept
Read access to instance path component.
label whichZone(const label objectIndex) const
Given a global object index, return the zone it is in.
const vectorField & faceCentres() const
virtual const tensorField & reverseT() const
Return neighbour-cell transformation tensor.
A PtrList of objects of type <T> with automated input and output.
void transformList(const tensor &rotTensor, UList< T > &field)
Inplace transform a list of elements.
void inplaceRenumber(const labelUList &oldToNew, IntListType &input)
Inplace renumber the values (not the indices) of a list.
vector point
Point is a vector.
void setInstance(const fileName &instance, const IOobjectOption::writeOption wOpt=IOobject::AUTO_WRITE)
Set the instance for mesh files.
A bitSet stores bits (elements with only two states) in packed internal format and supports a variety...
#define WarningInFunction
Report a warning using Foam::Warning.
const word & name() const
Return reference to name.
Type gAverage(const FieldField< Field, Type > &f)
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers...
Mesh data needed to do the Finite Volume discretisation.
List< Key > sortedToc() const
The table of contents (the keys) in sorted order.
Direct mesh changes based on v1.3 polyTopoChange syntax.
const polyBoundaryMesh & patches
static const word & calculatedType() noexcept
The type name for calculated patch fields.
const boolList & flipMap() const noexcept
Return face flip map.
List< label > sortedToc(const UList< bool > &bools)
Return the (sorted) values corresponding to 'true' entries.
messageStream Info
Information stream (stdout output on master, null elsewhere)
static autoPtr< polyPatch > New(const word &patchType, const word &name, const label size, const label start, const label index, const polyBoundaryMesh &bm)
Return pointer to a new patch created on freestore from components.
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
Mesh consisting of general polyhedral cells.
entry * set(entry *entryPtr)
Assign a new entry, overwriting any existing entry.
static autoPtr< AMIInterpolation > New(const word &modelName, const dictionary &dict, const bool reverseTarget=false)
Selector for dictionary.
A subset of mesh faces organised as a primitive patch.
T getOrDefault(const word &keyword, const T &deflt, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T, or return the given default value. FatalIOError if it is found and the number of...
const cyclicPolyPatch & neighbPatch() const
A patch is a list of labels that address the faces in the global face list.
label nBoundaryFaces() const noexcept
Number of boundary faces (== nFaces - nInternalFaces)
Foam::argList args(argc, argv)
const labelList & sharedPointAddr() const
Return addressing into the complete globally shared points.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
bool found(const word &optName) const
Return true if the named option is found.
bool set(const Key &key, const T &obj)
Copy assign a new entry, overwriting existing entries.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
static void listCombineReduce(List< T > &values, const CombineOp &cop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
After completion all processors have the same data.
label setAction(const topoAction &action)
For compatibility with polyTopoChange: set topological action.
static constexpr const zero Zero
Global zero (0)