28 #include <gsl/gsl_errno.h>
29 #include <gsl/gsl_spline.h>
35 std::vector<double> times,
36 std::vector<double> values)
37 : spline_m(NULL), acc_m(NULL) {
42 : spline_m(NULL), acc_m(NULL) {
54 gsl_interp_accel_free(
acc_m);
66 os <<
"Uninitiaised SplineTimeDependence" <<
endl;
70 <<
" with " <<
times_m.size() <<
" entries" <<
endl;
75 std::vector<double> times,
76 std::vector<double> values) {
77 if (times.size() != values.size()) {
79 "SplineTimeDependence::SplineTimeDependence",
80 "Times and values should be of equal length");
82 if (times.size() < splineOrder+1) {
84 "SplineTimeDependence::SplineTimeDependence",
85 "Times and values should be of length > splineOrder+1");
87 if (splineOrder != 1 and splineOrder != 3) {
89 "SplineTimeDependence::SplineTimeDependence",
90 "Only linear or cubic interpolation is supported");
92 for (
int i = 0; i < int(times.size())-1; ++i) {
93 if (times[i] >= times[i+1]) {
95 "SplineTimeDependence::SplineTimeDependence",
96 "Times should increase monotonically");
103 if (splineOrder == 1) {
104 spline_m = gsl_spline_alloc (gsl_interp_linear, times.size());
105 }
else if (splineOrder == 3) {
106 spline_m = gsl_spline_alloc (gsl_interp_cspline, times.size());
110 gsl_spline_init(
spline_m, ×[0], &values[0], times.size());
112 acc_m = gsl_interp_accel_alloc();
114 gsl_interp_accel_reset(
acc_m);
std::vector< double > times_m
Inform & print(Inform &os)
void setSpline(size_t splineOrder, std::vector< double > times, std::vector< double > values)
SplineTimeDependence * clone()
std::vector< double > values_m
Inform & endl(Inform &inf)