Source code for cosapp.drivers.time.euler

import numpy
from numbers import Number
from typing import Optional

from cosapp.drivers.time.base import AbstractTimeDriver, System
from cosapp.drivers.time.implicit import ImplicitTimeDriver


[docs] class EulerExplicit(AbstractTimeDriver): def __init__( self, name="Euler", owner: Optional[System] = None, **options ): """Initialize driver Parameters ---------- owner: System, optional :py:class:`~cosapp.systems.system.System` to which driver belongs; defaults to `None` name: str, optional Name of the `Driver`. **options : Dict[str, Any] Optional keywords arguments; may contain time step and interval, with keys `dt` and `time_interval` """ super().__init__(name, owner, **options) def _update_transients(self, dt: Number) -> None: """ Time integration of transient variables over time step `dt` by explicit Euler scheme. """ for x in self._transients.values(): x.value += x.d_dt * dt
[docs] class EulerImplicit(ImplicitTimeDriver): def __init__( self, name="Implicit Euler", owner: Optional[System] = None, **options ): """Initialize driver Parameters ---------- owner: System, optional :py:class:`~cosapp.systems.system.System` to which driver belongs; defaults to `None` name: str, optional Name of the `Driver`. **options : Dict[str, Any] Optional keywords arguments; may contain time step and interval, with keys `dt` and `time_interval` """ super().__init__(name, owner, **options) def _time_residues(self, dt: float, current: bool): """Computes and returns the current- or next-time component of the transient problem residue vector. Parameters: ----------- - dt [float]: Time step - current [bool]: If `True`, compute the current time (n) part of the residues. If `False`, compute the time (n + 1) part of the residues. """ time_problem = self._var_manager.problem residues = [] if not current: for transient in time_problem.transients.values(): r = transient.value - dt * numpy.ravel(transient.d_dt) residues.extend(numpy.ravel(r)) else: for transient in time_problem.transients.values(): residues.extend(numpy.ravel(transient.value)) return numpy.array(residues)