Update online_anaylysis
This commit is contained in:
@@ -13,36 +13,41 @@ from psycopg import sql
|
|||||||
import pandas as pd
|
import pandas as pd
|
||||||
import csv
|
import csv
|
||||||
import chardet
|
import chardet
|
||||||
|
import simulation
|
||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# burst analysis 01
|
# burst analysis 01
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
def burst_analysis(prj_name, date_time, burst_ID: list | str, burst_size: list | float | int = None, duration=900, pump_control=None, valve_closed=None) -> str:
|
def burst_analysis(name: str, modify_pattern_start_time: str, burst_ID: list | str = None, burst_size: list | float | int = None,
|
||||||
'''
|
modify_total_duration: int=900, modify_fixed_pump_pattern: dict[str, list] = None,
|
||||||
burst 分析
|
modify_variable_pump_pattern: dict[str, list] = None, modify_valve_opening: dict[str, float] = None,
|
||||||
:param prj_name:
|
scheme_Name: str = None) -> None:
|
||||||
:param date_time:
|
"""
|
||||||
:param burst_ID:
|
爆管模拟
|
||||||
:param burst_siz:
|
:param name: 模型名称,数据库中对应的名字
|
||||||
:param duration:
|
:param modify_pattern_start_time: 模拟开始时间,格式为'2024-11-25T09:00:00+08:00'
|
||||||
:param pump_control:
|
:param burst_ID: 爆管管道的ID,选取的是管道,单独传入一个爆管管道,可以是str或list,传入多个爆管管道是用list
|
||||||
:param valve_closed:
|
:param burst_size: 爆管管道破裂的孔口面积,和burst_ID列表各位置的ID对应,以cm*cm计算
|
||||||
|
:param modify_total_duration: 模拟总历时,秒
|
||||||
|
:param modify_fixed_pump_pattern: dict中包含多个水泵模式,str为工频水泵的id,list为修改后的pattern
|
||||||
|
:param modify_variable_pump_pattern: dict中包含多个水泵模式,str为变频水泵的id,list为修改后的pattern
|
||||||
|
:param modify_valve_opening: dict中包含多个阀门开启度,str为阀门的id,float为修改后的阀门开启度
|
||||||
|
:param scheme_Name: 方案名称
|
||||||
:return:
|
:return:
|
||||||
'''
|
"""
|
||||||
|
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
||||||
new_name = f'burst_Anal_{prj_name}'
|
new_name = f'burst_Anal_{name}'
|
||||||
|
|
||||||
if have_project(new_name):
|
if have_project(new_name):
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
if is_project_open(prj_name):
|
if is_project_open(name):
|
||||||
close_project(prj_name)
|
close_project(name)
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
||||||
CopyProjectEx()(prj_name, new_name,
|
CopyProjectEx()(name, new_name,
|
||||||
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
||||||
open_project(new_name)
|
open_project(new_name)
|
||||||
@@ -108,43 +113,56 @@ def burst_analysis(prj_name, date_time, burst_ID: list | str, burst_size: list |
|
|||||||
cs_options.append(options)
|
cs_options.append(options)
|
||||||
set_option(new_name, cs_options)
|
set_option(new_name, cs_options)
|
||||||
|
|
||||||
valve_control = None
|
# valve_control = None
|
||||||
if valve_closed is not None:
|
# if modify_valve_opening is not None:
|
||||||
valve_control = {}
|
# valve_control = {}
|
||||||
for valve in valve_closed:
|
# for valve in modify_valve_opening:
|
||||||
valve_control[valve] = {'status': 'CLOSED'}
|
# valve_control[valve] = {'status': 'CLOSED'}
|
||||||
|
# result = run_simulation_ex(new_name,'realtime', modify_pattern_start_time,
|
||||||
result = run_simulation_ex(new_name,'realtime', date_time,
|
# end_datetime=modify_pattern_start_time,
|
||||||
end_datetime=date_time,
|
# modify_total_duration=modify_total_duration,
|
||||||
duration=duration,
|
# modify_pump_pattern=modify_pump_pattern,
|
||||||
pump_control=pump_control,
|
# valve_control=valve_control,
|
||||||
valve_control=valve_control,
|
# downloading_prohibition=True)
|
||||||
downloading_prohibition=True)
|
simulation.run_simulation(name=new_name, simulation_type='extended', modify_pattern_start_time=modify_pattern_start_time,
|
||||||
|
modify_total_duration=modify_total_duration, modify_fixed_pump_pattern=modify_fixed_pump_pattern,
|
||||||
|
modify_variable_pump_pattern=modify_variable_pump_pattern, modify_valve_opening=modify_valve_opening,
|
||||||
|
scheme_Type='burst_Analysis', scheme_Name=scheme_Name)
|
||||||
|
|
||||||
#step 3. restore the base model status
|
#step 3. restore the base model status
|
||||||
# execute_undo(prj_name) #有疑惑
|
# execute_undo(name) #有疑惑
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
|
|
||||||
return result
|
# return result
|
||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# valve closing analysis 02
|
# valve closing analysis 02
|
||||||
############################################################
|
############################################################
|
||||||
def valve_close_analysis(prj_name, date_time, valves, duration=None)->str:
|
def valve_close_analysis(name: str, modify_pattern_start_time: str, modify_total_duration: int = 900,
|
||||||
|
modify_valve_opening: dict[str, float] = None, scheme_Name: str = None) -> None:
|
||||||
|
"""
|
||||||
|
关阀模拟
|
||||||
|
:param name: 模型名称,数据库中对应的名字
|
||||||
|
:param modify_pattern_start_time: 模拟开始时间,格式为'2024-11-25T09:00:00+08:00'
|
||||||
|
:param modify_total_duration: 模拟总历时,秒
|
||||||
|
:param modify_valve_opening: dict中包含多个阀门开启度,str为阀门的id,float为修改后的阀门开启度
|
||||||
|
:param scheme_Name: 方案名称
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
||||||
new_name = f'valve_close_Anal_{prj_name}'
|
new_name = f'valve_close_Anal_{name}'
|
||||||
|
|
||||||
if have_project(new_name):
|
if have_project(new_name):
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
if is_project_open(prj_name):
|
if is_project_open(name):
|
||||||
close_project(prj_name)
|
close_project(name)
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
||||||
CopyProjectEx()(prj_name, new_name,
|
CopyProjectEx()(name, new_name,
|
||||||
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
||||||
open_project(new_name)
|
open_project(new_name)
|
||||||
@@ -152,15 +170,15 @@ def valve_close_analysis(prj_name, date_time, valves, duration=None)->str:
|
|||||||
|
|
||||||
#step 1. change the valves status to 'closed'
|
#step 1. change the valves status to 'closed'
|
||||||
|
|
||||||
for valve in valves:
|
# for valve in valves:
|
||||||
if not is_valve(new_name,valve):
|
# if not is_valve(new_name,valve):
|
||||||
result='ID:{}is not a valve type'.format(valve)
|
# result='ID:{}is not a valve type'.format(valve)
|
||||||
return result
|
# return result
|
||||||
cs=ChangeSet()
|
# cs=ChangeSet()
|
||||||
status=get_status(new_name,valve)
|
# status=get_status(new_name,valve)
|
||||||
status['status']='CLOSED'
|
# status['status']='CLOSED'
|
||||||
cs.append(status)
|
# cs.append(status)
|
||||||
set_status(new_name,cs)
|
# set_status(new_name,cs)
|
||||||
|
|
||||||
#step 2. run simulation
|
#step 2. run simulation
|
||||||
|
|
||||||
@@ -172,35 +190,51 @@ def valve_close_analysis(prj_name, date_time, valves, duration=None)->str:
|
|||||||
cs_options.append(options)
|
cs_options.append(options)
|
||||||
set_option(new_name, cs_options)
|
set_option(new_name, cs_options)
|
||||||
|
|
||||||
result = run_simulation_ex(new_name,'realtime', date_time, date_time, duration,
|
# result = run_simulation_ex(new_name,'realtime', modify_pattern_start_time, modify_pattern_start_time, modify_total_duration,
|
||||||
downloading_prohibition=True)
|
# downloading_prohibition=True)
|
||||||
|
simulation.run_simulation(name=new_name, simulation_type='extended', modify_pattern_start_time=modify_pattern_start_time,
|
||||||
|
modify_total_duration=duration, modify_valve_opening=modify_valve_opening,
|
||||||
|
scheme_Type='valve_close_Analysis', scheme_Name=scheme_Name)
|
||||||
|
|
||||||
#step 3. restore the base model
|
#step 3. restore the base model
|
||||||
# for valve in valves:
|
# for valve in valves:
|
||||||
# execute_undo(prj_name)
|
# execute_undo(name)
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
|
|
||||||
return result
|
# return result
|
||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# flushing analysis 03
|
# flushing analysis 03
|
||||||
#Pipe_Flushing_Analysis(prj_name,date_time, Valve_id_list, Drainage_Node_Id, Flushing_flow[opt], Flushing_duration[opt])->out_file:string
|
#Pipe_Flushing_Analysis(prj_name,date_time, Valve_id_list, Drainage_Node_Id, Flushing_flow[opt], Flushing_duration[opt])->out_file:string
|
||||||
############################################################
|
############################################################
|
||||||
def flushing_analysis(prj_name, date_time, valves, valves_k, drainage_node_ID, flushing_flow=0, duration=None)->str:
|
def flushing_analysis(name: str, modify_pattern_start_time: str, modify_total_duration: int = 900,
|
||||||
|
modify_valve_opening: dict[str, float] = None, drainage_node_ID: str = None,
|
||||||
|
flushing_flow: float = 0, scheme_Name: str = None) -> None:
|
||||||
|
"""
|
||||||
|
管道冲洗模拟
|
||||||
|
:param name: 模型名称,数据库中对应的名字
|
||||||
|
:param modify_pattern_start_time: 模拟开始时间,格式为'2024-11-25T09:00:00+08:00'
|
||||||
|
:param modify_total_duration: 模拟总历时,秒
|
||||||
|
:param modify_valve_opening: dict中包含多个阀门开启度,str为阀门的id,float为修改后的阀门开启度
|
||||||
|
:param drainage_node_ID: 冲洗排放口所在节点ID
|
||||||
|
:param flushing_flow: 冲洗水量,传入参数单位为m3/h
|
||||||
|
:param scheme_Name: 方案名称
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
||||||
new_name = f'flushing_Anal_{prj_name}'
|
new_name = f'flushing_Anal_{name}'
|
||||||
|
|
||||||
if have_project(new_name):
|
if have_project(new_name):
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
if is_project_open(prj_name):
|
if is_project_open(name):
|
||||||
close_project(prj_name)
|
close_project(name)
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
||||||
CopyProjectEx()(prj_name, new_name,
|
CopyProjectEx()(name, new_name,
|
||||||
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
||||||
open_project(new_name)
|
open_project(new_name)
|
||||||
@@ -210,24 +244,27 @@ def flushing_analysis(prj_name, date_time, valves, valves_k, drainage_node_ID, f
|
|||||||
return 'Wrong Drainage node type'
|
return 'Wrong Drainage node type'
|
||||||
|
|
||||||
#step 1. change the valves status to 'closed'
|
#step 1. change the valves status to 'closed'
|
||||||
for valve, valve_k in zip(valves, valves_k):
|
# for valve, valve_k in zip(valves, valves_k):
|
||||||
cs=ChangeSet()
|
# cs=ChangeSet()
|
||||||
status=get_status(new_name,valve)
|
# status=get_status(new_name,valve)
|
||||||
# status['status']='CLOSED'
|
# # status['status']='CLOSED'
|
||||||
if valve_k == 0:
|
# if valve_k == 0:
|
||||||
status['status'] = 'CLOSED'
|
# status['status'] = 'CLOSED'
|
||||||
elif valve_k < 1:
|
# elif valve_k < 1:
|
||||||
status['status'] = 'OPEN'
|
# status['status'] = 'OPEN'
|
||||||
status['setting'] = 0.1036 * pow(valve_k, -3.105)
|
# status['setting'] = 0.1036 * pow(valve_k, -3.105)
|
||||||
cs.append(status)
|
# cs.append(status)
|
||||||
set_status(new_name,cs)
|
# set_status(new_name,cs)
|
||||||
|
units = get_option(new_name)
|
||||||
#step 2. set the emitter coefficient of drainage node or add flush flow to the drainage node
|
#step 2. set the emitter coefficient of drainage node or add flush flow to the drainage node
|
||||||
emitter_demand=get_demand(new_name,drainage_node_ID)
|
emitter_demand=get_demand(new_name,drainage_node_ID)
|
||||||
cs=ChangeSet()
|
cs = ChangeSet()
|
||||||
if flushing_flow>0:
|
if flushing_flow > 0:
|
||||||
for r in emitter_demand['demands']:
|
for r in emitter_demand['demands']:
|
||||||
r['demand']+=(flushing_flow/3.6)
|
if units == 'LPS':
|
||||||
|
r['demand'] += (flushing_flow/3.6)
|
||||||
|
elif units == 'CMH':
|
||||||
|
r['demand'] += flushing_flow
|
||||||
cs.append(emitter_demand)
|
cs.append(emitter_demand)
|
||||||
set_demand(new_name,cs)
|
set_demand(new_name,cs)
|
||||||
else:
|
else:
|
||||||
@@ -260,31 +297,47 @@ def flushing_analysis(prj_name, date_time, valves, valves_k, drainage_node_ID, f
|
|||||||
cs_options.append(options)
|
cs_options.append(options)
|
||||||
set_option(new_name, cs_options)
|
set_option(new_name, cs_options)
|
||||||
|
|
||||||
result = run_simulation_ex(new_name,'realtime', date_time, date_time, duration,
|
# result = run_simulation_ex(new_name,'realtime', modify_pattern_start_time, modify_pattern_start_time, modify_total_duration,
|
||||||
downloading_prohibition=True)
|
# downloading_prohibition=True)
|
||||||
|
simulation.run_simulation(name=new_name, simulation_type='extended', modify_pattern_start_time=modify_pattern_start_time,
|
||||||
|
modify_total_duration=modify_total_duration, modify_valve_opening=modify_valve_opening,
|
||||||
|
scheme_Type='flushing_Analysis', scheme_Name=scheme_Name)
|
||||||
|
|
||||||
#step 4. restore the base model
|
#step 4. restore the base model
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
return result
|
# return result
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# Contaminant simulation 04
|
# Contaminant simulation 04
|
||||||
#
|
#
|
||||||
############################################################
|
############################################################
|
||||||
def contaminant_simulation(prj_name:str,date_time:str, source:str,concentration:float,duration=900,pattern:str=None)->str:
|
def contaminant_simulation(name: str, modify_pattern_start_time: str, modify_total_duration: int = 900,
|
||||||
|
source: str = None, concentration: float = None,
|
||||||
|
source_pattern: str = None, scheme_Name: str = None) -> None:
|
||||||
|
"""
|
||||||
|
污染模拟
|
||||||
|
:param name: 模型名称,数据库中对应的名字
|
||||||
|
:param modify_pattern_start_time: 模拟开始时间,格式为'2024-11-25T09:00:00+08:00'
|
||||||
|
:param modify_total_duration: 模拟总历时,秒
|
||||||
|
:param source: 污染源所在的节点ID
|
||||||
|
:param concentration: 污染源位置处的浓度,单位mg/L,即默认的污染模拟setting为concentration
|
||||||
|
:param source_pattern: 污染源的时间变化模式,若不传入则默认以恒定浓度持续模拟,时间长度等于duration;
|
||||||
|
若传入,则格式为{1.0,0.5,1.1}等系数列表pattern_step模拟等于模型的hydraulic time step
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
||||||
new_name = f'contaminant_Sim_{prj_name}'
|
new_name = f'contaminant_Sim_{name}'
|
||||||
|
|
||||||
if have_project(new_name):
|
if have_project(new_name):
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
if is_project_open(prj_name):
|
if is_project_open(name):
|
||||||
close_project(prj_name)
|
close_project(name)
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
||||||
CopyProjectEx()(prj_name, new_name,
|
CopyProjectEx()(name, new_name,
|
||||||
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
||||||
open_project(new_name)
|
open_project(new_name)
|
||||||
@@ -301,19 +354,19 @@ def contaminant_simulation(prj_name:str,date_time:str, source:str,concentration:
|
|||||||
secs=from_clock_to_seconds_2(hydraulic_step)
|
secs=from_clock_to_seconds_2(hydraulic_step)
|
||||||
operation_step=0
|
operation_step=0
|
||||||
#step 1. set duration
|
#step 1. set duration
|
||||||
if duration==None:
|
if modify_total_duration==None:
|
||||||
duration=secs
|
modify_total_duration =secs
|
||||||
#step 2. set pattern
|
#step 2. set pattern
|
||||||
if pattern!=None:
|
if source_pattern!=None:
|
||||||
pt=get_pattern(new_name,pattern)
|
pt=get_pattern(new_name,source_pattern)
|
||||||
if pt==None:
|
if pt==None:
|
||||||
str_response=str('cant find pattern')
|
str_response=str('cant find source_pattern')
|
||||||
return str_response
|
return str_response
|
||||||
else:
|
else:
|
||||||
cs_pattern=ChangeSet()
|
cs_pattern=ChangeSet()
|
||||||
pt={}
|
pt={}
|
||||||
factors=[]
|
factors=[]
|
||||||
tmp_duration=duration
|
tmp_duration= modify_total_duration
|
||||||
while tmp_duration>0:
|
while tmp_duration>0:
|
||||||
factors.append(1.0)
|
factors.append(1.0)
|
||||||
tmp_duration=tmp_duration-secs
|
tmp_duration=tmp_duration-secs
|
||||||
@@ -360,33 +413,42 @@ def contaminant_simulation(prj_name:str,date_time:str, source:str,concentration:
|
|||||||
operation_step+=1
|
operation_step+=1
|
||||||
|
|
||||||
#step 5. run simulation
|
#step 5. run simulation
|
||||||
result = run_simulation_ex(new_name,'realtime', date_time, date_time, duration,
|
# result = run_simulation_ex(new_name,'realtime', modify_pattern_start_time, modify_pattern_start_time, modify_total_duration,
|
||||||
downloading_prohibition=True)
|
# downloading_prohibition=True)
|
||||||
|
simulation.run_simulation(name=new_name, simulation_type='extended', modify_pattern_start_time=modify_pattern_start_time,
|
||||||
|
modify_total_duration=modify_total_duration, scheme_Type="contaminant_Analysis", scheme_Name=scheme_Name)
|
||||||
|
|
||||||
# for i in range(1,operation_step):
|
# for i in range(1,operation_step):
|
||||||
# execute_undo(prj_name)
|
# execute_undo(name)
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
return result
|
# return result
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# age analysis 05
|
# age analysis 05 ***水龄模拟目前还没和实时模拟打通,不确定是否需要,先不要使用***
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
|
|
||||||
def age_analysis(prj_name, start_time, end_time, duration) -> str:
|
def age_analysis(name: str, modify_pattern_start_time: str, modify_total_duration: int = 900) -> None:
|
||||||
|
"""
|
||||||
|
水龄模拟
|
||||||
|
:param name: 模型名称,数据库中对应的名字
|
||||||
|
:param modify_pattern_start_time: 模拟开始时间,格式为'2024-11-25T09:00:00+08:00'
|
||||||
|
:param modify_total_duration: 模拟总历时,秒
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
||||||
new_name = f'age_Anal_{prj_name}'
|
new_name = f'age_Anal_{name}'
|
||||||
|
|
||||||
if have_project(new_name):
|
if have_project(new_name):
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
if is_project_open(prj_name):
|
if is_project_open(name):
|
||||||
close_project(prj_name)
|
close_project(name)
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
||||||
CopyProjectEx()(prj_name, new_name,
|
CopyProjectEx()(name, new_name,
|
||||||
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
||||||
open_project(new_name)
|
open_project(new_name)
|
||||||
@@ -394,11 +456,11 @@ def age_analysis(prj_name, start_time, end_time, duration) -> str:
|
|||||||
|
|
||||||
# step 1. run simulation
|
# step 1. run simulation
|
||||||
|
|
||||||
result = run_simulation_ex(new_name, 'realtime', start_time, end_time, duration,
|
result = run_simulation_ex(new_name, 'realtime', modify_pattern_start_time, modify_total_duration,
|
||||||
downloading_prohibition=True)
|
downloading_prohibition=True)
|
||||||
|
|
||||||
# step 2. restore the base model status
|
# step 2. restore the base model status
|
||||||
# execute_undo(prj_name) #有疑惑
|
# execute_undo(name) #有疑惑
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
@@ -430,18 +492,31 @@ def age_analysis(prj_name, start_time, end_time, duration) -> str:
|
|||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
|
|
||||||
def pressure_regulation(prj_name, start_datetime, pump_control, tank_initial_level_control=None) -> str:
|
def pressure_regulation(name: str, modify_pattern_start_time: str, modify_total_duration: int = 900,
|
||||||
|
modify_tank_initial_level: dict[str, float] = None, modify_fixed_pump_pattern: dict[str, list] = None,
|
||||||
|
modify_variable_pump_pattern: dict[str, list] = None, scheme_Name: str = None) -> None:
|
||||||
|
"""
|
||||||
|
区域调压模拟,用来模拟未来15分钟内,开关水泵对区域压力的影响
|
||||||
|
:param name: 模型名称,数据库中对应的名字
|
||||||
|
:param modify_pattern_start_time: 模拟开始时间,格式为'2024-11-25T09:00:00+08:00'
|
||||||
|
:param modify_total_duration: 模拟总历时,秒
|
||||||
|
:param modify_tank_initial_level: dict中包含多个水塔,str为水塔的id,float为修改后的initial_level
|
||||||
|
:param modify_fixed_pump_pattern: dict中包含多个水泵模式,str为工频水泵的id,list为修改后的pattern
|
||||||
|
:param modify_variable_pump_pattern: dict中包含多个水泵模式,str为变频水泵的id,list为修改后的pattern
|
||||||
|
:param scheme_Name: 模拟方案名称
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Analysis.")
|
||||||
new_name = f'pressure_regulation_{prj_name}'
|
new_name = f'pressure_regulation_{name}'
|
||||||
|
|
||||||
if have_project(new_name):
|
if have_project(new_name):
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
if is_project_open(prj_name):
|
if is_project_open(name):
|
||||||
close_project(prj_name)
|
close_project(name)
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Copying Database.")
|
||||||
CopyProjectEx()(prj_name, new_name,
|
CopyProjectEx()(name, new_name,
|
||||||
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
['operation', 'current_operation', 'restore_operation', 'batch_operation', 'operation_table'])
|
||||||
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
print(datetime.now(pytz.timezone('Asia/Shanghai')).strftime("%Y-%m-%d %H:%M:%S") + " -- Start Opening Database.")
|
||||||
open_project(new_name)
|
open_project(new_name)
|
||||||
@@ -455,23 +530,28 @@ def pressure_regulation(prj_name, start_datetime, pump_control, tank_initial_lev
|
|||||||
cs_options.append(options)
|
cs_options.append(options)
|
||||||
set_option(new_name, cs_options)
|
set_option(new_name, cs_options)
|
||||||
|
|
||||||
result = run_simulation_ex(name=new_name,
|
# result = run_simulation_ex(name=new_name,
|
||||||
simulation_type='realtime',
|
# simulation_type='realtime',
|
||||||
start_datetime=start_datetime,
|
# start_datetime=start_datetime,
|
||||||
duration=900,
|
# duration=900,
|
||||||
pump_control=pump_control,
|
# pump_control=pump_control,
|
||||||
tank_initial_level_control=tank_initial_level_control,
|
# tank_initial_level_control=tank_initial_level_control,
|
||||||
downloading_prohibition=True)
|
# downloading_prohibition=True)
|
||||||
|
simulation.run_simulation(name=new_name, simulation_type='extended', modify_pattern_start_time=modify_pattern_start_time,
|
||||||
|
modify_total_duration=modify_total_duration, modify_tank_initial_level=modify_tank_initial_level,
|
||||||
|
modify_fixed_pump_pattern=modify_fixed_pump_pattern, modify_variable_pump_pattern=modify_variable_pump_pattern,
|
||||||
|
scheme_Type="pressure_regulation", scheme_Name=scheme_Name)
|
||||||
|
|
||||||
|
|
||||||
if is_project_open(new_name):
|
if is_project_open(new_name):
|
||||||
close_project(new_name)
|
close_project(new_name)
|
||||||
delete_project(new_name)
|
delete_project(new_name)
|
||||||
|
|
||||||
return result
|
# return result
|
||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# project management 07
|
# project management 07 ***暂时不使用,与业务需求无关***
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
|
|
||||||
@@ -510,7 +590,7 @@ def project_management(prj_name, start_datetime, pump_control,
|
|||||||
|
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# scheduling analysis 08
|
# scheduling analysis 08 ***暂时不使用,与业务需求无关***
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
|
|
||||||
@@ -633,6 +713,11 @@ def daily_scheduling_simulation(prj_name, start_time, pump_control,
|
|||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
def network_update(file_path: str) -> None:
|
def network_update(file_path: str) -> None:
|
||||||
|
"""
|
||||||
|
更新pg数据库中的inp文件
|
||||||
|
:param file_path: inp文件
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
read_inp('bb', file_path)
|
read_inp('bb', file_path)
|
||||||
|
|
||||||
csv_path = './history_pattern_flow.csv'
|
csv_path = './history_pattern_flow.csv'
|
||||||
@@ -783,5 +868,9 @@ if __name__ == '__main__':
|
|||||||
# str_dump=dump_output('h:\\OneDrive\\tjwaterserver\\temp\\beibeizone.db_busrtID(ZBBGXSZW000001).out')
|
# str_dump=dump_output('h:\\OneDrive\\tjwaterserver\\temp\\beibeizone.db_busrtID(ZBBGXSZW000001).out')
|
||||||
# with open("burst_out_dump.txt", "w") as f:
|
# with open("burst_out_dump.txt", "w") as f:
|
||||||
# f.write(str_dump)
|
# f.write(str_dump)
|
||||||
# network_update('model22_1223.inp')
|
# # network_update('model22_1223.inp')
|
||||||
submit_scada_info('bb', '4490')
|
# submit_scada_info('bb', '4490')
|
||||||
|
# 示例1:burst_analysis
|
||||||
|
burst_analysis(name='bb', modify_pattern_start_time='2025-02-14T10:30:00+08:00',
|
||||||
|
burst_ID='ZBBGXSZW000002', burst_size=50, modify_total_duration=1800, scheme_Name='burst_scheme')
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user