SplineInterpolatorOffline.cc
Go to the documentation of this file.
1 #include "SplineInterpolator.h"
2 
3 #include <vector>
4 #include <boost/multi_array.hpp>
5 
6 using namespace utl::Spline;
7 
8 Interpolator1D::Interpolator1D(const double xStart,
9  const double xStop, /* inclusive! */
10  const std::vector<double>& values,
11  const BoundaryCondition& bcX)
12 {
13  const size_t xn = values.size();
14 
15  fSpline.Configure(0, KnotVector(xn, xStart, xStop));
16 
17  fData.resize(xn+2);
18  for (size_t i = 0; i < xn; ++i)
19  fData[i] = values[i];
20 
21  Solver<1, KnotVector, BasisFunction> solver;
22  solver.Configure(0, fSpline.GetKnotVector(), fSpline.GetBasisVector(), bcX);
23  solver(&fData.front());
24 }
25 
26 double
27 Interpolator1D::operator()(const double x)
28  const
29 {
30  return fSpline(&fData.front(), x);
31 }
32 
33 Interpolator2D::Interpolator2D(const double xStart,
34  const double xStop, /* inclusive! */
35  const double yStart,
36  const double yStop, /* inclusive! */
37  const boost::multi_array<double,2>& values,
38  const BoundaryCondition bcX,
39  const BoundaryCondition bcY)
40 {
41  const size_t xn = values.shape()[0];
42  const size_t yn = values.shape()[1];
43 
44  fSpline.Configure(0, KnotVector(xn, xStart, xStop));
45  fSpline.Configure(1, KnotVector(yn, yStart, yStop));
46 
47  fData.resize((xn+2)*(yn+2));
48  for (size_t i = 0; i < xn; ++i)
49  for (size_t j = 0; j < yn; ++j)
50  fData[j*(xn+2) + i] = values[i][j];
51 
52  Solver<2, KnotVector, BasisFunction> solver;
53  solver.Configure(0, fSpline.GetKnotVector(0), fSpline.GetBasisVector(0), bcX);
54  solver.Configure(1, fSpline.GetKnotVector(1), fSpline.GetBasisVector(1), bcY);
55  solver(&fData.front());
56 }
57 
58 double
59 Interpolator2D::operator()(const double x, const double y)
60  const
61 {
62  fX[0] = x;
63  fX[1] = y;
64  return fSpline(&fData.front(), fX);
65 }
66 
67 Interpolator3D::Interpolator3D(const double xStart,
68  const double xStop, /* inclusive! */
69  const double yStart,
70  const double yStop, /* inclusive! */
71  const double zStart,
72  const double zStop, /* inclusive! */
73  const boost::multi_array<double,3>& values,
74  const BoundaryCondition bcX,
75  const BoundaryCondition bcY,
76  const BoundaryCondition bcZ)
77 {
78  const size_t xn = values.shape()[0];
79  const size_t yn = values.shape()[1];
80  const size_t zn = values.shape()[2];
81 
82  fSpline.Configure(0, KnotVector(xn, xStart, xStop));
83  fSpline.Configure(1, KnotVector(yn, yStart, yStop));
84  fSpline.Configure(2, KnotVector(zn, zStart, zStop));
85 
86  fData.resize((xn+2)*(yn+2)*(zn+2));
87  for (size_t i = 0; i < xn; ++i)
88  for (size_t j = 0; j < yn; ++j)
89  for (size_t k = 0; k < zn; ++k)
90  fData[k*(yn+2)*(xn+2) + j*(xn+2) + i] = values[i][j][k];
91 
92  Solver<3, KnotVector, BasisFunction> solver;
93  solver.Configure(0, fSpline.GetKnotVector(0), fSpline.GetBasisVector(0), bcX);
94  solver.Configure(1, fSpline.GetKnotVector(1), fSpline.GetBasisVector(1), bcY);
95  solver.Configure(2, fSpline.GetKnotVector(2), fSpline.GetBasisVector(2), bcZ);
96  solver(&fData.front());
97 }
98 
99 double
100 Interpolator3D::operator()(const double x, const double y, const double z)
101  const
102 {
103  fX[0] = x;
104  fX[1] = y;
105  fX[2] = z;
106  return fSpline(&fData.front(),fX);
107 }
108 
110  const double xStop, /* inclusive! */
111  const boost::multi_array<double,2>& fValue, // first index is function vector index!
112  const BoundaryCondition& bcX)
113 {
114  const size_t fn = fValue.shape()[0];
115  const size_t xn = fValue.shape()[1];
116 
117  fSpline.Configure(0, KnotVector(xn, xStart, xStop));
118 
119  fData.resize(fn, std::vector<double>(xn+2));
120 
121  Solver<1, KnotVector, BasisFunction> solver;
122  solver.Configure(0, fSpline.GetKnotVector(), fSpline.GetBasisVector(), bcX);
123  for (size_t m = 0; m < fn; ++m)
124  {
125  for (size_t i = 0; i < xn; ++i)
126  fData[m][i] = fValue[m][i];
127  solver(&fData[m].front());
128  }
129 }
130 
131 void
132 VectorInterpolator1D::operator()(std::vector<double>& result, const double x)
133  const
134 {
135  for (size_t m = 0; m < fData.size(); ++m)
136  result[m] = fSpline(&fData[m].front(),x);
137 }
138 
140  const double xStop, /* inclusive! */
141  const double yStart,
142  const double yStop, /* inclusive! */
143  const boost::multi_array<double,3>& values, // first index is function vector index!
144  const BoundaryCondition& bcX,
145  const BoundaryCondition& bcY)
146 {
147  const size_t fn = values.shape()[0];
148  const size_t xn = values.shape()[1];
149  const size_t yn = values.shape()[2];
150 
151  fSpline.Configure(0, KnotVector(xn, xStart, xStop));
152  fSpline.Configure(1, KnotVector(yn, yStart, yStop));
153 
154  fData.resize(fn, std::vector<double>((xn+2)*(yn+2)));
155 
156  Solver<2, KnotVector, BasisFunction> solver;
157  solver.Configure(0, fSpline.GetKnotVector(0), fSpline.GetBasisVector(0), bcX);
158  solver.Configure(1, fSpline.GetKnotVector(1), fSpline.GetBasisVector(1), bcY);
159  for (size_t m = 0; m < fn; ++m)
160  {
161  for (size_t i = 0; i < xn; ++i)
162  for (size_t j = 0; j < yn; ++j)
163  fData[m][j*(xn+2) + i] = values[m][i][j];
164  solver(&fData[m].front());
165  }
166 }
167 
168 void
169 VectorInterpolator2D::operator()(std::vector<double>& result, const double x, const double y)
170  const
171 {
172  fX[0] = x;
173  fX[1] = y;
174  for (size_t m = 0; m < fData.size(); ++m)
175  result[m] = fSpline(&fData[m].front(), fX);
176 }
177 
179  const double xStop, /* inclusive! */
180  const double yStart,
181  const double yStop, /* inclusive! */
182  const double zStart,
183  const double zStop, /* inclusive! */
184  const boost::multi_array<double,4>& values, // first index is function vector index!
185  const BoundaryCondition& bcX,
186  const BoundaryCondition& bcY,
187  const BoundaryCondition& bcZ)
188 {
189  const size_t fn = values.shape()[0];
190  const size_t xn = values.shape()[1];
191  const size_t yn = values.shape()[2];
192  const size_t zn = values.shape()[3];
193 
194  fSpline.Configure(0, KnotVector(xn, xStart, xStop));
195  fSpline.Configure(1, KnotVector(yn, yStart, yStop));
196  fSpline.Configure(2, KnotVector(zn, zStart, zStop));
197 
198  fData.resize(fn, std::vector<double>((xn+2)*(yn+2)*(zn+2)));
199 
200  Solver<3, KnotVector, BasisFunction> solver;
201  solver.Configure(0, fSpline.GetKnotVector(0), fSpline.GetBasisVector(0), bcX);
202  solver.Configure(1, fSpline.GetKnotVector(1), fSpline.GetBasisVector(1), bcY);
203  solver.Configure(2, fSpline.GetKnotVector(2), fSpline.GetBasisVector(2), bcZ);
204  for (size_t m = 0; m < fn; ++m)
205  {
206  for (size_t i = 0; i < xn; ++i)
207  for (size_t j = 0; j < yn; ++j)
208  for (size_t k = 0; k < zn; ++k)
209  fData[m][k*(yn+2)*(xn+2) + j*(xn+2) + i] = values[m][i][j][k];
210  solver(&fData[m].front());
211  }
212 }
213 
214 void
215 VectorInterpolator3D::operator()(std::vector<double>& result, const double x, const double y, const double z)
216  const
217 {
218  fX[0] = x;
219  fX[1] = y;
220  fX[2] = z;
221  for (size_t m = 0; m < fData.size(); ++m)
222  result[m] = fSpline(&fData[m].front(), fX);
223 }
std::vector< std::vector< double > > fData
Spline::Function< 3, KnotVector, BasisFunction > fSpline
Spline::Function< 2, KnotVector, BasisFunction > fSpline
std::vector< std::vector< double > > fData
Spline::Function< 2, KnotVector, BasisFunction > fSpline
void operator()(std::vector< double > &result, const double x, const double y, const double z) const
Spline::Function< 3, KnotVector, BasisFunction > fSpline
const Data result[]
std::vector< std::vector< double > > fData
double operator()(const double x, const double y, const double z) const
void Configure(const dim_t idim, const AKnotVector &knots)
Spline::Function< 1, KnotVector, BasisFunction > fSpline
void operator()(std::vector< double > &result, const double x, const double y) const
void operator()(std::vector< double > &result, const double x) const
Spline::Function< 1, KnotVector, BasisFunction > fSpline
constexpr double m
Definition: AugerUnits.h:121
double operator()(const double x) const
double operator()(const double x, const double y) const

, generated on Tue Sep 26 2023.