PIbd-42_SSPR/experiment_planner.py

214 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import requests
import os
import subprocess
import time
import psutil
import argparse
import macros_generator as mg
STARCCM_PATH = '/home/user/Siemens/19.02.009-R8/STAR-CCM+19.02.009-R8/star/bin/starccm+'
NUMBER_PROCESSES = 16
def download_file_from_fastapi(api_url, params, full_file_name):
response = requests.post(api_url, json=params)
if response.status_code == 200:
with open(full_file_name, "wb") as f:
f.write(response.content)
print("File downloaded successfully.")
else:
print(f"Failed to download file. Status code: {response.status_code}")
def terminate_process_by_name(process_name):
# Проходим по всем процессам в системе
for proc in psutil.process_iter(['pid', 'name']):
try:
# Если имя процесса совпадает с искомым
if proc.info['name'] == process_name:
# Завершаем процесс
proc.terminate()
print(f"Процесс '{process_name}' с PID {proc.pid} был завершен.")
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e:
print(f"Не удалось завершить процесс '{process_name}': {e}")
def create_directory(path):
if not os.path.exists(path):
os.makedirs(path)
def delete_directory(path):
if os.path.exists(path):
os.remove(path)
def run_macros(macros_name, model_name=None, new_model=False, is_gpgpu=False):
np_value = '1 -gpgpu auto' if is_gpgpu else str(NUMBER_PROCESSES)
if new_model:
macros_command = f'{STARCCM_PATH} -np {np_value} -new -batch \'{macros_name}\''
else:
if model_name is None:
raise ValueError("model_name must be provided if new_model is False")
macros_command = f'{STARCCM_PATH} -np {np_value} \'{model_name}\' -batch \'{macros_name}\''
subprocess.run(
["bash", "-c", macros_command])
def run_experiment(angle):
chemkin_path = "/media/user/Новый том/burner_automation/burner_data/chemkin"
mesh_base_size = 0.7
cpu_stopping_criterion = 200
stopping_criterion = 7000
main_path = '/media/user/Новый том/burner_automation/experiment_data'
create_directory(main_path)
diameters = {'d1': 1442, 'd2': 1016, 'd3': 640, 'd4': 325, 'd5': 325, 'd6': 245}
default_values = {
"N1": 24,
"L1": 70.0,
"a1": 60.0,
"N2": 18,
"L2": 105.0,
"N3": 9,
"L3": 30.0
}
# number_outer_blades = [12, 24, 36, 48]
#number_outer_blades = 24.0
# length_outer_blades = [44, 70, 86, 107.5]
#length_outer_blades = 70.0
# angle_outer_blades = [30.0, 45.0, 60.0, 75.0]
# number_middle_blades = [9, 18, 27, 36]
#number_middle_blades = 18.0
# load = [190, 260, 315, 400, 465]
# load_eco = [260, 315, 400, 465]
load = 450
# recycling_eco = [0, 7, 14, 21, 28]
# recycling = [0, 5, 10, 15, 20, 25, 30]
# recycling = [0, 6, 12, 18, 24, 30]
recycling = 0
start_time = time.time()
directories_list = []
api_url = "http://10.6.23.120:8000/api/v1/generate_geom"
params = {
"a1": angle
}
geometry_path = str(24) + '_' + str(70) + '_' + str(angle) + '_' + str(18)
geometry_path_full = os.path.join(main_path, geometry_path, 'geometry')
create_directory(geometry_path_full)
geometry_file_name = os.path.join(geometry_path_full, 'geometry.stp')
download_file_from_fastapi(api_url, params, geometry_file_name)
macros_path = os.path.join(main_path, geometry_path, 'general_macros')
directories_list.append(macros_path)
MODEL_PATH = os.path.join(main_path, geometry_path, 'model')
directories_list.append(MODEL_PATH)
model_parameters = {
'geometry_path': geometry_file_name,
'chemkin_path': chemkin_path,
'init_model_folder': MODEL_PATH,
'bladeCount': 18,
'mesh_base_size': mesh_base_size
}
fuel_parameters = mg.load_calculation(load, diameters)
recycling_parameters = mg.recycling_calculation(fuel_parameters['alpha'], fuel_parameters['gas_consumption'],
fuel_parameters['air_consumption'], recycling)
experiments_path = os.path.join(main_path, geometry_path, 'experiments')
directories_list.append(experiments_path)
load_path = os.path.join(experiments_path, str(load))
directories_list.append(load_path)
load_macros_experiment_path = os.path.join(load_path, 'macros')
directories_list.append(load_macros_experiment_path)
load_model_experiment_path = os.path.join(load_path, 'model')
directories_list.append(load_model_experiment_path)
recycling_experiment_path = os.path.join(load_path, str(recycling))
directories_list.append(recycling_experiment_path)
recycling_macros_experiment_path = os.path.join(recycling_experiment_path, 'macros')
directories_list.append(recycling_macros_experiment_path)
solver_parameters = {
'experiment_path': recycling_experiment_path,
'stopping_criterion': stopping_criterion
}
prc_macros_file = os.path.join(macros_path, 'preprocess_macro.java')
fuel_macros_file = os.path.join(load_macros_experiment_path, 'fuel_macro.java')
rec_macros_file = os.path.join(recycling_macros_experiment_path, 'recycle_macro.java')
run_macros_file = os.path.join(recycling_macros_experiment_path, 'run_macros.java')
for directory in directories_list:
create_directory(directory)
model_file = os.path.join(MODEL_PATH, 'init_model.sim')
mg.preprocessor_settings(prc_macros_file, model_parameters, model_file)
load_model_file = os.path.join(load_model_experiment_path, "load_"+str(load)+".sim")
mg.fuel_settings(fuel_macros_file, fuel_parameters, load_model_file)
exp_file = os.path.join(recycling_experiment_path, "recycling_"+str(recycling)+".sim")
mg.fgm_table_settings(rec_macros_file, recycling_parameters, exp_file)
mg.setting_and_running_solver(run_macros_file, solver_parameters, exp_file)
run_macros(prc_macros_file, new_model=True)
run_macros(fuel_macros_file, model_file)
run_macros(rec_macros_file, load_model_file)
run_macros(run_macros_file, exp_file, is_gpgpu=True)
_EXP_FILE = exp_file + "~"
delete_directory(_EXP_FILE)
# solver_parameters['stopping_criterion'] = STOPPING_CRITERION
# mg.setting_and_running_solver(run_macros_file, solver_parameters, EXP_FILE)
# run_macros(run_macros_file, EXP_FILE, is_gpgpu=True)
# _EXP_FILE = EXP_FILE + "~"
# delete_directory(_EXP_FILE)
# Конец замера времени
end_time = time.time()
# Вычисление времени выполнения
execution_time = end_time - start_time
print(f"Execution time: {execution_time}")
# time.sleep(10)
#
# processes_name = ["starccm+", "star-ccm+"]
#
# for process in processes_name:
# terminate_process_by_name(process)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Запуск экспериментов с энергетической установкой ГМУ-45")
parser.add_argument("angle", type=str, help="Угол наклона лопаток во внешнем контуре")
args = parser.parse_args()
run_experiment(args.angle)