https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
SplineInterpolation Class Reference

This class interpolates tabulated functions with cubic splines. More...

#include <SplineInterpolation.h>

Inheritance diagram for SplineInterpolation:
[legend]

Public Member Functions

 SplineInterpolation ()
 
 SplineInterpolation (const std::vector< Real > &x, const std::vector< Real > &y, Real yp1=_deriv_bound, Real ypn=_deriv_bound)
 Construct the object.
 
virtual ~SplineInterpolation ()=default
 
void setData (const std::vector< Real > &x, const std::vector< Real > &y, Real yp1=_deriv_bound, Real ypn=_deriv_bound)
 Set the x-, y- values and first derivatives.
 
void errorCheck ()
 
Real sample (Real x) const
 This function will take an independent variable input and will return the dependent variable based on the generated fit.
 
ADReal sample (const ADReal &x) const
 
Real sampleDerivative (Real x) const
 
Real sample2ndDerivative (Real x) const
 
unsigned int getSampleSize ()
 This function returns the size of the array holding the points, i.e.
 
Real domain (int i) const
 
Real range (int i) const
 
Real sample (const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const
 
ADReal sample (const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, const ADReal &x_int) const
 
Real sampleDerivative (const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const
 
Real sample2ndDerivative (const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const
 

Protected Member Functions

void solve ()
 
template<typename T >
sample (const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, const T &x_int, unsigned int klo, unsigned int khi) const
 Sample value at point x_int given the indices of the vector of dependent values that bound the point.
 
void spline (const std::vector< Real > &x, const std::vector< Real > &y, std::vector< Real > &y2, Real yp1=_deriv_bound, Real ypn=_deriv_bound)
 This function calculates the second derivatives based on supplied x and y-vectors.
 
void findInterval (const std::vector< Real > &x, Real x_int, unsigned int &klo, unsigned int &khi) const
 
template<typename T >
void computeCoeffs (const std::vector< Real > &x, unsigned int klo, unsigned int khi, const T &x_int, Real &h, T &a, T &b) const
 

Protected Attributes

std::vector< Real > _x
 
std::vector< Real > _y
 
Real _yp1
 boundary conditions
 
Real _ypn
 
std::vector< Real > _y2
 Second derivatives.
 

Static Protected Attributes

static int _file_number = 0
 
static const Real _deriv_bound = std::numeric_limits<Real>::max()
 

Detailed Description

This class interpolates tabulated functions with cubic splines.

Adopted from Numerical Recipes in C (section 3.3).

Definition at line 20 of file SplineInterpolation.h.

Constructor & Destructor Documentation

◆ SplineInterpolation() [1/2]

SplineInterpolation::SplineInterpolation ( )

Definition at line 20 of file SplineInterpolation.C.

20{}

◆ SplineInterpolation() [2/2]

SplineInterpolation::SplineInterpolation ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
Real  yp1 = _deriv_bound,
Real  ypn = _deriv_bound 
)

Construct the object.

Parameters
xTabulated function (x-positions)
yTabulated function (y-positions)
yp1First derivative of the interpolating function at point 1
ypnFirst derivative of the interpolating function at point n

If yp1, ypn are not specified or greater or equal that _deriv_bound, we use natural spline

Definition at line 22 of file SplineInterpolation.C.

◆ ~SplineInterpolation()

virtual SplineInterpolation::~SplineInterpolation ( )
virtualdefault

Member Function Documentation

◆ computeCoeffs()

template<typename T >
void SplineInterpolationBase::computeCoeffs ( const std::vector< Real > &  x,
unsigned int  klo,
unsigned int  khi,
const T &  x_int,
Real &  h,
T &  a,
T &  b 
) const
protectedinherited

Definition at line 85 of file SplineInterpolationBase.C.

92{
93 h = x[khi] - x[klo];
94 if (h == 0)
95 mooseError("The values of x must be distinct");
96 a = (x[khi] - x_int) / h;
97 b = (x_int - x[klo]) / h;
98}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311

Referenced by SplineInterpolationBase::sample(), SplineInterpolationBase::sample2ndDerivative(), and SplineInterpolationBase::sampleDerivative().

◆ domain()

Real SplineInterpolation::domain ( int  i) const

Definition at line 92 of file SplineInterpolation.C.

93{
94 return _x[i];
95}

◆ errorCheck()

void SplineInterpolation::errorCheck ( )

Definition at line 47 of file SplineInterpolation.C.

48{
49 if (_x.size() != _y.size())
50 mooseError("SplineInterpolation: vectors are not the same length");
51
52 bool error = false;
53 for (unsigned i = 0; !error && i + 1 < _x.size(); ++i)
54 if (_x[i] >= _x[i + 1])
55 error = true;
56
57 if (error)
58 mooseError("x-values are not strictly increasing");
59}

Referenced by setData(), and SplineInterpolation().

◆ findInterval()

void SplineInterpolationBase::findInterval ( const std::vector< Real > &  x,
Real  x_int,
unsigned int klo,
unsigned int khi 
) const
protectedinherited

Definition at line 65 of file SplineInterpolationBase.C.

69{
70 klo = 0;
71 mooseAssert(x.size() >= 2, "You must have at least two knots to create a spline.");
72 khi = x.size() - 1;
73 while (khi - klo > 1)
74 {
75 unsigned int k = (khi + klo) >> 1;
76 if (x[k] > x_int)
77 khi = k;
78 else
79 klo = k;
80 }
81}

Referenced by BicubicSplineInterpolation::constructColumnSpline(), BicubicSplineInterpolation::constructRowSpline(), SplineInterpolationBase::sample(), SplineInterpolationBase::sample(), SplineInterpolationBase::sample2ndDerivative(), and SplineInterpolationBase::sampleDerivative().

◆ getSampleSize()

unsigned int SplineInterpolation::getSampleSize ( )

This function returns the size of the array holding the points, i.e.

the number of sample points

Definition at line 104 of file SplineInterpolation.C.

105{
106 return _x.size();
107}

◆ range()

Real SplineInterpolation::range ( int  i) const

Definition at line 98 of file SplineInterpolation.C.

99{
100 return _y[i];
101}

◆ sample() [1/5]

ADReal SplineInterpolation::sample ( const ADReal x) const

Definition at line 74 of file SplineInterpolation.C.

75{
77}
Real sample(const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const
std::vector< Real > _y2
Second derivatives.

◆ sample() [2/5]

ADReal SplineInterpolationBase::sample ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
const std::vector< Real > &  y2,
const ADReal x_int 
) const
inherited

Definition at line 113 of file SplineInterpolationBase.C.

117{
118 unsigned int klo, khi;
119 findInterval(x, MetaPhysicL::raw_value(x_int), klo, khi);
120
121 return sample(x, y, y2, x_int, klo, khi);
122}
void findInterval(const std::vector< Real > &x, Real x_int, unsigned int &klo, unsigned int &khi) const
auto raw_value(const Eigen::Map< T > &in)

◆ sample() [3/5]

template<typename T >
T SplineInterpolationBase::sample ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
const std::vector< Real > &  y2,
const T &  x_int,
unsigned int  klo,
unsigned int  khi 
) const
protectedinherited

Sample value at point x_int given the indices of the vector of dependent values that bound the point.

This method is useful in bicubic spline interpolation, where several spline evaluations are needed to sample from a 2D point.

Definition at line 157 of file SplineInterpolationBase.C.

163{
164 Real h;
165 T a, b;
166 computeCoeffs(x, klo, khi, x_int, h, a, b);
167
168 return a * y[klo] + b * y[khi] +
169 ((a * a * a - a) * y2[klo] + (b * b * b - b) * y2[khi]) * (h * h) / 6.0;
170}
void computeCoeffs(const std::vector< Real > &x, unsigned int klo, unsigned int khi, const T &x_int, Real &h, T &a, T &b) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ sample() [4/5]

Real SplineInterpolationBase::sample ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
const std::vector< Real > &  y2,
Real  x_int 
) const
inherited

◆ sample() [5/5]

Real SplineInterpolation::sample ( Real  x) const

This function will take an independent variable input and will return the dependent variable based on the generated fit.

Definition at line 68 of file SplineInterpolation.C.

69{
71}

Referenced by SplineFunction::value(), and SplineFunction::value().

◆ sample2ndDerivative() [1/2]

Real SplineInterpolationBase::sample2ndDerivative ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
const std::vector< Real > &  y2,
Real  x_int 
) const
inherited

Definition at line 141 of file SplineInterpolationBase.C.

145{
146 unsigned int klo, khi;
147 findInterval(x, x_int, klo, khi);
148
149 Real h, a, b;
150 computeCoeffs(x, klo, khi, x_int, h, a, b);
151
152 return a * y2[klo] + b * y2[khi];
153}

Referenced by sample2ndDerivative(), and BicubicSplineInterpolation::sample2ndDerivative().

◆ sample2ndDerivative() [2/2]

Real SplineInterpolation::sample2ndDerivative ( Real  x) const

Definition at line 86 of file SplineInterpolation.C.

87{
89}
Real sample2ndDerivative(const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const

Referenced by SplineFunction::secondDerivative().

◆ sampleDerivative() [1/2]

Real SplineInterpolationBase::sampleDerivative ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
const std::vector< Real > &  y2,
Real  x_int 
) const
inherited

Definition at line 125 of file SplineInterpolationBase.C.

129{
130 unsigned int klo, khi;
131 findInterval(x, x_int, klo, khi);
132
133 Real h, a, b;
134 computeCoeffs(x, klo, khi, x_int, h, a, b);
135
136 return (y[khi] - y[klo]) / h -
137 (((3.0 * a * a - 1.0) * y2[klo] + (3.0 * b * b - 1.0) * -y2[khi]) * h / 6.0);
138}

Referenced by sampleDerivative(), BicubicSplineInterpolation::sampleDerivative(), and BicubicSplineInterpolation::sampleValueAndDerivatives().

◆ sampleDerivative() [2/2]

Real SplineInterpolation::sampleDerivative ( Real  x) const

Definition at line 80 of file SplineInterpolation.C.

81{
83}
Real sampleDerivative(const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const

Referenced by SplineFunction::derivative().

◆ setData()

void SplineInterpolation::setData ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
Real  yp1 = _deriv_bound,
Real  ypn = _deriv_bound 
)

Set the x-, y- values and first derivatives.

Definition at line 33 of file SplineInterpolation.C.

37{
38 _x = x;
39 _y = y;
40 _yp1 = yp1;
41 _ypn = ypn;
42 errorCheck();
43 solve();
44}

◆ solve()

void SplineInterpolation::solve ( )
protected

Definition at line 62 of file SplineInterpolation.C.

63{
64 spline(_x, _y, _y2, _yp1, _ypn);
65}
void spline(const std::vector< Real > &x, const std::vector< Real > &y, std::vector< Real > &y2, Real yp1=_deriv_bound, Real ypn=_deriv_bound)
This function calculates the second derivatives based on supplied x and y-vectors.

Referenced by setData(), and SplineInterpolation().

◆ spline()

void SplineInterpolationBase::spline ( const std::vector< Real > &  x,
const std::vector< Real > &  y,
std::vector< Real > &  y2,
Real  yp1 = _deriv_bound,
Real  ypn = _deriv_bound 
)
protectedinherited

This function calculates the second derivatives based on supplied x and y-vectors.

Definition at line 19 of file SplineInterpolationBase.C.

24{
25 auto n = x.size();
26 if (n < 2)
27 mooseError("You must have at least two knots to create a spline.");
28
29 std::vector<Real> u(n, 0.);
30 y2.assign(n, 0.);
31
32 if (yp1 >= 1e30)
33 y2[0] = u[0] = 0.;
34 else
35 {
36 y2[0] = -0.5;
37 u[0] = (3.0 / (x[1] - x[0])) * ((y[1] - y[0]) / (x[1] - x[0]) - yp1);
38 }
39 // decomposition of tri-diagonal algorithm (y2 and u are used for temporary storage)
40 for (decltype(n) i = 1; i < n - 1; i++)
41 {
42 Real sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]);
43 Real p = sig * y2[i - 1] + 2.0;
44 y2[i] = (sig - 1.0) / p;
45 u[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1]);
46 u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
47 }
48
49 Real qn, un;
50 if (ypn >= 1e30)
51 qn = un = 0.;
52 else
53 {
54 qn = 0.5;
55 un = (3.0 / (x[n - 1] - x[n - 2])) * (ypn - (y[n - 1] - y[n - 2]) / (x[n - 1] - x[n - 2]));
56 }
57
58 y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.);
59 // back substitution
60 for (auto k = n - 1; k >= 1; k--)
61 y2[k - 1] = y2[k - 1] * y2[k] + u[k - 1];
62}

Referenced by BicubicSplineInterpolation::constructColumnSpline(), BicubicSplineInterpolation::constructColumnSplineSecondDerivativeTable(), BicubicSplineInterpolation::constructRowSpline(), BicubicSplineInterpolation::constructRowSplineSecondDerivativeTable(), and solve().

Member Data Documentation

◆ _deriv_bound

const Real SplineInterpolationBase::_deriv_bound = std::numeric_limits<Real>::max()
staticprotectedinherited

Definition at line 79 of file SplineInterpolationBase.h.

Referenced by BicubicSplineInterpolation::errorCheck().

◆ _file_number

int SplineInterpolation::_file_number = 0
staticprotected

Definition at line 80 of file SplineInterpolation.h.

◆ _x

std::vector<Real> SplineInterpolation::_x
protected

◆ _y

std::vector<Real> SplineInterpolation::_y
protected

◆ _y2

std::vector<Real> SplineInterpolation::_y2
protected

Second derivatives.

Definition at line 76 of file SplineInterpolation.h.

Referenced by sample(), sample(), sample2ndDerivative(), sampleDerivative(), and solve().

◆ _yp1

Real SplineInterpolation::_yp1
protected

boundary conditions

Definition at line 74 of file SplineInterpolation.h.

Referenced by setData(), and solve().

◆ _ypn

Real SplineInterpolation::_ypn
protected

Definition at line 74 of file SplineInterpolation.h.

Referenced by setData(), and solve().


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