30 const std::vector<double> &y_)
31 : interpolation_points(x_)
32 , interpolation_values(y_)
33 , acc(gsl_interp_accel_alloc(),
34 [](gsl_interp_accel *p) { gsl_interp_accel_free(p); })
35 , cspline(gsl_spline_alloc(gsl_interp_cspline, interpolation_points.size()),
36 [](gsl_spline *p) { gsl_spline_free(p); })
38 Assert(interpolation_points.size() > 0,
41 Assert(interpolation_points.size() == interpolation_values.size(),
43 interpolation_values.size()));
46 for (
unsigned int i = 0; i < interpolation_points.size() - 1; ++i)
47 AssertThrow(interpolation_points[i] < interpolation_points[i + 1],
49 interpolation_points[i],
50 interpolation_points[i + 1]));
52 const unsigned int n = interpolation_points.size();
54 gsl_spline_init(cspline.get(),
55 interpolation_points.data(),
56 interpolation_values.data(),
69 std::lock_guard<std::mutex> lock(acc_mutex);
71 const double x = p[0];
72 Assert(x >= interpolation_points.front() &&
73 x <= interpolation_points.back(),
75 interpolation_points.front(),
76 interpolation_points.back()));
78 return gsl_spline_eval(cspline.get(), x, acc.get());
90 std::lock_guard<std::mutex> lock(acc_mutex);
92 const double x = p[0];
93 Assert(x >= interpolation_points.front() &&
94 x <= interpolation_points.back(),
96 interpolation_points.front(),
97 interpolation_points.back()));
99 const double deriv = gsl_spline_eval_deriv(cspline.get(), x, acc.get());
114 std::lock_guard<std::mutex> lock(acc_mutex);
116 const double x = p[0];
117 Assert(x >= interpolation_points.front() &&
118 x <= interpolation_points.back(),
120 interpolation_points.front(),
121 interpolation_points.back()));
123 return gsl_spline_eval_deriv2(cspline.get(), x, acc.get());