From f925106579bc17958c652ffb4abf90cf3ec00931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Artelt?= Date: Wed, 11 Dec 2024 09:36:07 +0100 Subject: [PATCH] Bugfix: Multiple source pattern for the same species and node but at different time points --- epyt_flow/simulation/events/quality_events.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/epyt_flow/simulation/events/quality_events.py b/epyt_flow/simulation/events/quality_events.py index 20d0937..ae18ec7 100644 --- a/epyt_flow/simulation/events/quality_events.py +++ b/epyt_flow/simulation/events/quality_events.py @@ -136,7 +136,7 @@ def __str__(self) -> str: f"node_id: {self.__node_id} profile: {self.__profile} source_type: {self.__source_type}" def _get_pattern_id(self) -> str: - return f"{self.__species_id}_{self.__node_id}_{self.start_time}" + return f"{self.__species_id}_{self.__node_id}" def init(self, epanet_api: epyt.epanet) -> None: super().init(epanet_api) @@ -180,9 +180,20 @@ def init(self, epanet_api: epyt.epanet) -> None: pattern_id = self._get_pattern_id() if pattern_id in self._epanet_api.getMSXPatternsNameID(): - raise ValueError("Duplicated injection event") - - self._epanet_api.addMSXPattern(pattern_id, pattern) + node_idx = self._epanet_api.getNodeIndex(self.__node_id) + species_idx, = self._epanet_api.getMSXSpeciesIndex([self.__species_id]) + cur_source_type = self._epanet_api.msx.MSXgetsource(node_idx, species_idx) + if cur_source_type[0] != source_type_: + raise ValueError("Source type does not match existing source type") + + # Add new injection amount to existing injection -- + # i.e. two injection events at the same node + pattern_idx, = self._epanet_api.getMSXPatternsIndex([pattern_id]) + cur_pattern = self._epanet_api.getMSXPattern()[pattern_idx - 1] + cur_pattern += pattern + self._epanet_api.setMSXPattern(pattern_idx, cur_pattern) + else: + self._epanet_api.addMSXPattern(pattern_id, pattern) self._epanet_api.setMSXSources(self.__node_id, self.__species_id, source_type_, 1, pattern_id)