#include #include #include #include #include #include class parameters { public: parameters(); double get(double); private: std::vector x, y; std::unique_ptr acc; std::unique_ptr spline; }; /* ---{}--- constructor ---{}--- */ parameters::parameters(): x({{0.0,1.0,2.0}}),y({{0.0,1.0,2.0}}), acc(gsl_interp_accel_alloc(),gsl_interp_accel_free), spline(gsl_spline_alloc(gsl_interp_cspline,x.size()),gsl_spline_free) { gsl_spline_init(spline.get(),x.data(),y.data(),x.size()); } /* ---{}--- parameters::get ---{}--- */ auto parameters::get(double x) -> double { return gsl_spline_eval(spline.get(),x,acc.get()); } /* ---{}--- gsl function ---{}--- */ double function(double x, void* ptr) { parameters* params = static_cast(ptr); return params->get(x); } int main() { parameters params; gsl_function F; F.function = &function; F.params = ¶ms; double result, error; std::unique_ptr w(gsl_integration_workspace_alloc(1000),gsl_integration_workspace_free); gsl_integration_qags(&F,0,2,0,1.0e-7,1000,w.get(),&result,&error); std::cout << result << std::endl; return 0; }