Go to the documentation of this file.
89 void simpleMarkFeatures
92 const bitSet& isBoundaryEdge,
93 const scalar featureAngle,
94 const bool concaveMultiCells,
95 const bool doNotPreserveFaceZones,
124 label meshEdgeI = meshEdges[edgeI];
125 featureEdgeSet.
insert(meshEdgeI);
152 allBoundary.checkPointManifold(
false, &singleCellFeaturePointSet);
156 const labelList& meshPoints = allBoundary.meshPoints();
160 const labelList& eFaces = edgeFaces[edgeI];
162 if (eFaces.size() > 2)
164 const edge&
e = allBoundary.edges()[edgeI];
171 singleCellFeaturePointSet.
insert(meshPoints[
e[0]]);
172 singleCellFeaturePointSet.
insert(meshPoints[
e[1]]);
179 const labelList& eFaces = edgeFaces[edgeI];
181 if (eFaces.size() == 2)
183 label f0 = eFaces[0];
184 label f1 = eFaces[1];
187 const vector& n0 = allBoundary.faceNormals()[f0];
188 const vector& n1 = allBoundary.faceNormals()[f1];
190 if ((n0 & n1) < minCos)
192 const edge&
e = allBoundary.edges()[edgeI];
193 label v0 = meshPoints[
e[0]];
194 label v1 = meshPoints[
e[1]];
197 featureEdgeSet.
insert(meshEdgeI);
203 allBoundary[f1].centre(allBoundary.points())
204 - allBoundary[f0].centre(allBoundary.points())
207 if (concaveMultiCells && (c1c0 & n0) > SMALL)
210 Info<<
"Detected concave feature edge:" << edgeI
211 <<
" cos:" << (c1c0 & n0)
213 << allBoundary.points()[v0]
214 << allBoundary.points()[v1]
217 singleCellFeaturePointSet.erase(v0);
218 multiCellFeaturePointSet.
insert(v0);
219 singleCellFeaturePointSet.erase(v1);
220 multiCellFeaturePointSet.
insert(v1);
225 if (!multiCellFeaturePointSet.found(v0))
227 singleCellFeaturePointSet.
insert(v0);
229 if (!multiCellFeaturePointSet.found(v1))
231 singleCellFeaturePointSet.
insert(v1);
247 featureFaceSet.insert(facei);
253 if (doNotPreserveFaceZones)
255 if (faceZones.size() > 0)
258 <<
"Detected " << faceZones.size()
259 <<
" faceZones. These will not be preserved."
265 if (faceZones.size() > 0)
267 Info<<
"Detected " << faceZones.size()
268 <<
" faceZones. Preserving these by marking their"
269 <<
" points, edges and faces as features." <<
endl;
274 const faceZone& fz = faceZones[zoneI];
276 Info<<
"Inserting all faces in faceZone " << fz.
name()
277 <<
" as features." <<
endl;
285 featureFaceSet.insert(facei);
290 singleCellFeaturePointSet.erase(
f[fp]);
291 multiCellFeaturePointSet.
insert(
f[fp]);
294 featureEdgeSet.
insert(fEdges[fp]);
301 featureFaces = featureFaceSet.toc();
302 featureEdges = featureEdgeSet.toc();
303 singleCellFeaturePoints = singleCellFeaturePointSet.toc();
304 multiCellFeaturePoints = multiCellFeaturePointSet.toc();
314 const labelList& singleCellFeaturePoints,
320 Info<<
"Dumping centres of featureFaces to obj file " << str.name()
329 Info<<
"Dumping featureEdges to obj file " << str.name() <<
endl;
339 str<<
"l " << vertI-1 <<
' ' << vertI <<
nl;
343 OFstream str(
"singleCellFeaturePoints.obj");
344 Info<<
"Dumping featurePoints that become a single cell to obj file "
345 << str.name() <<
endl;
346 forAll(singleCellFeaturePoints, i)
352 OFstream str(
"multiCellFeaturePoints.obj");
353 Info<<
"Dumping featurePoints that become multiple cells to obj file "
354 << str.name() <<
endl;
355 forAll(multiCellFeaturePoints, i)
363 int main(
int argc,
char *argv[])
367 "Creates the dual of a polyMesh,"
368 " adhering to all the feature and patch edges."
383 "Have multiple faces in between cells"
388 "Split cells on concave boundary edges into multiple cells"
392 "doNotPreserveFaceZones",
393 "Disable the default behaviour of preserving faceZones by having"
394 " multiple faces in between cells"
413 isBoundaryEdge.
set(fEdges[i]);
417 const scalar featureAngle =
args.
get<scalar>(1);
420 Info<<
"Feature:" << featureAngle <<
endl
421 <<
"minCos :" << minCos <<
endl
425 const bool splitAllFaces =
args.
found(
"splitAllFaces");
428 Info<<
"Splitting all internal faces to create multiple faces"
429 <<
" between two cells." <<
nl
433 const bool overwrite =
args.
found(
"overwrite");
434 const bool doNotPreserveFaceZones =
args.
found(
"doNotPreserveFaceZones");
435 const bool concaveMultiCells =
args.
found(
"concaveMultiCells");
436 if (concaveMultiCells)
438 Info<<
"Generating multiple cells for points on concave feature edges."
459 doNotPreserveFaceZones,
463 singleCellFeaturePoints,
464 multiCellFeaturePoints
483 singleCellFeaturePoints,
484 multiCellFeaturePoints
533 dualMaker.setRefinement
538 singleCellFeaturePoints,
539 multiCellFeaturePoints,
550 if (map().hasMotionPoints())
virtual const pointField & points() const
A class for handling words, derived from Foam::string.
virtual bool write(const bool valid=true) const
A bitSet stores bits (elements with only two states) in packed internal format and supports a variety...
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO.
wordList ReadFields(const typename GeoMesh::Mesh &mesh, const IOobjectList &objects, PtrList< GeometricField< Type, PatchField, GeoMesh >> &fields, const bool syncPar=true, const bool readOldTime=false)
A List obtained as a section of another List.
static word timeName(const scalar t, const int precision=precision_)
Direct mesh changes based on v1.3 polyTopoChange syntax.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
static void addNote(const string ¬e)
void set(const bitSet &bitset)
Unit conversion functions.
virtual tmp< scalarField > movePoints(const pointField &)
const polyBoundaryMesh & boundaryMesh() const
Ostream & endl(Ostream &os)
const edgeList & edges() const
A HashTable with keys but without contents that is similar to std::unordered_set.
T get(const label index) const
Mesh consisting of general polyhedral cells.
static void addArgument(const string &argName, const string &usage="")
const fileName & pointsInstance() const
A subset of mesh faces organised as a primitive patch.
A patch is a list of labels that address the faces in the global face list.
const labelListList & faceEdges() const
virtual void updateMesh(const mapPolyMesh &mpm)
label nBoundaryFaces() const noexcept
const faceZoneMesh & faceZones() const noexcept
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers....
constexpr scalar degToRad(const scalar deg) noexcept
List of IOobjects with searching and retrieving facilities.
Output to file stream, using an OSstream.
label nInternalEdges() const
static void addBoolOption(const word &optName, const string &usage="", bool advanced=false)
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
virtual const faceList & faces() const
Field reading functions for post-processing utilities.
const word & name() const noexcept
label nInternalFaces() const noexcept
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
const vectorField & faceCentres() const
static void removeFiles(const polyMesh &mesh)
const dimensionedScalar e
labelList identity(const label len, label start=0)
bool insert(const Key &key)
const polyBoundaryMesh & patches
label nFaces() const noexcept
A face is a list of labels corresponding to mesh vertices.
const labelList & meshEdges() const
Foam::argList args(argc, argv)
static void removeFiles(const polyMesh &)
#define WarningInFunction
Creates dual of polyMesh. Every point becomes a cell (or multiple cells for feature points),...
void setInstance(const fileName &instance, const IOobject::writeOption wOpt=IOobject::AUTO_WRITE)
bool found(const word &optName) const
A list of faces which address into the list of points.
dimensionedScalar cos(const dimensionedScalar &ds)