ENH: support arc edge specification with origin point

- The arc will frequently enclose an angle less than 180 degrees.
  For the case, it is possible to define the arc by its endpoints
  and its centre (origin) point. For example,

      arc 0 1 origin (0 0 0);

  When defined in the way, any discrepancy in the arc radius for the
  endpoints is resolved by adjusting the origin to ensure that the
  average radius is satisfied.

  It is also possible to specify a \em flatness factor as a multiplier
  of the radius. For example,

      arc 0 1 origin 1.1 (0 0 0);

ENH: minor code cleanup for block edges

ENH: expose point appending as polyList::concat
This commit is contained in:
Mark Olesen
2020-10-05 12:36:19 +02:00
parent 8939a55653
commit 1d08ed9be2
26 changed files with 575 additions and 299 deletions

View File

@ -134,7 +134,7 @@ Foam::point Foam::BSpline::position
Foam::scalar Foam::BSpline::length() const Foam::scalar Foam::BSpline::length() const
{ {
NotImplemented; NotImplemented;
return 1.0; return 1;
} }

View File

@ -6,6 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -77,21 +78,12 @@ class BSpline
: :
public polyLine public polyLine
{ {
// Private Member Functions
//- No copy construct
BSpline(const BSpline&) = delete;
//- No copy assignment
void operator=(const BSpline&) = delete;
public: public:
// Constructors // Constructors
//- Construct from components //- Construct from components
BSpline explicit BSpline
( (
const pointField& knots, const pointField& knots,
const bool notImplementedClosed = false const bool notImplementedClosed = false
@ -100,15 +92,16 @@ public:
// Member Functions // Member Functions
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the global curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
point position(const scalar lambda) const; point position(const scalar lambda) const;
//- Return the point position corresponding to the local parameter //- The point position corresponding to the local lambda (0-1)
// 0 <= lambda <= 1 on the given segment //- on the given segment
point position(const label segment, const scalar lambda) const; point position(const label segment, const scalar lambda) const;
//- Return the length of the curve //- The length of the curve
// \note NotImplemented
scalar length() const; scalar length() const;
}; };

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2014-2016 OpenFOAM Foundation Copyright (C) 2014-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -27,9 +27,9 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "BSplineEdge.H" #include "BSplineEdge.H"
#include "polyLine.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam namespace Foam
@ -59,7 +59,10 @@ Foam::blockEdges::BSplineEdge::BSplineEdge
) )
: :
blockEdge(points, start, end), blockEdge(points, start, end),
BSpline(appendEndPoints(points, start, end, internalPoints)) BSpline
(
polyLine::concat(points[start_], internalPoints, points[end_])
)
{} {}
@ -73,13 +76,16 @@ Foam::blockEdges::BSplineEdge::BSplineEdge
) )
: :
blockEdge(dict, index, points, is), blockEdge(dict, index, points, is),
BSpline(appendEndPoints(points, start_, end_, pointField(is))) BSpline
(
polyLine::concat(points[start_], pointField(is), points[end_])
)
{ {
token t(is); token tok(is);
is.putBack(t); is.putBack(tok);
// discard unused start/end tangents // Discard unused start/end tangents
if (t == token::BEGIN_LIST) if (tok == token::BEGIN_LIST)
{ {
vector tangent0Ignored(is); vector tangent0Ignored(is);
vector tangent1Ignored(is); vector tangent1Ignored(is);

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2014-2016 OpenFOAM Foundation Copyright (C) 2014-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -77,20 +77,20 @@ public:
//- Construct from components //- Construct from components
BSplineEdge BSplineEdge
( (
const pointField&, const pointField& points, //!< Referenced point field
const label start, const label start, //!< Start point in referenced point field
const label end, const label end, //!< End point in referenced point field
const pointField& internalPoints const pointField& internalPoints
); );
//- Construct from Istream, setting pointsList //- Construct from Istream and point field.
BSplineEdge BSplineEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField&, const pointField& points, //!< Referenced point field
Istream& Istream& is
); );
@ -100,11 +100,12 @@ public:
// Member Functions // Member Functions
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual point position(const scalar) const; virtual point position(const scalar) const;
//- Return the length of the spline curve (not implemented) //- The length of the spline curve
// \note NotImplemented
virtual scalar length() const; virtual scalar length() const;
}; };

View File

@ -6,6 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -43,10 +44,15 @@ namespace blockEdges
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle() void Foam::blockEdges::arcEdge::calcFromMidPoint
(
const point& p1,
const point& p3,
const point& p2
)
{ {
const vector a = p2_ - p1_; const vector a = p2 - p1;
const vector b = p3_ - p1_; const vector b = p3 - p1;
// Find centre of arcEdge // Find centre of arcEdge
const scalar asqr = a & a; const scalar asqr = a & a;
@ -55,7 +61,7 @@ Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle()
const scalar denom = asqr*bsqr - adotb*adotb; const scalar denom = asqr*bsqr - adotb*adotb;
if (mag(denom) < VSMALL) if (mag(denom) < ROOTVSMALL)
{ {
FatalErrorInFunction FatalErrorInFunction
<< denom << denom
@ -64,44 +70,120 @@ Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle()
const scalar fact = 0.5*(bsqr - adotb)/denom; const scalar fact = 0.5*(bsqr - adotb)/denom;
point centre = 0.5*a + fact*((a ^ b) ^ a); const point centre = p1 + 0.5*a + fact*((a ^ b) ^ a);
centre += p1_; // Position vectors from centre
const vector r1(p1 - centre);
const vector r2(p2 - centre);
const vector r3(p3 - centre);
// Find position vectors w.r.t. the arcEdge centre const scalar mag1(mag(r1));
const vector r1(p1_ - centre); const scalar mag3(mag(r3));
const vector r2(p2_ - centre);
const vector r3(p3_ - centre);
// Find angle (in degrees) vector arcAxis(r1 ^ r3);
angle_ = radToDeg(acos((r3 & r1)/(mag(r3) * mag(r1))));
// The radius from r1 and from r3 will be identical
radius_ = mag(r3);
// Determine the angle
angle_ = acos((r1 & r3)/(mag1*mag3));
// Check if the vectors define an exterior or an interior arcEdge // Check if the vectors define an exterior or an interior arcEdge
if (((r1 ^ r2) & (r1 ^ r3)) < 0.0) if (((r1 ^ r2) & (r1 ^ r3)) < 0.0)
{ {
angle_ = 360.0 - angle_; angle_ = constant::mathematical::twoPi - angle_;
} }
vector arcAxis; if (angle_ <= constant::mathematical::pi)
if (angle_ <= 180.0)
{ {
arcAxis = r1 ^ r3; if (mag(arcAxis)/(mag1*mag3) < 0.001)
if (mag(arcAxis)/(mag(r1)*mag(r3)) < 0.001)
{ {
arcAxis = r1 ^ r2; arcAxis = r1 ^ r2;
} }
} }
else else
{ {
arcAxis = r3 ^ r1; arcAxis = -arcAxis;
} }
radius_ = mag(r3); // Corresponding local cylindrical coordinate system
cs_ = coordSystem::cylindrical(centre, arcAxis, r1);
}
// The corresponding local cylindrical coordinate system (radians)
return coordSystem::cylindrical("arc", centre, arcAxis, r1); void Foam::blockEdges::arcEdge::calcFromCentre
(
const point& p1,
const point& p3,
const point& centre,
bool adjustCentre,
scalar rMultiplier
)
{
// Position vectors from centre
const vector r1(p1 - centre);
const vector r3(p3 - centre);
const scalar mag1(mag(r1));
const scalar mag3(mag(r3));
const vector chord(p3 - p1);
const vector arcAxis(r1 ^ r3);
// The average radius
radius_ = 0.5*(mag1 + mag3);
// The included angle
angle_ = acos((r1 & r3)/(mag1*mag3));
// TODO? check for 180 degrees (co-linear points)?
bool needsAdjust = false;
if (adjustCentre)
{
needsAdjust = !equal(mag1, mag3);
if (!equal(rMultiplier, 1))
{
// The min radius is constrained by the chord,
// otherwise bad things will happen.
needsAdjust = true;
radius_ *= rMultiplier;
radius_ = max(radius_, (1.001*0.5*mag(chord)));
}
}
if (needsAdjust)
{
// The centre is not equidistant to p1 and p3.
// Use the chord and the arcAxis to determine the vector to
// the midpoint of the chord and adjust the centre along this
// line.
const point newCentre =
(
(0.5 * (p3 + p1)) // mid-chord point
+ sqrt(sqr(radius_) - 0.25 * magSqr(chord))
* normalised(arcAxis ^ chord) // mid-chord -> centre
);
//// Info<< nl << "Adjust centre. r1=" << mag1 << " r3=" << mag3
//// << " radius=" << radius_ << nl
//// << "angle=" << radToDeg(angle_) << ' '
//// << coordSystem::cylindrical(centre, arcAxis, r1) << nl;
// Recalculate - do attempt to readjust
calcFromCentre(p1, p3, newCentre, false);
}
else
{
// Corresponding local cylindrical coordinate system
cs_ = coordSystem::cylindrical(centre, arcAxis, r1);
}
} }
@ -110,17 +192,35 @@ Foam::coordSystem::cylindrical Foam::blockEdges::arcEdge::calcAngle()
Foam::blockEdges::arcEdge::arcEdge Foam::blockEdges::arcEdge::arcEdge
( (
const pointField& points, const pointField& points,
const point& origin,
const label start, const label start,
const label end, const label end
const point& pMid
) )
: :
blockEdge(points, start, end), blockEdge(points, start, end),
p1_(points_[start_]), radius_(0),
p2_(pMid), angle_(0),
p3_(points_[end_]), cs_()
cs_(calcAngle()) {
{} calcFromCentre(points[start_], points[end_], origin);
}
Foam::blockEdges::arcEdge::arcEdge
(
const pointField& points,
const label start,
const label end,
const point& midPoint
)
:
blockEdge(points, start, end),
radius_(0),
angle_(0),
cs_()
{
calcFromMidPoint(points[start_], points[end_], midPoint);
}
Foam::blockEdges::arcEdge::arcEdge Foam::blockEdges::arcEdge::arcEdge
@ -133,41 +233,82 @@ Foam::blockEdges::arcEdge::arcEdge
) )
: :
blockEdge(dict, index, points, is), blockEdge(dict, index, points, is),
p1_(points_[start_]), radius_(0),
p2_(is), angle_(0),
p3_(points_[end_]), cs_()
cs_(calcAngle()) {
{} point p;
token tok(is);
if (tok.isWord())
{
// Can be
// - origin (0 0 0)
// - origin 1.2 (0 0 0)
scalar rMultiplier = 1;
is >> tok;
if (tok.isNumber())
{
rMultiplier = tok.number();
}
else
{
is.putBack(tok);
}
is >> p; // The origin (centre)
calcFromCentre(points_[start_], points_[end_], p, true, rMultiplier);
}
else
{
is.putBack(tok);
is >> p; // A mid-point
calcFromMidPoint(points_[start_], points_[end_], p);
}
// Debug information
#if 0
Info<< "arc " << start_ << ' ' << end_
<< ' ' << position(0.5) << ' ' << cs_
// << " radius=" << radius_ << " angle=" << radToDeg(angle_)
<< nl;
#endif
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::point Foam::blockEdges::arcEdge::position(const scalar lambda) const Foam::point Foam::blockEdges::arcEdge::position(const scalar lambda) const
{ {
#ifdef FULLDEBUG
if (lambda < -SMALL || lambda > 1 + SMALL) if (lambda < -SMALL || lambda > 1 + SMALL)
{ {
FatalErrorInFunction WarningInFunction
<< "Parameter out of range, lambda = " << lambda << "Parameter out of range, lambda = " << lambda << nl;
<< abort(FatalError);
} }
#endif
if (lambda < SMALL) if (lambda < SMALL)
{ {
return p1_; return points_[start_];
} }
else if (lambda > 1 - SMALL) else if (lambda >= 1 - SMALL)
{ {
return p3_; return points_[end_];
} }
// The angle is degrees, the coordinate system in radians return cs_.globalPosition(vector(radius_, (lambda*angle_), 0));
return cs_.globalPosition(vector(radius_, degToRad(lambda*angle_), 0));
} }
Foam::scalar Foam::blockEdges::arcEdge::length() const Foam::scalar Foam::blockEdges::arcEdge::length() const noexcept
{ {
return degToRad(radius_*angle_); return (radius_*angle_);
} }

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2017 OpenCFD Ltd. Copyright (C) 2017-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -28,7 +28,32 @@ Class
Foam::blockEdges::arcEdge Foam::blockEdges::arcEdge
Description Description
Defines the arcEdge of a circle in terms of 3 points on its circumference A blockEdge defined as an arc of a circle.
The arc is normally defined by its endpoints and a point on
its circumference, typically a midpoint. For example,
\verbatim
points ((1 0 0) (0 1 0));
arc 0 1 (0.707107 0.707107 0);
\endverbatim
The arc can enclose an angle greater than 0 and less than 360 degrees.
The arc will frequently enclose an angle less than 180 degrees.
For the case, it is possible to define the arc by its endpoints and its
centre (origin) point. For example,
\verbatim
arc 0 1 origin (0 0 0);
\endverbatim
When defined in the way, any discrepancy in the arc radius for the
endpoints is resolved by adjusting the origin to ensure that the average
radius is satisfied.
It is also possible to define a \em flatness factor as a multiplier of
the calculated radius. For example,
\verbatim
arc 0 1 origin 1.1 (0 0 0);
\endverbatim
SourceFiles SourceFiles
arcEdge.C arcEdge.C
@ -56,26 +81,41 @@ class arcEdge
: :
public blockEdge public blockEdge
{ {
// Private data // Private Data
// Begin, mid, end points
point p1_, p2_, p3_;
//- The arc angle (in degrees)
scalar angle_;
//- The arc radius //- The arc radius
scalar radius_; scalar radius_;
//- The arc angle (radians)
scalar angle_;
//- The local cylindrical coordinate system //- The local cylindrical coordinate system
coordSystem::cylindrical cs_; coordSystem::cylindrical cs_;
// Private Member Functions // Private Member Functions
//- Calculate the angle, radius and axis //- Calculate angle, radius, cylindrical coordinate system
// \return the cylindrical coordinate system //- from end points and the given point on the circumference
coordSystem::cylindrical calcAngle(); void calcFromMidPoint
(
const point& p1, //!< Start point
const point& p3, //!< End point
const point& p2 //!< Point on circumference
);
//- Calculate angle, radius, cylindrical coordinate system
//- from end points and the given origin.
// Optionally adjust centre to accommodate deviations in the
// effective radius to the end-points
void calcFromCentre
(
const point& p1, //!< Start point
const point& p3, //!< End point
const point& centre, //!< Centre
bool adjustCentre = false, //!< Adjust centre
scalar rMultiplier = 1 //!< Adjust radius by this factor
);
//- No copy construct //- No copy construct
arcEdge(const arcEdge&) = delete; arcEdge(const arcEdge&) = delete;
@ -92,23 +132,34 @@ public:
// Constructors // Constructors
//- Construct from components //- Construct from components, given the origin of the circle
arcEdge arcEdge
( (
const pointField& points, const pointField& points, //!< Referenced point field
const label start, const point& origin, //!< The origin of the circle
const label end, const label start, //!< Start point in referenced point field
const point& pMid const label end //!< End point in referenced point field
); );
//- Construct from Istream setting pointsList //- Construct from components, using a point on the circumference
arcEdge
(
const pointField& points, //!< Referenced point field
const label start, //!< Start point in referenced point field
const label end, //!< End point in referenced point field
const point& midPoint //!< A point on the circumference
);
//- Construct from Istream and point field.
// The Istream can specify either a point on the circumference,
// or with a tag to specify the origin.
arcEdge arcEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry, // unsed
const pointField& points, const pointField& points, //!< Referenced point field
Istream& Istream& is
); );
@ -122,7 +173,7 @@ public:
point position(const scalar lambda) const; point position(const scalar lambda) const;
//- The length of the curve //- The length of the curve
scalar length() const; scalar length() const noexcept;
}; };

View File

@ -26,6 +26,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "bezier.H" #include "bezier.H"
#include "polyLine.H"
#include "SubList.H" #include "SubList.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
@ -66,7 +67,10 @@ Foam::blockEdges::bezier::bezier
) )
: :
blockEdge(dict, index, points, is), blockEdge(dict, index, points, is),
control_(appendEndPoints(points, start_, end_, pointField(is))) control_
(
polyLine::concat(points[start_], pointField(is), points[end_])
)
{} {}
@ -94,7 +98,7 @@ Foam::point Foam::blockEdges::bezier::position(const scalar lambda) const
Foam::scalar Foam::blockEdges::bezier::length() const Foam::scalar Foam::blockEdges::bezier::length() const
{ {
NotImplemented; NotImplemented;
return 1.0; return 1;
} }

View File

@ -63,7 +63,7 @@ class bezier
: :
public blockEdge public blockEdge
{ {
private: // Private Data
//- Control points //- Control points
pointField control_; pointField control_;
@ -89,20 +89,20 @@ public:
//- Construct from components //- Construct from components
bezier bezier
( (
const pointField& points, const pointField& points, //!< Referenced point field
const label start, const label start, //!< Start point in referenced point field
const label end, const label end, //!< End point in referenced point field
const pointField& control const pointField& control //!< The control points
); );
//- Construct from Istream //- Construct from Istream and point field.
bezier bezier
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField&, const pointField& points, //!< Referenced point field
Istream& Istream& is
); );
@ -117,6 +117,7 @@ public:
point position(const scalar lambda) const; point position(const scalar lambda) const;
//- Return the length of the curve //- Return the length of the curve
// \not NotImplemented
scalar length() const; scalar length() const;
}; };

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -28,6 +28,7 @@ License
#include "blockEdge.H" #include "blockEdge.H"
#include "blockVertex.H" #include "blockVertex.H"
#include "polyLine.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -104,32 +105,22 @@ Foam::autoPtr<Foam::blockEdge> Foam::blockEdge::New
} }
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::pointField Foam::blockEdge::appendEndPoints Foam::pointField Foam::blockEdge::appendEndPoints
( (
const pointField& points, const pointField& pts,
const label start, const label start,
const label end, const label end,
const pointField& otherKnots const pointField& intermediate
) )
{ {
pointField allKnots(otherKnots.size() + 2); return pointField(polyLine::concat(pts[start], intermediate, pts[end]));
// Start/end knots
allKnots[0] = points[start];
allKnots[otherKnots.size() + 1] = points[end];
// Intermediate knots
forAll(otherKnots, knotI)
{
allKnots[knotI+1] = otherKnots[knotI];
}
return allKnots;
} }
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::tmp<Foam::pointField> Foam::tmp<Foam::pointField>
Foam::blockEdge::position(const scalarList& lambdas) const Foam::blockEdge::position(const scalarList& lambdas) const
{ {

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -24,6 +24,12 @@ License
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Namespace
Foam::blockEdges
Description
A namespace for various blockEdge types.
Class Class
Foam::blockEdge Foam::blockEdge
@ -46,13 +52,10 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward declaration of friend functions and operators // Forward Declarations
class blockEdge; class blockEdge;
Ostream& operator<<(Ostream&, const blockEdge&); Ostream& operator<<(Ostream&, const blockEdge&);
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class blockEdge Declaration Class blockEdge Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -61,24 +64,29 @@ class blockEdge
{ {
protected: protected:
// Protected data // Protected Data
//- The referenced point field
const pointField& points_; const pointField& points_;
//- Index of the start point
const label start_; const label start_;
//- Index of the end point
const label end_; const label end_;
// Protected Member Functions // Protected Member Functions
//- Return a complete point field by appending the start/end points //- Return a complete point field by appending the start/end points
// to the given list //- to the given list
// \deprecated(2020-10) use polyLine::concat
static pointField appendEndPoints static pointField appendEndPoints
( (
const pointField&, const pointField& points, //!< Referenced point field
const label start, const label start, //!< Start point in referenced point field
const label end, const label end, //!< End point in referenced point field
const pointField& otherKnots const pointField& intermediate //!< Intermediate points (knots)
); );
@ -110,18 +118,18 @@ public:
//- Construct from components //- Construct from components
blockEdge blockEdge
( (
const pointField& points, const pointField& points, //!< Referenced point field
const label start, const label start, //!< Start point in referenced point field
const label end const label end //!< End point in referenced point field
); );
//- Construct from Istream setting pointsList //- Construct from Istream and point field.
blockEdge blockEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const pointField&, const pointField& points, //!< Referenced point field
Istream& Istream& is
); );
//- Clone function //- Clone function
@ -133,8 +141,8 @@ public:
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField&, const pointField& points,
Istream& Istream& is
); );
//- Class used for the read-construction of //- Class used for the read-construction of
@ -174,10 +182,10 @@ public:
// Member Functions // Member Functions
//- Return label of start point //- Index of start point
inline label start() const; inline label start() const;
//- Return label of end point //- Index of end point
inline label end() const; inline label end() const;
//- Compare the given start and end points with this curve //- Compare the given start and end points with this curve
@ -201,22 +209,22 @@ public:
// - -1: same edge, but different orientation // - -1: same edge, but different orientation
inline int compare(const label start, const label end) const; inline int compare(const label start, const label end) const;
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual point position(const scalar) const = 0; virtual point position(const scalar) const = 0;
//- Return the point positions corresponding to the curve parameters //- The point positions corresponding to the curve parameters
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual tmp<pointField> position(const scalarList&) const; virtual tmp<pointField> position(const scalarList&) const;
//- Return the length of the curve //- The length of the curve
virtual scalar length() const = 0; virtual scalar length() const = 0;
//- Write edge with variable backsubstitution //- Write edge with variable backsubstitution
void write(Ostream&, const dictionary&) const; void write(Ostream&, const dictionary&) const;
// Ostream operator // Ostream Operator
friend Ostream& operator<<(Ostream&, const blockEdge&); friend Ostream& operator<<(Ostream&, const blockEdge&);
}; };

View File

@ -49,10 +49,8 @@ inline int Foam::blockEdge::compare(const label start, const label end) const
{ {
return -1; return -1;
} }
else
{ return 0;
return 0;
}
} }

View File

@ -6,6 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -46,6 +47,7 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward Declarations
class blockEdge; class blockEdge;
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
@ -54,7 +56,7 @@ class blockEdge;
class lineDivide class lineDivide
{ {
// Private data // Private Data
pointField points_; pointField points_;
@ -67,18 +69,18 @@ public:
//- Construct from components //- Construct from components
lineDivide lineDivide
( (
const blockEdge&, const blockEdge& cedge,
const label ndiv, const label nDiv,
const gradingDescriptors& gd = gradingDescriptors() const gradingDescriptors& gd = gradingDescriptors()
); );
// Member Functions // Member Functions
//- Return the points //- The points
const pointField& points() const; const pointField& points() const;
//- Return the list of lambda values //- The list of lambda values
const scalarList& lambdaDivisions() const; const scalarList& lambdaDivisions() const;
}; };

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -71,11 +71,21 @@ Foam::blockEdges::lineEdge::lineEdge
Foam::point Foam::blockEdges::lineEdge::position(const scalar lambda) const Foam::point Foam::blockEdges::lineEdge::position(const scalar lambda) const
{ {
if (lambda < -SMALL || lambda > 1+SMALL) #ifdef FULLDEBUG
if (lambda < -SMALL || lambda > 1 + SMALL)
{ {
FatalErrorInFunction WarningInFunction
<< "Parameter out of range, lambda = " << lambda << "Parameter out of range, lambda = " << lambda << nl;
<< abort(FatalError); }
#endif
if (lambda < SMALL)
{
return points_[start_];
}
else if (lambda >= 1 - SMALL)
{
return points_[end_];
} }
return points_[start_] + lambda * (points_[end_] - points_[start_]); return points_[start_] + lambda * (points_[end_] - points_[start_]);

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -51,12 +51,10 @@ namespace blockEdges
Class lineEdge Declaration Class lineEdge Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class lineEdge class lineEdge
: :
public blockEdge public blockEdge
{ {
public: public:
//- Runtime type information //- Runtime type information
@ -66,15 +64,20 @@ public:
// Constructors // Constructors
//- Construct from components //- Construct from components
lineEdge(const pointField&, const label start, const label end); lineEdge
(
const pointField& points, //!< Referenced point field
const label start, //!< Start point in referenced point field
const label end //!< End point in referenced point field
);
//- Construct from Istream with a pointField //- Construct from Istream and point field.
lineEdge lineEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField&, const pointField& points, //!< Referenced point field
Istream& is Istream& is
); );
@ -85,11 +88,11 @@ public:
// Member Functions // Member Functions
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
point position(const scalar) const; point position(const scalar) const;
//- Return the length of the curve //- The length of the curve
scalar length() const; scalar length() const;
}; };

View File

@ -6,6 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -26,16 +27,41 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "polyLine.H" #include "polyLine.H"
#include "SubList.H"
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::tmp<Foam::pointField> Foam::polyLine::concat
(
const point& p0,
const pointField& intermediate,
const point& p1
)
{
auto tresult = tmp<pointField>::New(intermediate.size() + 2);
auto& result = tresult.ref();
// Intermediate points (knots)
SubList<point>(result, intermediate.size(), 1) = intermediate;
// Start/end points (knots)
result.first() = p0;
result.last() = p1;
return tresult;
}
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::polyLine::calcParam() void Foam::polyLine::calcParam()
{ {
param_.setSize(points_.size()); lineLength_ = 0;
param_.resize(points_.size());
if (param_.size()) if (param_.size())
{ {
param_[0] = 0.0; param_[0] = 0;
for (label i=1; i < param_.size(); i++) for (label i=1; i < param_.size(); i++)
{ {
@ -48,23 +74,34 @@ void Foam::polyLine::calcParam()
{ {
param_[i] /= lineLength_; param_[i] /= lineLength_;
} }
param_.last() = 1.0; param_.last() = 1;
}
else
{
lineLength_ = 0.0;
} }
} }
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::polyLine::polyLine(const pointField& ps, const bool) Foam::polyLine::polyLine(const pointField& ps, const bool)
: :
points_(ps), points_(ps),
lineLength_(0.0), lineLength_(0),
param_(0) param_()
{
calcParam();
}
Foam::polyLine::polyLine
(
const point& start,
const pointField& intermediate,
const point& end,
const bool
)
:
points_(polyLine::concat(start, intermediate, end)),
lineLength_(0),
param_()
{ {
calcParam(); calcParam();
} }
@ -101,19 +138,20 @@ Foam::label Foam::polyLine::localParameter(scalar& lambda) const
// Search table of cumulative distances to find which line-segment // Search table of cumulative distances to find which line-segment
// we are on. // we are on.
// Check the upper bound. // Check the upper bound.
// Too small to bother with a binary search...
label segmentI = 1; label segment = 1;
while (param_[segmentI] < lambda) while (param_[segment] < lambda)
{ {
segmentI++; ++segment;
} }
segmentI--; // We want the corresponding lower bound --segment; // We want the corresponding lower bound
// The local parameter [0-1] on this line segment // The local parameter [0-1] on this line segment
lambda = lambda =
(lambda - param_[segmentI])/(param_[segmentI+1] - param_[segmentI]); (lambda - param_[segment])/(param_[segment+1] - param_[segment]);
return segmentI; return segment;
} }
@ -151,8 +189,8 @@ Foam::point Foam::polyLine::position
return points_.last(); return points_.last();
} }
const point& p0 = points()[segment]; const point& p0 = points_[segment];
const point& p1 = points()[segment+1]; const point& p1 = points_[segment+1];
// Special cases - no calculation needed // Special cases - no calculation needed
if (mu <= 0.0) if (mu <= 0.0)
@ -163,11 +201,9 @@ Foam::point Foam::polyLine::position
{ {
return p1; return p1;
} }
else
{ // Linear interpolation
// Linear interpolation return points_[segment] + mu*(p1 - p0);
return points_[segment] + mu*(p1 - p0);
}
} }

View File

@ -6,6 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -52,26 +53,16 @@ namespace Foam
Class polyLine Declaration Class polyLine Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class polyLine class polyLine
{ {
// Private Member Functions
//- No copy construct
polyLine(const polyLine&) = delete;
//- No copy assignment
void operator=(const polyLine&) = delete;
protected: protected:
// Protected data // Protected Data
//- The control points or ends of each segments //- The control points or ends of each segments
pointField points_; pointField points_;
//- The real line length //- The real (total) line length
scalar lineLength_; scalar lineLength_;
//- The rational (0-1) cumulative parameter value for each point //- The rational (0-1) cumulative parameter value for each point
@ -81,11 +72,11 @@ protected:
// Protected Member Functions // Protected Member Functions
//- Precalculate the rational cumulative parameter value //- Precalculate the rational cumulative parameter value
// and the line-length //- and the line-length
void calcParam(); void calcParam();
//- Return the line segment and the local parameter [0..1] //- Return the line segment and the local parameter [0..1]
// corresponding to the global lambda [0..1] //- corresponding to the global lambda [0..1]
label localParameter(scalar& lambda) const; label localParameter(scalar& lambda) const;
@ -94,30 +85,50 @@ public:
// Constructors // Constructors
//- Construct from components //- Construct from components
explicit polyLine
(
const pointField& points, //!< The poly-line points
const bool notImplementedClosed = false
);
//- Construct from begin, intermediate, end points
polyLine polyLine
( (
const pointField&, const point& start, //!< The start point
const pointField& intermediate, //!< The intermediate points
const point& end, //!< The end point
const bool notImplementedClosed = false const bool notImplementedClosed = false
); );
// Static Member Functions
//- Concatenate begin, intermediate and end points
static tmp<pointField> concat
(
const point& start, //!< The start point
const pointField& intermediate, //!< The intermediate points
const point& end //!< The end point
);
// Member Functions // Member Functions
//- Return const-access to the control-points //- Return const-access to the control-points
const pointField& points() const; const pointField& points() const;
//- Return the number of line segments //- The number of line segments
label nSegments() const; label nSegments() const;
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
point position(const scalar) const; point position(const scalar) const;
//- Return the point position corresponding to the local parameter //- The point position corresponding to the local parameter
// 0 <= lambda <= 1 on the given segment // 0 <= lambda <= 1 on the given segment
point position(const label segment, const scalar) const; point position(const label segment, const scalar) const;
//- Return the length of the curve //- The length of the curve
scalar length() const; scalar length() const;
}; };

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -48,11 +48,11 @@ Foam::blockEdges::polyLineEdge::polyLineEdge
const pointField& ps, const pointField& ps,
const label start, const label start,
const label end, const label end,
const pointField& otherPoints const pointField& intermediate
) )
: :
blockEdge(ps, start, end), blockEdge(ps, start, end),
polyLine(appendEndPoints(ps, start_, end_, otherPoints)) polyLine(ps[start_], intermediate, ps[end_])
{} {}
@ -66,7 +66,7 @@ Foam::blockEdges::polyLineEdge::polyLineEdge
) )
: :
blockEdge(dict, index, ps, is), blockEdge(dict, index, ps, is),
polyLine(appendEndPoints(ps, start_, end_, pointField(is))) polyLine(ps[start_], pointField(is), ps[end_])
{} {}

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -77,19 +77,19 @@ public:
//- Construct from components //- Construct from components
polyLineEdge polyLineEdge
( (
const pointField&, const pointField& points, //!< Referenced point field
const label start, const label start, //!< Start point in referenced point field
const label end, const label end, //!< End point in referenced point field
const pointField& otherPoints const pointField& intermediate //!< The intermediate points
); );
//- Construct from Istream //- Construct from Istream and point field.
polyLineEdge polyLineEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField&, const pointField& points, //!< Referenced point field
Istream& is Istream& is
); );
@ -100,11 +100,11 @@ public:
// Member Functions // Member Functions
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
point position(const scalar lambda) const; point position(const scalar lambda) const;
//- Return the length of the curve //- The length of the curve
scalar length() const; scalar length() const;
}; };

View File

@ -59,7 +59,7 @@ Foam::projectCurveEdge::projectCurveEdge
geometry_(geometry) geometry_(geometry)
{ {
wordList names(is); wordList names(is);
surfaces_.setSize(names.size()); surfaces_.resize(names.size());
forAll(names, i) forAll(names, i)
{ {
surfaces_[i] = geometry_.findSurfaceID(names[i]); surfaces_[i] = geometry_.findSurfaceID(names[i]);
@ -83,6 +83,14 @@ Foam::projectCurveEdge::projectCurveEdge
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::point
Foam::projectCurveEdge::position(const scalar) const
{
NotImplemented;
return point::max;
}
Foam::tmp<Foam::pointField> Foam::tmp<Foam::pointField>
Foam::projectCurveEdge::position(const scalarList& lambdas) const Foam::projectCurveEdge::position(const scalarList& lambdas) const
{ {
@ -101,8 +109,8 @@ Foam::projectCurveEdge::position(const scalarList& lambdas) const
} }
tmp<pointField> tpoints(new pointField(lambdas.size())); auto tpoints = tmp<pointField>::New(lambdas.size());
pointField& points = tpoints.ref(); auto& points = tpoints.ref();
const point& startPt = points_[start_]; const point& startPt = points_[start_];
const point& endPt = points_[end_]; const point& endPt = points_[end_];
@ -149,10 +157,11 @@ Foam::projectCurveEdge::position(const scalarList& lambdas) const
// Upper limit for number of iterations // Upper limit for number of iterations
const label maxIter = 10; constexpr label maxIter = 10;
// Residual tolerance // Residual tolerance
const scalar relTol = 0.1; constexpr scalar relTol = 0.1;
const scalar absTol = 1e-4; constexpr scalar absTol = 1e-4;
scalar initialResidual = 0.0; scalar initialResidual = 0.0;
@ -258,4 +267,11 @@ Foam::projectCurveEdge::position(const scalarList& lambdas) const
} }
Foam::scalar Foam::projectCurveEdge::length() const
{
NotImplemented;
return 1;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2016 OpenFOAM Foundation Copyright (C) 2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -46,6 +46,7 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward Declarations
class pointConstraint; class pointConstraint;
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
@ -81,13 +82,13 @@ public:
// Constructors // Constructors
//- Construct from Istream setting pointsList //- Construct from Istream and point field.
projectCurveEdge projectCurveEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField& points, const pointField& points, //!< Referenced point field
Istream& is Istream& is
); );
@ -98,24 +99,18 @@ public:
// Member Functions // Member Functions
//- Return the point positions corresponding to the curve parameters //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual point position(const scalar) const // \note NotImplemented
{ virtual point position(const scalar) const;
NotImplemented;
return point::max;
}
//- Return the point positions corresponding to the curve parameters //- The point positions corresponding to the curve parameters
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual tmp<pointField> position(const scalarList&) const; virtual tmp<pointField> position(const scalarList&) const;
//- Return the length of the curve //- The length of the curve
virtual scalar length() const // \note NotImplemented
{ virtual scalar length() const;
NotImplemented;
return 1;
}
}; };

View File

@ -26,13 +26,12 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "searchableSurfacesQueries.H"
#include "projectEdge.H" #include "projectEdge.H"
#include "unitConversion.H"
#include "addToRunTimeSelectionTable.H"
#include "pointConstraint.H" #include "pointConstraint.H"
#include "searchableSurfacesQueries.H"
#include "OBJstream.H" #include "OBJstream.H"
#include "linearInterpolationWeights.H" #include "linearInterpolationWeights.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -146,8 +145,8 @@ Foam::projectEdge::position(const scalarList& lambdas) const
} }
tmp<pointField> tpoints(new pointField(lambdas.size())); auto tpoints = tmp<pointField>::New(lambdas.size());
pointField& points = tpoints.ref(); auto& points = tpoints.ref();
const point& startPt = points_[start_]; const point& startPt = points_[start_];
const point& endPt = points_[end_]; const point& endPt = points_[end_];
@ -161,10 +160,11 @@ Foam::projectEdge::position(const scalarList& lambdas) const
// Upper limit for number of iterations // Upper limit for number of iterations
const label maxIter = 10; constexpr label maxIter = 10;
// Residual tolerance // Residual tolerance
const scalar relTol = 0.1; constexpr scalar relTol = 0.1;
const scalar absTol = 1e-4; constexpr scalar absTol = 1e-4;
scalar initialResidual = 0.0; scalar initialResidual = 0.0;
@ -270,4 +270,11 @@ Foam::projectEdge::position(const scalarList& lambdas) const
} }
Foam::scalar Foam::projectEdge::length() const
{
NotImplemented;
return 1;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2016 OpenFOAM Foundation Copyright (C) 2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -46,6 +46,7 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward Declarations
class pointConstraint; class pointConstraint;
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
@ -84,13 +85,13 @@ public:
// Constructors // Constructors
//- Construct from Istream setting pointsList //- Construct from Istream and point field.
projectEdge projectEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField& points, const pointField& points, //!< Referenced point field
Istream& is Istream& is
); );
@ -101,20 +102,17 @@ public:
// Member Functions // Member Functions
//- Return the point positions corresponding to the curve parameters //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual point position(const scalar) const; virtual point position(const scalar) const;
//- Return the point positions corresponding to the curve parameters //- The point positions corresponding to the curve parameters
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual tmp<pointField> position(const scalarList&) const; virtual tmp<pointField> position(const scalarList&) const;
//- Return the length of the curve //- The length of the edge
virtual scalar length() const // \note NotImplemented
{ virtual scalar length() const;
NotImplemented;
return 1;
}
}; };

View File

@ -134,7 +134,7 @@ Foam::point Foam::CatmullRomSpline::position
Foam::scalar Foam::CatmullRomSpline::length() const Foam::scalar Foam::CatmullRomSpline::length() const
{ {
NotImplemented; NotImplemented;
return 1.0; return 1;
} }

View File

@ -6,6 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -79,21 +80,12 @@ class CatmullRomSpline
: :
public polyLine public polyLine
{ {
// Private Member Functions
//- No copy construct
CatmullRomSpline(const CatmullRomSpline&) = delete;
//- No copy assignment
void operator=(const CatmullRomSpline&) = delete;
public: public:
// Constructors // Constructors
//- Construct from components //- Construct from components
CatmullRomSpline explicit CatmullRomSpline
( (
const pointField& knots, const pointField& knots,
const bool notImplementedClosed = false const bool notImplementedClosed = false
@ -102,15 +94,16 @@ public:
// Member Functions // Member Functions
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
point position(const scalar lambda) const; point position(const scalar lambda) const;
//- Return the point position corresponding to the local parameter //- The point position corresponding to the local parameter
// 0 <= lambda <= 1 on the given segment // 0 <= lambda <= 1 on the given segment
point position(const label segment, const scalar lambda) const; point position(const label segment, const scalar lambda) const;
//- Return the length of the curve //- The length of the curve
// \note NotImplemented
scalar length() const; scalar length() const;
}; };

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -27,9 +27,9 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "splineEdge.H" #include "splineEdge.H"
#include "polyLine.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam namespace Foam
@ -59,7 +59,10 @@ Foam::blockEdges::splineEdge::splineEdge
) )
: :
blockEdge(points, start, end), blockEdge(points, start, end),
CatmullRomSpline(appendEndPoints(points, start, end, internalPoints)) CatmullRomSpline
(
polyLine::concat(points[start_], internalPoints, points[end_])
)
{} {}
@ -73,13 +76,16 @@ Foam::blockEdges::splineEdge::splineEdge
) )
: :
blockEdge(dict, index, points, is), blockEdge(dict, index, points, is),
CatmullRomSpline(appendEndPoints(points, start_, end_, pointField(is))) CatmullRomSpline
(
polyLine::concat(points[start_], pointField(is), points[end_])
)
{ {
token t(is); token tok(is);
is.putBack(t); is.putBack(tok);
// discard unused start/end tangents // Discard unused start/end tangents
if (t == token::BEGIN_LIST) if (tok == token::BEGIN_LIST)
{ {
vector tangent0Ignored(is); vector tangent0Ignored(is);
vector tangent1Ignored(is); vector tangent1Ignored(is);

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd. Copyright (C) 2019-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -30,6 +30,10 @@ Class
Description Description
A blockEdge interface for Catmull-Rom splines. A blockEdge interface for Catmull-Rom splines.
See also
BSpline
CatmullRomSpline
SourceFiles SourceFiles
splineEdge.C splineEdge.C
@ -77,19 +81,19 @@ public:
//- Construct from components //- Construct from components
splineEdge splineEdge
( (
const pointField&, const pointField& points, //!< Referenced point field
const label start, const label start, //!< Start point in referenced point field
const label end, const label end, //!< End point in referenced point field
const pointField& internalPoints const pointField& internalPoints
); );
//- Construct from Istream, setting pointsList //- Construct from Istream and point field.
splineEdge splineEdge
( (
const dictionary& dict, const dictionary& dict,
const label index, const label index,
const searchableSurfaces& geometry, const searchableSurfaces& geometry,
const pointField&, const pointField& points, //!< Referenced point field
Istream& Istream&
); );
@ -100,11 +104,12 @@ public:
// Member Functions // Member Functions
//- Return the point position corresponding to the curve parameter //- The point position corresponding to the curve parameter
// 0 <= lambda <= 1 // 0 <= lambda <= 1
virtual point position(const scalar) const; virtual point position(const scalar) const;
//- Return the length of the spline curve (not implemented) //- The length of the spline curve
// \note NotImplemented
virtual scalar length() const; virtual scalar length() const;
}; };