PIbd-42_SSPR/experiment_planner.py

214 lines
7.3 KiB
Python
Raw Permalink Normal View History

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)