1 #ifndef _SplineSolver_Spline_h_
2 #define _SplineSolver_Spline_h_
6 #include <boost/multi_array.hpp>
8 #include <utl/EquationSolver.h>
12 typedef unsigned char dim_t;
24 const double vLeft = 0.0,
25 const double vRight = 0.0) :
44 template<dim_t ADimension,
typename AKnotVector,
typename ABasisFunction>
58 const size_t n = bs.size();
59 fInv[idim].resize(boost::extents[n][n]);
60 for (
size_t i=0;i<n;++i)
61 for (
size_t j=0;j<n;++j)
64 for (
size_t i = 0; i < n-2; ++i)
65 for (
size_t k = i; k < i+3; ++k)
66 fInv[idim][i][k] = bs[k](xs[i]);
71 for (
size_t der = 0; der < 2; ++der)
72 for (
size_t k = 0; k < 3; ++k)
74 fInv[idim][n-2][k] = bs[k](xs[0],1);
75 fInv[idim][n-1][n-3+k] = bs[n-3+k](xs[n-3],1);
82 for (
size_t k = 0; k < 3; ++k)
84 fInv[idim][n-2][k] = bs[k](xs[0],2);
85 fInv[idim][n-1][n-3+k] = bs[n-3+k](xs[n-3],2);
92 for (
size_t der = 0; der < 2; ++der)
93 for (
size_t k = 0; k < 3; ++k)
95 fInv[idim][n-2+der][k] = bs[k](xs[0],1+der);
96 fInv[idim][n-2+der][n-3+k] = -bs[n-3+k](xs[n-3],1+der);
107 size_t strides[ADimension];
109 for (
short idim = 0; idim < short(ADimension-1); ++idim)
110 strides[idim+1] = strides[idim]*
fSizes[idim];
112 for (
dim_t idim = 0; idim < ADimension; ++idim)
114 size_t strides2[ADimension+1];
116 for (
dim_t jdim = 0; jdim < ADimension; ++jdim)
118 const size_t n = jdim == idim ? 1 :
120 strides2[jdim+1] = strides2[jdim]*n;
123 for (
size_t i = 0; i < strides2[ADimension]; ++i)
126 for (
dim_t jdim = 0; jdim < ADimension; ++jdim)
129 j += ((i % strides2[jdim+1])/strides2[jdim]) * strides[jdim];
134 for (
size_t k = 0; k <
m; ++k)
137 for (
size_t l = 0; l < m-2; ++l)
138 fBuffer[k] +=
fInv[idim][k][l]*cs[j + l*strides[idim]];
143 for (
size_t l = 0; l <
m; ++l)
144 cs[j + l*strides[idim]] =
fBuffer[l];
153 boost::multi_array<double,2>
fInv[ADimension];
Computes B-spline coefficients.
BoundaryCondition(const BoundaryConditionType type=eNatural, const double vLeft=0.0, const double vRight=0.0)
BoundaryConditionType fType
void operator()(double *cs) const
boost::multi_array< double, 2 > fInv[ADimension]
BoundaryCondition fBCs[ADimension]
std::vector< double > fBuffer
bool operator==(const BoundaryConditionType type) const
void InvertMatrix(const size_t n, AMatrix &a)
Invert A in place with Gauss-Jordan elimination and full pivoting.
size_t fSizes[ADimension]
void Configure(const dim_t idim, const AKnotVector &xs, const std::vector< ABasisFunction > &bs, const BoundaryCondition &bc)
Prepare inversion matrix.