@abstractmethod def step(self, t: float, dt: float, inputs: Dict[str, np.ndarray]) -> XModStep: """Advance model by dt from t with given inputs.""" pass
@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.""" xmod co-simulation
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).""" @abstractmethod def step(self, t: float, dt: float, inputs:
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")] @abstractmethod def step(self
def set_state(self, state: Dict): pass xmod co-simulation master ---------------------------------------------------------------------- class XModCoSimulation: """Orchestrates coupled xmod models."""
@dataclass class XModStep: """Result of a model step.""" outputs: Dict[str, np.ndarray] # port name -> value new_time: float event_occurred: bool = False