18#include "Utility/Inform.h"
21 const size_t splineOrder,
const std::vector<double>& times,
22 const std::vector<double>& values) {
34 os <<
"Uninitialised SplineTimeDependence" << endl;
37 <<
" entries" << endl;
43 const size_t splineOrder,
const std::vector<double>& times,
44 const std::vector<double>& values) {
45 if (times.size() != values.size()) {
46 throw std::invalid_argument(
47 "SplineTimeDependence::SplineTimeDependence: "
48 "Times and values should be of equal length");
50 if (times.size() <= splineOrder) {
51 throw std::invalid_argument(
52 "SplineTimeDependence::SplineTimeDependence: "
53 "Times and values should be of length > splineOrder");
56 throw std::invalid_argument(
57 "SplineTimeDependence::SplineTimeDependence: "
58 "Only linear or cubic interpolation is supported");
60 for (
size_t i = 0; i < times.size() - 1; ++i) {
61 if (times[i] >= times[i + 1]) {
62 throw std::invalid_argument(
63 "SplineTimeDependence::SplineTimeDependence: "
64 "Times should increase monotonically");
70 splineAcc_m = std::make_unique<AbstractSpline::Accelerator>();
82 ss <<
"SplineTimeDependence::getValue: time out of spline range: " << time;
83 throw std::invalid_argument(ss.str());
93 ss <<
"SplineTimeDependence::getValue: time out of spline range: " << time;
94 throw std::invalid_argument(ss.str());
void setSpline(size_t splineOrder, const std::vector< double > ×, const std::vector< double > &values)
Inform & print(Inform &os) const
static constexpr size_t CubicInterpolation
SplineTimeDependence * clone() override
std::vector< double > values_m
std::unique_ptr< AbstractSpline > spline_m
double getValue(double time) override
std::unique_ptr< AbstractSpline::Accelerator > splineAcc_m
double getIntegral(double time) override
std::vector< double > times_m
SplineTimeDependence()=default
static constexpr size_t LinearInterpolation