Source code for pymt.framework.bmi_timeinterp
from ..errors import BmiError
from ..utils import as_cwd
from .timeinterp import TimeInterpolator
[docs]
class BmiTimeInterpolator:
def __init__(self, *args, **kwds):
method = kwds.pop("method", "linear")
self._interpolators = {
name: None for name in self.output_var_names if "__" in name
}
self.reset(method=method)
super().__init__(*args, **kwds)
[docs]
def reset(self, method="linear"):
for name in self._interpolators:
self._interpolators[name] = TimeInterpolator(method=method)
[docs]
def add_data(self):
for name in self._interpolators:
try:
self._interpolators[name].add_data([(self.time, self.get_value(name))])
except BmiError:
self._interpolators.pop(name)
print(f"unable to get value for {name}. ignoring")
[docs]
def interpolate(self, name, at):
return self._interpolators[name].interpolate(at)
[docs]
def update_until(self, then, method=None, units=None):
with as_cwd(self.initdir):
then = self.time_from(then, units)
if hasattr(self.bmi, "update_until"):
try:
self.bmi.update_until(then)
except NotImplementedError:
pass
self.reset()
while self.time < then:
if self.time + self.time_step > then:
self.add_data()
self.update()
if self.time > then:
self.add_data()