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

This class interpolates tabulated functions with a bi-cubic spline. More...

#include <BicubicSplineInterpolation.h>

Inheritance diagram for BicubicSplineInterpolation:
[legend]

Public Member Functions

 BicubicSplineInterpolation ()
 
 BicubicSplineInterpolation (const std::vector< Real > &x1, const std::vector< Real > &x2, const std::vector< std::vector< Real > > &y, const std::vector< Real > &yx11=std::vector< Real >(), const std::vector< Real > &yx1n=std::vector< Real >(), const std::vector< Real > &yx21=std::vector< Real >(), const std::vector< Real > &yx2n=std::vector< Real >())
 In the future, may add interface that allows necessary vector of boundary conditions to be supplied for each edge of grid; however, for now we just use natural splines at the grid boundaries.
 
virtual ~BicubicSplineInterpolation ()=default
 
void setData (const std::vector< Real > &x1, const std::vector< Real > &x2, const std::vector< std::vector< Real > > &y, const std::vector< Real > &yx11=std::vector< Real >(), const std::vector< Real > &yx1n=std::vector< Real >(), const std::vector< Real > &yx21=std::vector< Real >(), const std::vector< Real > &yx2n=std::vector< Real >())
 Set the x1, x2 and y values, and first derivatives at the edges.
 
void errorCheck ()
 Sanity checks on input data.
 
Real sample (Real x1, Real x2, Real yx11=_deriv_bound, Real yx1n=_deriv_bound)
 Samples value at point (x1, x2)
 
void sampleValueAndDerivatives (Real x1, Real x2, Real &y, Real &dy1, Real &dy2, Real yx11=_deriv_bound, Real yx1n=_deriv_bound, Real yx21=_deriv_bound, Real yx2n=_deriv_bound)
 Samples value and first derivatives at point (x1, x2) Use this function for speed when computing both value and derivatives, as it minimizes the amount of spline evaluation.
 
Real sampleDerivative (Real x1, Real x2, unsigned int deriv_var, Real yp1=_deriv_bound, Real ypn=_deriv_bound)
 Samples first derivative at point (x1, x2)
 
Real sample2ndDerivative (Real x1, Real x2, unsigned int deriv_var, Real yp1=_deriv_bound, Real ypn=_deriv_bound)
 Samples second derivative at point (x1, x2)
 
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 constructRowSplineSecondDerivativeTable ()
 Precompute tables of row (column) spline second derivatives and store them to reduce computational demands.
 
void constructColumnSplineSecondDerivativeTable ()
 
void solve ()
 Calculates the tables of second derivatives.
 
void constructRowSpline (Real x1, std::vector< Real > &spline_eval, std::vector< Real > &spline_second_derivs, Real yx11=_deriv_bound, Real yx1n=_deriv_bound)
 Helper functions to evaluate column splines and construct row spline for the given point.
 
void constructColumnSpline (Real x2, std::vector< Real > &spline_eval, std::vector< Real > &spline_second_derivs, Real yx21=_deriv_bound, Real yx2n=_deriv_bound)
 Helper functions to evaluate row splines and construct column spline for the given point.
 
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 > _x1
 Independent values in the x1 direction.
 
std::vector< Real > _x2
 Independent values in the x2 direction.
 
std::vector< std::vector< Real > > _y
 The dependent values at (x1, x2) points.
 
std::vector< std::vector< Real > > _y_trans
 Transpose of _y.
 
std::vector< Real > _yx11
 Boundary conditions.
 
std::vector< Real > _yx1n
 
std::vector< Real > _yx21
 
std::vector< Real > _yx2n
 
std::vector< std::vector< Real > > _y2_rows
 Second derivatives.
 
std::vector< std::vector< Real > > _y2_columns
 
std::vector< Real > _row_spline_second_derivs
 Vectors used during sampling.
 
std::vector< Real > _row_spline_eval
 
std::vector< Real > _column_spline_second_derivs
 
std::vector< Real > _column_spline_eval
 

Static Protected Attributes

static int _file_number = 0
 File number for data dump.
 
static const Real _deriv_bound = std::numeric_limits<Real>::max()
 

Detailed Description

This class interpolates tabulated functions with a bi-cubic spline.

Adopted from Numerical Recipes in C (section 3.6). Consistent with the terminology in Numerical Recipes, moving over a column spline means moving over the x1 coord Likewise, moving over a row spline means moving over the x2 coord

Definition at line 22 of file BicubicSplineInterpolation.h.

Constructor & Destructor Documentation

◆ BicubicSplineInterpolation() [1/2]

BicubicSplineInterpolation::BicubicSplineInterpolation ( )

Definition at line 15 of file BicubicSplineInterpolation.C.

15{}

◆ BicubicSplineInterpolation() [2/2]

BicubicSplineInterpolation::BicubicSplineInterpolation ( const std::vector< Real > &  x1,
const std::vector< Real > &  x2,
const std::vector< std::vector< Real > > &  y,
const std::vector< Real > &  yx11 = std::vector<Real>(),
const std::vector< Real > &  yx1n = std::vector<Real>(),
const std::vector< Real > &  yx21 = std::vector<Real>(),
const std::vector< Real > &  yx2n = std::vector<Real>() 
)

In the future, may add interface that allows necessary vector of boundary conditions to be supplied for each edge of grid; however, for now we just use natural splines at the grid boundaries.

Definition at line 17 of file BicubicSplineInterpolation.C.

25 _x1(x1),
26 _x2(x2),
27 _y(y),
28 _yx11(yx11),
29 _yx1n(yx1n),
30 _yx21(yx21),
31 _yx2n(yx2n)
32{
33 auto n = _x2.size();
35 _column_spline_eval.resize(n);
36
37 auto m = _x1.size();
39 _row_spline_eval.resize(m);
40
41 errorCheck();
42 solve();
43}
std::vector< Real > _column_spline_second_derivs
void errorCheck()
Sanity checks on input data.
std::vector< Real > _x1
Independent values in the x1 direction.
void solve()
Calculates the tables of second derivatives.
std::vector< Real > _row_spline_second_derivs
Vectors used during sampling.
std::vector< Real > _yx11
Boundary conditions.
std::vector< Real > _x2
Independent values in the x2 direction.
std::vector< std::vector< Real > > _y
The dependent values at (x1, x2) points.

◆ ~BicubicSplineInterpolation()

virtual BicubicSplineInterpolation::~BicubicSplineInterpolation ( )
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().

◆ constructColumnSpline()

void BicubicSplineInterpolation::constructColumnSpline ( Real  x2,
std::vector< Real > &  spline_eval,
std::vector< Real > &  spline_second_derivs,
Real  yx21 = _deriv_bound,
Real  yx2n = _deriv_bound 
)
protected

Helper functions to evaluate row splines and construct column spline for the given point.

Definition at line 278 of file BicubicSplineInterpolation.C.

283{
284 auto m = _x1.size();
285
286 // Find the indices that bound the point x2
287 unsigned int klo, khi;
288 findInterval(_x2, x2, klo, khi);
289
290 // Evaluate m row-splines to get y-values for column spline construction using
291 // the indices above to avoid computing them for each j
292 for (decltype(m) j = 0; j < m; ++j)
294
295 // Construct single column spline; get back the second derivatives wrt x1 coord
296 // on the x1 grid points
297 spline(_x1, row_spline_eval, column_spline_second_derivs, yx21, yx2n);
298}
std::vector< std::vector< Real > > _y2_rows
Second derivatives.
Real sample(const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const
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

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

◆ constructColumnSplineSecondDerivativeTable()

void BicubicSplineInterpolation::constructColumnSplineSecondDerivativeTable ( )
protected

Definition at line 127 of file BicubicSplineInterpolation.C.

128{
129 auto m = _x1.size();
130 auto n = _x2.size();
131 _y2_columns.resize(n);
132 _y_trans.resize(n);
133
134 for (decltype(n) j = 0; j < n; ++j)
135 _y_trans[j].resize(m);
136
137 // transpose the _y values so the columns can be easily iterated over
138 for (decltype(n) i = 0; i < _y.size(); ++i)
139 for (decltype(n) j = 0; j < _y[0].size(); ++j)
140 _y_trans[j][i] = _y[i][j];
141
142 if (_yx11.empty())
143 for (decltype(n) j = 0; j < n; ++j)
145
146 else
147 for (decltype(n) j = 0; j < n; ++j)
148 spline(_x1, _y_trans[j], _y2_columns[j], _yx11[j], _yx1n[j]);
149}
std::vector< std::vector< Real > > _y_trans
Transpose of _y.
std::vector< std::vector< Real > > _y2_columns

Referenced by solve().

◆ constructRowSpline()

void BicubicSplineInterpolation::constructRowSpline ( Real  x1,
std::vector< Real > &  spline_eval,
std::vector< Real > &  spline_second_derivs,
Real  yx11 = _deriv_bound,
Real  yx1n = _deriv_bound 
)
protected

Helper functions to evaluate column splines and construct row spline for the given point.

Definition at line 254 of file BicubicSplineInterpolation.C.

259{
260 auto n = _x2.size();
261
262 // Find the indices that bound the point x1
263 unsigned int klo, khi;
264 findInterval(_x1, x1, klo, khi);
265
266 // Evaluate n column-splines to get y-values for row spline construction using
267 // the indices above to avoid computing them for each j
268 for (decltype(n) j = 0; j < n; ++j)
271
272 // Construct single row spline; get back the second derivatives wrt x2 coord
273 // on the x2 grid points
274 spline(_x2, column_spline_eval, row_spline_second_derivs, yx11, yx1n);
275}

Referenced by sample2ndDerivative(), sampleDerivative(), and sampleValueAndDerivatives().

◆ constructRowSplineSecondDerivativeTable()

void BicubicSplineInterpolation::constructRowSplineSecondDerivativeTable ( )
protected

Precompute tables of row (column) spline second derivatives and store them to reduce computational demands.

Definition at line 112 of file BicubicSplineInterpolation.C.

113{
114 auto m = _x1.size();
115 _y2_rows.resize(m);
116
117 if (_yx21.empty())
118 for (decltype(m) j = 0; j < m; ++j)
119 spline(_x2, _y[j], _y2_rows[j]);
120
121 else
122 for (decltype(m) j = 0; j < m; ++j)
123 spline(_x2, _y[j], _y2_rows[j], _yx21[j], _yx2n[j]);
124}

Referenced by solve().

◆ errorCheck()

void BicubicSplineInterpolation::errorCheck ( )

Sanity checks on input data.

Definition at line 75 of file BicubicSplineInterpolation.C.

76{
77 auto m = _x1.size(), n = _x2.size();
78
79 if (_y.size() != m)
80 mooseError("y row dimension does not match the size of x1.");
81 else
82 for (decltype(m) i = 0; i < _y.size(); ++i)
83 if (_y[i].size() != n)
84 mooseError("y column dimension does not match the size of x2.");
85
86 if (_yx11.empty())
87 _yx11.resize(n, _deriv_bound);
88 else if (_yx11.size() != n)
89 mooseError("The length of the vectors holding the first derivatives of y with respect to x1 "
90 "must match the length of x2.");
91
92 if (_yx1n.empty())
93 _yx1n.resize(n, _deriv_bound);
94 else if (_yx1n.size() != n)
95 mooseError("The length of the vectors holding the first derivatives of y with respect to x1 "
96 "must match the length of x2.");
97
98 if (_yx21.empty())
99 _yx21.resize(m, _deriv_bound);
100 else if (_yx21.size() != m)
101 mooseError("The length of the vectors holding the first derivatives of y with respect to x2 "
102 "must match the length of x1.");
103
104 if (_yx2n.empty())
105 _yx2n.resize(m, _deriv_bound);
106 else if (_yx2n.size() != m)
107 mooseError("The length of the vectors holding the first derivatives of y with respect to x2 "
108 "must match the length of x1.");
109}

Referenced by BicubicSplineInterpolation(), and setData().

◆ 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 constructColumnSpline(), constructRowSpline(), SplineInterpolationBase::sample(), SplineInterpolationBase::sample(), SplineInterpolationBase::sample2ndDerivative(), and SplineInterpolationBase::sampleDerivative().

◆ sample() [1/4]

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}
auto raw_value(const Eigen::Map< T > &in)

◆ sample() [2/4]

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() [3/4]

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

Definition at line 101 of file SplineInterpolationBase.C.

105{
106 unsigned int klo, khi;
107 findInterval(x, x_int, klo, khi);
108
109 return sample(x, y, y2, x_int, klo, khi);
110}

Referenced by constructColumnSpline(), constructRowSpline(), SplineInterpolation::sample(), SplineInterpolationBase::sample(), SplineInterpolationBase::sample(), SplineInterpolation::sample(), sample(), and sampleValueAndDerivatives().

◆ sample() [4/4]

Real BicubicSplineInterpolation::sample ( Real  x1,
Real  x2,
Real  yx11 = _deriv_bound,
Real  yx1n = _deriv_bound 
)

Samples value at point (x1, x2)

Definition at line 159 of file BicubicSplineInterpolation.C.

163{
165
166 // Evaluate newly constructed column spline
168}
void constructColumnSpline(Real x2, std::vector< Real > &spline_eval, std::vector< Real > &spline_second_derivs, Real yx21=_deriv_bound, Real yx2n=_deriv_bound)
Helper functions to evaluate row splines and construct column spline for the given point.

Referenced by BicubicSplineFunction::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 SplineInterpolation::sample2ndDerivative(), and sample2ndDerivative().

◆ sample2ndDerivative() [2/2]

Real BicubicSplineInterpolation::sample2ndDerivative ( Real  x1,
Real  x2,
unsigned int  deriv_var,
Real  yp1 = _deriv_bound,
Real  ypn = _deriv_bound 
)

Samples second derivative at point (x1, x2)

Definition at line 202 of file BicubicSplineInterpolation.C.

207{
208 // Take second derivative along x1 axis
209 if (deriv_var == 1)
210 {
212
213 // Evaluate second derivative wrt x1 of newly constructed column spline
216 }
217
218 // Take second derivative along x2 axis
219 else if (deriv_var == 2)
220 {
222
223 // Evaluate second derivative wrt x2 of newly constructed row spline
226 }
227
228 else
229 mooseError("deriv_var must be either 1 or 2 in BicubicSplineInterpolation");
230}
void constructRowSpline(Real x1, std::vector< Real > &spline_eval, std::vector< Real > &spline_second_derivs, Real yx11=_deriv_bound, Real yx1n=_deriv_bound)
Helper functions to evaluate column splines and construct row spline for the given point.
Real sample2ndDerivative(const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const

Referenced by BicubicSplineFunction::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 SplineInterpolation::sampleDerivative(), sampleDerivative(), and sampleValueAndDerivatives().

◆ sampleDerivative() [2/2]

Real BicubicSplineInterpolation::sampleDerivative ( Real  x1,
Real  x2,
unsigned int  deriv_var,
Real  yp1 = _deriv_bound,
Real  ypn = _deriv_bound 
)

Samples first derivative at point (x1, x2)

Definition at line 171 of file BicubicSplineInterpolation.C.

176{
177 // Take derivative along x1 axis
178 if (deriv_var == 1)
179 {
181
182 // Evaluate derivative wrt x1 of newly constructed column spline
185 }
186
187 // Take derivative along x2 axis
188 else if (deriv_var == 2)
189 {
191
192 // Evaluate derivative wrt x2 of newly constructed row spline
195 }
196
197 else
198 mooseError("deriv_var must be either 1 or 2 in BicubicSplineInterpolation");
199}
Real sampleDerivative(const std::vector< Real > &x, const std::vector< Real > &y, const std::vector< Real > &y2, Real x_int) const

Referenced by BicubicSplineFunction::derivative().

◆ sampleValueAndDerivatives()

void BicubicSplineInterpolation::sampleValueAndDerivatives ( Real  x1,
Real  x2,
Real &  y,
Real &  dy1,
Real &  dy2,
Real  yx11 = _deriv_bound,
Real  yx1n = _deriv_bound,
Real  yx21 = _deriv_bound,
Real  yx2n = _deriv_bound 
)

Samples value and first derivatives at point (x1, x2) Use this function for speed when computing both value and derivatives, as it minimizes the amount of spline evaluation.

Definition at line 233 of file BicubicSplineInterpolation.C.

◆ setData()

void BicubicSplineInterpolation::setData ( const std::vector< Real > &  x1,
const std::vector< Real > &  x2,
const std::vector< std::vector< Real > > &  y,
const std::vector< Real > &  yx11 = std::vector<Real>(),
const std::vector< Real > &  yx1n = std::vector<Real>(),
const std::vector< Real > &  yx21 = std::vector<Real>(),
const std::vector< Real > &  yx2n = std::vector<Real>() 
)

Set the x1, x2 and y values, and first derivatives at the edges.

Definition at line 46 of file BicubicSplineInterpolation.C.

53{
54 _x1 = x1;
55 _x2 = x2;
56 _y = y;
57 _yx11 = yx11;
58 _yx1n = yx1n;
59 _yx21 = yx21;
60 _yx2n = yx2n;
61
62 auto n = _x2.size();
64 _column_spline_eval.resize(n);
65
66 auto m = _x1.size();
68 _row_spline_eval.resize(m);
69
70 errorCheck();
71 solve();
72}

Referenced by BicubicSplineFunction::BicubicSplineFunction().

◆ solve()

void BicubicSplineInterpolation::solve ( )
protected

Calculates the tables of second derivatives.

Definition at line 152 of file BicubicSplineInterpolation.C.

153{
156}
void constructRowSplineSecondDerivativeTable()
Precompute tables of row (column) spline second derivatives and store them to reduce computational de...

Referenced by BicubicSplineInterpolation(), and setData().

◆ 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 constructColumnSpline(), constructColumnSplineSecondDerivativeTable(), constructRowSpline(), constructRowSplineSecondDerivativeTable(), and SplineInterpolation::solve().

Member Data Documentation

◆ _column_spline_eval

std::vector<Real> BicubicSplineInterpolation::_column_spline_eval
protected

◆ _column_spline_second_derivs

std::vector<Real> BicubicSplineInterpolation::_column_spline_second_derivs
protected

◆ _deriv_bound

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

Definition at line 79 of file SplineInterpolationBase.h.

Referenced by errorCheck().

◆ _file_number

int BicubicSplineInterpolation::_file_number = 0
staticprotected

File number for data dump.

Definition at line 153 of file BicubicSplineInterpolation.h.

◆ _row_spline_eval

std::vector<Real> BicubicSplineInterpolation::_row_spline_eval
protected

◆ _row_spline_second_derivs

std::vector<Real> BicubicSplineInterpolation::_row_spline_second_derivs
protected

◆ _x1

std::vector<Real> BicubicSplineInterpolation::_x1
protected

◆ _x2

std::vector<Real> BicubicSplineInterpolation::_x2
protected

◆ _y

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

◆ _y2_columns

std::vector<std::vector<Real> > BicubicSplineInterpolation::_y2_columns
protected

◆ _y2_rows

std::vector<std::vector<Real> > BicubicSplineInterpolation::_y2_rows
protected

Second derivatives.

Definition at line 111 of file BicubicSplineInterpolation.h.

Referenced by constructColumnSpline(), and constructRowSplineSecondDerivativeTable().

◆ _y_trans

std::vector<std::vector<Real> > BicubicSplineInterpolation::_y_trans
protected

Transpose of _y.

Definition at line 97 of file BicubicSplineInterpolation.h.

Referenced by constructColumnSplineSecondDerivativeTable(), and constructRowSpline().

◆ _yx11

std::vector<Real> BicubicSplineInterpolation::_yx11
protected

Boundary conditions.

The first index indicates the coordinate the derivative is with respect to. The second index indicates the grid index, e.g. 1 is the lower bound, and n is the upper bound

Definition at line 105 of file BicubicSplineInterpolation.h.

Referenced by constructColumnSplineSecondDerivativeTable(), errorCheck(), and setData().

◆ _yx1n

std::vector<Real> BicubicSplineInterpolation::_yx1n
protected

◆ _yx21

std::vector<Real> BicubicSplineInterpolation::_yx21
protected

◆ _yx2n

std::vector<Real> BicubicSplineInterpolation::_yx2n
protected

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