Xmod Co-simulation — !!better!!
def add_model(self, model: XModModel): self.models[model.name] = model
def set_state(self, state: Dict): pass xmod co-simulation master ---------------------------------------------------------------------- class XModCoSimulation: """Orchestrates coupled xmod models."""
def set_state(self, state: Dict): self.x = state["x"] self.v = state["v"] Example: Simple controller (P-controller) ---------------------------------------------------------------------- class PController(XModModel): """Outputs F = Kp * (x_ref - x_measured).""" xmod co-simulation
def step(self, t: float, dt: float, inputs: Dict[str, np.ndarray]) -> XModStep: x_meas = inputs.get("x_measured", np.array([0.0]))[0] F_cmd = self.Kp * (self.x_ref - x_meas) return XModStep( outputs={"F_cmd": np.array([F_cmd])}, new_time=t + dt )
@abstractmethod def set_state(self, state: Dict): pass Example: Spring-mass-damper as an xmod model ---------------------------------------------------------------------- class SpringMassDamper(XModModel): """x = position, v = velocity, F_ext = external force input.""" def add_model(self, model: XModModel): self
def get_state(self): return {} # stateless
def __init__(self, name: str, m: float, k: float, c: float): super().__init__(name) self.m = m self.k = k self.c = c self.x = 0.0 self.v = 0.0 # Define ports self.input_ports = [XModPort("F_ext")] self.output_ports = [XModPort("x"), XModPort("v")] XModStep: x_meas = inputs.get("x_measured"
@abstractmethod def step(self, t: float, dt: float, inputs: Dict[str, np.ndarray]) -> XModStep: """Advance model by dt from t with given inputs.""" pass