import numpy as nm
from sfepy.base.base import Struct
from sfepy.terms.terms import Term
[docs]
class THTerm(Term):
"""
Base class for terms depending on time history (fading memory
terms).
"""
[docs]
def eval_real(self, shape, fargs, mode='eval', term_mode=None,
diff_var=None, **kwargs):
if diff_var is None:
if mode == 'eval':
out = 0.0
else:
out = nm.zeros(shape, dtype=nm.float64)
iter_kernel = fargs
for ii, fargs in iter_kernel():
out1, status = Term.eval_real(self, shape, fargs, mode=mode,
term_mode=term_mode,
diff_var=diff_var, **kwargs)
out += out1
else:
out, status = Term.eval_real(self, shape, fargs, mode=mode,
term_mode=term_mode,
diff_var=diff_var, **kwargs)
return out, status
[docs]
class ETHTerm(Term):
"""
Base class for terms depending on time history with exponential
convolution kernel (fading memory terms).
"""
[docs]
def get_eth_data(self, key, state, decay, values):
step_cache = state.evaluate_cache.setdefault('eth', {})
cache = step_cache.setdefault(None, {})
data_key = key + (self.arg_derivatives[state.name],)
if data_key in cache:
out = cache[data_key]
out.values = values
else:
out = Struct(history=nm.zeros_like(values),
values=values,
decay=decay,
__advance__=self.advance_eth_data)
cache[data_key] = out
return out
[docs]
def advance_eth_data(self, ts, data):
data.history[:] = data.decay * (data.history + data.values)