from pyfr.integrators.dual.phys.base import BaseDualIntegrator
class BaseDualController(BaseDualIntegrator):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Solution filtering frequency
self._fnsteps = self.cfg.getint('soln-filter', 'nsteps', '0')
# Fire off any event handlers if not restarting
if not self.isrestart:
self._run_plugins()
def _accept_step(self, idxcurr):
self.tcurr += self._dt
self.nacptsteps += 1
self.nacptchain += 1
# Filter
if self._fnsteps and self.nacptsteps % self._fnsteps == 0:
self.pseudointegrator.system.filt(idxcurr)
self._invalidate_caches()
# Run any plugins
self._run_plugins()
# Clear the pseudo step info
self.pseudointegrator.pseudostepinfo = []
[docs]
class DualNoneController(BaseDualController):
controller_name = 'none'
controller_has_variable_dt = False
[docs]
def advance_to(self, t):
if t < self.tcurr:
raise ValueError('Advance time is in the past')
while self.tcurr < t:
# Take the physical step
self.step(self.tcurr, self._dt)
# We are not adaptive, so accept every step
self._accept_step(self.pseudointegrator._idxcurr)