20#ifndef CCGSL_INTERP2D_HPP
21#define CCGSL_INTERP2D_HPP
24#include<gsl/gsl_interp2d.h>
36 typedef gsl_interp2d_type
type;
52 explicit interp2d(
type const* T,
size_t const xsize,
size_t const ysize ){
55 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
105#ifdef __GXX_EXPERIMENTAL_CXX0X__
111 std::swap(
count, v.count );
112 v.ccgsl_pointer =
nullptr;
120 interp2d( std::move( v ) ).swap( *
this );
230#ifdef __GXX_EXPERIMENTAL_CXX0X__
238 char const*
name()
const {
return gsl_interp2d_name(
get() ); }
243 size_t min_size()
const {
return gsl_interp2d_min_size(
get() ); }
258 int set(
double zarr[],
size_t const i,
size_t const j,
double const z )
const {
259 return gsl_interp2d_set(
get(), zarr, i, j, z ); }
268 template<
typename ARRAY>
269 int set( ARRAY& zarr,
size_t const i,
size_t const j,
double const z )
const {
270 if( zarr.size() !=
get()->xsize *
get()->ysize )
271 throw std::range_error(
"gsl::interp2d::set(): zarr has wrong size.");
272 return gsl_interp2d_set(
get(), zarr.data(), i, j, z ); }
280 double get(
double const zarr[],
size_t const i,
size_t const j )
const {
281 return gsl_interp2d_get(
get(), zarr, i, j ); }
289 template<
typename ARRAY>
290 double get( ARRAY
const& zarr,
size_t const i,
size_t const j )
const {
291 if( zarr.size() !=
get()->xsize *
get()->ysize )
292 throw std::range_error(
"gsl::interp2d::get(): zarr has wrong size.");
293 return gsl_interp2d_get(
get(), zarr.data(), i, j ); }
300 size_t idx(
size_t const i,
size_t const j )
const {
301 return gsl_interp2d_idx(
get(), i, j ); }
311 int init(
double const xa[],
double const ya[],
double const za[],
size_t const xsize,
312 size_t const ysize ){
313 return gsl_interp2d_init(
get(), xa, ya, za, xsize, ysize ); }
322 template<
typename VECTOR>
323 int init( VECTOR
const& xa, VECTOR
const& ya, VECTOR
const& za ){
324 if( za.size() != xa.size() * ya.size() )
325 throw std::range_error(
"gsl::interp2d::init(): za has wrong size.");
326 return gsl_interp2d_init(
get(), xa.data(), ya.data(), za.data(),
327 xa.size(), ya.size() ); }
339 double eval(
double const xarr[],
double const yarr[],
double const zarr[],
341 return gsl_interp2d_eval(
get(), xarr, yarr, zarr, x, y, xa.
get(), ya.
get() ); }
354 template<
typename VECTOR>
355 double eval( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
357 if( zarr.size() != xarr.size() * yarr.size() )
358 throw std::range_error(
"gsl::interp2d::eval(): zarr has wrong size.");
359 return gsl_interp2d_eval(
get(), xarr.data(), yarr.data(), zarr.data(),
360 x, y, xa.
get(), ya.
get() ); }
372 double eval_extrap(
double const xarr[],
double const yarr[],
double const zarr[],
373 double const x,
double const y,
375 return gsl_interp2d_eval_extrap(
get(), xarr, yarr, zarr, x, y, xa.
get(),
389 template<
typename VECTOR>
390 double eval_extrap( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
391 double const x,
double const y,
393 if( zarr.size() != xarr.size() * yarr.size() )
394 throw std::range_error(
"gsl::interp2d::eval_extrap(): zarr has wrong size.");
395 return gsl_interp2d_eval_extrap(
get(), xarr.data(), yarr.data(), zarr.data(),
396 x, y, xa.
get(), ya.
get() ); }
409 int eval_e(
double const xarr[],
double const yarr[],
double const zarr[],
410 double const x,
double const y,
412 return gsl_interp2d_eval_e(
get(), xarr, yarr, zarr, x, y,
413 xa.
get(), ya.
get(), &z ); }
427 template<
typename VECTOR>
428 int eval_e( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
429 double const x,
double const y,
431 if( zarr.size() != xarr.size() * yarr.size() )
432 throw std::range_error(
"gsl::interp2d::eval_e(): zarr has wrong size.");
433 return gsl_interp2d_eval_e(
get(), xarr.data(), yarr.data(), zarr.data(),
434 x, y, xa.
get(), ya.
get(), &z ); }
435#ifndef GSL_DISABLE_DEPRECATED
448 int eval_e_extrap(
double const xarr[],
double const yarr[],
double const zarr[],
449 double const x,
double const y,
451 return gsl_interp2d_eval_e_extrap(
get(), xarr, yarr, zarr, x, y,
452 xa.
get(), ya.
get(), &z ); }
466 template<
typename VECTOR>
467 int eval_e_extrap( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
468 double const x,
double const y,
470 return gsl_interp2d_eval_e_extrap(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
471 xa.
get(), ya.
get(), &z ); }
485 int eval_extrap_e(
double const xarr[],
double const yarr[],
double const zarr[],
486 double const x,
double const y,
488 return gsl_interp2d_eval_extrap_e(
get(), xarr, yarr, zarr, x, y,
489 xa.
get(), ya.
get(), &z ); }
503 template<
typename VECTOR>
504 int eval_extrap_e( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
505 double const x,
double const y,
507 if( zarr.size() != xarr.size() * yarr.size() )
508 throw std::range_error(
"gsl::interp2d::extrap_e(): zarr has wrong size.");
509 return gsl_interp2d_eval_extrap_e(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
510 xa.get(), ya.get(), &z ); }
523 double eval_deriv_x(
double const xarr[],
double const yarr[],
double const zarr[],
524 double const x,
double const y,
526 return gsl_interp2d_eval_deriv_x(
get(), xarr, yarr, zarr, x, y, xa.
get(),
540 template<
typename VECTOR>
541 double eval_deriv_x( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
542 double const x,
double const y,
544 if( zarr.size() != xarr.size() * yarr.size() )
545 throw std::range_error(
"gsl::interp2d::eval_deriv_x(): zarr has wrong size.");
546 return gsl_interp2d_eval_deriv_x(
get(), xarr.data(), yarr.data(), zarr.data(),
547 x, y, xa.
get(), ya.
get() ); }
560 int eval_deriv_x_e(
double const xarr[],
double const yarr[],
double const zarr[],
563 return gsl_interp2d_eval_deriv_x_e(
get(), xarr, yarr, zarr, x, y,
564 xa.
get(), ya.
get(), &z ); }
578 template<
typename VECTOR>
582 if( zarr.size() != xarr.size() * yarr.size() )
583 throw std::range_error(
"gsl::interp2d::eval_deriv-x_e(): zarr has wrong size.");
584 return gsl_interp2d_eval_deriv_x_e(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
585 xa.
get(), ya.
get(), &z ); }
597 double eval_deriv_y(
double const xarr[],
double const yarr[],
double const zarr[],
598 double const x,
double const y,
600 return gsl_interp2d_eval_deriv_y(
get(), xarr, yarr, zarr, x, y,
614 template<
typename VECTOR>
615 double eval_deriv_y( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
616 double const x,
double const y,
618 if( zarr.size() != xarr.size() * yarr.size() )
619 throw std::range_error(
"gsl::interp2d::eval_deriv_y(): zarr has wrong size.");
620 return gsl_interp2d_eval_deriv_y(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
634 int eval_deriv_y_e(
double const xarr[],
double const yarr[],
double const zarr[],
637 return gsl_interp2d_eval_deriv_y_e(
get(), xarr, yarr, zarr, x, y,
638 xa.
get(), ya.
get(), &z ); }
652 template<
typename VECTOR>
656 if( zarr.size() != xarr.size() * yarr.size() )
657 throw std::range_error(
"gsl::interp2d::eval_deriv_y_e(): zarr has wrong size.");
658 return gsl_interp2d_eval_deriv_y_e(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
659 xa.
get(), ya.
get(), &z ); }
671 double eval_deriv_xx(
double const xarr[],
double const yarr[],
double const zarr[],
672 double const x,
double const y,
674 return gsl_interp2d_eval_deriv_xx(
get(), xarr, yarr, zarr, x, y,
688 template<
typename VECTOR>
689 double eval_deriv_xx( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
690 double const x,
double const y,
692 if( zarr.size() != xarr.size() * yarr.size() )
693 throw std::range_error(
"gsl::interp2d::eval_deriv_xx(): zarr has wrong size.");
694 return gsl_interp2d_eval_deriv_xx(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
709 double const x,
double const y,
711 return gsl_interp2d_eval_deriv_xx_e(
get(), xarr, yarr, zarr, x, y,
712 xa.
get(), ya.
get(), &z ); }
726 template<
typename VECTOR>
730 if( zarr.size() != xarr.size() * yarr.size() )
731 throw std::range_error(
"gsl::interp2d::eval_deriv_xx_e(): zarr has wrong size.");
732 return gsl_interp2d_eval_deriv_xx_e(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
733 xa.
get(), ya.
get(), &z ); }
745 double eval_deriv_yy(
double const xarr[],
double const yarr[],
double const zarr[],
746 double const x,
double const y,
748 return gsl_interp2d_eval_deriv_yy(
get(), xarr, yarr, zarr, x, y,
762 template<
typename VECTOR>
763 double eval_deriv_yy( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
764 double const x,
double const y,
766 if( zarr.size() != xarr.size() * yarr.size() )
767 throw std::range_error(
"gsl::interp2d::eval_deriv_yy(): zarr has wrong size.");
768 return gsl_interp2d_eval_deriv_yy(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
783 double const x,
double const y,
785 return gsl_interp2d_eval_deriv_yy_e(
get(), xarr, yarr, zarr, x, y,
786 xa.
get(), ya.
get(), &z ); }
800 template<
typename VECTOR>
802 double const x,
double const y,
804 if( zarr.size() != xarr.size() * yarr.size() )
805 throw std::range_error(
"gsl::interp2d::eval_deriv_yy_e(): zarr has wrong size.");
806 return gsl_interp2d_eval_deriv_yy_e(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
807 xa.
get(), ya.
get(), &z ); }
819 double eval_deriv_xy(
double const xarr[],
double const yarr[],
double const zarr[],
820 double const x,
double const y,
822 return gsl_interp2d_eval_deriv_xy(
get(), xarr, yarr, zarr, x, y,
836 template<
typename VECTOR>
837 double eval_deriv_xy( VECTOR
const& xarr, VECTOR
const& yarr, VECTOR
const& zarr,
838 double const x,
double const y,
840 if( zarr.size() != xarr.size() * yarr.size() )
841 throw std::range_error(
"gsl::interp2d::eval_deriv_xy(): zarr has wrong size.");
842 return gsl_interp2d_eval_deriv_xy(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
857 double const x,
double const y,
859 return gsl_interp2d_eval_deriv_xy_e(
get(), xarr, yarr, zarr, x, y,
860 xa.
get(), ya.
get(), &z ); }
874 template<
typename VECTOR>
876 double const x,
double const y,
878 if( zarr.size() != xarr.size() * yarr.size() )
879 throw std::range_error(
"gsl::interp2d::eval_deriv_xy_e(): zarr has wrong size.");
880 return gsl_interp2d_eval_deriv_xy_e(
get(), xarr.data(), yarr.data(), zarr.data(), x, y,
881 xa.
get(), ya.
get(), &z ); }
int eval_deriv_xy_e(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_xy_e().
double eval_deriv_xx(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_xx().
int init(double const xa[], double const ya[], double const za[], size_t const xsize, size_t const ysize)
C++ version of gsl_interp2d_init().
interp2d & operator=(interp2d &&v)
Move operator.
double eval_deriv_x(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_x().
int set(double zarr[], size_t const i, size_t const j, double const z) const
C++ version of gsl_interp2d_set().
double get(ARRAY const &zarr, size_t const i, size_t const j) const
C++ version of gsl_interp2d_get().
static type const * bilinear()
2D interpolation static type.
int eval_deriv_xy_e(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_xy_e().
interp2d(type const *T, size_t const xsize, size_t const ysize)
The default constructor creates a new interp with n elements.
void swap(interp2d &v)
Swap two interp2d objects.
double eval_deriv_yy(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_yy().
int eval_deriv_y_e(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_y_e().
int eval_deriv_x_e(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_x_e().
int eval_e_extrap(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_e_extrap().
bool operator<(interp2d const &v) const
A container needs to define an ordering for sorting.
size_t use_count() const
Find how many interp2d objects share this pointer.
double eval_deriv_x(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_x().
bool operator==(interp2d const &v) const
Two interp2d are identically equal if their elements are identical.
bool operator!=(interp2d const &v) const
Two interp2d are different if their elements are not identical.
int eval_deriv_y_e(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_y_e().
double eval_deriv_y(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_y().
int set(ARRAY &zarr, size_t const i, size_t const j, double const z) const
C++ version of gsl_interp2d_set().
gsl_interp2d * ccgsl_pointer
The shared pointer.
int eval_deriv_xx_e(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_xx_e().
int eval_deriv_yy_e(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_yy_e().
double get(double const zarr[], size_t const i, size_t const j) const
C++ version of gsl_interp2d_get().
interp2d()
The default constructor is only really useful for assigning to.
int eval_e_extrap(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_e_extrap().
double eval(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval().
bool operator<=(interp2d const &v) const
A container needs to define an ordering for sorting.
gsl_interp2d_type type
Convenient typedef.
double eval_deriv_xy(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_xy().
static type const * bicubic()
2D interpolation static type.
interp2d(gsl_interp2d *v)
Could construct from a gsl_interp2d.
interp2d & operator=(interp2d const &v)
The assignment operator.
bool operator>=(interp2d const &v) const
A container needs to define an ordering for sorting.
int eval_e(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_e().
interp2d(interp2d &&v)
Move constructor.
double eval_deriv_yy(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_yy().
double eval_deriv_y(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_y().
gsl_interp2d * get() const
Get the gsl_interp2d.
int init(VECTOR const &xa, VECTOR const &ya, VECTOR const &za)
C++ version of gsl_interp2d_init().
double eval_deriv_xy(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_xy().
int eval_deriv_x_e(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_x_e().
interp2d(interp2d const &v)
The copy constructor.
int eval_e(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_e().
double eval(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval().
size_t * count
The shared reference count.
double eval_extrap(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_extrap().
char const * name() const
C++ version of gsl_interp2d_name().
bool operator>(interp2d const &v) const
A container needs to define an ordering for sorting.
double eval_extrap(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_extrap().
bool empty() const
Find if the interp2d is empty.
static size_t type_min_size(type const *T)
C++ version of gsl_interp2d_type_min_size().
size_t idx(size_t const i, size_t const j) const
C++ version of gsl_interp2d_idx().
int eval_deriv_xx_e(VECTOR const &xarr, VECTOR const &yarr, VECTOR const &zarr, double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_xx_e().
double eval_deriv_xx(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya) const
C++ version of gsl_interp2d_eval_deriv_xx().
int eval_deriv_yy_e(double const xarr[], double const yarr[], double const zarr[], double const x, double const y, interp::accel &xa, interp::accel &ya, double &z) const
C++ version of gsl_interp2d_eval_deriv_yy_e().
bool unique() const
Find if this is the only object sharing the gsl_interp2d.
size_t min_size() const
C++ version of gsl_interp2d_min_size().
~interp2d()
The destructor only deletes the pointers if count reaches zero.
Workspace for acceleration.
gsl_interp_accel * get() const
Get the gsl_interp_accel.
int accel(ARRAY const &array, workspace &w, double &sum_accel, double &abserr)
C++ version of gsl_sum_levin_u_accel().
The gsl package creates an interface to the GNU Scientific Library for C++.