Skip to main content
Baldur Bjarnason

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