diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C index ebecad88e168f7377c61993ef4942d1d7dc7d61e..66dc10737d7617427f62e0c165303f01b61d6662 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C @@ -37,6 +37,90 @@ namespace Foam defineTypeNameAndDebug(rayShooting, 0); addToRunTimeSelectionTable(initialPointsMethod, rayShooting, dictionary); + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void rayShooting::splitLine +( + const line<point, point>& l, + const scalar& pert, + DynamicList<Vb::Point>& initialPoints +) const +{ + Foam::point midPoint(l.centre()); + const scalar localCellSize(cellShapeControls().cellSize(midPoint)); + const scalar lineLength(l.mag()); + + const scalar minDistFromSurfaceSqr + ( + minimumSurfaceDistanceCoeffSqr_ + *sqr(localCellSize) + ); + + if + ( + magSqr(midPoint - l.start()) > minDistFromSurfaceSqr + && magSqr(midPoint - l.end()) > minDistFromSurfaceSqr + ) + { + // Add extra points if line length is much bigger than local cell size +// if (lineLength > 4.0*localCellSize) +// { +// splitLine +// ( +// line<point, point>(l.start(), midPoint), +// pert, +// initialPoints +// ); +// +// splitLine +// ( +// line<point, point>(midPoint, l.end()), +// pert, +// initialPoints +// ); +// } + + if (randomiseInitialGrid_) + { + Foam::point newPt + ( + midPoint.x() + pert*(rndGen().scalar01() - 0.5), + midPoint.y() + pert*(rndGen().scalar01() - 0.5), + midPoint.z() + pert*(rndGen().scalar01() - 0.5) + ); + + if + ( + !geometryToConformTo().findSurfaceAnyIntersection + ( + midPoint, + newPt + ) + ) + { + midPoint = newPt; + } + else + { + WarningIn + ( + "rayShooting::splitLine" + "(" + " const line<point,point>&," + " const scalar&," + " DynamicList<Vb::Point>&" + ")" + ) << "Point perturbation crosses a surface. Not inserting." + << endl; + } + } + + initialPoints.append(toPoint(midPoint)); + } +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // rayShooting::rayShooting @@ -75,7 +159,7 @@ List<Vb::Point> rayShooting::initialPoints() const const searchableSurfaces& surfaces = geometryToConformTo().geometry(); const labelList& surfacesToConformTo = geometryToConformTo().surfaces(); - const scalar maxRayLength = surfaces.bounds().mag(); + const scalar maxRayLength(surfaces.bounds().mag()); // Initialise points list label initialPointsSize = 0; @@ -94,8 +178,7 @@ List<Vb::Point> rayShooting::initialPoints() const const pointField& faceCentres = faceCentresTmp(); Info<< " Shoot rays from " << s.name() << nl - << " nRays = " << faceCentres.size() << endl; - + << " nRays = " << faceCentres.size() << endl; forAll(faceCentres, fcI) { @@ -110,9 +193,11 @@ List<Vb::Point> rayShooting::initialPoints() const continue; } - const scalar pert = + const scalar pert + ( randomPerturbationCoeff_ - *cellShapeControls().cellSize(fC); + *cellShapeControls().cellSize(fC) + ); pointIndexHit surfHitStart; label hitSurfaceStart; @@ -181,27 +266,12 @@ List<Vb::Point> rayShooting::initialPoints() const } } - Foam::point midPoint(l.centre()); - - const scalar minDistFromSurfaceSqr = - minimumSurfaceDistanceCoeffSqr_ - *sqr(cellShapeControls().cellSize(midPoint)); - - if (randomiseInitialGrid_) - { - midPoint.x() += pert*(rndGen().scalar01() - 0.5); - midPoint.y() += pert*(rndGen().scalar01() - 0.5); - midPoint.z() += pert*(rndGen().scalar01() - 0.5); - } - - if + splitLine ( - magSqr(midPoint - l.start()) > minDistFromSurfaceSqr - && magSqr(midPoint - l.end()) > minDistFromSurfaceSqr - ) - { - initialPoints.append(toPoint(midPoint)); - } + l, + pert, + initialPoints + ); } } } diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H index e66df62b7c0f9c6d6632469a31874472274fbd2f..e5bd1936ff5cd03d4803d585eb92a47958141a96 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H @@ -61,6 +61,16 @@ private: scalar randomPerturbationCoeff_; + // Private Member Functions + + void splitLine + ( + const line<point, point>& l, + const scalar& pert, + DynamicList<Vb::Point>& initialPoints + ) const; + + public: //- Runtime type information