Update simulation.py from WMH

This commit is contained in:
DingZQ
2025-03-23 12:21:02 +08:00
parent 51d45ef192
commit 55bab8cf60

View File

@@ -526,13 +526,15 @@ def convert_time_format(original_time: str) -> str:
def get_history_pattern_info(project_name, pattern_name): def get_history_pattern_info(project_name, pattern_name):
"""读取选定pattern的保存的历史pattern信息flow""" """读取选定pattern的保存的历史pattern信息flow和factor"""
flow_list = [] flow_list = []
factor_list = []
patterns_info = read_all(project_name, patterns_info = read_all(project_name,
f"select * from history_patterns_flows where id = '{pattern_name}' order by _order") f"select * from history_patterns_flows where id = '{pattern_name}' order by _order")
for item in patterns_info: for item in patterns_info:
flow_list.append(float(item['flow'])) flow_list.append(float(item['flow']))
return flow_list factor_list.append(float(item['factor']))
return flow_list, factor_list
# 2025/01/11 # 2025/01/11
@@ -572,9 +574,7 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
print('{} -- Hydraulic simulation started.'.format( print('{} -- Hydraulic simulation started.'.format(
datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S'))) datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S')))
# 重新打开数据库
if is_project_open(name):
close_project(name)
# 判断是实时模拟还是多步长模拟 # 判断是实时模拟还是多步长模拟
# if simulation_type.upper() == 'REALTIME': # 实时模拟(修改原数据库) # if simulation_type.upper() == 'REALTIME': # 实时模拟(修改原数据库)
# name_c = name # name_c = name
@@ -689,7 +689,7 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
if value: if value:
demand_pattern = get_pattern(name_c, get_demand(name_c, demand_name)['pattern']) demand_pattern = get_pattern(name_c, get_demand(name_c, demand_name)['pattern'])
if get_option(name_c)['UNITS'] == 'LPS': if get_option(name_c)['UNITS'] == 'LPS':
demand_pattern['factors'][modify_index] = float(value) / 3.6 # m3/h 转换为 L/s demand_pattern['factors'][modify_index] = float(value) / 3.6 # 默认SCADA数据获取的是流量单位是m3/h 转换为 L/s
elif get_option(name_c)['UNITS'] == 'CMH': elif get_option(name_c)['UNITS'] == 'CMH':
demand_pattern['factors'][modify_index] = float(value) demand_pattern['factors'][modify_index] = float(value)
cs = ChangeSet() cs = ChangeSet()
@@ -706,14 +706,19 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
# print(source_outflow_dict) # print(source_outflow_dict)
for pattern_name in source_outflow_dict.keys(): for pattern_name in source_outflow_dict.keys():
# print(pattern_name) # print(pattern_name)
history_source_outflow_list = get_history_pattern_info(name_c, pattern_name) history_source_outflow_flow_list, history_source_outflow_factor_list = get_history_pattern_info(name_c, pattern_name)
history_source_outflow = history_source_outflow_list[modify_index] history_source_outflow_flow = history_source_outflow_flow_list[modify_index]
history_source_outflow_factor = history_source_outflow_factor_list[modify_index]
# print(source_outflow_dict[pattern_name]) # print(source_outflow_dict[pattern_name])
# print(history_source_outflow_flow)
# print(history_source_outflow_factor)
if source_outflow_dict[pattern_name]: if source_outflow_dict[pattern_name]:
realtime_source_outflow = float(source_outflow_dict[pattern_name]) realtime_source_outflow = float(source_outflow_dict[pattern_name])
multiply_factor = realtime_source_outflow / history_source_outflow multiply_factor = realtime_source_outflow / history_source_outflow_flow
# print(multiply_factor)
pattern = get_pattern(name_c, pattern_name) pattern = get_pattern(name_c, pattern_name)
pattern['factors'][modify_index] *= multiply_factor pattern['factors'][modify_index] = multiply_factor * history_source_outflow_factor
# print(pattern['factors'][modify_index])
cs = ChangeSet() cs = ChangeSet()
cs.append(pattern) cs.append(pattern)
set_pattern(name_c, cs) set_pattern(name_c, cs)
@@ -723,13 +728,14 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
query_ids_list=list(globals.realtime_pipe_flow_pattern_id.values()), query_time=modify_pattern_start_time) query_ids_list=list(globals.realtime_pipe_flow_pattern_id.values()), query_time=modify_pattern_start_time)
realtime_pipe_flow_dict = {key: realtime_pipe_flow_SCADA_data_dict[value] for key, value in globals.realtime_pipe_flow_pattern_id.items()} realtime_pipe_flow_dict = {key: realtime_pipe_flow_SCADA_data_dict[value] for key, value in globals.realtime_pipe_flow_pattern_id.items()}
for pattern_name in realtime_pipe_flow_dict.keys(): for pattern_name in realtime_pipe_flow_dict.keys():
history_pipe_flow_list = get_history_pattern_info(name_c, pattern_name) history_pipe_flow_flow_list, history_pipe_flow_factor_list = get_history_pattern_info(name_c, pattern_name)
history_pipe_flow = history_pipe_flow_list[modify_index] history_pipe_flow_flow = history_pipe_flow_flow_list[modify_index]
history_pipe_flow_factor = history_pipe_flow_factor_list[modify_index]
if realtime_pipe_flow_dict[pattern_name]: if realtime_pipe_flow_dict[pattern_name]:
realtime_pipe_flow = float(realtime_pipe_flow_dict[pattern_name]) realtime_pipe_flow = float(realtime_pipe_flow_dict[pattern_name])
multiply_factor = realtime_pipe_flow / history_pipe_flow multiply_factor = realtime_pipe_flow / history_pipe_flow_flow
pattern = get_pattern(name_c, pattern_name) pattern = get_pattern(name_c, pattern_name)
pattern['factors'][modify_index] *= multiply_factor pattern['factors'][modify_index] = multiply_factor * history_pipe_flow_factor
cs = ChangeSet() cs = ChangeSet()
cs.append(pattern) cs.append(pattern)
set_pattern(name_c, cs) set_pattern(name_c, cs)
@@ -745,15 +751,17 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
query_ids_list=list(temp_realtime_pipe_flow_pattern_id.values()), query_time=modify_pattern_start_time) query_ids_list=list(temp_realtime_pipe_flow_pattern_id.values()), query_time=modify_pattern_start_time)
temp_realtime_pipe_flow_dict = {key: temp_realtime_pipe_flow_SCADA_data_dict[value] for key, value in temp_realtime_pipe_flow_pattern_id.items()} temp_realtime_pipe_flow_dict = {key: temp_realtime_pipe_flow_SCADA_data_dict[value] for key, value in temp_realtime_pipe_flow_pattern_id.items()}
for pattern_name in temp_realtime_pipe_flow_dict.keys(): for pattern_name in temp_realtime_pipe_flow_dict.keys():
temp_history_pipe_flow_list = get_history_pattern_info(name_c, pattern_name) temp_history_pipe_flow_flow_list, temp_history_pipe_flow_factor_list = get_history_pattern_info(name_c, pattern_name)
temp_history_pipe_flow = temp_history_pipe_flow_list[modify_index] temp_history_pipe_flow_flow = temp_history_pipe_flow_flow_list[modify_index]
if temp_realtime_pipe_flow_dict[pattern_name]: if temp_realtime_pipe_flow_dict[pattern_name]:
temp_realtime_pipe_flow = float(temp_realtime_pipe_flow_dict[pattern_name]) temp_realtime_pipe_flow = float(temp_realtime_pipe_flow_dict[pattern_name])
temp_multiply_factor = temp_realtime_pipe_flow / temp_history_pipe_flow temp_multiply_factor = temp_realtime_pipe_flow / temp_history_pipe_flow_flow
temp_non_realtime_demand_pattern_list = globals.pipe_flow_region_patterns[pattern_name] temp_non_realtime_demand_pattern_list = globals.pipe_flow_region_patterns[pattern_name]
for demand_pattern_name in temp_non_realtime_demand_pattern_list: for demand_pattern_name in temp_non_realtime_demand_pattern_list:
history_non_realtime_demand_flow_list, history_non_realtime_demand_factor_list = get_history_pattern_info(name_c, demand_pattern_name)
history_non_realtime_demand_factor = history_non_realtime_demand_factor_list[modify_index]
pattern = get_pattern(name_c, demand_pattern_name) pattern = get_pattern(name_c, demand_pattern_name)
pattern['factors'][modify_index] *= temp_multiply_factor pattern['factors'][modify_index] = temp_multiply_factor * history_non_realtime_demand_factor
cs = ChangeSet() cs = ChangeSet()
cs.append(pattern) cs.append(pattern)
set_pattern(name_c, cs) set_pattern(name_c, cs)
@@ -778,17 +786,19 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
region_total_source_outflow = sum(region_source_outflow_valid_values) region_total_source_outflow = sum(region_source_outflow_valid_values)
history_region_total_source_outflow = 0 history_region_total_source_outflow = 0
for source_outflow_pattern_name in temp_source_outflow_region_patterns: for source_outflow_pattern_name in temp_source_outflow_region_patterns:
temp_history_source_outflow_list = get_history_pattern_info(name_c, source_outflow_pattern_name) temp_history_source_outflow_flow_list, temp_history_source_outflow_factor_list = get_history_pattern_info(name_c, source_outflow_pattern_name)
history_region_total_source_outflow += temp_history_source_outflow_list[modify_index] history_region_total_source_outflow += temp_history_source_outflow_flow_list[modify_index]
region_total_realtime_region_pipe_flow_and_demand = sum(valid_values) region_total_realtime_region_pipe_flow_and_demand = sum(valid_values)
history_region_total_realtime_region_pipe_flow_and_demand = 0 history_region_total_realtime_region_pipe_flow_and_demand = 0
for pipe_flow_and_demand_pattern_name in temp_realtime_region_pipe_flow_and_demand_patterns: for pipe_flow_and_demand_pattern_name in temp_realtime_region_pipe_flow_and_demand_patterns:
temp_history_pipe_flow_and_demand_list = get_history_pattern_info(name_c, pipe_flow_and_demand_pattern_name) temp_history_pipe_flow_and_demand_flow_list, temp_history_pipe_flow_and_demand_factor_list = get_history_pattern_info(name_c, pipe_flow_and_demand_pattern_name)
history_region_total_realtime_region_pipe_flow_and_demand += temp_history_pipe_flow_and_demand_list[modify_index] history_region_total_realtime_region_pipe_flow_and_demand += temp_history_pipe_flow_and_demand_flow_list[modify_index]
temp_multiply_factor = (region_total_source_outflow - region_total_realtime_region_pipe_flow_and_demand) / (history_region_total_source_outflow - history_region_total_realtime_region_pipe_flow_and_demand) temp_multiply_factor = (region_total_source_outflow - region_total_realtime_region_pipe_flow_and_demand) / (history_region_total_source_outflow - history_region_total_realtime_region_pipe_flow_and_demand)
for non_realtime_region_pattern_name in temp_non_realtime_region_patterns: for non_realtime_region_pattern_name in temp_non_realtime_region_patterns:
history_non_realtime_region_pattern_flow_list, history_non_realtime_region_pattern_factor_list = get_history_pattern_info(name_c, non_realtime_region_pattern_name)
history_non_realtime_region_pattern_factor = history_non_realtime_region_pattern_factor_list[modify_index]
pattern = get_pattern(name_c, non_realtime_region_pattern_name) pattern = get_pattern(name_c, non_realtime_region_pattern_name)
pattern['factors'][modify_index] *= temp_multiply_factor pattern['factors'][modify_index] = temp_multiply_factor * history_non_realtime_region_pattern_factor
cs = ChangeSet() cs = ChangeSet()
cs.append(pattern) cs.append(pattern)
set_pattern(name_c, cs) set_pattern(name_c, cs)
@@ -883,8 +893,6 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
print('{} -- Hydraulic simulation finished, cost time: {:.2f} s.'.format( print('{} -- Hydraulic simulation finished, cost time: {:.2f} s.'.format(
datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S'), datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S'),
time_cost_end - time_cost_start)) time_cost_end - time_cost_start))
close_project(name_c)
# DingZQ 下面这几句一定要这样,不然读取不了 # DingZQ 下面这几句一定要这样,不然读取不了
time.sleep(5) # wait 5 seconds time.sleep(5) # wait 5 seconds
@@ -893,10 +901,10 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
output = Output(tmp_file) output = Output(tmp_file)
node_result = output.node_results() node_result = output.node_results()
link_result = output.link_results() link_result = output.link_results()
link_flow = [] # link_flow = []
for link in link_result: # for link in link_result:
link_flow.append(link['result'][-1]['flow']) # link_flow.append(link['result'][-1]['flow'])
print(link_flow) # print(link_flow)
num_periods_result = output.times()['num_periods'] num_periods_result = output.times()['num_periods']
print("simulation_type", simulation_type) print("simulation_type", simulation_type)
print("before store result") print("before store result")