60 const gsl_interp_type *interpT, realT *xin, realT *yin,
size_t Nin, realT *xout, realT *yout,
size_t Nout )
62 static_assert( std::is_same<double, typename std::remove_cv<realT>::type>::value,
63 "GSL Interpolation only works with double" );
65 gsl_set_error_handler_off();
67 gsl_interp *interp = gsl_interp_alloc( interpT, Nin );
68 if( interp ==
nullptr )
70 std::cerr <<
"gsl_interpolate: gsl_interp_alloc failed\n";
74 gsl_interp_accel *acc = gsl_interp_accel_alloc();
77 std::cerr <<
"gsl_interpolate: gsl_interp_accel_alloc failed\n";
80 int gsl_errno = gsl_interp_init( interp, xin, yin, Nin );
84 std::cerr <<
"gsl_interpolate: error from gsl_interp_init [" << gsl_strerror( gsl_errno ) <<
"]\n";
85 gsl_interp_free( interp );
86 gsl_interp_accel_free( acc );
91 for(
size_t i = 0; i < Nout; ++i )
94 gsl_errno += gsl_interp_eval_e( interp, xin, yin, xout[i], acc, &yout[i] );
97 gsl_interp_free( interp );
98 gsl_interp_accel_free( acc );
102 std::cerr <<
"gsl_interpolate: error(s) reported by gsl_interp_eval_e\n";
121 std::vector<realT> &xin,
122 std::vector<realT> &yin,
123 std::vector<realT> &xout,
124 std::vector<realT> &yout )
126 yout.resize( xout.size() );
127 return gsl_interpolate( interpT, xin.data(), yin.data(), xin.size(), xout.data(), yout.data(), xout.size() );
int gsl_interpolate(const gsl_interp_type *interpT, realT *xin, realT *yin, size_t Nin, realT *xout, realT *yout, size_t Nout)
Interpolate a 1-D data X vs Y discrete function onto a new X axis.