@@ -41,6 +41,7 @@ class which means it will use OMCSessionZMQ by default. If you want to use
4141import logging
4242import json
4343import os
44+ import pathlib
4445import platform
4546import psutil
4647import re
@@ -831,6 +832,8 @@ def __init__(self, fileName=None, modelName=None, lmodel=[], useCorba=False, com
831832 self ._omc_log_file = self .getconn ._omc_log_file
832833 self ._omc_process = self .getconn ._omc_process
833834
835+ # get OpenModelica version
836+ self ._version = self .sendExpression ("getVersion()" , parsed = True )
834837 ## set commandLineOptions if provided by users
835838 if commandLineOptions is not None :
836839 exp = "" .join (["setCommandLineOptions(" ,"\" " ,commandLineOptions ,"\" " ,")" ])
@@ -1216,6 +1219,14 @@ def getOptimizationOptions(self, names=None): # 10
12161219 elif (isinstance (names , list )):
12171220 return ([self .optimizeOptions .get (x ,"NotExist" ) for x in names ])
12181221
1222+ def parse_om_version (self , version : str ) -> tuple [int , int , int ]:
1223+ match = re .search (r"v?(\d+)\.(\d+)\.(\d+)" , version )
1224+ if not match :
1225+ raise ValueError (f"Version not found in: { version } " )
1226+ major , minor , patch = map (int , match .groups ())
1227+
1228+ return major , minor , patch
1229+
12191230 # to simulate or re-simulate model
12201231 def simulate (self , resultfile = None , simflags = None , verbose = True ): # 11
12211232 """
@@ -1243,18 +1254,29 @@ def simulate(self, resultfile=None, simflags=None, verbose=True): # 11
12431254 simflags = " " + simflags
12441255
12451256 overrideFile = os .path .join (self .tempdir , '{}.{}' .format (self .modelName + "_override" , "txt" )).replace ("\\ " , "/" )
1257+ override_file = pathlib .Path (overrideFile )
1258+ override = ""
12461259 if (self .overridevariables or self .simoptionsoverride ):
1247- tmpdict = self .overridevariables .copy ()
1248- tmpdict .update (self .simoptionsoverride )
1249- # write to override file
1250- file = open (overrideFile , "w" )
1251- for (key , value ) in tmpdict .items ():
1252- name = key + "=" + value + "\n "
1253- file .write (name )
1254- file .close ()
1255- override = " -overrideFile=" + overrideFile
1256- else :
1257- override = ""
1260+ # simulation options are not read from override file from version >= 1.26.0,
1261+ # pass them to simulation executable directly as individual arguments
1262+ # see https://github.com/OpenModelica/OpenModelica/pull/14813
1263+ major , minor , patch = self .parse_om_version (self ._version )
1264+ if (major , minor , patch ) >= (1 , 26 , 0 ):
1265+ for key , opt_value in self .simoptionsoverride .items ():
1266+ override += f" -{ key } ={ str (opt_value )} "
1267+ override_content = (
1268+ "\n " .join ([f"{ key } ={ value } " for key , value in self .overridevariables .items ()])
1269+ + "\n "
1270+ )
1271+ else :
1272+ override_content = (
1273+ "\n " .join ([f"{ key } ={ value } " for key , value in self .overridevariables .items ()])
1274+ + "\n " .join ([f"{ key } ={ value } " for key , value in self .simoptionsoverride .items ()])
1275+ + "\n "
1276+ )
1277+
1278+ override_file .write_text (override_content )
1279+ override += " -overrideFile=" + overrideFile
12581280
12591281 if (self .inputFlag ): # if model has input quantities
12601282 for i in self .inputlist :
@@ -1700,18 +1722,27 @@ def linearize(self, lintime = None, simflags= None): # 22
17001722 return print ("Linearization cannot be performed as the model is not build, use ModelicaSystem() to build the model first" )
17011723
17021724 overrideLinearFile = os .path .join (self .tempdir , '{}.{}' .format (self .modelName + "_override_linear" , "txt" )).replace ("\\ " , "/" )
1703-
1704- file = open (overrideLinearFile , "w" )
1705- for (key , value ) in self .overridevariables .items ():
1706- name = key + "=" + value + "\n "
1707- file .write (name )
1708- for (key , value ) in self .linearOptions .items ():
1709- name = key + "=" + str (value ) + "\n "
1710- file .write (name )
1711- file .close ()
1712-
1713- override = " -overrideFile=" + overrideLinearFile
1714- # print(override)
1725+ override_file = pathlib .Path (overrideLinearFile )
1726+ override = ""
1727+
1728+ # See comment in simulate_cmd regarding override file and OM version
1729+ major , minor , patch = self .parse_om_version (self ._version )
1730+ if (major , minor , patch ) >= (1 , 26 , 0 ):
1731+ for key , opt_value in self .linearOptions .items ():
1732+ override += f" -{ key } ={ str (opt_value )} "
1733+ override_content = (
1734+ "\n " .join ([f"{ key } ={ value } " for key , value in self .overridevariables .items ()])
1735+ + "\n "
1736+ )
1737+ else :
1738+ override_content = (
1739+ "\n " .join ([f"{ key } ={ value } " for key , value in self .overridevariables .items ()])
1740+ + "\n " .join ([f"{ key } ={ value } " for key , value in self .linearOptions .items ()])
1741+ + "\n "
1742+ )
1743+
1744+ override_file .write_text (override_content )
1745+ override += " -overrideFile=" + overrideLinearFile
17151746
17161747 if self .inputFlag :
17171748 nameVal = self .getInputs ()
0 commit comments