8 spline(
const std::vector<doublereal>& x,
9 const std::vector<doublereal>& y,
10 std::vector<doublereal>& b,
11 std::vector<doublereal>&
c,
12 std::vector<doublereal>& d)
46 ASSERTMSGBREAK(x.size() == y.size(),
"Error in spline, x.size()!=y.size()");
58 b[0] = (y[1] - y[0])/(x[1] - x[0]);
71 c[1] = (y[1] - y[0])/d[0];
72 for (
int i = 1; i < nm1; i++) {
73 d[i] = x[i + 1] - x[i];
74 b[i] = 2.*(d[i - 1] + d[i]);
75 c[i + 1] = (y[i + 1] - y[i])/d[i];
76 c[i] = c[i + 1] - c[i];
87 c[0] = c[2]/(x[3] - x[1]) - c[1]/(x[2] - x[0]);
88 c[n - 1] = c[n - 2]/(x[n - 1] - x[n - 3]) - c[n - 3]/(x[n - 2] - x[n - 4]);
89 c[0] = c[0]*d[0]*d[0]/(x[3] - x[0]);
90 c[n - 1] = -c[n - 1]*d[n - 2]*d[n - 2]/(x[n - 1] - x[n - 4]);
95 for (
int i = 1; i < n; i++) {
97 b[i] = b[i] - t*d[i - 1];
98 c[i] = c[i] - t*c[i - 1];
104 c[n - 1] = c[n - 1]/b[n - 1];
105 for (
int ib = 0; ib < nm1; ib++) {
107 c[i] = (c[i] - d[i]*c[i + 1])/b[i];
114 b[n-1] = (y[n - 1] - y[nm1 - 1])/d[nm1 - 1] + d[nm1 - 1]*(c[nm1 - 1] + 2.*c[n - 1]);
115 for (
int i=0; i<nm1; i++) {
116 b[i] = (y[i + 1] - y[i])/d[i] - d[i]*(c[i + 1] + 2.*c[i]);
117 d[i] = (c[i + 1] - c[i])/d[i];
120 c[n - 1] = 3.*c[n - 1];
129 const std::vector<doublereal>& x,
130 const std::vector<doublereal>& y,
131 const std::vector<doublereal>& b,
132 const std::vector<doublereal>&
c,
133 const std::vector<doublereal>& d,
156 ASSERTMSGBREAK(x.size() == y.size(),
"Error in seval, x.size()!=y.size()");
157 ASSERTMSGBREAK(x.size() == b.size(),
"Error in seval, x.size()!=b.size()");
158 ASSERTMSGBREAK(x.size() == c.size(),
"Error in seval, x.size()!=c.size()");
159 ASSERTMSGBREAK(x.size() == d.size(),
"Error in seval, x.size()!=d.size()");
172 return y[0] + dx*b[0];
182 }
else if (u >= x[n - 1]) {
186 return y[n - 1] + dx*b[n - 1];
221 return y[i] + dx*(b[i] + dx*(c[i] + dx*d[i]));
224 return b[i] + dx*(2.*c[i] + 3.*dx*d[i]);
227 return 2.*c[i] + 6.*dx*d[i];
243 const std::vector<doublereal>& x,
244 const std::vector<doublereal>& y,
267 ASSERTMSGBREAK(x.size() == y.size(),
"Error in leval, x.size()!=y.size()");
290 m = (y[i+1] - y[i])/(x[i+1] - x[i]);
294 ASSERTMSGBREAK(diff >=0,
"Error in multilinear evaluation, diff<0");
#define ASSERTMSGBREAK(expr, msg)
void spline(const std::vector< doublereal > &x, const std::vector< doublereal > &y, std::vector< doublereal > &b, std::vector< doublereal > &c, std::vector< doublereal > &d)
doublereal leval(const doublereal &u, const std::vector< doublereal > &x, const std::vector< doublereal > &y, const int diff)
static std::stack< cleanup * > c
doublereal seval(const doublereal &u, const std::vector< doublereal > &x, const std::vector< doublereal > &y, const std::vector< doublereal > &b, const std::vector< doublereal > &c, const std::vector< doublereal > &d, const int diff)