151 public: std::optional<InMemorySession<T, V>>
StepTo(
153 if (_session.iter == gridFields.end())
160 auto nextTime =
std::next(_session.iter);
161 if (nextTime == this->gridFields.end() || _time < _session.iter->first)
166 while (nextTime != this->gridFields.end()
167 && nextTime->first <= _time)
169 newSess.iter = nextTime;
172 newSess.
time = _time;
184 if (_session.iter == this->gridFields.end())
190 InterpolationPoint4D<T, V> slice1;
191 slice1.timeSlice = _session.iter->second.GetInterpolators(
192 _point, _tol.X(), _tol.Y(), _tol.Z());
193 slice1.time = _session.iter->first;
196 auto nextTime =
std::next(_session.iter);
197 if (nextTime != this->gridFields.end())
200 InterpolationPoint4D<T, V> slice2;
201 slice2.timeSlice = nextTime->second.GetInterpolators(
202 _point, _tol.X(), _tol.Y(), _tol.Z());
203 slice2.time = nextTime->first;
224 const std::vector<InterpolationPoint4D<T, V>> &_interpolators,
228 const X _default = X(0)
231 if (_session.iter == this->gridFields.end())
237 auto time = _session.
time;
238 if (_interpolators.size() == 0)
return std::nullopt;
239 if (_interpolators.size() == 1)
242 return _session.iter->second.EstimateValueUsingTrilinear(
249 if (_interpolators[0].timeSlice.size() == 0
250 && _interpolators[1].timeSlice.size() == 0)
255 if (_interpolators[1].timeSlice.size() == 0)
257 return _session.iter->second.EstimateValueUsingTrilinear(
263 if (_interpolators[0].timeSlice.size() == 0)
265 return next->second.EstimateValueUsingTrilinear(
273 auto res1 = _session.iter->second.EstimateValueUsingTrilinear(
279 auto res2 = next->second.EstimateValueUsingTrilinear(
285 if (res1.has_value() || res2.has_value())
287 InterpolationPoint1D<T>
288 pt1{_session.iter->first, 0}, pt2{next->first, 1};
291 res1.value_or(_default), res2.value_or(_default)};
292 return LinearInterpolate(pt1, pt2, times, time);