53 const label newPointi,
151 void createBoundaryEdgeTrees
163 treeBoundaryEdges[surfI] =
179 bb.
min() -=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
180 bb.max() +=
point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
192 treeBoundaryEdges[surfI]
204 class findNearestOpSubset
219 shapeMask_(shapeMask)
227 scalar& nearestDistSqr,
236 const label index = indices[i];
242 &&
findIndex(shapeMask_, edgeIndex) != -1
248 const edge& e = shape.
edges()[edgeIndex];
257 if (distSqr < nearestDistSqr)
259 nearestDistSqr = distSqr;
271 int main(
int argc,
char *argv[])
275 "hook surfaces to other surfaces by moving and retriangulating their" 276 "boundary edges to match other surface boundary edges" 294 const scalar matchTolerance(
max(1e-6*dist, SMALL));
295 const label maxIters = 100;
297 Info<<
"Hooking distance = " << dist <<
endl;
318 const wordList& regions = surfs[surfI].regions();
319 forAll(regions, surfRegionI)
339 refCast<const triSurfaceMesh>(surfs[surfI]);
348 "hookedSurface_" + surfs.names()[surfI],
363 Info<<
nl <<
"Iteration = " << nIters++ <<
endl;
366 createBoundaryEdgeTrees(newSurfaces, bEdgeTrees, treeBoundaryEdges);
368 forAll(newSurfaces, surfI)
370 const triSurface& newSurf = newSurfaces[surfI];
377 forAll(newSurfaces, surfI)
386 forAll(bPointsTobEdges, bPointi)
393 const labelList& pEdges = pointEdges[pointi];
405 bEdgeTree.findNearest
430 nearestHit = currentHit;
431 bPointsHitTree[bPointi] = treeI;
437 if (nearestHit.
hit())
455 forAll(bPointsTobEdges, bPointi)
461 const label hitSurfI = bPointsHitTree[bPointi];
462 const triSurface& hitSurf = newSurfaces[hitSurfI];
465 treeBoundaryEdges[hitSurfI][eHit.
index()];
472 if (eFaces.
size() != 1)
475 <<
"Edge is attached to " << eFaces.
size()
476 <<
" faces." <<
endl;
481 const label facei = eFaces[0];
483 if (visitedFace[hitSurfI][facei])
509 label newPointi = -1;
512 if (hitSurfI == surfI)
518 newPoints[hitSurfI].
append(newPoints[surfI][pointi]);
519 newPointi = newPoints[hitSurfI].size() - 1;
532 visitedFace[hitSurfI][facei] =
true;
534 forAll(newFacesFromSplit, newFacei)
536 const labelledTri& fN = newFacesFromSplit[newFacei];
540 newFaces[hitSurfI][facei] = fN;
544 newFaces[hitSurfI].
append(fN);
551 Info<<
" Number of edges split = " << nChanged <<
endl;
553 forAll(newSurfaces, surfI)
562 "hookedSurface_" + surfs.names()[surfI],
577 }
while (nChanged > 0 && nIters <= maxIters);
581 forAll(newSurfaces, surfI)
585 Info<<
"Writing hooked surface " << newSurf.searchableSurface::name()
588 newSurf.searchableSurface::write();
cachedRandom rndGen(label(0),-1)
label end() const
Return end vertex label.
linePointRef line(const pointField &) const
Return edge line.
#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.
Ostream & indent(Ostream &os)
Indent stream.
label region() const
Return region label.
const point & min() const
Minimum describing the bounding box.
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
bool empty() const
Return true if the UList is empty (ie, size() is zero)
bool hit() const
Is there a hit.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Unit conversion functions.
const labelList & boundaryPoints() const
Return list of boundary points,.
const List< Face > & localFaces() const
Return patch faces addressing into local point list.
void size(const label)
Override size to be inconsistent with allocated storage.
const Point & rawPoint() const
Return point with no checking.
treeBoundBox extend(Random &, const scalar s) const
Return slightly wider bounding box.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Holds data for octree to work on an edges subset.
static void noParallel()
Remove the parallel options.
labelList identity(const label len)
Create identity map (map[i] == i) of given length.
static SLList< string > validArgs
A list of valid (mandatory) arguments.
This class describes the interaction of (usually) a face and a point. It carries the info of a succes...
const edgeList & edges() const
const labelListList & pointEdges() const
Return point-edge addressing.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
IOoject and searching on triSurface.
scalar distance() const
Return distance to hit.
vectorField pointField
pointField is a vectorField.
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 point labels. The functionality it provides supports the discretisation on a...
A class for handling words, derived from string.
void append(const T &)
Append an element at the end of the list.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
Container for searchableSurfaces.
List< label > labelList
A List of labels.
Triangle with additional region number.
const Point & rawPoint() const
Return point with no checking.
label fcIndex(const label i) const
Return the forward circular index, i.e. the next index.
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
Simple random number generator.
dimensioned< scalar > magSqr(const dimensioned< Type > &)
label start() const
Return start vertex label.
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
IOobject dictIO(dictName, runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE)
T argRead(const label index) const
Read a value from the argument at index.
label nEdges() const
Return number of edges in patch.
const labelList & edgeLabels() const
vector point
Point is a vector.
Non-pointer based hierarchical recursive searching.
#define WarningInFunction
Report a warning using Foam::Warning.
word dictName("noiseDict")
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
const Type & shapes() const
Reference to shape.
label nInternalEdges() const
Number of internal edges.
label index() const
Return index.
const Point & hitPoint() const
Return hit point.
const pointField & points() const
Standard boundBox + extra functionality for use in octree.
const labelListList & edgeFaces() const
Return edge-face addressing.
bool hit() const
Is there a hit.
static void addNote(const string &)
Add extra notes for the usage information.
Triangulated surface description with patch information.
Foam::argList args(argc, argv)
Ostream & incrIndent(Ostream &os)
Increment the indent level.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
const Field< PointType > & localPoints() const
Return pointField of points in patch.
label size() const
Return the number of elements in the UPtrList.