33 const std::vector<double> &y_)
34 : interpolation_points(x_)
35 , interpolation_values(y_)
36 , acc(gsl_interp_accel_alloc(),
37 [](gsl_interp_accel *p) { gsl_interp_accel_free(p); })
38 , cspline(gsl_spline_alloc(gsl_interp_cspline, interpolation_points.size()),
39 [](gsl_spline *p) { gsl_spline_free(p); })
41 Assert(interpolation_points.size() > 0,
44 Assert(interpolation_points.size() == interpolation_values.size(),
46 interpolation_values.size()));
49 for (
unsigned int i = 0; i < interpolation_points.size() - 1; ++i)
50 AssertThrow(interpolation_points[i] < interpolation_points[i + 1],
52 interpolation_points[i],
53 interpolation_points[i + 1]));
55 const unsigned int n = interpolation_points.size();
57 gsl_spline_init(cspline.get(),
58 interpolation_points.data(),
59 interpolation_values.data(),
72 std::scoped_lock lock(acc_mutex);
74 const double x = p[0];
75 Assert(x >= interpolation_points.front() &&
76 x <= interpolation_points.back(),
78 interpolation_points.front(),
79 interpolation_points.back()));
81 return gsl_spline_eval(cspline.get(), x, acc.get());
93 std::scoped_lock lock(acc_mutex);
95 const double x = p[0];
96 Assert(x >= interpolation_points.front() &&
97 x <= interpolation_points.back(),
99 interpolation_points.front(),
100 interpolation_points.back()));
102 const double deriv = gsl_spline_eval_deriv(cspline.get(), x, acc.get());
117 std::scoped_lock lock(acc_mutex);
119 const double x = p[0];
120 Assert(x >= interpolation_points.front() &&
121 x <= interpolation_points.back(),
123 interpolation_points.front(),
124 interpolation_points.back()));
126 return gsl_spline_eval_deriv2(cspline.get(), x, acc.get());