1 #ifndef _utl_SplineInterpolatorEinspline_h_
2 #define _utl_SplineInterpolatorEinspline_h_
6 #include <boost/array.hpp>
7 #include <boost/multi_array.hpp>
9 #include <utl/AugerException.h>
15 #undef PACKAGE_BUGREPORT
18 #undef PACKAGE_TARNAME
19 #undef PACKAGE_VERSION
21 #include <einspline/bspline_base.h>
22 #include <einspline/bspline_structs.h>
23 #include <einspline/bspline_create.h>
24 #include <einspline/bspline_eval_std_d.h>
26 #include <einspline/multi_bspline_structs.h>
27 #include <einspline/multi_bspline_create.h>
28 #include <einspline/multi_bspline_eval_d.h>
30 #undef PACKAGE_BUGREPORT
33 #undef PACKAGE_TARNAME
34 #undef PACKAGE_VERSION
64 const double vLeft = 0,
65 const double vRight = 0)
67 lCode =
static_cast<const bc_code
>(type);
69 rCode =
static_cast<const bc_code
>(type);
83 const std::vector<double>& fValue,
89 grid.num = fValue.size();
90 fDataPtr = create_UBspline_1d_d(grid, bcX, const_cast<double*>(&fValue[0]));
103 const int n =
fDataPtr->x_grid.num + (
fDataPtr->xBC.lCode == PERIODIC ? 3 : 2);
105 for (
int i = 0; i < n; ++i)
117 if (x < fDataPtr->x_grid.start || x >
fDataPtr->x_grid.end)
121 eval_UBspline_1d_d(
fDataPtr, x, &result);
158 const boost::multi_array<double,2>& values,
163 grid[0].num = values.shape()[0];
164 grid[0].start = xStart;
166 grid[1].num = values.shape()[1];
167 grid[1].start = yStart;
169 fDataPtr = create_UBspline_2d_d(grid[0], grid[1], bcX, bcY, const_cast<double*>(values.data()));
177 if (
this != &other) {
186 for (
int i = 0; i < n; ++i)
198 if (x < fDataPtr->x_grid.start || x >
fDataPtr->x_grid.end)
200 if (y < fDataPtr->y_grid.start || y >
fDataPtr->y_grid.end)
204 eval_UBspline_2d_d(
fDataPtr, x, y, &result);
209 GetStart(
const unsigned char dimension)
226 GetStop(
const unsigned char dimension)
259 const boost::multi_array<double,3>& values,
265 grid[0].num = values.shape()[0];
266 grid[0].start = xStart;
268 grid[1].num = values.shape()[1];
269 grid[1].start = yStart;
271 grid[2].num = values.shape()[2];
272 grid[2].start = zStart;
275 fDataPtr = create_UBspline_3d_d(grid[0], grid[1], grid[2], bcX, bcY, bcZ, const_cast<double*>(values.data()));
283 if (
this != &other) {
293 for (
int i = 0; i < n; ++i)
305 if (x < fDataPtr->x_grid.start || x >
fDataPtr->x_grid.end)
307 if (y < fDataPtr->y_grid.start || y >
fDataPtr->y_grid.end)
309 if (z < fDataPtr->z_grid.start || z >
fDataPtr->z_grid.end)
313 eval_UBspline_3d_d(
fDataPtr, x, y, z, &result);
318 GetStart(
const unsigned char dimension)
337 GetStop(
const unsigned char dimension)
368 const boost::multi_array<double,2>& fValue,
374 grid.num = fValue.shape()[1];
376 fDataPtr = create_multi_UBspline_1d_d(grid, bcX, fValue.shape()[0]);
377 for (
size_t i = 0; i < fValue.shape()[0]; ++i)
378 set_multi_UBspline_1d_d(
fDataPtr, i, const_cast<double*>(fValue.data() + i*grid.num));
386 if (
this != &other) {
391 const int n =
fDataPtr->num_splines *
394 for (
int i = 0; i < n; ++i)
406 if (x < fDataPtr->x_grid.start || x >
fDataPtr->x_grid.end)
408 if (result.size() != size_t(
fDataPtr->num_splines))
409 result.resize(
fDataPtr->num_splines);
410 eval_multi_UBspline_1d_d(
fDataPtr, x, &result[0]);
446 const boost::multi_array<double,3>& fValue,
451 grid[0].start = xStart;
453 grid[0].num = fValue.shape()[1];
454 grid[1].start = yStart;
456 grid[1].num = fValue.shape()[2];
458 fDataPtr = create_multi_UBspline_2d_d(grid[0], grid[1], bcX, bcY, fValue.shape()[0]);
459 for (
size_t i = 0; i < fValue.shape()[0]; ++i)
460 set_multi_UBspline_2d_d(
fDataPtr, i, const_cast<double*>(fValue.data() + i*grid[0].num*grid[1].num));
468 if (
this != &other) {
473 const int n =
fDataPtr->num_splines *
477 for (
int i = 0; i < n; ++i)
489 if (x < fDataPtr->x_grid.start || x >
fDataPtr->x_grid.end)
491 if (y < fDataPtr->y_grid.start || y >
fDataPtr->y_grid.end)
493 if (result.size() != size_t(
fDataPtr->num_splines))
494 result.resize(
fDataPtr->num_splines);
495 eval_multi_UBspline_2d_d(
fDataPtr, x, y, &result[0]);
499 GetStart(
const unsigned char dimension)
516 GetStop(
const unsigned char dimension)
549 const boost::multi_array<double,4>& fValue,
555 grid[0].start = xStart;
557 grid[0].num = fValue.shape()[1];
558 grid[1].start = yStart;
560 grid[1].num = fValue.shape()[2];
561 grid[2].start = zStart;
563 grid[2].num = fValue.shape()[3];
565 fDataPtr = create_multi_UBspline_3d_d(grid[0], grid[1], grid[2], bcX, bcY, bcZ, fValue.shape()[0]);
566 for (
size_t i = 0; i < fValue.shape()[0]; ++i)
567 set_multi_UBspline_3d_d(
fDataPtr, i, const_cast<double*>(fValue.data() + i*grid[0].num*grid[1].num*grid[2].num));
575 if (
this != &other) {
580 const int n =
fDataPtr->num_splines *
585 for (
int i = 0; i < n; ++i)
597 if (x < fDataPtr->x_grid.start || x >
fDataPtr->x_grid.end)
599 if (y < fDataPtr->y_grid.start || y >
fDataPtr->y_grid.end)
601 if (z < fDataPtr->z_grid.start || z >
fDataPtr->z_grid.end)
603 if (result.size() != size_t(
fDataPtr->num_splines))
604 result.resize(
fDataPtr->num_splines);
605 eval_multi_UBspline_3d_d(
fDataPtr, x, y, z, &result[0]);
609 GetStart(
const unsigned char dimension)
628 GetStop(
const unsigned char dimension)
Interpolator3D(const Interpolator3D &other)
multi_UBspline_1d_d * fDataPtr
double GetStart(const unsigned char dimension) const
VectorInterpolator2D & operator=(const VectorInterpolator2D &other)
multi_UBspline_3d_d * fDataPtr
Base class for exceptions arising because configuration data are not valid.
VectorInterpolator1D & operator=(const VectorInterpolator1D &other)
Interpolator2D(const Interpolator2D &other)
double GetStart(const unsigned char dimension) const
VectorInterpolator2D(const VectorInterpolator2D &other)
VectorInterpolator1D(const VectorInterpolator1D &other)
double GetStop(const unsigned char dimension) const
Exception for reporting variable out of valid range.
VectorInterpolator2D(const double xStart, const double xStop, const double yStart, const double yStop, const boost::multi_array< double, 3 > &fValue, const BoundaryCondition &bcX=BoundaryCondition(), const BoundaryCondition &bcY=BoundaryCondition())
VectorInterpolator3D & operator=(const VectorInterpolator3D &other)
Interpolator2D & operator=(const Interpolator2D &other)
void operator()(std::vector< double > &result, const double x, const double y, const double z) const
BoundaryCondition(const Type type=eNatural, const double vLeft=0, const double vRight=0)
multi_UBspline_2d_d * fDataPtr
double GetStart(const unsigned char dimension) const
double operator()(const double x, const double y, const double z) const
Interpolator1D(const double xStart, const double xStop, const std::vector< double > &fValue, const BoundaryCondition &bcX=BoundaryCondition())
double GetStop(const unsigned char dimension) const
Base class for inconsistency/illogicality exceptions.
void operator()(std::vector< double > &result, const double x, const double y) const
Interpolator1D & operator=(const Interpolator1D &other)
Interpolator1D(const Interpolator1D &other)
Interpolator3D(const double xStart, const double xStop, const double yStart, const double yStop, const double zStart, const double zStop, const boost::multi_array< double, 3 > &values, const BoundaryCondition bcX=BoundaryCondition(), const BoundaryCondition bcY=BoundaryCondition(), const BoundaryCondition bcZ=BoundaryCondition())
double GetStart(const unsigned char dimension) const
void operator()(std::vector< double > &result, const double x) const
VectorInterpolator3D(const VectorInterpolator3D &other)
VectorInterpolator1D(const double xStart, const double xStop, const boost::multi_array< double, 2 > &fValue, const BoundaryCondition &bcX=BoundaryCondition())
double GetStop(const unsigned char dimension) const
double GetStop(const unsigned char dimension) const
VectorInterpolator3D(const double xStart, const double xStop, const double yStart, const double yStop, const double zStart, const double zStop, const boost::multi_array< double, 4 > &fValue, const BoundaryCondition &bcX=BoundaryCondition(), const BoundaryCondition &bcY=BoundaryCondition(), const BoundaryCondition &bcZ=BoundaryCondition())
Interpolator2D(const double xStart, const double xStop, const double yStart, const double yStop, const boost::multi_array< double, 2 > &values, const BoundaryCondition bcX=BoundaryCondition(), const BoundaryCondition bcY=BoundaryCondition())
double operator()(const double x) const
Interpolator3D & operator=(const Interpolator3D &other)
double operator()(const double x, const double y) const