30 template<
class Derived>
44 template<
class Derived>
55 template<
class Derived>
58 const Derived& derived =
static_cast<const Derived&
>(*this);
61 if (
lambda <= 0)
return start();
62 if (
lambda >= 1)
return end();
65 auto evaluatePoint = [&derived](
const scalar&
lambda)
67 const scalar l =
lambda*derived.nSegments();
68 const label segmenti = floor(l);
69 const scalar segmentLambda = l - segmenti;
70 return derived.position(segmenti, segmentLambda);
74 scalar lambdaStar =
lambda;
75 scalar
error = vGreat;
76 for (
label iter = 0;
error > tol_ && iter < nIter_; ++ iter)
79 const point p = evaluatePoint(lambdaStar);
82 const scalar dist0 =
mag(
p - start());
83 const scalar dist1 =
mag(
p - end());
84 const scalar lambdaDist = dist0/(dist0 + dist1);
91 const scalar lambdaStar0 =
lambda < lambdaDist ? 0 : lambdaStar;
92 const scalar lambdaStar1 =
lambda < lambdaDist ? lambdaStar : 1;
93 const scalar lambdaDist0 =
lambda < lambdaDist ? 0 : lambdaDist;
94 const scalar lambdaDist1 =
lambda < lambdaDist ? lambdaDist : 1;
96 (
lambda - lambdaDist0)/
max(lambdaDist1 - lambdaDist0, vSmall);
97 lambdaStar = (1 -
x)*lambdaStar0 +
x*lambdaStar1;
101 return evaluatePoint(lambdaStar);
105 template<
class Derived>
111 const Derived& derived =
static_cast<const Derived&
>(*this);
135 const scalar l = lambdas[i]*derived.nSegments();
136 const label segmenti = floor(l);
137 const scalar segmentLambda = l - segmenti;
138 points[i] = derived.position(segmenti, segmentLambda);
143 scalar
error = vGreat;
144 for (
label iter = 0;
error > tol_ && iter < nIter_; ++ iter)
150 evaluatePoints(lambdasStar);
155 for (
label i = 1; i <
n; ++ i)
172 for (
label i = 0; i <=
n; ++ i)
174 const scalar lambdaStar0 = i == 0 ? 0 : lambdasStar[i - 1];
175 const scalar lambdaStar1 = i <
n ? lambdasStar[i] : 1;
177 const scalar lambdaDist0 = i == 0 ? 0 : lambdasDist[i - 1];
178 const scalar lambdaDist1 = i <
n ? lambdasDist[i] : 1;
180 while (iNew <
n && lambdas[iNew] <= lambdaDist1)
183 (lambdas[iNew] - lambdaDist0)
184 /
max(lambdaDist1 - lambdaDist0, vSmall);
186 lambdasStarNew[iNew] = (1 -
x)*lambdaStar0 +
x*lambdaStar1;
193 Swap(tlambdasStar, tlambdasStarNew);
197 evaluatePoints(tlambdasStar());
#define forAll(list, i)
Loop across all elements in list.
void size(const label)
Override size to be inconsistent with allocated storage.
point position(const scalar lambda) const
Return the point position corresponding to the curve parameter.
Spline(const pointField &knots, const scalar tol, const label nIter)
Construct from components.
T & first()
Return the first element of the list.
T & last()
Return the last element of the list.
Class to handle errors and exceptions in a simple, consistent stream-based manner.
A class for managing temporary objects.
T & ref() const
Return non-const reference or generate a fatal error.
dimensionedScalar lambda(viscosity->lookup("lambda"))
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
vectorField pointField
pointField is a vectorField.
void mag(LagrangianPatchField< scalar > &f, const LagrangianPatchField< Type > &f1)
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)