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:
- Install
syssimxwithpip. - Install OpenSim with
condausing 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d09ecc51c57b7201ec639f7e2a5db2d040408433a4ea62d7595a02bb24c74528
|
|
| MD5 |
aff4d1cc880b74beec99ed17fb6c91a3
|
|
| BLAKE2b-256 |
0c20719fbf2d6fbaf7eec65af83f111803f2044c6a1c4afccb769930c2c5eb71
|
Provenance
The following attestation bundles were made for syssimx-0.1.4.tar.gz:
Publisher:
publish-pypi.yml on FlorianFrech/SystemSimulation
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
syssimx-0.1.4.tar.gz -
Subject digest:
d09ecc51c57b7201ec639f7e2a5db2d040408433a4ea62d7595a02bb24c74528 - Sigstore transparency entry: 1003704647
- Sigstore integration time:
-
Permalink:
FlorianFrech/SystemSimulation@75fa79626e569d31f4baea34fef8fed098b09533 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/FlorianFrech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@75fa79626e569d31f4baea34fef8fed098b09533 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d063295aa3eed236c490191d305f22ce68408aa83352870f2b20dc30dc4e9ff0
|
|
| MD5 |
f00c897b235c755fc9682aa1c55f3c09
|
|
| BLAKE2b-256 |
44cfeb303c8f7d84d38ed39c0b809011c9ecd34237ac9a5fe5d0bf458db9f8ea
|
Provenance
The following attestation bundles were made for syssimx-0.1.4-py3-none-any.whl:
Publisher:
publish-pypi.yml on FlorianFrech/SystemSimulation
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
syssimx-0.1.4-py3-none-any.whl -
Subject digest:
d063295aa3eed236c490191d305f22ce68408aa83352870f2b20dc30dc4e9ff0 - Sigstore transparency entry: 1003704650
- Sigstore integration time:
-
Permalink:
FlorianFrech/SystemSimulation@75fa79626e569d31f4baea34fef8fed098b09533 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/FlorianFrech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@75fa79626e569d31f4baea34fef8fed098b09533 -
Trigger Event:
push
-
Statement type: