Сбой системы при использовании OMPython для запуска итеративного моделирования с помощью OpenModelica (OMC)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сбой системы при использовании OMPython для запуска итеративного моделирования с помощью OpenModelica (OMC)

Сообщение Anonymous »

Я использую 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.

Подробнее здесь: https://stackoverflow.com/questions/791 ... delica-omc
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»