20#ifndef CCGSL_INTERP_HPP
21#define CCGSL_INTERP_HPP
25#include<gsl/gsl_interp.h>
36 typedef gsl_interp_type
type;
54 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
104#ifdef __GXX_EXPERIMENTAL_CXX0X__
110 std::swap(
count, v.count );
111 v.ccgsl_pointer =
nullptr;
119 interp( std::move( v ) ).swap( *
this );
229#ifdef __GXX_EXPERIMENTAL_CXX0X__
247 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
260 explicit accel( gsl_interp_accel* v ){
297#ifdef __GXX_EXPERIMENTAL_CXX0X__
303 std::swap(
count, v.count );
304 v.ccgsl_pointer =
nullptr;
312 accel( std::move( v ) ).swap( *
this );
422#ifdef __GXX_EXPERIMENTAL_CXX0X__
431 int reset(){
return gsl_interp_accel_reset(
get() ); }
439 size_t find(
double const xa[],
size_t len,
double x ){
440 return gsl_interp_accel_find(
get(), xa, len, x ); }
448 template<
typename XA>
449 size_t find( XA
const& xa,
double x ){
450 return gsl_interp_accel_find(
get(), xa.data(), xa.size(), x ); }
460 int init(
double const xa[],
double const ya[],
size_t const size ){
461 return gsl_interp_init(
get(), xa, ya,
size ); }
470 template<
typename XA,
typename YA>
471 int init( XA
const& xa, YA
const& ya ){
472 if( ya.size() != xa.size() )
473 throw std::length_error(
"gsl::interp::init(): xa and ya must have the same size.");
474 return gsl_interp_init(
get(), xa.data(), ya.data(), xa.size() ); }
480 char const*
name()
const {
return gsl_interp_name(
get() ); }
486 unsigned int min_size()
const {
return gsl_interp_min_size(
get() ); }
494 return gsl_interp_type_min_size( T ); }
505 int eval_e(
double const xa[],
double const ya[],
double x,
accel&
a,
double* y )
const {
506 return gsl_interp_eval_e(
get(), xa, ya, x,
a.get(), y ); }
517 int eval_e(
double const xa[],
double const ya[],
double x,
accel&
a,
double& y )
const {
518 return gsl_interp_eval_e(
get(), xa, ya, x,
a.get(), &y ); }
528 double eval(
double const xa[],
double const ya[],
double x,
accel&
a )
const {
529 return gsl_interp_eval(
get(), xa, ya, x,
a.get() ); }
541 int eval_deriv_e(
double const xa[],
double const ya[],
double x,
accel&
a,
double* d )
542 const {
return gsl_interp_eval_deriv_e(
get(), xa, ya, x,
a.get(), d ); }
554 const {
return gsl_interp_eval_deriv_e(
get(), xa, ya, x,
a.get(), &d ); }
565 return gsl_interp_eval_deriv(
get(), xa, ya, x,
a.get() ); }
578 const {
return gsl_interp_eval_deriv2_e(
get(), xa, ya, x,
a.get(), d2 ); }
590 const {
return gsl_interp_eval_deriv2_e(
get(), xa, ya, x,
a.get(), &d2 ); }
601 return gsl_interp_eval_deriv2(
get(), xa, ya, x,
a.get() ); }
614 int eval_integ_e(
double const xa[],
double const ya[],
double a,
double b,
616 return gsl_interp_eval_integ_e(
get(), xa, ya,
a,
b, acc.get(),
result ); }
630 return gsl_interp_eval_integ_e(
get(), xa, ya,
a,
b, acc.
get(), &
result ); }
642 const {
return gsl_interp_eval_integ(
get(), xa, ya,
a,
b, acc.
get() ); }
652 size_t bsearch(
double const x_array[],
double x,
size_t index_lo,
size_t index_hi ){
653 return gsl_interp_bsearch( x_array, x, index_lo, index_hi ); }
667 template<
typename XA,
typename YA>
668 int eval_e( XA
const& xa, YA
const& ya,
double x,
accel&
a,
double* y )
const {
669 return gsl_interp_eval_e(
get(), xa.data(), ya.data(), x,
a.get(), y ); }
681 template<
typename XA,
typename YA>
682 int eval_e( XA
const& xa, YA
const& ya,
double x,
accel&
a,
double& y )
const {
683 return gsl_interp_eval_e(
get(), xa.data(), ya.data(), x,
a.get(), &y ); }
694 template<
typename XA,
typename YA>
695 double eval( XA
const& xa, YA
const& ya,
double x,
accel&
a )
const {
696 return gsl_interp_eval(
get(), xa.data(), ya.data(), x,
a.get() ); }
709 template<
typename XA,
typename YA>
711 return gsl_interp_eval_deriv_e(
get(), xa.data(), ya.data(), x,
a.get(), d ); }
723 template<
typename XA,
typename YA>
725 return gsl_interp_eval_deriv_e(
get(), xa.data(), ya.data(), x,
a.get(), &d ); }
736 template<
typename XA,
typename YA>
738 return gsl_interp_eval_deriv(
get(), xa.data(), ya.data(), x,
a.get() ); }
751 template<
typename XA,
typename YA>
753 return gsl_interp_eval_deriv2_e(
get(), xa.data(), ya.data(), x,
a.get(), d2 ); }
765 template<
typename XA,
typename YA>
767 return gsl_interp_eval_deriv2_e(
get(), xa.data(), ya.data(), x,
a.get(), &d2 ); }
778 template<
typename XA,
typename YA>
780 return gsl_interp_eval_deriv2(
get(), xa.data(), ya.data(), x,
a.get() ); }
794 template<
typename XA,
typename YA>
797 return gsl_interp_eval_integ_e(
get(), xa.data(), ya.data(),
a,
b, acc.get(),
result ); }
810 template<
typename XA,
typename YA>
813 return gsl_interp_eval_integ_e(
get(), xa.data(), ya.data(),
a,
b, acc.
get(), &
result ); }
825 template<
typename XA,
typename YA>
827 return gsl_interp_eval_integ(
get(), xa.data(), ya.data(),
a,
b, acc.
get() ); }
839 static size_t bsearch( X
const& x_array,
double x,
size_t index_lo,
size_t index_hi ){
840 return gsl_interp_bsearch( x_array.data(), x, index_lo, index_hi ); }
857 inline static type const*
akima(){
return gsl_interp_akima; }
Workspace for acceleration.
~accel()
The destructor only deletes the pointers if count reaches zero.
bool unique() const
Find if this is the only object sharing the gsl_interp_accel.
bool operator>=(accel const &v) const
A container needs to define an ordering for sorting.
accel(accel const &v)
The copy constructor.
bool operator<(accel const &v) const
A container needs to define an ordering for sorting.
void swap(accel &v)
Swap two accel objects.
bool operator<=(accel const &v) const
A container needs to define an ordering for sorting.
size_t find(XA const &xa, double x)
C++ version of gsl_interp_accel_find().
bool operator!=(accel const &v) const
Two accel are different if their elements are not identical.
accel & operator=(accel const &v)
The assignment operator.
size_t use_count() const
Find how many accel objects share this pointer.
bool operator==(accel const &v) const
Two accel are identically equal if their elements are identical.
accel & operator=(accel &&v)
Move operator.
int reset()
C++ version of gsl_interp_accel_reset().
size_t find(double const xa[], size_t len, double x)
C++ version of gsl_interp_accel_find().
bool operator>(accel const &v) const
A container needs to define an ordering for sorting.
size_t * count
The shared reference count.
accel()
The default constructor creates a new accel.
accel(accel &&v)
Move constructor.
accel(gsl_interp_accel *v)
Could construct from a gsl_interp_accel.
gsl_interp_accel * ccgsl_pointer
The shared pointer.
gsl_interp_accel * get() const
Get the gsl_interp_accel.
bool empty() const
Find if the accel is empty.
Interpolation functions and objects.
interp(interp const &v)
The copy constructor.
double eval_deriv2(XA const &xa, YA const &ya, double x, accel &a) const
C++ version of gsl_interp_eval_deriv2().
interp & operator=(interp const &v)
The assignment operator.
interp()
The default constructor is only really useful for assigning to.
static type const * steffen()
Static type.
static type const * cspline()
Static type.
double eval_integ(double const xa[], double const ya[], double a, double b, accel &acc) const
C++ version of gsl_interp_eval_integ().
gsl_interp * get() const
Get the gsl_interp.
char const * name() const
C++ version of gsl_interp_name().
int eval_integ_e(double const xa[], double const ya[], double a, double b, accel &acc, double &result) const
C++ version of gsl_interp_eval_integ_e().
double eval(double const xa[], double const ya[], double x, accel &a) const
C++ version of gsl_interp_eval().
interp & operator=(interp &&v)
Move operator.
unsigned int min_size() const
C++ version of gsl_interp_min_size().
double eval(XA const &xa, YA const &ya, double x, accel &a) const
C++ version of gsl_interp_eval().
int eval_deriv_e(XA const &xa, YA const &ya, double x, accel &a, double &d) const
C++ version of gsl_interp_eval_deriv_e().
interp(interp &&v)
Move constructor.
bool operator<(interp const &v) const
A container needs to define an ordering for sorting.
double eval_deriv(double const xa[], double const ya[], double x, accel &a) const
C++ version of gsl_interp_eval_deriv().
int eval_deriv2_e(double const xa[], double const ya[], double x, accel &a, double &d2) const
C++ version of gsl_interp_eval_deriv2_e().
int init(double const xa[], double const ya[], size_t const size)
C++ version of gsl_interp_init().
interp(gsl_interp *v)
Could construct from a gsl_interp.
interp(type const *T, size_t const n)
The default constructor creates a new interp with n elements.
gsl_interp_type type
Convenient typedef.
size_t bsearch(double const x_array[], double x, size_t index_lo, size_t index_hi)
C++ version of gsl_interp_bsearch().
bool operator!=(interp const &v) const
Two interp are different if their elements are not identical.
int eval_integ_e(XA const &xa, YA const &ya, double a, double b, accel &acc, double &result) const
C++ version of gsl_interp_eval_integ_e().
gsl_interp * ccgsl_pointer
The shared pointer.
static type const * akima()
Static type.
int eval_e(XA const &xa, YA const &ya, double x, accel &a, double &y) const
C++ version of gsl_interp_eval_e().
bool operator==(interp const &v) const
Two interp are identically equal if their elements are identical.
void swap(interp &v)
Swap two interp objects.
static size_t bsearch(X const &x_array, double x, size_t index_lo, size_t index_hi)
C++ version of gsl_interp_bsearch().
double eval_deriv2(double const xa[], double const ya[], double x, accel &a) const
C++ version of gsl_interp_eval_deriv2().
static type const * akima_periodic()
Static type.
double eval_integ(XA const &xa, YA const &ya, double a, double b, accel &acc) const
C++ version of gsl_interp_eval_integ().
bool unique() const
Find if this is the only object sharing the gsl_interp.
double eval_deriv(XA const &xa, YA const &ya, double x, accel &a) const
C++ version of gsl_interp_eval_deriv().
size_t use_count() const
Find how many interp objects share this pointer.
int eval_e(double const xa[], double const ya[], double x, accel &a, double &y) const
C++ version of gsl_interp_eval_e().
size_t * count
The shared reference count.
bool operator>=(interp const &v) const
A container needs to define an ordering for sorting.
int eval_deriv2_e(XA const &xa, YA const &ya, double x, accel &a, double &d2) const
C++ version of gsl_interp_eval_deriv2_e().
int eval_deriv_e(double const xa[], double const ya[], double x, accel &a, double &d) const
C++ version of gsl_interp_eval_deriv_e().
~interp()
The destructor only deletes the pointers if count reaches zero.
bool operator>(interp const &v) const
A container needs to define an ordering for sorting.
unsigned int type_min_size(gsl_interp_type const *T)
C++ version of gsl_interp_type_min_size().
bool empty() const
Find if the interp is empty.
static type const * cspline_periodic()
Static type.
bool operator<=(interp const &v) const
A container needs to define an ordering for sorting.
int init(XA const &xa, YA const &ya)
C++ version of gsl_interp_init().
size_t size(series const &cs)
C++ version of gsl_cheb_size().
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
double b(int order, double qq)
C++ version of gsl_sf_mathieu_b().
double a(int order, double qq)
C++ version of gsl_sf_mathieu_a().
gsl_sf_result result
Typedef for gsl_sf_result.
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++.