From b2f82cc1a7f14ec526f78ddf8a56b9ec24f83212 Mon Sep 17 00:00:00 2001 From: syntron Date: Wed, 18 Mar 2026 20:37:09 +0100 Subject: [PATCH] [backport] Do not add simulation options to overrideFile (#400) - 3.6.1 --- OMPython/__init__.py | 77 +++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/OMPython/__init__.py b/OMPython/__init__.py index df600e4b..56e51a6a 100755 --- a/OMPython/__init__.py +++ b/OMPython/__init__.py @@ -41,6 +41,7 @@ class which means it will use OMCSessionZMQ by default. If you want to use import logging import json import os +import pathlib import platform import psutil import re @@ -831,6 +832,8 @@ def __init__(self, fileName=None, modelName=None, lmodel=[], useCorba=False, com self._omc_log_file = self.getconn._omc_log_file self._omc_process = self.getconn._omc_process + # get OpenModelica version + self._version = self.sendExpression("getVersion()", parsed=True) ## set commandLineOptions if provided by users if commandLineOptions is not None: exp="".join(["setCommandLineOptions(","\"",commandLineOptions,"\"",")"]) @@ -1216,6 +1219,14 @@ def getOptimizationOptions(self, names=None): # 10 elif(isinstance(names, list)): return ([self.optimizeOptions.get(x,"NotExist") for x in names]) + def parse_om_version(self, version: str) -> tuple[int, int, int]: + match = re.search(r"v?(\d+)\.(\d+)\.(\d+)", version) + if not match: + raise ValueError(f"Version not found in: {version}") + major, minor, patch = map(int, match.groups()) + + return major, minor, patch + # to simulate or re-simulate model def simulate(self, resultfile=None, simflags=None, verbose=True): # 11 """ @@ -1243,18 +1254,29 @@ def simulate(self, resultfile=None, simflags=None, verbose=True): # 11 simflags=" " + simflags overrideFile = os.path.join(self.tempdir, '{}.{}'.format(self.modelName + "_override", "txt")).replace("\\", "/") + override_file = pathlib.Path(overrideFile) + override = "" if (self.overridevariables or self.simoptionsoverride): - tmpdict=self.overridevariables.copy() - tmpdict.update(self.simoptionsoverride) - # write to override file - file = open(overrideFile, "w") - for (key, value) in tmpdict.items(): - name = key + "=" + value + "\n" - file.write(name) - file.close() - override =" -overrideFile=" + overrideFile - else: - override ="" + # simulation options are not read from override file from version >= 1.26.0, + # pass them to simulation executable directly as individual arguments + # see https://github.com/OpenModelica/OpenModelica/pull/14813 + major, minor, patch = self.parse_om_version(self._version) + if (major, minor, patch) >= (1, 26, 0): + for key, opt_value in self.simoptionsoverride.items(): + override += f" -{key}={str(opt_value)}" + override_content = ( + "\n".join([f"{key}={value}" for key, value in self.overridevariables.items()]) + + "\n" + ) + else: + override_content = ( + "\n".join([f"{key}={value}" for key, value in self.overridevariables.items()]) + + "\n".join([f"{key}={value}" for key, value in self.simoptionsoverride.items()]) + + "\n" + ) + + override_file.write_text(override_content) + override += " -overrideFile=" + overrideFile if (self.inputFlag): # if model has input quantities for i in self.inputlist: @@ -1700,18 +1722,27 @@ def linearize(self, lintime = None, simflags= None): # 22 return print("Linearization cannot be performed as the model is not build, use ModelicaSystem() to build the model first") overrideLinearFile = os.path.join(self.tempdir, '{}.{}'.format(self.modelName + "_override_linear", "txt")).replace("\\", "/") - - file = open(overrideLinearFile, "w") - for (key, value) in self.overridevariables.items(): - name = key + "=" + value + "\n" - file.write(name) - for (key, value) in self.linearOptions.items(): - name = key + "=" + str(value) + "\n" - file.write(name) - file.close() - - override =" -overrideFile=" + overrideLinearFile - # print(override) + override_file = pathlib.Path(overrideLinearFile) + override = "" + + # See comment in simulate_cmd regarding override file and OM version + major, minor, patch = self.parse_om_version(self._version) + if (major, minor, patch) >= (1, 26, 0): + for key, opt_value in self.linearOptions.items(): + override += f" -{key}={str(opt_value)}" + override_content = ( + "\n".join([f"{key}={value}" for key, value in self.overridevariables.items()]) + + "\n" + ) + else: + override_content = ( + "\n".join([f"{key}={value}" for key, value in self.overridevariables.items()]) + + "\n".join([f"{key}={value}" for key, value in self.linearOptions.items()]) + + "\n" + ) + + override_file.write_text(override_content) + override += " -overrideFile=" + overrideLinearFile if self.inputFlag: nameVal = self.getInputs()