Source code for pymt.framework.bmi_timeinterp
#! /usr/bin/env python
from scripting.contexts import cd
from ..errors import BmiError
from .timeinterp import TimeInterpolator
[docs]class BmiTimeInterpolator(object):
def __init__(self, *args, **kwds):
method = kwds.pop("method", "linear")
self._interpolators = dict(
[(name, None) for name in self.output_var_names if "__" in name]
)
self.reset(method=method)
super(BmiTimeInterpolator, self).__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("unable to get value for {name}. ignoring".format(name=name))
[docs] def interpolate(self, name, at):
return self._interpolators[name].interpolate(at)
[docs] def update_until(self, then, method=None, units=None):
with cd(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()