68 void insertDuplicateMerge
81 label otherFacei = duplicates[bFacei];
83 if (otherFacei != -1 && otherFacei > bFacei)
90 label own0 = faceOwner[face0];
91 label own1 = faceOwner[face1];
97 bool zoneFlip =
false;
101 const faceZone& fZone = faceZones[zoneID];
126 bool zoneFlip =
false;
130 const faceZone& fZone = faceZones[zoneID];
169 forAll(duplicates, bFacei)
171 if (duplicates[bFacei] != -1)
176 if (isA<processorPolyPatch>(patches[patchi]))
179 <<
"Duplicate face " << facei
180 <<
" is on a processorPolyPatch." 181 <<
"This is not allowed." <<
nl 199 forAll(duplicates, bFacei)
201 label otherFacei = duplicates[bFacei];
203 if (otherFacei != -1 && otherFacei > bFacei)
210 Pout<<
"Writing " << duplicateSet.size()
211 <<
" duplicate faces to faceSet " << duplicateSet.objectPath()
213 duplicateSet.
write();
222 int main(
int argc,
char *argv[])
226 "Detect faces that share points (baffles).\n" 227 "Merge them or duplicate the points." 235 "find baffles only, but do not merge or split them" 240 "topologically split duplicate surfaces" 271 findBaffles(mesh, boundaryFaces);
279 if (fields)
Info<<
"Reading geometric fields" <<
nl <<
endl;
282 if (fields)
ReadFields(mesh, objects, vsFlds);
285 if (fields)
ReadFields(mesh, objects, vvFlds);
288 if (fields)
ReadFields(mesh, objects, vstFlds);
291 if (fields)
ReadFields(mesh, objects, vsymtFlds);
294 if (fields)
ReadFields(mesh, objects, vtFlds);
297 if (fields)
ReadFields(mesh, objects, ssFlds);
300 if (fields)
ReadFields(mesh, objects, svFlds);
303 if (fields)
ReadFields(mesh, objects, sstFlds);
306 if (fields)
ReadFields(mesh, objects, ssymtFlds);
309 if (fields)
ReadFields(mesh, objects, stFlds);
318 Pout<<
"Topologically splitting duplicate surfaces" 319 <<
", i.e. duplicating points internal to duplicate surfaces." 329 pointDuplicator.setRefinement(
regionSide, meshMod);
333 Pout<<
"Merging duplicate faces." 337 labelList duplicates(findBaffles(mesh, boundaryFaces));
340 insertDuplicateMerge(mesh, duplicates, meshMod);
355 if (map().hasMotionPoints())
370 const labelList& pointMap = map().pointMap();
372 labelList nDupPerPoint(map().nOldPoints(), 0);
374 pointSet dupPoints(mesh,
"duplicatedPoints", 100);
378 label oldPointi = pointMap[pointi];
380 nDupPerPoint[oldPointi]++;
382 if (nDupPerPoint[oldPointi] > 1)
384 dupPoints.insert(map().reversePointMap()[oldPointi]);
385 dupPoints.insert(pointi);
389 Pout<<
"Writing " << dupPoints.size()
390 <<
" duplicated points to pointSet " 391 << dupPoints.objectPath() <<
nl <<
endl;
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
Class containing data for face removal.
virtual tmp< scalarField > movePoints(const pointField &)
Move points, returns volumes swept by faces in motion.
wordList ReadFields(const Mesh &mesh, const IOobjectList &objects, PtrList< GeoField > &fields, const bool syncPar=true)
Read all fields of the specified type.
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
const word & name() const
Return name.
List of IOobjects with searching and retrieving facilities.
const faceZoneMesh & faceZones() const
Return face zone mesh.
Class describing modification of a face.
void off()
Switch the function objects off.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
label nInternalFaces() const
const boolList & flipMap() const
Return face flip map.
Ostream & endl(Ostream &os)
Add newline and flush stream.
bool optionFound(const word &opt) const
Return true if the named option is found.
label whichFace(const label globalCellID) const
Helper function to re-direct to zone::localID(...)
Field reading functions for post-processing utilities.
static word timeName(const scalar, const int precision=precision_)
Return time name of given scalar time.
Takes mesh with 'baffles' (= boundary faces sharing points). Determines for selected points on bounda...
Determines the 'side' for every face and connected to a singly-connected (through edges) region of fa...
const fileName & pointsInstance() const
Return the current instance directory for points.
virtual void updateMesh(const mapPolyMesh &mpm)
Update the mesh corresponding to given map.
A class for handling words, derived from string.
virtual const labelList & faceOwner() const
Return face owner.
virtual const faceList & faces() const
Return raw faces.
errorManip< error > abort(error &err)
void setInstance(const fileName &)
Set the instance for mesh files.
label whichZone(const label objectIndex) const
Given a global object index, return the zone it is in.
const functionObjectList & functionObjects() const
Return the list of function objects.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
prefixOSstream Pout(cout, "Pout")
Direct mesh changes based on v1.3 polyTopoChange syntax.
static labelList findDuplicateFaces(const primitiveMesh &, const labelList &)
Helper routine to find baffles (two boundary faces using the.
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
virtual Ostream & write(const token &)=0
Write next token to stream.
Mesh consisting of general polyhedral cells.
static void addBoolOption(const word &opt, const string &usage="")
Add to a bool option to validOptions with usage information.
A subset of mesh faces organised as a primitive patch.
static void addNote(const string &)
Add extra notes for the usage information.
autoPtr< mapPolyMesh > changeMesh(polyMesh &mesh, const bool inflate, const bool syncParallel=true, const bool orderCells=false, const bool orderPoints=false)
Inplace changes mesh without change of patches.
virtual bool write(const bool valid=true) const
Write using setting from DB.
Foam::argList args(argc, argv)
label whichPatch(const label faceIndex) const
Return patch index for a given face label.
label setAction(const topoAction &action)
For compatibility with polyTopoChange: set topological action.