Xmod Co-simulation !!hot!! ✦ Validated

class XModModel(ABC): """Base class for an xmod co-simulation component."""

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 __init__(self, name: str, Kp: float, x_ref: float = 0.0): super().__init__(name) self.Kp = Kp self.x_ref = x_ref self.input_ports = [XModPort("x_measured")] self.output_ports = [XModPort("F_cmd")] to_port: str): self.connections.append((from_model

def connect(self, from_model: str, from_port: str, to_model: str, to_port: str): self.connections.append((from_model, from_port, to_model, to_port)) to_port)) def step(self

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 )

def run(self, t_start: float, t_end: float, log_callback: Callable = None): t = t_start outputs = {name: {} for name in self.models} while t < t_end - 1e-12: # Gather all inputs for each model from previous outputs inputs_for = {name: {} for name in self.models} for fm, fp, tm, tp in self.connections: if fm in outputs and fp in outputs[fm]: inputs_for[tm][tp] = outputs[fm][fp] # Step each model new_outputs = {} for name, model in self.models.items(): step_result = model.step(t, self.dt, inputs_for[name]) new_outputs[name] = step_result.outputs outputs = new_outputs t += self.dt if log_callback: log_callback(t, outputs)