54 const label newPointi,
152 void createBoundaryEdgeTrees
164 treeBoundaryEdges[surfI] =
190 treeBoundaryEdges[surfI]
202 class findNearestOpSubset
217 shapeMask_(shapeMask)
225 scalar& nearestDistSqr,
234 const label index = indices[i];
240 &&
findIndex(shapeMask_, edgeIndex) != -1
246 const edge& e = shape.
edges()[edgeIndex];
255 if (distSqr < nearestDistSqr)
257 nearestDistSqr = distSqr;
269 int main(
int argc,
char *argv[])
273 "hook surfaces to other surfaces by moving and retriangulating their" 274 "boundary edges to match other surface boundary edges" 292 const scalar matchTolerance(
max(1e-6*dist, small));
293 const label maxIters = 100;
295 Info<<
"Hooking distance = " << dist <<
endl;
316 const wordList& regions = surfs[surfI].regions();
317 forAll(regions, surfRegionI)
337 refCast<const triSurfaceMesh>(surfs[surfI]);
346 "hookedSurface_" + surfs.names()[surfI],
361 Info<<
nl <<
"Iteration = " << nIters++ <<
endl;
364 createBoundaryEdgeTrees(newSurfaces, bEdgeTrees, treeBoundaryEdges);
366 forAll(newSurfaces, surfI)
368 const triSurface& newSurf = newSurfaces[surfI];
375 forAll(newSurfaces, surfI)
384 forAll(bPointsTobEdges, bPointi)
391 const labelList& pEdges = pointEdges[pointi];
403 bEdgeTree.findNearest
428 nearestHit = currentHit;
429 bPointsHitTree[bPointi] = treeI;
435 if (nearestHit.
hit())
453 forAll(bPointsTobEdges, bPointi)
459 const label hitSurfI = bPointsHitTree[bPointi];
460 const triSurface& hitSurf = newSurfaces[hitSurfI];
463 treeBoundaryEdges[hitSurfI][eHit.
index()];
470 if (eFaces.
size() != 1)
473 <<
"Edge is attached to " << eFaces.
size()
474 <<
" faces." <<
endl;
479 const label facei = eFaces[0];
481 if (visitedFace[hitSurfI][facei])
507 label newPointi = -1;
510 if (hitSurfI == surfI)
516 newPoints[hitSurfI].
append(newPoints[surfI][pointi]);
517 newPointi = newPoints[hitSurfI].size() - 1;
530 visitedFace[hitSurfI][facei] =
true;
532 forAll(newFacesFromSplit, newFacei)
534 const labelledTri& fN = newFacesFromSplit[newFacei];
538 newFaces[hitSurfI][facei] = fN;
542 newFaces[hitSurfI].
append(fN);
549 Info<<
" Number of edges split = " << nChanged <<
endl;
551 forAll(newSurfaces, surfI)
560 "hookedSurface_" + surfs.names()[surfI],
575 }
while (nChanged > 0 && nIters <= maxIters);
579 forAll(newSurfaces, surfI)
583 Info<<
"Writing hooked surface " << newSurf.searchableSurface::name()
586 newSurf.searchableSurface::write();
const labelListList & pointEdges() const
Return point-edge addressing.
#define forAll(list, i)
Loop across all elements in list.
bool empty() const
Return true if the UList is empty (ie, size() is zero)
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.
const pointField & points() const
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Unit conversion functions.
void size(const label)
Override size to be inconsistent with allocated storage.
const labelList & boundaryPoints() const
Return list of boundary points,.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Holds data for octree to work on an edges subset.
label nInternalEdges() const
Number of internal edges.
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 Field< PointType > & localPoints() const
Return pointField of points in patch.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
IOoject and searching on triSurface.
const Point & hitPoint() const
Return hit point.
label region() const
Return region label.
linePointRef line(const pointField &) const
Return edge line.
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 word & constant() const
Return constant name.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
bool hit() const
Is there a hit.
Container for searchableSurfaces.
const Type & shapes() const
Reference to shape.
const labelListList & edgeFaces() const
Return edge-face addressing.
bool hit() const
Is there a hit.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
List< label > labelList
A List of labels.
const word dictName("particleTrackDict")
Triangle with additional region number.
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
label fcIndex(const label i) const
Return the forward circular index, i.e. the next index.
const Point & rawPoint() const
Return point with no checking.
dimensioned< scalar > magSqr(const dimensioned< Type > &)
const Point & rawPoint() const
Return point with no checking.
label nEdges() const
Return number of edges in patch.
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
IOobject dictIO(dictName, runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE)
label size() const
Return the number of elements in the UPtrList.
const edgeList & edges() const
Non-pointer based hierarchical recursive searching.
#define WarningInFunction
Report a warning using Foam::Warning.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
label end() const
Return end vertex label.
const List< FaceType > & localFaces() const
Return patch faces addressing into local point list.
T argRead(const label index) const
Read a value from the argument at index.
Standard boundBox + extra functionality for use in octree.
scalar distance() const
Return distance to 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...
label index() const
Return index.
const labelList & edgeLabels() const
label start() const
Return start vertex label.
treeBoundBox extend(const scalar s) const
Return asymetrically extended bounding box, with guaranteed.