Source code for yonderdrake.time.marker

"""Lazy public constructors for method-neutral time-memory UFL markers."""

from __future__ import annotations

from math import isfinite
from typing import Any


[docs] def CaputoDerivative(u: Any, alpha: Any) -> Any: """Create a Caputo marker for ``FractionalTimeStepper``.""" from yonderdrake.time._ufl_marker import CaputoDerivativeMarker return CaputoDerivativeMarker(u, alpha)
[docs] def RiemannLiouvilleDerivative(u: Any, alpha: Any) -> Any: """Create a left Riemann-Liouville marker.""" from yonderdrake.time._ufl_marker import RiemannLiouvilleDerivativeMarker return RiemannLiouvilleDerivativeMarker(u, alpha)
[docs] def ExponentialMemory(u: Any, decay_rate: Any) -> Any: """Create a one-timescale fading-memory marker.""" from yonderdrake.time._ufl_marker import ExponentialMemoryMarker return ExponentialMemoryMarker(u, decay_rate)
[docs] def CaputoFabrizioOperator( u: Any, alpha: Any, *, normalization: Any = 1.0, ) -> Any: """Return the published Caputo-Fabrizio exponential-memory operator.""" try: order = float(alpha) except (TypeError, ValueError) as error: raise TypeError("alpha must be a real scalar") from error if not 0.0 < order < 1.0: raise ValueError("alpha must satisfy 0 < alpha < 1") try: scale = float(normalization) except (TypeError, ValueError) as error: raise TypeError("normalization must be a real scalar") from error if not isfinite(scale) or scale <= 0.0: raise ValueError("normalization must be finite and positive") return (scale / (1.0 - order)) * ExponentialMemory( u, order / (1.0 - order), )