From 7531ccba9be86308a9e69a84b784bad8737591be Mon Sep 17 00:00:00 2001 From: laurence Date: Thu, 29 Aug 2013 15:32:43 +0100 Subject: [PATCH 1/5] ENH: foamyHexMesh: add rayShooting initial points method --- .../conformalVoronoiMesh/Make/files | 1 + .../conformalVoronoiMesh.C | 2 +- .../rayShooting/rayShooting.C | 218 ++++++++++++++++++ .../rayShooting/rayShooting.H | 105 +++++++++ 4 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C create mode 100644 applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/Make/files b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/Make/files index e42c52451f..bc4a363517 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/Make/files +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/Make/files @@ -64,6 +64,7 @@ initialPointsMethod/bodyCentredCubic/bodyCentredCubic.C initialPointsMethod/faceCentredCubic/faceCentredCubic.C initialPointsMethod/pointFile/pointFile.C initialPointsMethod/autoDensity/autoDensity.C +initialPointsMethod/rayShooting/rayShooting.C relaxationModel/relaxationModel/relaxationModel.C relaxationModel/adaptiveLinear/adaptiveLinear.C diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C index 6f137249c1..e580febdd8 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C @@ -1249,7 +1249,7 @@ void Foam::conformalVoronoiMesh::move() if ( ( - (vA->internalPoint() && vB->internalPoint()) + (vA->internalPoint() || vB->internalPoint()) && (!vA->referred() || !vB->referred()) // || // ( diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C new file mode 100644 index 0000000000..c4beb20b8e --- /dev/null +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C @@ -0,0 +1,218 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "rayShooting.H" +#include "addToRunTimeSelectionTable.H" +#include "triSurfaceMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(rayShooting, 0); +addToRunTimeSelectionTable(initialPointsMethod, rayShooting, dictionary); + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +rayShooting::rayShooting +( + const dictionary& initialPointsDict, + const Time& runTime, + Random& rndGen, + const conformationSurfaces& geometryToConformTo, + const cellShapeControl& cellShapeControls, + const autoPtr& decomposition +) +: + initialPointsMethod + ( + typeName, + initialPointsDict, + runTime, + rndGen, + geometryToConformTo, + cellShapeControls, + decomposition + ), + maxRayLength_(readScalar(detailsDict().lookup("maxRayLength"))), + randomiseInitialGrid_(detailsDict().lookup("randomiseInitialGrid")), + randomPerturbationCoeff_ + ( + readScalar(detailsDict().lookup("randomPerturbationCoeff")) + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +List rayShooting::initialPoints() const +{ + // Loop over surface faces + const searchableSurfaces& surfaces = geometryToConformTo().geometry(); + const labelList& surfacesToConformTo = geometryToConformTo().surfaces(); + + // Initialise points list + label initialPointsSize = 0; + forAll(surfaces, surfI) + { + initialPointsSize += surfaces[surfI].size(); + } + + DynamicList initialPoints(initialPointsSize); + + forAll(surfacesToConformTo, surfI) + { + const searchableSurface& s = surfaces[surfacesToConformTo[surfI]]; + + tmp faceCentresTmp(s.coordinates()); + const pointField& faceCentres = faceCentresTmp(); + + Info<< " Shoot rays from " << s.name() << nl + << " nRays = " << faceCentres.size() << endl; + + + forAll(faceCentres, fcI) + { + const Foam::point& fC = faceCentres[fcI]; + + if + ( + Pstream::parRun() + && !decomposition().positionOnThisProcessor(fC) + ) + { + continue; + } + + const scalar pert = + randomPerturbationCoeff_ + *cellShapeControls().cellSize(fC); + + pointIndexHit surfHitStart; + label hitSurfaceStart; + + // Face centres should be on the surface so search distance can be + // small + geometryToConformTo().findSurfaceNearest + ( + fC, + sqr(SMALL), + surfHitStart, + hitSurfaceStart + ); + + vectorField normStart(1, vector::min); + geometryToConformTo().getNormal + ( + hitSurfaceStart, + List(1, surfHitStart), + normStart + ); + + pointIndexHit surfHitEnd; + label hitSurfaceEnd; + + geometryToConformTo().findSurfaceNearestIntersection + ( + fC - normStart[0]*SMALL, + fC - normStart[0]*maxRayLength_, + surfHitEnd, + hitSurfaceEnd + ); + + vectorField normEnd(1, vector::min); + geometryToConformTo().getNormal + ( + hitSurfaceEnd, + List(1, surfHitEnd), + normEnd + ); + + if + ( + surfHitEnd.hit() + && ((normStart[0] & normEnd[0]) < 0) + ) + { + line l(fC, surfHitEnd.hitPoint()); + + if (Pstream::parRun()) + { + // Clip the line in parallel + pointIndexHit procIntersection = + decomposition().findLine + ( + l.start() + l.vec()*SMALL, + l.end() - l.vec()*maxRayLength_ + ); + + if (procIntersection.hit()) + { + l = + line + ( + l.start(), + procIntersection.hitPoint() + ); + } + } + + Foam::point midPoint(l.centre()); + + const scalar minDistFromSurfaceSqr = + minimumSurfaceDistanceCoeffSqr_ + *sqr(cellShapeControls().cellSize(midPoint)); + + if + ( + magSqr(midPoint - l.start()) > minDistFromSurfaceSqr + && magSqr(midPoint - l.end()) > minDistFromSurfaceSqr + ) + { + if (randomiseInitialGrid_) + { + midPoint.x() += pert*(rndGen().scalar01() - 0.5); + midPoint.y() += pert*(rndGen().scalar01() - 0.5); + midPoint.z() += pert*(rndGen().scalar01() - 0.5); + } + + initialPoints.append(toPoint(midPoint)); + } + } + } + } + + return initialPoints.shrink(); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H new file mode 100644 index 0000000000..c199a31e0a --- /dev/null +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H @@ -0,0 +1,105 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::rayShooting + +Description + +SourceFiles + rayShooting.C + +\*---------------------------------------------------------------------------*/ + +#ifndef rayShooting_H +#define rayShooting_H + +#include "initialPointsMethod.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class rayShooting Declaration +\*---------------------------------------------------------------------------*/ + +class rayShooting +: + public initialPointsMethod +{ + +private: + + // Private data + + const scalar maxRayLength_; + + //- Should the initial positions be randomised + Switch randomiseInitialGrid_; + + //- Randomise the initial positions by fraction of the initialCellSize_ + scalar randomPerturbationCoeff_; + + +public: + + //- Runtime type information + TypeName("rayShooting"); + + // Constructors + + //- Construct from components + rayShooting + ( + const dictionary& initialPointsDict, + const Time& runTime, + Random& rndGen, + const conformationSurfaces& geometryToConformTo, + const cellShapeControl& cellShapeControls, + const autoPtr& decomposition + ); + + + //- Destructor + virtual ~rayShooting() + {} + + + // Member Functions + + //- Return the initial points for the conformalVoronoiMesh + virtual List initialPoints() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // From 8dda57ddbfb9dbccafa9494be3a37d92bbd1e066 Mon Sep 17 00:00:00 2001 From: laurence Date: Thu, 29 Aug 2013 16:00:04 +0100 Subject: [PATCH 2/5] ENH: foamyHexMesh: correct rayShooting point addition on intersection --- .../rayShooting/rayShooting.C | 103 +++++++++--------- 1 file changed, 51 insertions(+), 52 deletions(-) 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 c4beb20b8e..e0be01bcac 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C @@ -121,7 +121,7 @@ List rayShooting::initialPoints() const geometryToConformTo().findSurfaceNearest ( fC, - sqr(SMALL), + sqr(pert), surfHitStart, hitSurfaceStart ); @@ -145,63 +145,62 @@ List rayShooting::initialPoints() const hitSurfaceEnd ); - vectorField normEnd(1, vector::min); - geometryToConformTo().getNormal - ( - hitSurfaceEnd, - List(1, surfHitEnd), - normEnd - ); - - if - ( - surfHitEnd.hit() - && ((normStart[0] & normEnd[0]) < 0) - ) + if (surfHitEnd.hit()) { - line l(fC, surfHitEnd.hitPoint()); - - if (Pstream::parRun()) - { - // Clip the line in parallel - pointIndexHit procIntersection = - decomposition().findLine - ( - l.start() + l.vec()*SMALL, - l.end() - l.vec()*maxRayLength_ - ); - - if (procIntersection.hit()) - { - l = - line - ( - l.start(), - procIntersection.hitPoint() - ); - } - } - - Foam::point midPoint(l.centre()); - - const scalar minDistFromSurfaceSqr = - minimumSurfaceDistanceCoeffSqr_ - *sqr(cellShapeControls().cellSize(midPoint)); - - if + vectorField normEnd(1, vector::min); + geometryToConformTo().getNormal ( - magSqr(midPoint - l.start()) > minDistFromSurfaceSqr - && magSqr(midPoint - l.end()) > minDistFromSurfaceSqr - ) + hitSurfaceEnd, + List(1, surfHitEnd), + normEnd + ); + + if ((normStart[0] & normEnd[0]) < 0) { - if (randomiseInitialGrid_) + line l(fC, surfHitEnd.hitPoint()); + + if (Pstream::parRun()) { - midPoint.x() += pert*(rndGen().scalar01() - 0.5); - midPoint.y() += pert*(rndGen().scalar01() - 0.5); - midPoint.z() += pert*(rndGen().scalar01() - 0.5); + // Clip the line in parallel + pointIndexHit procIntersection = + decomposition().findLine + ( + l.start() + l.vec()*SMALL, + l.end() - l.vec()*maxRayLength_ + ); + + if (procIntersection.hit()) + { + l = + line + ( + l.start(), + procIntersection.hitPoint() + ); + } } - initialPoints.append(toPoint(midPoint)); + Foam::point midPoint(l.centre()); + + const scalar minDistFromSurfaceSqr = + minimumSurfaceDistanceCoeffSqr_ + *sqr(cellShapeControls().cellSize(midPoint)); + + if + ( + magSqr(midPoint - l.start()) > minDistFromSurfaceSqr + && magSqr(midPoint - l.end()) > minDistFromSurfaceSqr + ) + { + if (randomiseInitialGrid_) + { + midPoint.x() += pert*(rndGen().scalar01() - 0.5); + midPoint.y() += pert*(rndGen().scalar01() - 0.5); + midPoint.z() += pert*(rndGen().scalar01() - 0.5); + } + + initialPoints.append(toPoint(midPoint)); + } } } } From 20a8649a0094f4377f767829c1e33a263a205437 Mon Sep 17 00:00:00 2001 From: laurence Date: Thu, 29 Aug 2013 16:04:24 +0100 Subject: [PATCH 3/5] ENH: foamyHexMesh: calc maxRayLength from bounds of surface --- .../initialPointsMethod/rayShooting/rayShooting.C | 7 ++++--- .../initialPointsMethod/rayShooting/rayShooting.H | 2 -- 2 files changed, 4 insertions(+), 5 deletions(-) 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 e0be01bcac..880871165e 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C @@ -59,7 +59,6 @@ rayShooting::rayShooting cellShapeControls, decomposition ), - maxRayLength_(readScalar(detailsDict().lookup("maxRayLength"))), randomiseInitialGrid_(detailsDict().lookup("randomiseInitialGrid")), randomPerturbationCoeff_ ( @@ -76,6 +75,8 @@ List rayShooting::initialPoints() const const searchableSurfaces& surfaces = geometryToConformTo().geometry(); const labelList& surfacesToConformTo = geometryToConformTo().surfaces(); + const scalar maxRayLength = surfaces.bounds().mag(); + // Initialise points list label initialPointsSize = 0; forAll(surfaces, surfI) @@ -140,7 +141,7 @@ List rayShooting::initialPoints() const geometryToConformTo().findSurfaceNearestIntersection ( fC - normStart[0]*SMALL, - fC - normStart[0]*maxRayLength_, + fC - normStart[0]*maxRayLength, surfHitEnd, hitSurfaceEnd ); @@ -166,7 +167,7 @@ List rayShooting::initialPoints() const decomposition().findLine ( l.start() + l.vec()*SMALL, - l.end() - l.vec()*maxRayLength_ + l.end() - l.vec()*maxRayLength ); if (procIntersection.hit()) 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 c199a31e0a..e66df62b7c 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.H @@ -54,8 +54,6 @@ private: // Private data - const scalar maxRayLength_; - //- Should the initial positions be randomised Switch randomiseInitialGrid_; From 067c80b0d73042f6ec7629c1e561cfbe3bcc6dbd Mon Sep 17 00:00:00 2001 From: laurence Date: Thu, 29 Aug 2013 16:34:39 +0100 Subject: [PATCH 4/5] ENH: foamyHexMesh: correct proc boundary intersection in ray shooting --- .../rayShooting/rayShooting.C | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 880871165e..ebecad88e1 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/initialPointsMethod/rayShooting/rayShooting.C @@ -140,7 +140,7 @@ List rayShooting::initialPoints() const geometryToConformTo().findSurfaceNearestIntersection ( - fC - normStart[0]*SMALL, + fC - normStart[0]*pert, fC - normStart[0]*maxRayLength, surfHitEnd, hitSurfaceEnd @@ -166,8 +166,8 @@ List rayShooting::initialPoints() const pointIndexHit procIntersection = decomposition().findLine ( - l.start() + l.vec()*SMALL, - l.end() - l.vec()*maxRayLength + l.start(), + l.end() ); if (procIntersection.hit()) @@ -187,19 +187,19 @@ List rayShooting::initialPoints() const 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 ( magSqr(midPoint - l.start()) > minDistFromSurfaceSqr && magSqr(midPoint - l.end()) > minDistFromSurfaceSqr ) { - if (randomiseInitialGrid_) - { - midPoint.x() += pert*(rndGen().scalar01() - 0.5); - midPoint.y() += pert*(rndGen().scalar01() - 0.5); - midPoint.z() += pert*(rndGen().scalar01() - 0.5); - } - initialPoints.append(toPoint(midPoint)); } } From f7145eb63ffb26e7c2dda79a2f63c4baac144376 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 2 Sep 2013 09:46:25 +0100 Subject: [PATCH 5/5] Removed unnecessary include directory --- .../compressible/rhoPimpleFoam/rhoLTSPimpleFoam/Make/options | 1 - 1 file changed, 1 deletion(-) diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoLTSPimpleFoam/Make/options b/applications/solvers/compressible/rhoPimpleFoam/rhoLTSPimpleFoam/Make/options index 11053f31a9..502938c53c 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoLTSPimpleFoam/Make/options +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoLTSPimpleFoam/Make/options @@ -1,5 +1,4 @@ EXE_INC = \ - -I../rhoPorousMRFPimpleFoam \ -I.. \ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ -I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \