41 Info<<
"insertBoundingBox: creating bounding mesh" <<
endl;
53 Face_handle
f = vh->face(), next, start(
f);
60 if (!internal_flip(
f, cw(i))) external_flip(
f, i);
61 if (
f->neighbor(i) == start) start =
f;
63 f =
f->neighbor(cw(i));
70 Face_handle
n =
f->neighbor(i);
74 CGAL::ON_POSITIVE_SIDE
75 != side_of_oriented_circle(
n,
f->vertex(i)->point())
79 i =
n->index(
f->vertex(i));
86 Face_handle
n =
f->neighbor(i);
90 CGAL::ON_POSITIVE_SIDE
91 != side_of_oriented_circle(
n,
f->vertex(i)->point())
108 const dictionary& cvMeshDict
113 rndGen_(64293*Pstream::myProcNo()),
118 "cvSearchableSurfaces",
125 cvMeshDict.subDict(
"geometry"),
126 cvMeshDict.lookupOrDefault(
"singleRegionName", true)
133 cvMeshDict.subDict(
"surfaceConformation")
135 controls_(cvMeshDict, qSurf_.globalBounds()),
139 cvMeshDict.subDict(
"motionControl").subDict(
"shapeControlFunctions"),
141 controls_.minCellSize()
147 cvMeshDict.subDict(
"motionControl"),
155 cvMeshDict.subDict(
"surfaceConformation").
lookup(
"locationInMesh")
158 startOfInternalPoints_(0),
159 startOfSurfacePointPairs_(0),
160 startOfBoundaryConformPointPairs_(0),
166 insertFeaturePoints();
181 const scalar nearness
184 Info<<
"insertInitialPoints(const point2DField& points): ";
186 startOfInternalPoints_ = number_of_vertices();
187 label nVert = startOfInternalPoints_;
194 if (qSurf_.wellInside(toPoint3D(
p), nearness))
201 <<
"Rejecting point " <<
p <<
" outside surface" <<
endl;
205 Info<< nVert <<
" vertices inserted" <<
endl;
207 if (meshControls().objOutput())
212 writeTriangles(
"initial_triangles.obj",
true);
213 writeFaces(
"initial_faces.obj",
true);
220 IFstream pointsFile(pointFileName);
222 if (pointsFile.good())
227 0.5*meshControls().minCellSize2()
233 <<
"Could not open pointsFile " << pointFileName
241 Info<<
"insertInitialGrid: ";
243 startOfInternalPoints_ = number_of_vertices();
244 label nVert = startOfInternalPoints_;
246 scalar x0 = qSurf_.globalBounds().min().x();
247 scalar xR = qSurf_.globalBounds().max().x() - x0;
248 int ni = int(xR/meshControls().minCellSize()) + 1;
249 scalar deltax = xR/ni;
251 scalar
y0 = qSurf_.globalBounds().min().y();
252 scalar yR = qSurf_.globalBounds().max().y() -
y0;
253 int nj = int(yR/meshControls().minCellSize()) + 1;
254 scalar deltay = yR/nj;
257 scalar pert = meshControls().randomPerturbation()*
min(deltax, deltay);
259 for (
int i=0; i<ni; i++)
261 for (
int j=0; j<nj; j++)
263 point p(x0 + i*deltax,
y0 + j*deltay, 0);
265 if (meshControls().randomiseInitialGrid())
271 if (qSurf_.wellInside(
p, 0.5*meshControls().minCellSize2()))
278 Info<< nVert <<
" vertices inserted" <<
endl;
280 if (meshControls().objOutput())
285 writeTriangles(
"initial_triangles.obj",
true);
286 writeFaces(
"initial_faces.obj",
true);
293 startOfSurfacePointPairs_ = number_of_vertices();
295 if (meshControls().insertSurfaceNearestPointPairs())
297 insertSurfaceNearestPointPairs();
304 if (meshControls().insertSurfaceNearPointPairs())
306 insertSurfaceNearPointPairs();
309 startOfBoundaryConformPointPairs_ = number_of_vertices();
315 if (!meshControls().insertSurfaceNearestPointPairs())
317 markNearBoundaryPoints();
323 Triangulation::Finite_faces_iterator fit = finite_faces_begin();
324 fit != finite_faces_end();
331 for (
label iter=1; iter<=meshControls().maxBoundaryConformingIter(); iter++)
333 label nIntersections = insertBoundaryConformPointPairs
335 "surfaceIntersections_" +
Foam::name(iter) +
".obj"
338 if (nIntersections == 0)
344 Info<<
"BC iteration " << iter <<
": "
345 << nIntersections <<
" point-pairs inserted" <<
endl;
353 Triangulation::Finite_faces_iterator fit = finite_faces_begin();
354 fit != finite_faces_end();
379 Triangulation::Finite_vertices_iterator vit = finite_vertices_begin();
380 vit != finite_vertices_end();
384 if (vit->index() >= startOfSurfacePointPairs_)
394 const scalar relaxation = relaxationModel_->relaxation();
396 Info<<
"Relaxation = " << relaxation <<
endl;
398 Field<point2D> dualVertices(number_of_faces());
405 Triangulation::Finite_faces_iterator fit = finite_faces_begin();
406 fit != finite_faces_end();
410 fit->faceIndex() = -1;
414 fit->vertex(0)->internalOrBoundaryPoint()
415 || fit->vertex(1)->internalOrBoundaryPoint()
416 || fit->vertex(2)->internalOrBoundaryPoint()
419 fit->faceIndex() = dualVerti;
421 dualVertices[dualVerti] = toPoint2D(circumcenter(fit));
427 dualVertices.setSize(dualVerti);
429 Field<vector2D> displacementAccumulator
431 startOfSurfacePointPairs_,
438 number_of_vertices(),
439 meshControls().minCellSize()
442 Field<vector2D> alignments
444 number_of_vertices(),
450 Triangulation::Finite_vertices_iterator vit = finite_vertices_begin();
451 vit != finite_vertices_end();
455 if (vit->internalOrBoundaryPoint())
457 point2D vert = toPoint2D(vit->point());
461 label hitSurface = -1;
463 qSurf_.findSurfaceNearest
466 meshControls().span2(),
474 allGeometry_[hitSurface].getNormal
480 alignments[vit->index()] = toPoint2D(norm[0]);
482 sizes[vit->index()] =
483 cellSizeControl_.cellSize
485 toPoint3D(vit->point())
493 scalar cosAlignmentAcceptanceAngle = 0.68;
499 PackedBoolList pointToBeRetained(startOfSurfacePointPairs_,
true);
501 std::list<Point> pointsToInsert;
505 Triangulation::Finite_edges_iterator eit = finite_edges_begin();
506 eit != finite_edges_end();
510 Vertex_handle vA = eit->first->vertex(cw(eit->second));
511 Vertex_handle vB = eit->first->vertex(ccw(eit->second));
513 if (!vA->internalOrBoundaryPoint() || !vB->internalOrBoundaryPoint())
518 const point2D& dualV1 = dualVertices[eit->first->faceIndex()];
520 dualVertices[eit->first->neighbor(eit->second)->faceIndex()];
522 scalar dualEdgeLength =
mag(dualV1 - dualV2);
524 point2D dVA = toPoint2D(vA->point());
525 point2D dVB = toPoint2D(vB->point());
527 Field<vector2D> alignmentDirsA(2);
529 alignmentDirsA[0] = alignments[vA->index()];
532 -alignmentDirsA[0].
y(),
533 alignmentDirsA[0].
x()
536 Field<vector2D> alignmentDirsB(2);
538 alignmentDirsB[0] = alignments[vB->index()];
541 -alignmentDirsB[0].
y(),
542 alignmentDirsB[0].
x()
545 Field<vector2D> alignmentDirs(alignmentDirsA);
547 forAll(alignmentDirsA, aA)
549 const vector2D& a(alignmentDirsA[aA]);
551 scalar maxDotProduct = 0.0;
553 forAll(alignmentDirsB, aB)
557 scalar dotProduct = a &
b;
559 if (
mag(dotProduct) > maxDotProduct)
561 maxDotProduct =
mag(dotProduct);
563 alignmentDirs[aA] = a +
sign(dotProduct)*
b;
565 alignmentDirs[aA] /=
mag(alignmentDirs[aA]);
572 scalar rABMag =
mag(rAB);
576 vector2D& alignmentDir = alignmentDirs[aD];
578 if ((rAB & alignmentDir) < 0)
585 scalar alignmentDotProd = ((rAB/rABMag) & alignmentDir);
587 if (alignmentDotProd > cosAlignmentAcceptanceAngle)
589 scalar targetFaceSize =
590 0.5*(sizes[vA->index()] + sizes[vB->index()]);
599 alignmentDir *= 0.5*targetFaceSize;
603 if (dualEdgeLength < 0.7*targetFaceSize)
607 else if (dualEdgeLength < targetFaceSize)
612 /(targetFaceSize*(u - l))
620 && vB->internalPoint()
621 && rABMag > 1.75*targetFaceSize
622 && dualEdgeLength > 0.05*targetFaceSize
623 && alignmentDotProd > 0.93
627 pointsToInsert.push_back(
toPoint(0.5*(dVA + dVB)));
631 (vA->internalPoint() || vB->internalPoint())
632 && rABMag < 0.65*targetFaceSize
642 pointToBeRetained[vA->index()] ==
true
643 && pointToBeRetained[vB->index()] == true
646 pointsToInsert.push_back(
toPoint(0.5*(dVA + dVB)));
649 if (vA->internalPoint())
651 pointToBeRetained[vA->index()] =
false;
654 if (vB->internalPoint())
656 pointToBeRetained[vB->index()] =
false;
661 if (vA->internalPoint())
663 displacementAccumulator[vA->index()] +=
delta;
666 if (vB->internalPoint())
668 displacementAccumulator[vB->index()] += -
delta;
676 scalar totalDist =
sum(
mag(displacementAccumulator));
679 displacementAccumulator *= relaxation;
681 label numberOfNewPoints = pointsToInsert.size();
685 Triangulation::Finite_vertices_iterator vit = finite_vertices_begin();
686 vit != finite_vertices_end();
690 if (vit->internalPoint())
692 if (pointToBeRetained[vit->index()])
694 pointsToInsert.push_front
698 toPoint2D(vit->point())
699 + displacementAccumulator[vit->index()]
712 reinsertFeaturePoints();
714 startOfInternalPoints_ = number_of_vertices();
716 label nVert = startOfInternalPoints_;
718 Info<<
"Inserting " << numberOfNewPoints <<
" new points" <<
endl;
721 insert(pointsToInsert.begin(), pointsToInsert.end());
725 Delaunay::Finite_vertices_iterator vit = finite_vertices_begin();
726 vit != finite_vertices_end();
736 vit->index() = nVert++;
740 Info<<
" Total displacement = " << totalDisp <<
nl
741 <<
" Total distance = " << totalDist <<
nl
742 <<
" Points added = " << pointsToInsert.size()
747 insertSurfacePointPairs();
961 if (meshControls().objOutput())
963 writeFaces(
"allFaces.obj",
false);
964 writeFaces(
"faces.obj",
true);
965 writeTriangles(
"allTriangles.obj",
false);
966 writeTriangles(
"triangles.obj",
true);
974 if (meshControls().objOutput())
983 + runTime_.timeName()
991 +
"Triangles/allTriangles_"
992 + runTime_.timeName()