Update simulation.py
This commit is contained in:
356
simulation.py
356
simulation.py
@@ -1,7 +1,7 @@
|
||||
import numpy as np
|
||||
from tjnetwork import *
|
||||
from api.s36_wda_cal import *
|
||||
# from get_real_status import *
|
||||
from get_real_status import *
|
||||
from datetime import datetime,timedelta
|
||||
from math import modf
|
||||
import json
|
||||
@@ -17,135 +17,6 @@ import psycopg
|
||||
import logging
|
||||
import globals
|
||||
|
||||
# 数据接口
|
||||
# url_path = 'http://10.101.15.16:9000/loong' # 内网
|
||||
# url_path = 'http://183.64.62.100:9057/loong' # 外网
|
||||
# url_real = url_path + '/api/mpoints/realValue'
|
||||
# url_hist = url_path + '/api/curves/data'
|
||||
|
||||
# # 实时数据的设备编号
|
||||
# DN_900_ID='2498'
|
||||
# DN_500_ID='3854'
|
||||
# DN_1000_ID='3853'
|
||||
# H_RESSURE='2510'
|
||||
# L_PRESURE='2514'
|
||||
# H_TANK='4780'
|
||||
# L_TANK='4854'
|
||||
#
|
||||
# # inp文件数据信息
|
||||
PATTERN_TIME_STEP = 15.0
|
||||
|
||||
# regions
|
||||
# regions = ['hp', 'lp']
|
||||
# regions_demand_patterns = {'hp': ['DN900', 'DN500'], 'lp': ['DN1000']} # 出厂水量近似表示用水量
|
||||
# # regions_patterns = {'hp': ['ChuanYiJiXiao', 'BeiQuanHuaYuan', 'ZhuangYuanFuDi', 'JingNingJiaYuan',
|
||||
# # '308', 'JiaYinYuan', 'XinChengGuoJi', 'YiJingBeiChen', 'ZhongYangXinDu',
|
||||
# # 'XinHaiJiaYuan', 'DongFengJie', 'DingYaXinYu', 'ZiYunTai', 'XieMaGuangChang',
|
||||
# # 'YongJinFu', 'BianDianZhan', 'BeiNanDaDao', 'TianShengLiJie', 'XueYuanXiaoQu',
|
||||
# # 'YunHuaLu', 'GaoJiaQiao', 'LuZuoFuLuXiaDuan', 'TianRunCheng', 'CaoJiaBa',
|
||||
# # 'PuLingChang', 'QiLongXiaoQu', 'TuanXiao',
|
||||
# # 'TuanShanBaoZhongShiHua', 'XieMa', 'BeiWenQuanJiuHaoErQi', 'LaiYinHuSiQi',
|
||||
# # 'DN500', 'DN900'],
|
||||
# # 'lp': ['PanXiMingDu', 'WanKeJinYuHuaFuGaoCeng', 'KeJiXiao',
|
||||
# # 'LuGouQiao', 'LongJiangHuaYuan', 'LaoQiZhongDui', 'ShiYanCun', 'TianQiDaSha',
|
||||
# # 'TianShengPaiChuSuo', 'TianShengShangPin', 'JiaoTang', 'RenMinHuaYuan',
|
||||
# # 'TaiJiBinJiangYiQi', 'TianQiHuaYuan', 'TaiJiBinJiangErQi', '122Zhong',
|
||||
# # 'WanKeJinYuHuaFuYangFang', 'ChengBeiCaiShiKou', 'WenXingShe', 'YueLiangTianBBGJCZ',
|
||||
# # 'YueLiangTian', 'YueLiangTian200', 'ChengTaoChang', 'HuoCheZhan', 'LiangKu', 'QunXingLu',
|
||||
# # 'JiuYuanErTongYiYuan', 'TangDouHua', 'TaiJiBinJiangErQi(SanJi)',
|
||||
# # 'ZhangDouHua', 'JinYunXiaoQuDN400',
|
||||
# # 'DN1000']}
|
||||
#
|
||||
# # nodes
|
||||
# monitor_single_patterns = ['ChuanYiJiXiao', 'BeiQuanHuaYuan', 'ZhuangYuanFuDi', 'JingNingJiaYuan',
|
||||
# '308', 'JiaYinYuan', 'XinChengGuoJi', 'YiJingBeiChen', 'ZhongYangXinDu',
|
||||
# 'XinHaiJiaYuan', 'DongFengJie', 'DingYaXinYu', 'ZiYunTai', 'XieMaGuangChang',
|
||||
# 'YongJinFu', 'PanXiMingDu', 'WanKeJinYuHuaFuGaoCeng', 'KeJiXiao',
|
||||
# 'LuGouQiao', 'LongJiangHuaYuan', 'LaoQiZhongDui', 'ShiYanCun', 'TianQiDaSha',
|
||||
# 'TianShengPaiChuSuo', 'TianShengShangPin', 'JiaoTang', 'RenMinHuaYuan',
|
||||
# 'TaiJiBinJiangYiQi', 'TianQiHuaYuan', 'TaiJiBinJiangErQi', '122Zhong',
|
||||
# 'WanKeJinYuHuaFuYangFang']
|
||||
# monitor_single_patterns_id = {'ChuanYiJiXiao': '7338', 'BeiQuanHuaYuan': '7315', 'ZhuangYuanFuDi': '7316',
|
||||
# 'JingNingJiaYuan': '7528', '308': '8272', 'JiaYinYuan': '7304',
|
||||
# 'XinChengGuoJi': '7325', 'YiJingBeiChen': '7328', 'ZhongYangXinDu': '7329',
|
||||
# 'XinHaiJiaYuan': '9138', 'DongFengJie': '7302', 'DingYaXinYu': '7331',
|
||||
# 'ZiYunTai': '7420,9059', 'XieMaGuangChang': '7326', 'YongJinFu': '9059',
|
||||
# 'PanXiMingDu': '7320', 'WanKeJinYuHuaFuGaoCeng': '7419',
|
||||
# 'KeJiXiao': '7305', 'LuGouQiao': '7306', 'LongJiangHuaYuan': '7318',
|
||||
# 'LaoQiZhongDui': '9075', 'ShiYanCun': '7309', 'TianQiDaSha': '7323',
|
||||
# 'TianShengPaiChuSuo': '7335', 'TianShengShangPin': '7324', 'JiaoTang': '7332',
|
||||
# 'RenMinHuaYuan': '7322', 'TaiJiBinJiangYiQi': '7333', 'TianQiHuaYuan': '8235',
|
||||
# 'TaiJiBinJiangErQi': '7334', '122Zhong': '7314', 'WanKeJinYuHuaFuYangFang': '7418'}
|
||||
#
|
||||
# monitor_unity_patterns = ['BianDianZhan', 'BeiNanDaDao', 'TianShengLiJie', 'XueYuanXiaoQu',
|
||||
# 'YunHuaLu', 'GaoJiaQiao', 'LuZuoFuLuXiaDuan', 'TianRunCheng',
|
||||
# 'CaoJiaBa', 'PuLingChang', 'QiLongXiaoQu', 'TuanXiao',
|
||||
# 'ChengBeiCaiShiKou', 'WenXingShe', 'YueLiangTianBBGJCZ',
|
||||
# 'YueLiangTian', 'YueLiangTian200',
|
||||
# 'ChengTaoChang', 'HuoCheZhan', 'LiangKu', 'QunXingLu',
|
||||
# 'TuanShanBaoZhongShiHua', 'XieMa', 'BeiWenQuanJiuHaoErQi', 'LaiYinHuSiQi',
|
||||
# 'JiuYuanErTongYiYuan', 'TangDouHua', 'TaiJiBinJiangErQi(SanJi)',
|
||||
# 'ZhangDouHua', '',
|
||||
# 'DN500', 'DN900', 'DN1000']
|
||||
# monitor_unity_patterns_id = {'BianDianZhan': '7339', 'BeiNanDaDao': '7319', 'TianShengLiJie': '8242',
|
||||
# 'XueYuanXiaoQu': '7327', 'YunHuaLu': '7312', 'GaoJiaQiao': '7340',
|
||||
# 'LuZuoFuLuXiaDuan': '7343', 'TianRunCheng': '7310', 'CaoJiaBa': '7300',
|
||||
# 'PuLingChang': '7307', 'QiLongXiaoQu': '7321', 'TuanXiao': '8963',
|
||||
# 'ChengBeiCaiShiKou': '7330', 'WenXingShe': '7311',
|
||||
# 'YueLiangTianBBGJCZ': '7313', 'YueLiangTian': '7313', 'YueLiangTian200': '7313',
|
||||
# 'ChengTaoChang': '7301', 'HuoCheZhan': '7303',
|
||||
# 'LiangKu': '7296', 'QunXingLu': '7308',
|
||||
# 'DN500': '3854', 'DN900': '2498', 'DN1000': '3853'}
|
||||
# monitor_patterns = monitor_single_patterns + monitor_unity_patterns
|
||||
# monitor_patterns_id = {**monitor_single_patterns_id, **monitor_unity_patterns_id}
|
||||
|
||||
# flow
|
||||
# hp_flow_pattern_id = {'DN900': '2498', 'DN500': '3854'}
|
||||
# lp_flow_pattern_id = {'DN1000': '3853'}
|
||||
#
|
||||
# # pumps
|
||||
# pump_pattern_ids = ['1#', '2#', '3#', '4#', '5#', '6#', '7#']
|
||||
# pumps = ['PU00000', 'PU00001', 'PU00002', 'PU00003', 'PU00004', 'PU00005', 'PU00006']
|
||||
# variable_frequency_pumps = ['PU00004', 'PU00005', 'PU00006']
|
||||
# fixed_pumps_id = {'PU00000': '2747', 'PU00001': '2776', 'PU00002': '2730', 'PU00003': '2787'}
|
||||
# variable_pumps_id = {'PU00004': '2500', 'PU00005': '2502', 'PU00006': '2504'}
|
||||
#
|
||||
# # reservoirs
|
||||
# # reservoirs = ['ZBBDJSCP000002', 'R00003']
|
||||
# # reservoirs_id = {'ZBBDJSCP000002': '2497', 'R00003': '2571'}
|
||||
# # tanks
|
||||
# tanks = ['ZBBDTJSC000002', 'ZBBDTJSC000001']
|
||||
# tanks_id = {'ZBBDTJSC000002': '4780', 'ZBBDTJSC000001': '9774'}
|
||||
#
|
||||
# # 用于更改数据的SCADA设的ID
|
||||
# change_data_device_ids = ['2498', '3854', '3853', '2497', '2571', '4780', '9774',
|
||||
# '2747', '2776', '2730', '2787', '2500', '2502', '2504']
|
||||
|
||||
# # 实时数据类:element_id和api_query_id对应
|
||||
# reservoirs_id = {}
|
||||
# tanks_id = {}
|
||||
# fixed_pumps_id ={}
|
||||
# variable_pumps_id = {}
|
||||
# pressure_id = {}
|
||||
# demand_id = {}
|
||||
# quality_id = {}
|
||||
#
|
||||
# # 实时数据类:pattern_id和api_query_id对应
|
||||
# source_outflow_pattern_id = {}
|
||||
# realtime_pipe_flow_pattern_id = {}
|
||||
# pipe_flow_region_patterns = {} # 根据realtime的pipe_flow,对non_realtime的demand进行分区
|
||||
#
|
||||
# # 分区查询
|
||||
# source_outflow_region = {} # 以绑定的管段作为value
|
||||
# source_outflow_region_id = {} # 以api_query_id作为value
|
||||
# source_outflow_region_patterns = {} # 以associated_pattern作为value
|
||||
# # 非实时数据的pattern
|
||||
# non_realtime_region_patterns = {} # 基于source_outflow_region进行区分
|
||||
#
|
||||
# realtime_region_pipe_flow_and_demand_id = {} # 基于source_outflow_region搜索该分区中的实时pipe_flow和demand的api_query_id,后续用region的流量 - 实时流量计的流量
|
||||
# realtime_region_pipe_flow_and_demand_patterns = {} # 基于source_outflow_region搜索该分区中的实时pipe_flow和demand的associated_pattern,后续用region的流量 - 实时流量计的流量
|
||||
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
|
||||
@@ -497,6 +368,46 @@ def query_pipe_flow_region_patterns(name: str, column_prefix: str = 'associated_
|
||||
|
||||
return globals.pipe_flow_region_patterns
|
||||
|
||||
|
||||
# 2025/02/15
|
||||
def query_SCADA_ID_corresponding_info(name: str, SCADA_ID: str) -> dict:
|
||||
"""
|
||||
在地图上拾取SCADA元素后,获取SCADA_ID,在pg数据库中查询该SCADA设备对应的associated_element_id和api_query_id
|
||||
:param name: pg数据库的名称
|
||||
:param SCADA_ID: SCADA设备的ID
|
||||
:return: 包含associated_element_id和api_query_id的字典
|
||||
"""
|
||||
conn_string = f"dbname={name} host=127.0.0.1"
|
||||
try:
|
||||
# 使用 psycopg.connect 创建连接
|
||||
with psycopg.connect(conn_string) as conn:
|
||||
with conn.cursor() as cur:
|
||||
# 执行查询
|
||||
query = """
|
||||
SELECT associated_element_id, API_query_id
|
||||
FROM scada_info
|
||||
WHERE id = %s
|
||||
"""
|
||||
cur.execute(query, (SCADA_ID,)) # 执行查询并传递参数
|
||||
|
||||
# 获取查询结果
|
||||
result = cur.fetchone()
|
||||
|
||||
if result:
|
||||
# 将结果转换为字典
|
||||
associated_info = {
|
||||
'associated_element_id': result[0],
|
||||
'API_query_id': result[1]
|
||||
}
|
||||
return associated_info
|
||||
else:
|
||||
# 如果没有找到记录
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"An error occurred: {e}")
|
||||
return None
|
||||
|
||||
|
||||
# 2025/01/11
|
||||
def get_source_outflow_region_id(name: str, source_outflow_region: dict,
|
||||
column_prefix: str = 'associated_source_outflow_id') -> dict:
|
||||
@@ -626,7 +537,7 @@ def get_pattern_index(cur_datetime: str) -> int:
|
||||
dt = datetime.strptime(cur_datetime, str_format)
|
||||
hr = dt.hour
|
||||
mnt = dt.minute
|
||||
i = int((hr * 60 + mnt) / PATTERN_TIME_STEP)
|
||||
i = int((hr * 60 + mnt) / globals.PATTERN_TIME_STEP)
|
||||
return i
|
||||
|
||||
|
||||
@@ -637,7 +548,7 @@ def get_pattern_index_str(current_time: str) -> str:
|
||||
:return: str, 以“HH:MM:00”格式返回
|
||||
"""
|
||||
i = get_pattern_index(current_time)
|
||||
[minN, hrN] = modf(i * PATTERN_TIME_STEP / 60)
|
||||
[minN, hrN] = modf(i * globals.PATTERN_TIME_STEP / 60)
|
||||
minN_str = str(int(minN * 60))
|
||||
minN_str = minN_str.zfill(2)
|
||||
hrN_str = str(int(hrN))
|
||||
@@ -686,18 +597,23 @@ def get_history_pattern_info(project_name, pattern_name):
|
||||
def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: str, modify_total_duration: int = 0,
|
||||
modify_reservoir_head_pattern: dict[str, list] = None, modify_tank_initial_level: dict[str, float] = None,
|
||||
modify_junction_base_demand: dict[str, float] = None, modify_junction_damand_pattern: dict[str, list] = None,
|
||||
modify_pump_pattern: dict[str, list] = None):
|
||||
modify_fixed_pump_pattern: dict[str, list] = None, modify_variable_pump_pattern: dict[str, list] = None,
|
||||
modify_valve_opening: dict[str, float] = None, scheme_Type: str = None, scheme_Name: str = None) -> None:
|
||||
"""
|
||||
传入需要修改的参数,改变数据库中对应位置的值,然后计算,返回结果
|
||||
:param name: 模型名称,数据库中对应的名字
|
||||
:param simulation_type: 模拟的类型,realtime为实时模拟,修改原数据库;extended为多步长模拟,需要复制数据库
|
||||
:param modify_pattern_start_time: 模拟开始时间,格式为'2024-11-25T09:00:00+08:00'
|
||||
:param modify_total_duration: 模拟总历时
|
||||
:param modify_total_duration: 模拟总历时,秒
|
||||
:param modify_reservoir_head_pattern: dict中包含多个水库模式,str为水库head_pattern的id,list为修改后的head_pattern
|
||||
:param modify_tank_initial_level: dict中包含多个水塔,str为水塔的id,float为修改后的initial_level
|
||||
:param modify_junction_base_demand: dict中包含多个节点,str为节点的id,float为修改后的base_demand
|
||||
:param modify_junction_damand_pattern: dict中包含多个节点模式,str为节点demand_pattern的id,list为修改后的demand_pattern
|
||||
:param modify_pump_pattern: dict中包含多个水泵模式,str为水泵pattern的id,list为修改后的pattern
|
||||
: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_Type: 模拟方案类型
|
||||
:param scheme_Name:模拟方案名称
|
||||
:return:
|
||||
"""
|
||||
# 记录开始时间
|
||||
@@ -709,19 +625,27 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
|
||||
if is_project_open(name):
|
||||
close_project(name)
|
||||
# 判断是实时模拟还是多步长模拟
|
||||
if simulation_type.upper() == 'REALTIME': # 实时模拟(修改原数据库)
|
||||
# if simulation_type.upper() == 'REALTIME': # 实时模拟(修改原数据库)
|
||||
# name_c = name
|
||||
# elif simulation_type.upper() == 'EXTENDED': # 扩展模拟(复制数据库)
|
||||
# name_c = '_'.join([name, 'c'])
|
||||
# if have_project(name_c):
|
||||
# if is_project_open(name_c):
|
||||
# close_project(name_c)
|
||||
# delete_project(name_c)
|
||||
# copy_project(name, name_c) # 备份项目
|
||||
# else:
|
||||
# raise Exception('Incorrect simulation type, choose in (realtime, extended)')
|
||||
name_c = name
|
||||
elif simulation_type.upper() == 'EXTENDED': # 扩展模拟(复制数据库)
|
||||
name_c = '_'.join([name, 'c'])
|
||||
if have_project(name_c):
|
||||
if is_project_open(name_c):
|
||||
close_project(name_c)
|
||||
delete_project(name_c)
|
||||
copy_project(name, name_c) # 备份项目
|
||||
else:
|
||||
raise Exception('Incorrect simulation type, choose in (realtime, extended)')
|
||||
# 打开数据库
|
||||
open_project(name_c)
|
||||
dic_time = get_time(name_c)
|
||||
# 获取水力模拟步长,如’0:15:00‘
|
||||
globals.hydraulic_timestep = dic_time['HYDRAULIC TIMESTEP']
|
||||
# 将时间字符串转换为 timedelta 对象
|
||||
time_obj = datetime.strptime(globals.hydraulic_timestep, '%H:%M:%S')
|
||||
# 转换为分钟浮点数
|
||||
globals.PATTERN_TIME_STEP = float(time_obj.hour * 60 + time_obj.minute + time_obj.second / 60)
|
||||
|
||||
# 对输入的时间参数进行处理
|
||||
pattern_start_time = convert_time_format(modify_pattern_start_time)
|
||||
@@ -746,10 +670,13 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
|
||||
dic_time = get_time(name_c)
|
||||
dic_time['PATTERN START'] = str_pattern_start
|
||||
dic_time['DURATION'] = from_seconds_to_clock(modify_total_duration)
|
||||
if simulation_type.upper() == 'REALTIME':
|
||||
dic_time['DURATION'] = 0
|
||||
cs = ChangeSet()
|
||||
cs.operations.append(dic_time)
|
||||
set_time(name_c, cs)
|
||||
|
||||
# 根据SCADA实时数据进行修改,如果没有对应的SCADA数据,如未来的时间点,则不改变pg数据库的数据
|
||||
if globals.reservoirs_id:
|
||||
# reservoirs_id = {'ZBBDJSCP000002': '2497', 'R00003': '2571'}
|
||||
# 1.获取reservoir的SCADA数据,形式如{'2497': '3.1231', '2571': '2.7387'}
|
||||
@@ -928,19 +855,24 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
|
||||
region_realtime_region_pipe_flow_and_demand_data_dict = influxdb_api.query_SCADA_data_by_device_ID_and_time(
|
||||
query_ids_list=temp_realtime_region_pipe_flow_and_demand_id, query_time=modify_pattern_start_time)
|
||||
|
||||
region_total_source_outflow = sum(float(value) for value in region_source_outflow_data_dict.values())
|
||||
# 2025/02/12 确保 region_source_outflow_data_dict 和
|
||||
# region_realtime_region_pipe_flow_and_demand_data_dict中的每个值都不是 None 且不为 0
|
||||
region_source_outflow_valid_values = [float(value) for value in region_source_outflow_data_dict.values() if value not in [None, 0]]
|
||||
valid_values = [float(value) for value in region_realtime_region_pipe_flow_and_demand_data_dict.values() if value not in [None, 0]]
|
||||
# 如果都非空,则执行 sum 操作
|
||||
if region_source_outflow_valid_values and valid_values:
|
||||
region_total_source_outflow = sum(region_source_outflow_valid_values)
|
||||
history_region_total_source_outflow = 0
|
||||
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)
|
||||
history_region_total_source_outflow += temp_history_source_outflow_list[modify_index]
|
||||
|
||||
region_total_realtime_region_pipe_flow_and_demand = sum(float(value) for value in region_realtime_region_pipe_flow_and_demand_data_dict.values())
|
||||
region_total_realtime_region_pipe_flow_and_demand = sum(valid_values)
|
||||
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:
|
||||
temp_history_pipe_flow_and_demand_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]
|
||||
|
||||
if (region_total_source_outflow - 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:
|
||||
pattern = get_pattern(name_c, non_realtime_region_pattern_name)
|
||||
@@ -949,6 +881,98 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
|
||||
cs.append(pattern)
|
||||
set_pattern(name_c, cs)
|
||||
|
||||
# 根据输入的参数进行数据修改,后面修改的可以覆盖前面的,用于EXTENDED类的方案模拟
|
||||
# 修改清水池(reservoir)液位的pattern
|
||||
if modify_reservoir_head_pattern:
|
||||
for reservoir_name in modify_reservoir_head_pattern.keys():
|
||||
# 这句代码的作用是判断modify_reservoir_head_pattern[reservoir_name][0]是否不是NaN。
|
||||
# 如果modify_reservoir_head_pattern[reservoir_name][0]不是NaN,则条件成立,代码块会执行
|
||||
if not np.isnan(modify_reservoir_head_pattern[reservoir_name][0]):
|
||||
# 给 list 中的所有元素加上 RESERVOIR_BASIC_HEIGHT
|
||||
modified_values = [value + globals.RESERVOIR_BASIC_HEIGHT for value in
|
||||
modify_reservoir_head_pattern[reservoir_name]]
|
||||
reservoir_pattern = get_pattern(name_c, get_reservoir(name_c, reservoir_name)['pattern'])
|
||||
reservoir_pattern['factors'][modify_index
|
||||
:modify_index + len(modified_values)] = modified_values
|
||||
cs = ChangeSet()
|
||||
cs.append(reservoir_pattern)
|
||||
set_pattern(name_c, cs)
|
||||
|
||||
# 修改调节池(tank)初始液位
|
||||
if modify_tank_initial_level:
|
||||
for tank_name in modify_tank_initial_level.keys():
|
||||
if (not np.isnan(modify_tank_initial_level[tank_name])) and (modify_tank_initial_level[tank_name] != 0):
|
||||
tank = get_tank(name_c, tank_name)
|
||||
tank['init_level'] = modify_tank_initial_level[tank_name]
|
||||
cs = ChangeSet()
|
||||
cs.append(tank)
|
||||
set_tank(name_c, cs)
|
||||
|
||||
# 修改节点(junction)基础水量(demand)
|
||||
if modify_junction_base_demand:
|
||||
for junction_name in modify_junction_base_demand.keys():
|
||||
if not np.isnan(modify_junction_base_demand[junction_name]):
|
||||
junction = get_demand(name_c, junction_name)
|
||||
junction['demand'] = modify_junction_base_demand[junction_name]
|
||||
cs = ChangeSet()
|
||||
cs.append(junction)
|
||||
set_demand(name_c, cs)
|
||||
|
||||
# 修改节点(junction)的水量模式(pattern)
|
||||
if modify_junction_damand_pattern:
|
||||
for pattern_name in modify_junction_damand_pattern.keys():
|
||||
if not np.isnan(modify_junction_damand_pattern[pattern_name][0]):
|
||||
junction_pattern = get_pattern(name_c, pattern_name)
|
||||
junction_pattern['factors'][modify_index
|
||||
:modify_index + len(modify_junction_damand_pattern[pattern_name])] \
|
||||
= modify_junction_damand_pattern[pattern_name]
|
||||
cs = ChangeSet()
|
||||
cs.append(junction_pattern)
|
||||
set_pattern(name_c, cs)
|
||||
|
||||
# 修改工频水泵(fixed_pump)的pattern
|
||||
if modify_fixed_pump_pattern:
|
||||
for pump_name in modify_fixed_pump_pattern.keys():
|
||||
if not np.isnan(modify_fixed_pump_pattern[pump_name][0]):
|
||||
pump_pattern = get_pattern(name_c, get_pump(name_c, pattern_name)['pattern'])
|
||||
pump_pattern['factors'][modify_index
|
||||
:modify_index + len(modify_fixed_pump_pattern)] \
|
||||
= modify_fixed_pump_pattern[pump_name]
|
||||
cs = ChangeSet()
|
||||
cs.append(pump_pattern)
|
||||
set_pattern(name_c, cs)
|
||||
|
||||
# 修改变频水泵(variable_pump)的pattern
|
||||
if modify_variable_pump_pattern:
|
||||
for pump_name in modify_variable_pump_pattern.keys():
|
||||
if not np.isnan(modify_variable_pump_pattern[pump_name][0]):
|
||||
# 给 list 中的所有元素除以 50Hz
|
||||
modified_values = [value / 50 for value in modify_variable_pump_pattern[pump_name]]
|
||||
pump_pattern = get_pattern(name_c, get_pump(name_c, pattern_name)['pattern'])
|
||||
pump_pattern['factors'][modify_index
|
||||
:modify_index + len(modified_values)] = modified_values
|
||||
cs = ChangeSet()
|
||||
cs.append(pump_pattern)
|
||||
set_pattern(name_c, cs)
|
||||
|
||||
# 修改阀门(valve)的状态setting和status
|
||||
if modify_valve_opening:
|
||||
for valve_name in modify_valve_opening.keys():
|
||||
if not np.isnan(modify_valve_opening[valve_name]):
|
||||
valve_status = get_status(name_c, valve_name)
|
||||
if modify_valve_opening[valve_name] == 0:
|
||||
valve_status['status'] = 'CLOSED'
|
||||
valve_status['setting'] = 0
|
||||
if modify_valve_opening[valve_name] < 1:
|
||||
valve_status['status'] = 'OPEN'
|
||||
valve_status['setting'] = 0.1036 * pow(modify_valve_opening[valve_name], -3.105)
|
||||
if modify_valve_opening[valve_name] == 1:
|
||||
valve_status['status'] = 'OPEN'
|
||||
valve_status['setting'] = 0
|
||||
cs = ChangeSet()
|
||||
cs.append(valve_status)
|
||||
set_status(name_c, cs)
|
||||
|
||||
# 根据高压出厂流量,更改高压用水模式
|
||||
# hp_flow_SCADA_data_dict = influxdb_api.query_SCADA_data_by_device_ID_and_time(
|
||||
# query_ids_list=list(hp_flow_pattern_id.values()), query_time=modify_pattern_start_time)
|
||||
@@ -996,12 +1020,8 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
|
||||
# cs = ChangeSet()
|
||||
# cs.append(pattern)
|
||||
# set_pattern(name_c, cs)
|
||||
|
||||
|
||||
# 运行并返回结果
|
||||
print(f'Before run_project')
|
||||
result = run_project(name_c)
|
||||
# print(f'Simulation result : ' + result)
|
||||
|
||||
time_cost_end = time.perf_counter()
|
||||
print('{} -- Hydraulic simulation finished, cost time: {:.2f} s.'.format(
|
||||
@@ -1010,21 +1030,19 @@ def run_simulation(name: str, simulation_type: str, modify_pattern_start_time: s
|
||||
|
||||
close_project(name_c)
|
||||
|
||||
time.sleep(5) # wait 5 seconds
|
||||
|
||||
tmp_file = './temp/simulation.result.out'
|
||||
shutil.copy(f'./temp/{name_c}.db.opt', tmp_file)
|
||||
output = Output(tmp_file)
|
||||
output = Output("./temp/{}.db.out".format(name_c))
|
||||
node_result = output.node_results()
|
||||
link_result = output.link_results()
|
||||
num_periods_result = output.times()['num_periods']
|
||||
|
||||
|
||||
# print(link_result[:3])
|
||||
# print(num_periods_result)
|
||||
# print(node_result)
|
||||
# 存储
|
||||
if simulation_type.upper() == 'REALTIME':
|
||||
influxdb_api.store_realtime_simulation_result_to_influxdb(node_result, link_result, modify_pattern_start_time)
|
||||
|
||||
|
||||
|
||||
|
||||
elif simulation_type.upper() == 'EXTENDED':
|
||||
influxdb_api.store_scheme_simulation_result_to_influxdb(node_result, link_result, modify_pattern_start_time,
|
||||
num_periods_result, scheme_Type, scheme_Name)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
@@ -1032,7 +1050,6 @@ if __name__ == "__main__":
|
||||
query_corresponding_element_id_and_query_id("bb")
|
||||
query_corresponding_pattern_id_and_query_id('bb')
|
||||
region_result = query_non_realtime_region('bb')
|
||||
print(region_result)
|
||||
|
||||
globals.source_outflow_region_id = get_source_outflow_region_id('bb', region_result)
|
||||
globals.realtime_region_pipe_flow_and_demand_id = query_realtime_region_pipe_flow_and_demand_id('bb', region_result)
|
||||
@@ -1059,7 +1076,16 @@ if __name__ == "__main__":
|
||||
# print("Realtime Region Pipe Flow And Demand ID:", globals.realtime_region_pipe_flow_and_demand_id)
|
||||
# print("Realtime Region Pipe Flow And Demand Patterns:", globals.realtime_region_pipe_flow_and_demand_patterns)
|
||||
|
||||
run_simulation(name='bb', simulation_type="realtime", modify_pattern_start_time='2025-02-08T10:30:00+08:00')
|
||||
# 模拟示例1
|
||||
# run_simulation(name='bb', simulation_type="realtime", modify_pattern_start_time='2025-02-14T10:30:00+08:00')
|
||||
# 模拟示例2
|
||||
# run_simulation(name='bb', simulation_type="extended", modify_pattern_start_time='2025-02-14T10:30:00+08:00', modify_total_duration=900,
|
||||
# scheme_Type="burst_Analysis", scheme_Name="scheme1")
|
||||
|
||||
# 查询示例1:query_SCADA_ID_corresponding_info
|
||||
# result = query_SCADA_ID_corresponding_info(name='bb', SCADA_ID='P10755')
|
||||
# print(result)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user