Source code for syssimx.system.algorithms.gauss_seidel
"""Gauss-Seidel execution algorithm for system simulation.
This module provides an implementation of the Gauss-Seidel algorithm, which is used to advance a system simulation by processing components in a specific order. The algorithm ensures that direct-feedthrough components are handled correctly by making their outputs available within the same macro step to downstream components in the current execution order.
Classes:
GaussSeidelAlgorithm: Implements the Gauss-Seidel algorithm for advancing a system simulation.
Usage:
The `GaussSeidelAlgorithm` class is designed to be used as part of the system simulation framework. It processes components generation by generation, solving algebraic loops within each generation before stepping components forward.
Dependencies:
- `Algorithm`: Base class for all algorithms.
- `solve_algebraic_scc_ijcsa`: Function to solve algebraic strongly connected components.
Example:
.. code-block:: python
from syssimx.system.algorithms.gauss_seidel import GaussSeidelAlgorithm
algorithm = GaussSeidelAlgorithm()
algorithm.step(system, t, dt)
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import TYPE_CHECKING
from .base import Algorithm
from .ijcsa import solve_algebraic_scc_ijcsa
if TYPE_CHECKING:
from ..system import System
# ----------------------------------------------------------------------------
# Gauss-Seidel Algorithm
# ----------------------------------------------------------------------------
[docs]
@dataclass
class GaussSeidelAlgorithm(Algorithm):
"""Advance the system using Gauss-Seidel-style ordering.
Components are processed generation by generation, with algebraic loops
solved inside each generation before stepping components forward.
This approach accounts for direct-feedthrough components by making their
outputs available within the same macro step to downstream components in
the current execution order.
"""
name: str = "Gauss-Seidel"
[docs]
def step(self, system: System, t: float, dt: float) -> None:
"""Advance the system by one time step using Gauss-Seidel ordering.
Args:
system: System to advance.
t: Current simulation time.
dt: Step size.
"""
for gen in system.execution_order:
system._set_inputs_for_generation(gen, t)
gen_set = set(gen)
for loop in system.algebraic_loops:
if set(loop).issubset(gen_set):
solve_algebraic_scc_ijcsa(system, loop, t)
for comp_name in gen:
comp = system.components[comp_name]
comp.do_step(t, dt)