Skip to main content

A Python framework for heterogeneous system co-simulation (Modelica FMUs, OpenSim, FEM).

Project description

SysSimX

SysSimX is an open-source Python library for heterogeneous co-simulation. It lets you build coupled systems from components with different model representations and simulation backends, then execute them with consistent orchestration logic.

What SysSimX Provides

  • Graph-based system orchestration with dependency analysis and execution ordering
  • Algebraic loop detection and iterative handling (IJCSA-style workflow)
  • Multiple master algorithms:
    • Jacobi (parallel-style updates)
    • Gauss-Seidel (sequential updates with fresh values)
    • Hybrid (event-aware stepping with zero-crossing support)
  • Unit-aware port interfaces and conversion via Pint
  • Reusable component abstractions for:
    • FMI 2.0 Co-Simulation FMUs
    • NGSolve-based FEM models
    • OpenSim models
    • Custom Python components

Installation

Basic install

pip install syssimx

Optional extras

pip install "syssimx[fmu]"
pip install "syssimx[fem]"
pip install "syssimx[dev]"
pip install "syssimx[all]"
pip install "syssimx[full]"

OpenSim note (important)

OpenSim is conda-only and ABI-coupled to specific NumPy/SciPy builds. Recommended order:

  1. Install syssimx with pip.
  2. Install OpenSim with conda using ABI-compatible NumPy/SciPy pins.

See the full installation guide:

  • docs/01_getting_started/01_installation.ipynb

Quickstart Example

The example below creates a simple linear source feeding an integrator.

import matplotlib.pyplot as plt

from syssimx import CoSimComponent, Connection, System
from syssimx.core import PortSpec, PortType


class LinearSource(CoSimComponent):
    def __init__(self, name: str, a: float = 1.0, b: float = 0.0):
        super().__init__(name, group="Source")
        self.a = a
        self.b = b
        self.output_specs.update({
            "y": PortSpec(name="y", type=PortType.REAL, direction="out")
        })

    def _initialize_component(self, t0: float) -> None:
        pass

    def _do_step_internal(self, t: float, dt: float) -> None:
        pass

    def _update_output_states(self, t: float | None = None, event_names=None):
        t_now = 0.0 if t is None else t
        self.outputs["y"].set(self.a * t_now + self.b, t)


class Integrator(CoSimComponent):
    def __init__(self, name: str, x0: float = 0.0):
        super().__init__(name, group="Integrator")
        self.x0 = x0
        self.input_specs.update({
            "u": PortSpec(name="u", type=PortType.REAL, direction="in")
        })
        self.output_specs.update({
            "y": PortSpec(name="y", type=PortType.REAL, direction="out")
        })

    def _initialize_component(self, t0: float) -> None:
        self.x = self.x0
        self.outputs["y"].set(self.x, t0)

    def _do_step_internal(self, t: float, dt: float) -> None:
        u = self.inputs["u"].get()
        self.x = self.x + dt * float(u)

    def _update_output_states(self, t: float | None = None, event_names=None):
        self.outputs["y"].set(self.x, t)


source = LinearSource(name="LinearSource", a=1.0, b=0.0)
integrator = Integrator(name="Integrator", x0=0.0)

system = System(name="QuickstartSystem")
system.add_component(source)
system.add_component(integrator)
system.add_connection(Connection(
    src_comp="LinearSource", src_port="y",
    dst_comp="Integrator", dst_port="u",
))

system.initialize(t0=0.0)
system.run(t0=0.0, tf=5.0, dt=0.1)

history = system.get_history()
t_vals, data = history["Integrator"]
y_vals = data["y"]

plt.plot(t_vals, y_vals)
plt.xlabel("Time (s)")
plt.ylabel("Integrator output")
plt.title("SysSimX Quickstart")
plt.grid(True)
plt.show()

For the complete walkthrough, see:

  • docs/01_getting_started/02_quickstart.ipynb

Documentation

  • Documentation entry: docs/index.rst
  • Installation guide: docs/01_getting_started/01_installation.ipynb
  • Core concepts: docs/01_getting_started/03_concepts.ipynb
  • Quickstart tutorial: docs/01_getting_started/02_quickstart.ipynb
  • API docs: docs/02_api/
  • Tutorials and case studies:
    • docs/03_core_tutorials/
    • docs/04_tool_integration/
    • docs/05_case_study/

Project Status

SysSimX is under active development. APIs and behavior may evolve as algorithms and component integrations are extended.

License

  • Project license: MIT (LICENSE)
  • Third-party dependencies and attributions: THIRD_PARTY_LICENSES.MD

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

syssimx-0.1.4.tar.gz (84.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

syssimx-0.1.4-py3-none-any.whl (95.2 kB view details)

Uploaded Python 3

File details

Details for the file syssimx-0.1.4.tar.gz.

File metadata

  • Download URL: syssimx-0.1.4.tar.gz
  • Upload date:
  • Size: 84.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for syssimx-0.1.4.tar.gz
Algorithm Hash digest
SHA256 d09ecc51c57b7201ec639f7e2a5db2d040408433a4ea62d7595a02bb24c74528
MD5 aff4d1cc880b74beec99ed17fb6c91a3
BLAKE2b-256 0c20719fbf2d6fbaf7eec65af83f111803f2044c6a1c4afccb769930c2c5eb71

See more details on using hashes here.

Provenance

The following attestation bundles were made for syssimx-0.1.4.tar.gz:

Publisher: publish-pypi.yml on FlorianFrech/SystemSimulation

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file syssimx-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: syssimx-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 95.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for syssimx-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 d063295aa3eed236c490191d305f22ce68408aa83352870f2b20dc30dc4e9ff0
MD5 f00c897b235c755fc9682aa1c55f3c09
BLAKE2b-256 44cfeb303c8f7d84d38ed39c0b809011c9ecd34237ac9a5fe5d0bf458db9f8ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for syssimx-0.1.4-py3-none-any.whl:

Publisher: publish-pypi.yml on FlorianFrech/SystemSimulation

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page