3.2-git
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Dumux::FixedLengthSpline_< ScalarT, nSamples > Class Template Reference

The common code for all 3rd order polynomial splines with more than two sampling points. More...

#include <dumux/common/fixedlengthspline_.hh>

Inheritance diagram for Dumux::FixedLengthSpline_< ScalarT, nSamples >:
Inheritance graph

Description

template<class ScalarT, int nSamples>
class Dumux::FixedLengthSpline_< ScalarT, nSamples >

The common code for all 3rd order polynomial splines with more than two sampling points.

Public Member Functions

int numSamples () const
 Returns the number of sampling points. More...
 
template<class ScalarArrayX , class ScalarArrayY >
void setXYArrays (int numberSamples, const ScalarArrayX &x, const ScalarArrayY &y, Scalar m0, Scalar m1)
 Set the sampling points and the boundary slopes of a full spline using C-style arrays. More...
 
template<class ScalarContainerX , class ScalarContainerY >
void setXYContainers (const ScalarContainerX &x, const ScalarContainerY &y, Scalar m0, Scalar m1)
 Set the sampling points and the boundary slopes of a full spline using STL-compatible containers. More...
 
template<class PointArray >
void setArrayOfPoints (int numberSamples, const PointArray &points, Scalar m0, Scalar m1)
 Set the sampling points and the boundary slopes of a full spline using a C-style array. More...
 
template<class XYContainer >
void setContainerOfPoints (const XYContainer &points, Scalar m0, Scalar m1)
 Set the sampling points and the boundary slopes of a full spline using a STL-compatible container of array-like objects. More...
 
template<class XYContainer >
void setContainerOfTuples (const XYContainer &points, Scalar m0, Scalar m1)
 Set the sampling points and the boundary slopes of a full spline using a STL-compatible container of tuple-like objects. More...
 
template<class ScalarArrayX , class ScalarArrayY >
void setXYArrays (int numberSamples, const ScalarArrayX &x, const ScalarArrayY &y)
 Set the sampling points natural spline using C-style arrays. More...
 
template<class ScalarContainerX , class ScalarContainerY >
void setXYContainers (const ScalarContainerX &x, const ScalarContainerY &y)
 Set the sampling points of a natural spline using STL-compatible containers. More...
 
template<class PointArray >
void setArrayOfPoints (int numberSamples, const PointArray &points)
 Set the sampling points of a natural spline using a C-style array. More...
 
template<class XYContainer >
void setContainerOfPoints (const XYContainer &points)
 Set the sampling points of a natural spline using a STL-compatible container of array-like objects. More...
 
template<class XYContainer >
void setContainerOfTuples (const XYContainer &points)
 Set the sampling points of a natural spline using a STL-compatible container of tuple-like objects. More...
 
bool applies (Scalar x) const
 Return true if the given x is in range [x1, xn]. More...
 
Scalar xMin () const
 Return the x value of the leftmost sampling point. More...
 
Scalar xMax () const
 Return the x value of the rightmost sampling point. More...
 
void printCSV (Scalar xi0, Scalar xi1, int k) const
 Prints k tuples of the format (x, y, dx/dy, isMonotonic) to stdout. More...
 
Scalar eval (Scalar x, bool extrapolate=false) const
 Evaluate the spline at a given position. More...
 
Scalar evalDerivative (Scalar x, bool extrapolate=false) const
 Evaluate the spline's derivative at a given position. More...
 
Scalar intersect (Scalar a, Scalar b, Scalar c, Scalar d) const
 Find the intersections of the spline with a cubic polynomial in the whole intervall, throws Dune::MathError exception if there is more or less than one solution. More...
 
Scalar intersectInterval (Scalar x0, Scalar x1, Scalar a, Scalar b, Scalar c, Scalar d) const
 Find the intersections of the spline with a cubic polynomial in a sub-intervall of the spline, throws Dune::MathError exception if there is more or less than one solution. More...
 
int monotonic (Scalar x0, Scalar x1) const
 Returns 1 if the spline is monotonically increasing, -1 if the spline is mononously decreasing and 0 if the spline is not monotonous in the interval (x0, x1). More...
 
int monotonic () const
 Same as monotonic(x0, x1), but with the entire range of the spline as interval. More...
 

Protected Member Functions

 FixedLengthSpline_ ()
 
void makeFullSpline_ (Scalar m0, Scalar m1)
 Create a full spline from the already set sampling points. More...
 
void makeNaturalSpline_ ()
 Create a natural spline from the already set sampling points. More...
 
Scalar x_ (int i) const
 Returns the x coordinate of the i-th sampling point. More...
 
Scalar y_ (int i) const
 Returns the y coordinate of the i-th sampling point. More...
 
Scalar moment_ (int i) const
 Returns the moment (i.e. second derivative) of the spline at the i-th sampling point. More...
 
void assignSamplingPoints_ (DestVector &destX, DestVector &destY, const SourceVector &srcX, const SourceVector &srcY, int numSamples)
 Set the sampling point vectors. More...
 
void assignFromArrayList_ (DestVector &destX, DestVector &destY, const ListIterator &srcBegin, const ListIterator &srcEnd, int numSamples)
 
void assignFromTupleList_ (DestVector &destX, DestVector &destY, ListIterator srcBegin, ListIterator srcEnd, int numSamples)
 Set the sampling points. More...
 
void makePeriodicSystem_ (Matrix &M, Vector &d)
 Make the linear system of equations Mx = d which results in the moments of the periodic spline. More...
 
void makeFullSystem_ (Matrix &M, Vector &d, Scalar m0, Scalar m1)
 Make the linear system of equations Mx = d which results in the moments of the full spline. More...
 
void makeNaturalSystem_ (Matrix &M, Vector &d)
 Make the linear system of equations Mx = d which results in the moments of the natural spline. Stoer 2005: Numerische Mathematik 1, p. 111 [61]. More...
 
Scalar eval_ (Scalar x, int i) const
 
Scalar evalDerivative_ (Scalar x, int i) const
 
int monotonic_ (int i, Scalar x0, Scalar x1) const
 
int intersectSegment_ (Scalar *sol, int segIdx, Scalar a, Scalar b, Scalar c, Scalar d, Scalar x0=-1e100, Scalar x1=1e100) const
 Find all the intersections of a segment of the spline with a cubic polynomial within a specified interval. More...
 
int segmentIdx_ (Scalar x) const
 
Scalar h_ (int i) const
 Returns x[i] - x[i - 1]. More...
 
Scalar a_ (int i) const
 
Scalar b_ (int i) const
 
Scalar c_ (int i) const
 
Scalar d_ (int i) const
 
int numSamples_ () const
 Returns the number of sampling points. More...
 

Protected Attributes

Vector xPos_
 
Vector yPos_
 
BlockVector m_
 

Constructor & Destructor Documentation

◆ FixedLengthSpline_()

template<class ScalarT , int nSamples>
Dumux::FixedLengthSpline_< ScalarT, nSamples >::FixedLengthSpline_ ( )
inlineprotected

Member Function Documentation

◆ a_()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::a_ ( int  i) const
inlineprotectedinherited

◆ applies()

bool Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::applies ( Scalar  x) const
inlineinherited

Return true if the given x is in range [x1, xn].

◆ assignFromArrayList_()

void Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::assignFromArrayList_ ( DestVector &  destX,
DestVector &  destY,
const ListIterator &  srcBegin,
const ListIterator &  srcEnd,
int  numSamples 
)
inlineprotectedinherited

◆ assignFromTupleList_()

void Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::assignFromTupleList_ ( DestVector &  destX,
DestVector &  destY,
ListIterator  srcBegin,
ListIterator  srcEnd,
int  numSamples 
)
inlineprotectedinherited

Set the sampling points.

Here we assume that the elements of the source vector have an [] operator where v[0] is the x value and v[1] is the y value if the sampling point.

◆ assignSamplingPoints_()

void Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::assignSamplingPoints_ ( DestVector &  destX,
DestVector &  destY,
const SourceVector &  srcX,
const SourceVector &  srcY,
int  numSamples 
)
inlineprotectedinherited

Set the sampling point vectors.

This takes care that the order of the x-values is ascending, although the input must be ordered already!

◆ b_()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::b_ ( int  i) const
inlineprotectedinherited

◆ c_()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::c_ ( int  i) const
inlineprotectedinherited

◆ d_()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::d_ ( int  i) const
inlineprotectedinherited

◆ eval()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::eval ( Scalar  x,
bool  extrapolate = false 
) const
inlineinherited

Evaluate the spline at a given position.

Parameters
xThe value on the abscissa where the spline ought to be evaluated
extrapolateIf this parameter is set to true, the spline will be extended beyond its range by straight lines, if false calling extrapolate for \( x \not [x_{min}, x_{max}]\) will cause a failed assertation.

◆ eval_()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::eval_ ( Scalar  x,
int  i 
) const
inlineprotectedinherited

◆ evalDerivative()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::evalDerivative ( Scalar  x,
bool  extrapolate = false 
) const
inlineinherited

Evaluate the spline's derivative at a given position.

Parameters
xThe value on the abscissa where the spline's derivative ought to be evaluated
extrapolateIf this parameter is set to true, the spline will be extended beyond its range by straight lines, if false calling extrapolate for \( x \not [x_{min}, x_{max}]\) will cause a failed assertation.

◆ evalDerivative_()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::evalDerivative_ ( Scalar  x,
int  i 
) const
inlineprotectedinherited

◆ h_()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::h_ ( int  i) const
inlineprotectedinherited

Returns x[i] - x[i - 1].

◆ intersect()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::intersect ( Scalar  a,
Scalar  b,
Scalar  c,
Scalar  d 
) const
inlineinherited

Find the intersections of the spline with a cubic polynomial in the whole intervall, throws Dune::MathError exception if there is more or less than one solution.

◆ intersectInterval()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::intersectInterval ( Scalar  x0,
Scalar  x1,
Scalar  a,
Scalar  b,
Scalar  c,
Scalar  d 
) const
inlineinherited

Find the intersections of the spline with a cubic polynomial in a sub-intervall of the spline, throws Dune::MathError exception if there is more or less than one solution.

◆ intersectSegment_()

int Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::intersectSegment_ ( Scalar *  sol,
int  segIdx,
Scalar  a,
Scalar  b,
Scalar  c,
Scalar  d,
Scalar  x0 = -1e100,
Scalar  x1 = 1e100 
) const
inlineprotectedinherited

Find all the intersections of a segment of the spline with a cubic polynomial within a specified interval.

◆ makeFullSpline_()

template<class ScalarT , int nSamples>
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::makeFullSpline_ ( Scalar  m0,
Scalar  m1 
)
inlineprotected

Create a full spline from the already set sampling points.

Also creates temporary matrix and right hand side vector.

◆ makeFullSystem_()

void Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::makeFullSystem_ ( Matrix &  M,
Vector &  d,
Scalar  m0,
Scalar  m1 
)
inlineprotectedinherited

Make the linear system of equations Mx = d which results in the moments of the full spline.

◆ makeNaturalSpline_()

template<class ScalarT , int nSamples>
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::makeNaturalSpline_ ( )
inlineprotected

Create a natural spline from the already set sampling points.

Also creates temporary matrix and right hand side vector.

◆ makeNaturalSystem_()

void Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::makeNaturalSystem_ ( Matrix &  M,
Vector &  d 
)
inlineprotectedinherited

Make the linear system of equations Mx = d which results in the moments of the natural spline. Stoer 2005: Numerische Mathematik 1, p. 111 [61].

◆ makePeriodicSystem_()

void Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::makePeriodicSystem_ ( Matrix &  M,
Vector &  d 
)
inlineprotectedinherited

Make the linear system of equations Mx = d which results in the moments of the periodic spline.

When solving Mx = d, it should be noted that x[0] is trash and needs to be set to x[n-1]

◆ moment_()

template<class ScalarT , int nSamples>
Scalar Dumux::FixedLengthSpline_< ScalarT, nSamples >::moment_ ( int  i) const
inlineprotected

Returns the moment (i.e. second derivative) of the spline at the i-th sampling point.

◆ monotonic() [1/2]

int Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::monotonic ( ) const
inlineinherited

Same as monotonic(x0, x1), but with the entire range of the spline as interval.

◆ monotonic() [2/2]

int Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::monotonic ( Scalar  x0,
Scalar  x1 
) const
inlineinherited

Returns 1 if the spline is monotonically increasing, -1 if the spline is mononously decreasing and 0 if the spline is not monotonous in the interval (x0, x1).

In the corner case where the whole spline is flat, it returns 2.

◆ monotonic_()

int Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::monotonic_ ( int  i,
Scalar  x0,
Scalar  x1 
) const
inlineprotectedinherited

◆ numSamples()

template<class ScalarT , int nSamples>
int Dumux::FixedLengthSpline_< ScalarT, nSamples >::numSamples ( ) const
inline

Returns the number of sampling points.

◆ numSamples_()

int Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::numSamples_ ( ) const
inlineprotectedinherited

Returns the number of sampling points.

◆ printCSV()

void Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::printCSV ( Scalar  xi0,
Scalar  xi1,
int  k 
) const
inlineinherited

Prints k tuples of the format (x, y, dx/dy, isMonotonic) to stdout.

If the spline does not apply for parts of [x0, x1] it is extrapolated using a straight line. The result can be inspected using the following commands:

--------— snip --------— ./yourProgramm > spline.csv gnuplot

gnuplot> plot "spline.csv" using 1:2 w l ti "Curve", \ "spline.csv" using 1:3 w l ti "Derivative", \ "spline.csv" using 1:4 w p ti "Monotonic" --------— snap --------—

◆ segmentIdx_()

int Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::segmentIdx_ ( Scalar  x) const
inlineprotectedinherited

◆ setArrayOfPoints() [1/2]

template<class ScalarT , int nSamples>
template<class PointArray >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setArrayOfPoints ( int  numberSamples,
const PointArray &  points 
)
inline

Set the sampling points of a natural spline using a C-style array.

This method uses a single array of sampling points, which are seen as an array-like object which provides access to the X and Y coordinates. In this context 'array-like' means that an access to the members is provided via the [] operator. (e.g. C arrays, std::vector, std::array, etc.) The array containing the sampling points must be of size 'numberSamples' at least. Also, the number of sampling points must be larger than 1.

◆ setArrayOfPoints() [2/2]

template<class ScalarT , int nSamples>
template<class PointArray >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setArrayOfPoints ( int  numberSamples,
const PointArray &  points,
Scalar  m0,
Scalar  m1 
)
inline

Set the sampling points and the boundary slopes of a full spline using a C-style array.

This method uses a single array of sampling points, which are seen as an array-like object which provides access to the X and Y coordinates. In this context 'array-like' means that an access to the members is provided via the [] operator. (e.g. C arrays, std::vector, std::array, etc.) The array containing the sampling points must be of size 'numberSamples' at least. Also, the number of sampling points must be larger than 1.

◆ setContainerOfPoints() [1/2]

template<class ScalarT , int nSamples>
template<class XYContainer >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setContainerOfPoints ( const XYContainer &  points)
inline

Set the sampling points of a natural spline using a STL-compatible container of array-like objects.

This method uses a single STL-compatible container of sampling points, which are assumed to be array-like objects storing the X and Y coordinates. "STL-compatible" means that the container provides access to iterators using the begin(), end() methods and also provides a size() method. Also, the number of entries in the X and the Y containers must be equal and larger than 1.

◆ setContainerOfPoints() [2/2]

template<class ScalarT , int nSamples>
template<class XYContainer >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setContainerOfPoints ( const XYContainer &  points,
Scalar  m0,
Scalar  m1 
)
inline

Set the sampling points and the boundary slopes of a full spline using a STL-compatible container of array-like objects.

This method uses a single STL-compatible container of sampling points, which are assumed to be array-like objects storing the X and Y coordinates. "STL-compatible" means that the container provides access to iterators using the begin(), end() methods and also provides a size() method. Also, the number of entries in the X and the Y containers must be equal and larger than 1.

◆ setContainerOfTuples() [1/2]

template<class ScalarT , int nSamples>
template<class XYContainer >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setContainerOfTuples ( const XYContainer &  points)
inline

Set the sampling points of a natural spline using a STL-compatible container of tuple-like objects.

This method uses a single STL-compatible container of sampling points, which are assumed to be tuple-like objects storing the X and Y coordinates. "tuple-like" means that the objects provide access to the x values via std::get<0>(obj) and to the y value via std::get<1>(obj) (e.g. std::tuple or std::pair). "STL-compatible" means that the container provides access to iterators using the begin(), end() methods and also provides a size() method. Also, the number of entries in the X and the Y containers must be equal and larger than 1.

◆ setContainerOfTuples() [2/2]

template<class ScalarT , int nSamples>
template<class XYContainer >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setContainerOfTuples ( const XYContainer &  points,
Scalar  m0,
Scalar  m1 
)
inline

Set the sampling points and the boundary slopes of a full spline using a STL-compatible container of tuple-like objects.

This method uses a single STL-compatible container of sampling points, which are assumed to be tuple-like objects storing the X and Y coordinates. "tuple-like" means that the objects provide access to the x values via std::get<0>(obj) and to the y value via std::get<1>(obj) (e.g. std::tuple or std::pair). "STL-compatible" means that the container provides access to iterators using the begin(), end() methods and also provides a size() method. Also, the number of entries in the X and the Y containers must be equal and larger than 1.

◆ setXYArrays() [1/2]

template<class ScalarT , int nSamples>
template<class ScalarArrayX , class ScalarArrayY >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setXYArrays ( int  numberSamples,
const ScalarArrayX &  x,
const ScalarArrayY &  y 
)
inline

Set the sampling points natural spline using C-style arrays.

This method uses separate array-like objects for the values of the X and Y coordinates. In this context 'array-like' means that an access to the members is provided via the [] operator. (e.g. C arrays, std::vector, std::array, etc.) Each array must be of size 'numberSamples' at least. Also, the number of sampling points must be larger than 1.

◆ setXYArrays() [2/2]

template<class ScalarT , int nSamples>
template<class ScalarArrayX , class ScalarArrayY >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setXYArrays ( int  numberSamples,
const ScalarArrayX &  x,
const ScalarArrayY &  y,
Scalar  m0,
Scalar  m1 
)
inline

Set the sampling points and the boundary slopes of a full spline using C-style arrays.

This method uses separate array-like objects for the values of the X and Y coordinates. In this context 'array-like' means that an access to the members is provided via the [] operator. (e.g. C arrays, std::vector, std::array, etc.) Each array must be of size 'numberSamples' at least. Also, the number of sampling points must be larger than 1.

◆ setXYContainers() [1/2]

template<class ScalarT , int nSamples>
template<class ScalarContainerX , class ScalarContainerY >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setXYContainers ( const ScalarContainerX &  x,
const ScalarContainerY &  y 
)
inline

Set the sampling points of a natural spline using STL-compatible containers.

This method uses separate STL-compatible containers for the values of the sampling points' X and Y coordinates. "STL-compatible" means that the container provides access to iterators using the begin(), end() methods and also provides a size() method. Also, the number of entries in the X and the Y containers must be equal and larger than 1.

◆ setXYContainers() [2/2]

template<class ScalarT , int nSamples>
template<class ScalarContainerX , class ScalarContainerY >
void Dumux::FixedLengthSpline_< ScalarT, nSamples >::setXYContainers ( const ScalarContainerX &  x,
const ScalarContainerY &  y,
Scalar  m0,
Scalar  m1 
)
inline

Set the sampling points and the boundary slopes of a full spline using STL-compatible containers.

This method uses separate STL-compatible containers for the values of the sampling points' X and Y coordinates. "STL-compatible" means that the container provides access to iterators using the begin(), end() methods and also provides a size() method. Also, the number of entries in the X and the Y containers must be equal and larger than 1.

◆ x_()

template<class ScalarT , int nSamples>
Scalar Dumux::FixedLengthSpline_< ScalarT, nSamples >::x_ ( int  i) const
inlineprotected

Returns the x coordinate of the i-th sampling point.

◆ xMax()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::xMax ( ) const
inlineinherited

Return the x value of the rightmost sampling point.

◆ xMin()

Scalar Dumux::SplineCommon_< ScalarT, FixedLengthSpline_< ScalarT, nSamples > >::xMin ( ) const
inlineinherited

Return the x value of the leftmost sampling point.

◆ y_()

template<class ScalarT , int nSamples>
Scalar Dumux::FixedLengthSpline_< ScalarT, nSamples >::y_ ( int  i) const
inlineprotected

Returns the y coordinate of the i-th sampling point.

Member Data Documentation

◆ m_

template<class ScalarT , int nSamples>
BlockVector Dumux::FixedLengthSpline_< ScalarT, nSamples >::m_
protected

◆ xPos_

template<class ScalarT , int nSamples>
Vector Dumux::FixedLengthSpline_< ScalarT, nSamples >::xPos_
protected

◆ yPos_

template<class ScalarT , int nSamples>
Vector Dumux::FixedLengthSpline_< ScalarT, nSamples >::yPos_
protected

The documentation for this class was generated from the following file: