mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Remove requiredSize and requiredAlignment functions and their dictionary inputs
This commit is contained in:
@ -34,7 +34,6 @@ License
|
|||||||
#include "controlMeshRefinement.H"
|
#include "controlMeshRefinement.H"
|
||||||
#include "smoothAlignmentSolver.H"
|
#include "smoothAlignmentSolver.H"
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
@ -93,317 +92,6 @@ void Foam::conformalVoronoiMesh::cellSizeMeshOverlapsBackground() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::scalar Foam::conformalVoronoiMesh::requiredSize
|
|
||||||
(
|
|
||||||
const Foam::point& pt
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
pointIndexHit surfHit;
|
|
||||||
label hitSurface;
|
|
||||||
|
|
||||||
DynamicList<scalar> cellSizeHits;
|
|
||||||
|
|
||||||
geometryToConformTo_.findSurfaceNearest
|
|
||||||
(
|
|
||||||
pt,
|
|
||||||
sqr(GREAT),
|
|
||||||
surfHit,
|
|
||||||
hitSurface
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!surfHit.hit())
|
|
||||||
{
|
|
||||||
FatalErrorIn
|
|
||||||
(
|
|
||||||
"Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment"
|
|
||||||
)
|
|
||||||
<< "findSurfaceNearest did not find a hit across the surfaces."
|
|
||||||
<< exit(FatalError) << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
cellSizeHits.append(cellShapeControls().cellSize(pt));
|
|
||||||
|
|
||||||
// Primary alignment
|
|
||||||
|
|
||||||
vectorField norm(1);
|
|
||||||
|
|
||||||
allGeometry_[hitSurface].getNormal
|
|
||||||
(
|
|
||||||
List<pointIndexHit>(1, surfHit),
|
|
||||||
norm
|
|
||||||
);
|
|
||||||
|
|
||||||
const vector np = norm[0];
|
|
||||||
|
|
||||||
// Generate equally spaced 'spokes' in a circle normal to the
|
|
||||||
// direction from the vertex to the closest point on the surface
|
|
||||||
// and look for a secondary intersection.
|
|
||||||
|
|
||||||
const vector d = surfHit.hitPoint() - pt;
|
|
||||||
|
|
||||||
const tensor Rp = rotationTensor(vector(0,0,1), np);
|
|
||||||
|
|
||||||
const label s = cvMeshControls().alignmentSearchSpokes();
|
|
||||||
|
|
||||||
const scalar spanMag = geometryToConformTo_.globalBounds().mag();
|
|
||||||
|
|
||||||
scalar totalDist = 0;
|
|
||||||
|
|
||||||
for (label i = 0; i < s; i++)
|
|
||||||
{
|
|
||||||
vector spoke
|
|
||||||
(
|
|
||||||
Foam::cos(i*constant::mathematical::twoPi/s),
|
|
||||||
Foam::sin(i*constant::mathematical::twoPi/s),
|
|
||||||
0
|
|
||||||
);
|
|
||||||
|
|
||||||
spoke *= spanMag;
|
|
||||||
|
|
||||||
spoke = Rp & spoke;
|
|
||||||
|
|
||||||
pointIndexHit spokeHit;
|
|
||||||
|
|
||||||
label spokeSurface = -1;
|
|
||||||
|
|
||||||
// internal spoke
|
|
||||||
|
|
||||||
geometryToConformTo_.findSurfaceNearestIntersection
|
|
||||||
(
|
|
||||||
pt,
|
|
||||||
pt + spoke,
|
|
||||||
spokeHit,
|
|
||||||
spokeSurface
|
|
||||||
);
|
|
||||||
|
|
||||||
if (spokeHit.hit())
|
|
||||||
{
|
|
||||||
const Foam::point& hitPt = spokeHit.hitPoint();
|
|
||||||
|
|
||||||
scalar spokeHitDistance = mag(hitPt - pt);
|
|
||||||
|
|
||||||
cellSizeHits.append
|
|
||||||
(
|
|
||||||
cellShapeControls().cellSize(hitPt)
|
|
||||||
);
|
|
||||||
|
|
||||||
totalDist += spokeHitDistance;
|
|
||||||
}
|
|
||||||
|
|
||||||
//external spoke
|
|
||||||
|
|
||||||
Foam::point mirrorPt = pt + 2*d;
|
|
||||||
|
|
||||||
geometryToConformTo_.findSurfaceNearestIntersection
|
|
||||||
(
|
|
||||||
mirrorPt,
|
|
||||||
mirrorPt + spoke,
|
|
||||||
spokeHit,
|
|
||||||
spokeSurface
|
|
||||||
);
|
|
||||||
|
|
||||||
if (spokeHit.hit())
|
|
||||||
{
|
|
||||||
const Foam::point& hitPt = spokeHit.hitPoint();
|
|
||||||
|
|
||||||
scalar spokeHitDistance = mag(hitPt - mirrorPt);
|
|
||||||
|
|
||||||
cellSizeHits.append
|
|
||||||
(
|
|
||||||
cellShapeControls().cellSize(hitPt)
|
|
||||||
);
|
|
||||||
|
|
||||||
totalDist += spokeHitDistance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
scalar cellSize = 0;
|
|
||||||
|
|
||||||
forAll(cellSizeHits, hitI)
|
|
||||||
{
|
|
||||||
cellSize += cellSizeHits[hitI];
|
|
||||||
}
|
|
||||||
|
|
||||||
return cellSize/cellSizeHits.size();
|
|
||||||
//return cellShapeControls().cellSize(pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment
|
|
||||||
(
|
|
||||||
const Foam::point& pt
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
pointIndexHit surfHit;
|
|
||||||
label hitSurface;
|
|
||||||
|
|
||||||
geometryToConformTo_.findSurfaceNearest
|
|
||||||
(
|
|
||||||
pt,
|
|
||||||
sqr(GREAT),
|
|
||||||
surfHit,
|
|
||||||
hitSurface
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!surfHit.hit())
|
|
||||||
{
|
|
||||||
FatalErrorIn
|
|
||||||
(
|
|
||||||
"Foam::tensor Foam::conformalVoronoiMesh::requiredAlignment"
|
|
||||||
)
|
|
||||||
<< "findSurfaceNearest did not find a hit across the surfaces."
|
|
||||||
<< exit(FatalError) << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Primary alignment
|
|
||||||
|
|
||||||
vectorField norm(1);
|
|
||||||
|
|
||||||
allGeometry_[hitSurface].getNormal
|
|
||||||
(
|
|
||||||
List<pointIndexHit>(1, surfHit),
|
|
||||||
norm
|
|
||||||
);
|
|
||||||
|
|
||||||
const vector np = norm[0];
|
|
||||||
|
|
||||||
// Generate equally spaced 'spokes' in a circle normal to the
|
|
||||||
// direction from the vertex to the closest point on the surface
|
|
||||||
// and look for a secondary intersection.
|
|
||||||
|
|
||||||
const vector d = surfHit.hitPoint() - pt;
|
|
||||||
|
|
||||||
const tensor Rp = rotationTensor(vector(0,0,1), np);
|
|
||||||
|
|
||||||
const label s = cvMeshControls().alignmentSearchSpokes();
|
|
||||||
|
|
||||||
scalar closestSpokeHitDistance = GREAT;
|
|
||||||
|
|
||||||
pointIndexHit closestSpokeHit;
|
|
||||||
|
|
||||||
label closestSpokeSurface = -1;
|
|
||||||
|
|
||||||
const scalar spanMag = geometryToConformTo_.globalBounds().mag();
|
|
||||||
|
|
||||||
for (label i = 0; i < s; i++)
|
|
||||||
{
|
|
||||||
vector spoke
|
|
||||||
(
|
|
||||||
Foam::cos(i*constant::mathematical::twoPi/s),
|
|
||||||
Foam::sin(i*constant::mathematical::twoPi/s),
|
|
||||||
0
|
|
||||||
);
|
|
||||||
|
|
||||||
spoke *= spanMag;
|
|
||||||
|
|
||||||
spoke = Rp & spoke;
|
|
||||||
|
|
||||||
pointIndexHit spokeHit;
|
|
||||||
|
|
||||||
label spokeSurface = -1;
|
|
||||||
|
|
||||||
// internal spoke
|
|
||||||
|
|
||||||
geometryToConformTo_.findSurfaceNearestIntersection
|
|
||||||
(
|
|
||||||
pt,
|
|
||||||
pt + spoke,
|
|
||||||
spokeHit,
|
|
||||||
spokeSurface
|
|
||||||
);
|
|
||||||
|
|
||||||
if (spokeHit.hit())
|
|
||||||
{
|
|
||||||
scalar spokeHitDistance = mag
|
|
||||||
(
|
|
||||||
spokeHit.hitPoint() - pt
|
|
||||||
);
|
|
||||||
|
|
||||||
if (spokeHitDistance < closestSpokeHitDistance)
|
|
||||||
{
|
|
||||||
closestSpokeHit = spokeHit;
|
|
||||||
closestSpokeSurface = spokeSurface;
|
|
||||||
closestSpokeHitDistance = spokeHitDistance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//external spoke
|
|
||||||
|
|
||||||
Foam::point mirrorPt = pt + 2*d;
|
|
||||||
|
|
||||||
geometryToConformTo_.findSurfaceNearestIntersection
|
|
||||||
(
|
|
||||||
mirrorPt,
|
|
||||||
mirrorPt + spoke,
|
|
||||||
spokeHit,
|
|
||||||
spokeSurface
|
|
||||||
);
|
|
||||||
|
|
||||||
if (spokeHit.hit())
|
|
||||||
{
|
|
||||||
scalar spokeHitDistance = mag
|
|
||||||
(
|
|
||||||
spokeHit.hitPoint() - mirrorPt
|
|
||||||
);
|
|
||||||
|
|
||||||
if (spokeHitDistance < closestSpokeHitDistance)
|
|
||||||
{
|
|
||||||
closestSpokeHit = spokeHit;
|
|
||||||
closestSpokeSurface = spokeSurface;
|
|
||||||
closestSpokeHitDistance = spokeHitDistance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (closestSpokeSurface == -1)
|
|
||||||
{
|
|
||||||
WarningIn
|
|
||||||
(
|
|
||||||
"conformalVoronoiMesh::requiredAlignment"
|
|
||||||
"("
|
|
||||||
"const Foam::point& pt"
|
|
||||||
") const"
|
|
||||||
) << "No secondary surface hit found in spoke search "
|
|
||||||
<< "using " << s
|
|
||||||
<< " spokes, try increasing alignmentSearchSpokes."
|
|
||||||
<< endl;
|
|
||||||
|
|
||||||
return I;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Auxiliary alignment generated by spoke intersection normal.
|
|
||||||
|
|
||||||
allGeometry_[closestSpokeSurface].getNormal
|
|
||||||
(
|
|
||||||
List<pointIndexHit>(1, closestSpokeHit),
|
|
||||||
norm
|
|
||||||
);
|
|
||||||
|
|
||||||
const vector& na = norm[0];
|
|
||||||
|
|
||||||
// Secondary alignment
|
|
||||||
vector ns = np ^ na;
|
|
||||||
|
|
||||||
if (mag(ns) < SMALL)
|
|
||||||
{
|
|
||||||
FatalErrorIn("conformalVoronoiMesh::requiredAlignment")
|
|
||||||
<< "Parallel normals detected in spoke search." << nl
|
|
||||||
<< "point: " << pt << nl
|
|
||||||
<< "closest surface point: " << surfHit.hitPoint() << nl
|
|
||||||
<< "closest spoke hit: " << closestSpokeHit.hitPoint() << nl
|
|
||||||
<< "np: " << surfHit.hitPoint() + np << nl
|
|
||||||
<< "ns: " << closestSpokeHit.hitPoint() + na << nl
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
ns /= mag(ns);
|
|
||||||
|
|
||||||
tensor Rs = rotationTensor((Rp & vector(0,1,0)), ns);
|
|
||||||
|
|
||||||
return (Rs & Rp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::conformalVoronoiMesh::insertInternalPoints
|
void Foam::conformalVoronoiMesh::insertInternalPoints
|
||||||
(
|
(
|
||||||
List<Point>& points,
|
List<Point>& points,
|
||||||
|
|||||||
@ -269,12 +269,6 @@ private:
|
|||||||
//- Return the local maximum surface protrusion distance
|
//- Return the local maximum surface protrusion distance
|
||||||
inline scalar maxSurfaceProtrusion(const Foam::point& pt) const;
|
inline scalar maxSurfaceProtrusion(const Foam::point& pt) const;
|
||||||
|
|
||||||
//- Return the required cell size at the given location
|
|
||||||
scalar requiredSize(const Foam::point& pt) const;
|
|
||||||
|
|
||||||
//- Return the required alignment directions at the given location
|
|
||||||
tensor requiredAlignment(const Foam::point& pt) const;
|
|
||||||
|
|
||||||
//- Insert Point and return its auto-generated index
|
//- Insert Point and return its auto-generated index
|
||||||
inline bool insertPoint
|
inline bool insertPoint
|
||||||
(
|
(
|
||||||
|
|||||||
@ -151,21 +151,11 @@ Foam::cvControls::cvControls
|
|||||||
maxLoadUnbalance_ = -1;
|
maxLoadUnbalance_ = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
alignmentSearchSpokes_ = readLabel
|
|
||||||
(
|
|
||||||
motionDict.lookup("alignmentSearchSpokes")
|
|
||||||
);
|
|
||||||
|
|
||||||
cosAlignmentAcceptanceAngle_ = cos
|
cosAlignmentAcceptanceAngle_ = cos
|
||||||
(
|
(
|
||||||
degToRad(readScalar(motionDict.lookup("alignmentAcceptanceAngle")))
|
degToRad(readScalar(motionDict.lookup("alignmentAcceptanceAngle")))
|
||||||
);
|
);
|
||||||
|
|
||||||
sizeAndAlignmentRebuildFrequency_ = max
|
|
||||||
(
|
|
||||||
1,
|
|
||||||
readLabel(motionDict.lookup("sizeAndAlignmentRebuildFrequency"))
|
|
||||||
);
|
|
||||||
|
|
||||||
// Point removal criteria
|
// Point removal criteria
|
||||||
|
|
||||||
|
|||||||
@ -148,17 +148,10 @@ class cvControls
|
|||||||
//- Allowed relative load unbalance
|
//- Allowed relative load unbalance
|
||||||
scalar maxLoadUnbalance_;
|
scalar maxLoadUnbalance_;
|
||||||
|
|
||||||
//- Number of "spokes" to use to search for secondary alignment
|
|
||||||
// direction
|
|
||||||
label alignmentSearchSpokes_;
|
|
||||||
|
|
||||||
//- cosine of angle of alignment with required direction within which a
|
//- cosine of angle of alignment with required direction within which a
|
||||||
// face will be accepted for rotation
|
// face will be accepted for rotation
|
||||||
scalar cosAlignmentAcceptanceAngle_;
|
scalar cosAlignmentAcceptanceAngle_;
|
||||||
|
|
||||||
//- Now often to re-store the size and alignment data
|
|
||||||
label sizeAndAlignmentRebuildFrequency_;
|
|
||||||
|
|
||||||
|
|
||||||
// Point insertion criteria
|
// Point insertion criteria
|
||||||
|
|
||||||
@ -286,15 +279,9 @@ public:
|
|||||||
//- Return the maxLoadUnbalance
|
//- Return the maxLoadUnbalance
|
||||||
inline scalar maxLoadUnbalance() const;
|
inline scalar maxLoadUnbalance() const;
|
||||||
|
|
||||||
//- Return the number of alignmentSearchSpokes to use
|
|
||||||
inline label alignmentSearchSpokes() const;
|
|
||||||
|
|
||||||
//- Return the cosAlignmentAcceptanceAngle
|
//- Return the cosAlignmentAcceptanceAngle
|
||||||
inline scalar cosAlignmentAcceptanceAngle() const;
|
inline scalar cosAlignmentAcceptanceAngle() const;
|
||||||
|
|
||||||
//- Return the sizeAndAlignmentRebuildFrequency
|
|
||||||
inline label sizeAndAlignmentRebuildFrequency() const;
|
|
||||||
|
|
||||||
//- Return the aspectRatio
|
//- Return the aspectRatio
|
||||||
inline scalar aspectRatio() const;
|
inline scalar aspectRatio() const;
|
||||||
|
|
||||||
|
|||||||
@ -148,24 +148,12 @@ inline Foam::scalar Foam::cvControls::maxLoadUnbalance() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::label Foam::cvControls::alignmentSearchSpokes() const
|
|
||||||
{
|
|
||||||
return alignmentSearchSpokes_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::scalar Foam::cvControls::cosAlignmentAcceptanceAngle() const
|
inline Foam::scalar Foam::cvControls::cosAlignmentAcceptanceAngle() const
|
||||||
{
|
{
|
||||||
return cosAlignmentAcceptanceAngle_;
|
return cosAlignmentAcceptanceAngle_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::label Foam::cvControls::sizeAndAlignmentRebuildFrequency() const
|
|
||||||
{
|
|
||||||
return sizeAndAlignmentRebuildFrequency_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::scalar Foam::cvControls::insertionDistCoeff() const
|
inline Foam::scalar Foam::cvControls::insertionDistCoeff() const
|
||||||
{
|
{
|
||||||
return insertionDistCoeff_;
|
return insertionDistCoeff_;
|
||||||
|
|||||||
@ -308,6 +308,12 @@ motionControl
|
|||||||
// Timing and memory usage.
|
// Timing and memory usage.
|
||||||
timeChecks no;
|
timeChecks no;
|
||||||
|
|
||||||
|
// For each delaunay edge (between two vertices, becomes
|
||||||
|
// the Voronoi face normal) snap to the alignment direction if within
|
||||||
|
// alignmentAcceptanceAngle. Slightly > 45 is a good choice - prevents
|
||||||
|
// flipping.
|
||||||
|
alignmentAcceptanceAngle 48;
|
||||||
|
|
||||||
// When to insert points. Not advisable change to
|
// When to insert points. Not advisable change to
|
||||||
// these settings.
|
// these settings.
|
||||||
pointInsertionCriteria
|
pointInsertionCriteria
|
||||||
|
|||||||
Reference in New Issue
Block a user