diff --git a/ymmsl/v0_2/tests/test_timeline_resolver.py b/ymmsl/v0_2/tests/test_timeline_resolver.py index 44a0b7c..d81ea6f 100644 --- a/ymmsl/v0_2/tests/test_timeline_resolver.py +++ b/ymmsl/v0_2/tests/test_timeline_resolver.py @@ -149,3 +149,8 @@ def test_inconsistent_interact(timelines_configuration: Configuration) -> None: def test_model_ports(timelines_configuration: Configuration) -> None: model = timelines_configuration.models[Ref("model_ports")] resolve_timelines(model) + + +def test_muscle_settings_in(timelines_configuration: Configuration) -> None: + model = timelines_configuration.models[Ref("qmc")] + resolve_timelines(model) diff --git a/ymmsl/v0_2/tests/ymmsl1/timelines.ymmsl b/ymmsl/v0_2/tests/ymmsl1/timelines.ymmsl index 8ce6b22..331105c 100644 --- a/ymmsl/v0_2/tests/ymmsl1/timelines.ymmsl +++ b/ymmsl/v0_2/tests/ymmsl1/timelines.ymmsl @@ -223,3 +223,18 @@ models: in: meso.in meso.final: macro.in macro.final: final + + qmc: + components: + mc: + ports: + o_i: parameters_out + s: states_in + description: Monte Carlo driver for UQ. + sim: + ports: + o_f: state_out + description: Simulation + conduits: + mc.parameters_out: sim.muscle_settings_in + sim.state_out: mc.states_in diff --git a/ymmsl/v0_2/timeline_resolver.py b/ymmsl/v0_2/timeline_resolver.py index 6696127..efd4fa2 100644 --- a/ymmsl/v0_2/timeline_resolver.py +++ b/ymmsl/v0_2/timeline_resolver.py @@ -10,6 +10,7 @@ ) ROOT_TIMELINE = Timeline(":") +MUSCLE_SETTINGS_IN = Identifier("muscle_settings_in") def resolve_timelines(model: Model) -> None: @@ -172,6 +173,11 @@ def __init__(self, model: Model) -> None: for port_name, port in component.ports.items() } """Map of Port objects by their full reference""" + # Special ports: + for component in self._model.components.values(): + self._all_ports[component.name + MUSCLE_SETTINGS_IN] = Port( + MUSCLE_SETTINGS_IN, Operator.F_INIT + ) # Assign components to timelines for component in self._model.components.values(): @@ -187,6 +193,10 @@ def _f_init_conduits_for_component(self, component: Component) -> list[Conduit]: conduit = self._conduits_by_receiver.get(component.name + port.name) if conduit is not None: result.append(conduit) + # Special ports: + conduit = self._conduits_by_receiver.get(component.name + MUSCLE_SETTINGS_IN) + if conduit is not None: + result.append(conduit) return result def _assign_component(