Я использую OMPython для запуска моделирования с OpenModelica через OMCSessionZMQ, но столкнулся с сбоем системы (сбой на синем экране с кодом остановки REFERENCE BY POINTER в Windows и зависание в Ubuntu).
Я написал Python программа для создания файлов сценариев (.om) и использовала исторические данные, чтобы попытаться настроить параметры труб. Я использую Python для управления рекурсией через OMCSessionZMQ. Рекурсия может повторяться от 20 до почти 70 раз в Windows и до 150 раз в Ubuntu, и сбой не связан с этим конкретным запуском моделирования, поскольку он может успешно выполняться независимо или в других запусках. Хуже всего то, что после того, как я убил процесс, а также процессы omc и model_name, даже после того, как я перезагрузил экземпляр EC2 и попытался повторно запустить симуляцию в Ubuntu, он все равно зависал при запуске симуляции этого конкретный запуск, скажем, запуск моделирования (model_stuck). Однако он может построить модель, скажем, запустив buildModel(model_stuck), а также запустить симуляцию для моделей, отличных от model_stuck. Интересно, что model_stuck может успешно работать и в других системах.
Кстати, я даже пытался освободить ресурс, удалив процесс (как omc, так и modelname.exe).
Код выглядит следующим образом:
# Step 1. creating script
def generate_script(row, saved_path ):
script_0_1_pipe = f'''model shire01
Modelica.Fluid.Sources.MassFlowSource_T Source0_out(nPorts = 1, redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, m_flow = {row['Z201_SS_000_BS_FT30107']}/3.6, T = {row['Z201_SS_000_BS_TE30105']+273.15}) ;
Modelica.Fluid.Pipes.DynamicPipe pipe1(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 1227.10, height_ab = -13.21) ;
Modelica.Fluid.Pipes.DynamicPipe pipe2(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 670.78, height_ab = 21.58) ;
Modelica.Fluid.Pipes.DynamicPipe pipe3(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 882.224, height_ab = -27.142);
Modelica.Fluid.Pipes.DynamicPipe pipe5(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 3232.9, height_ab = -38.769) ;
Modelica.Fluid.Pipes.DynamicPipe pipe4(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 245.751, height_ab = 0.207);
Modelica.Fluid.Pipes.DynamicPipe pipe6(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 5462.68, height_ab = 2.254) ;
Modelica.Fluid.Sources.Boundary_pT Source1_in(nPorts = 1, redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, p = {row['pressure']*1e6}, T = {row['temp']+273.15}) ;
inner Modelica.Fluid.System system(p_ambient = 101325 );
equation
connect(Source0_out.ports[1], pipe1.port_a) ;
connect(pipe1.port_b, pipe2.port_a) ;
connect(pipe2.port_b, pipe3.port_a) ;
connect(pipe6.port_b, Source1_in.ports[1]) ;
connect(pipe3.port_b, pipe4.port_a) ;
connect(pipe4.port_b, pipe5.port_a) ;
connect(pipe5.port_b, pipe6.port_a) ;
annotation(
uses(Modelica(version = "4.0.0")),
version = "");
end shire01;'''
with open(saved_path, 'w', encoding = 'utf-8') as f:
f.write(script_0_1_pipe)
return script_0_1_pipe
import pandas as pd
df = pd.read_csv("/home/ubuntu/data/01_pipes", encoding="utf-8")
from OMPython import OMCSessionZMQ
import re
import glob
import os
current_directory = '/home/ubuntu/script'
ospath = '/home/ubuntu/result/shire.om'
error_log = '/home/ubuntu/result/shire_error.log'
import psutil
result_path = '/home/ubuntu/result/results_path.csv'
# Step 2 releasing resource
def delete_temp_files(folder):
extensions = ['*.tmp', '*.c', '*.h', '*.exe', '*.o', '*.mat', '*.libs', '*.makefile', '*.json', '*.xml', '*.bat',
'.bin', '.log']
for ext in extensions:
files = glob.glob(os.path.join(folder, ext))
for file in files:
try:
os.remove(file)
except Exception as e:
print(f"error occurs while deleting {file} : {e}")
def kill_omc_process(model_name=""):
for proc in psutil.process_iter(['pid', 'name']):
if 'omc' in proc.info['name'].lower():
try:
proc.kill()
print(f"Killed OMC process with PID {proc.info['pid']}")
except Exception as e:
print(f"Failed to kill process {proc.info['pid']}: {e}")
if model_name and len(model_name) > 3 and model_name in proc.info['name'].lower():
try:
proc.kill()
print(f"Killed OMC process with PID {proc.info['pid']}")
except Exception as e:
print(f"Failed to kill process {proc.info['pid']}: {e}")
ospath = '/home/ubuntu/result/shire.om'
current_directory = '/home/ubuntu/script'
# Step 3 Simulation
def simulate(file_path, model_name='shire01'):
try:
delete_temp_files(current_directory)
kill_omc_process(model_name)
omc = OMCSessionZMQ()
omc.execute('setCommandLineOptions("-d=initialization -d=aliasConflicts")')
omc.execute('installPackage(Modelica);')
omc.execute("loadModel(Modelica)")
omc.execute(f'loadFile("{file_path}")')
build_result = omc.execute(f"buildModel({model_name})")
print(build_result)
if "Error" in build_result:
print("error while building model: ", build_result)
return
simulate_result = omc.execute(
f'simulate({model_name}, startTime=0, stopTime=10, method="dassl", tolerance=1e-6, numberOfIntervals=5000)'
)
if "resultFile" not in simulate_result:
print("no result file found")
with open(error_log, 'a+', encoding='utf-8') as f:
f.write(f'\n\nerror occured while simulating with error', omc.execute("getErrorString()"))
return
result_file_match = re.search(r'resultFile\s*=\s*"([^"]+)"', simulate_result)
if result_file_match:
result_file = result_file_match.group(1)
else:
print("result file not found")
return
variable_name = 'Source0_out.ports[1].p'
time_point = 10
result = omc.execute(f'val({variable_name}, {time_point})')
return float(result) / 1e6
except Exception as e:
print(e)
finally:
kill_omc_process(model_name)
# Step 4 recursion
import psutil
script = ''
import time
with open(result_path, "a+", encoding ="utf-8") as f:
f.write(f"time, flow, source0 pressure, source1 pressure, simulated_pressure\n")
for ind,r in df.iterrows():
try:
kill_omc_process("shire01")
except Exception as e:
print(e)
try:
print(f'simulating on {ind}')
r['temp'] = max(r['Z202_SS_000_00_TE201A'],r['Z202_SS_000_00_TE201B'])
r['pressure'] = max(r['Z202_SS_D01_PD_PT201'],r['Z202_SS_D02_PD_PT203'])
script = generate_script(r, ospath)
simulated_pressure = simulate(ospath)
with open(result_path, "a+", encoding ="utf-8") as f:
f.write(f"{ind}, {r['Z201_SS_000_BS_FT30107']}, {r['Z201_SS_000_BS_PT30106']}, {r['pressure']}, {simulated_pressure}\n")
except Exception as e:
print(f'{ind} has something wrong: {e}')
Кстати, я также пытался создать экземпляр OMCSessionZMQ только один раз и после каждого запуска, отправляя «clear();» команда, но весь процесс более нестабильен и чаще приводит к сбоям.
Я надеюсь найти решения для запуска повторного моделирования с помощью OMPython.
Я использую OMPython для запуска моделирования с OpenModelica через OMCSessionZMQ, но столкнулся с сбоем системы (сбой на синем экране с кодом остановки REFERENCE BY POINTER в Windows и зависание в Ubuntu). Я написал Python программа для создания файлов сценариев (.om) и использовала исторические данные, чтобы попытаться настроить параметры труб. Я использую Python для управления рекурсией через OMCSessionZMQ. Рекурсия может повторяться от 20 до почти 70 раз в Windows и до 150 раз в Ubuntu, и сбой не связан с этим конкретным запуском моделирования, поскольку он может успешно выполняться независимо или в других запусках. [b]Хуже всего то, что после того, как я убил процесс, а также процессы omc и model_name, даже после того, как я перезагрузил экземпляр EC2 и попытался повторно запустить симуляцию в Ubuntu, он все равно зависал при запуске симуляции этого конкретный запуск, скажем, запуск моделирования (model_stuck). Однако он может построить модель, скажем, запустив buildModel(model_stuck), а также запустить симуляцию для моделей, отличных от model_stuck. Интересно, что model_stuck может успешно работать и в других системах.[/b] Кстати, я даже пытался освободить ресурс, удалив процесс (как omc, так и modelname.exe). Код выглядит следующим образом: [code]# Step 1. creating script def generate_script(row, saved_path ): script_0_1_pipe = f'''model shire01 Modelica.Fluid.Sources.MassFlowSource_T Source0_out(nPorts = 1, redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, m_flow = {row['Z201_SS_000_BS_FT30107']}/3.6, T = {row['Z201_SS_000_BS_TE30105']+273.15}) ; Modelica.Fluid.Pipes.DynamicPipe pipe1(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 1227.10, height_ab = -13.21) ; Modelica.Fluid.Pipes.DynamicPipe pipe2(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 670.78, height_ab = 21.58) ; Modelica.Fluid.Pipes.DynamicPipe pipe3(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 882.224, height_ab = -27.142); Modelica.Fluid.Pipes.DynamicPipe pipe5(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 3232.9, height_ab = -38.769) ; Modelica.Fluid.Pipes.DynamicPipe pipe4(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 245.751, height_ab = 0.207); Modelica.Fluid.Pipes.DynamicPipe pipe6(redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, diameter = 1.4, length = 5462.68, height_ab = 2.254) ; Modelica.Fluid.Sources.Boundary_pT Source1_in(nPorts = 1, redeclare package Medium = Modelica.Media.Examples.TwoPhaseWater, p = {row['pressure']*1e6}, T = {row['temp']+273.15}) ; inner Modelica.Fluid.System system(p_ambient = 101325 ); equation connect(Source0_out.ports[1], pipe1.port_a) ; connect(pipe1.port_b, pipe2.port_a) ; connect(pipe2.port_b, pipe3.port_a) ; connect(pipe6.port_b, Source1_in.ports[1]) ; connect(pipe3.port_b, pipe4.port_a) ; connect(pipe4.port_b, pipe5.port_a) ; connect(pipe5.port_b, pipe6.port_a) ;
annotation( uses(Modelica(version = "4.0.0")), version = ""); end shire01;''' with open(saved_path, 'w', encoding = 'utf-8') as f: f.write(script_0_1_pipe) return script_0_1_pipe
import pandas as pd df = pd.read_csv("/home/ubuntu/data/01_pipes", encoding="utf-8")
from OMPython import OMCSessionZMQ import re import glob import os
for ext in extensions: files = glob.glob(os.path.join(folder, ext)) for file in files: try: os.remove(file) except Exception as e: print(f"error occurs while deleting {file} : {e}")
def kill_omc_process(model_name=""): for proc in psutil.process_iter(['pid', 'name']): if 'omc' in proc.info['name'].lower(): try: proc.kill() print(f"Killed OMC process with PID {proc.info['pid']}") except Exception as e: print(f"Failed to kill process {proc.info['pid']}: {e}") if model_name and len(model_name) > 3 and model_name in proc.info['name'].lower(): try: proc.kill() print(f"Killed OMC process with PID {proc.info['pid']}") except Exception as e: print(f"Failed to kill process {proc.info['pid']}: {e}") ospath = '/home/ubuntu/result/shire.om' current_directory = '/home/ubuntu/script'
build_result = omc.execute(f"buildModel({model_name})") print(build_result) if "Error" in build_result: print("error while building model: ", build_result) return
if "resultFile" not in simulate_result: print("no result file found") with open(error_log, 'a+', encoding='utf-8') as f: f.write(f'\n\nerror occured while simulating with error', omc.execute("getErrorString()")) return
result_file_match = re.search(r'resultFile\s*=\s*"([^"]+)"', simulate_result) if result_file_match: result_file = result_file_match.group(1) else: print("result file not found") return
# Step 4 recursion import psutil script = '' import time with open(result_path, "a+", encoding ="utf-8") as f: f.write(f"time, flow, source0 pressure, source1 pressure, simulated_pressure\n") for ind,r in df.iterrows(): try: kill_omc_process("shire01") except Exception as e: print(e) try: print(f'simulating on {ind}') r['temp'] = max(r['Z202_SS_000_00_TE201A'],r['Z202_SS_000_00_TE201B']) r['pressure'] = max(r['Z202_SS_D01_PD_PT201'],r['Z202_SS_D02_PD_PT203']) script = generate_script(r, ospath) simulated_pressure = simulate(ospath) with open(result_path, "a+", encoding ="utf-8") as f: f.write(f"{ind}, {r['Z201_SS_000_BS_FT30107']}, {r['Z201_SS_000_BS_PT30106']}, {r['pressure']}, {simulated_pressure}\n") except Exception as e: print(f'{ind} has something wrong: {e}') [/code] Кстати, я также пытался создать экземпляр OMCSessionZMQ только один раз и после каждого запуска, отправляя «clear();» команда, но весь процесс более нестабильен и чаще приводит к сбоям. Я надеюсь найти решения для запуска повторного моделирования с помощью OMPython.
Я совместно моделирую модель в OpenModelica и Fluent(CFD). Моя цель — передать массу видов (трассировщик) в мультизональную модель в OpenModelica. Эта переменная называется room.mC и является не параметром, а непрерывной переменной. Кажется, функция...
Я совместно моделирую модель в OpenModelica и Fluent(CFD). Моя цель — передать массу видов (трассировщиков) из Fluent в мультизональную модель в OpenModelica. Шаг синхронизации составляет каждую 1 с. Время остановки моделирования составляет 10 с....
Как указать путь к папке результатов в mod.buildModel() с помощью Python?
model_path= C:/Users/sophie/VirtualEnv/RoomM-Model/ mod=ModelicaSystem(model_path + RoomM.mo , RoomM ) мод.buildModel()
Я использую Visual Studio 2019. Я относительно новичок в этом.
Мне нужно использовать Nuget Femyou, который доступен только для NetStandard 2.1. ( изменить ) Я также установил nuget NativeLibraryLoader. Первоначально я выбрал целевую платформу .NET...
Я моделирую систему в открытой моделике. У меня есть модель верхнего уровня с несколькими экземплярами похожих подклассов, параметры которых установлены по-разному в зависимости от экземпляра. Ниже приведен пример настроек модели верхнего уровня....