1 Star 0 Fork 4

limeng/供水管网运行安全评价

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
hydraulic.m 8.70 KB
一键复制 编辑 原始数据 按行查看 历史
jing-2020 提交于 2021-05-08 22:56 . 添加程序文件
function [score_hy,nodes_hydra1] = hydraulic( filename,filename_event,time,start_time,area,area_num,root )
%计算管网模型的水力可靠性
%% 函数说明:
% filename---进行水力可靠性计算的inp文件名;
% filename_event---事先定义事故的inp文件名;
% time---模拟周期,几个小时,例如:3(表示模拟3个小时);
% start_time---模拟的开始时间,整点,例如 9点;
% area---分区对应的编号;
% area_num---总的分区数目;
% root----存储分区结果的文件夹。
% score_hy---分区水力评价得分,形式为“时间段数*1”
% nodes_hydra1---分区节点水力评价得分,形式为“时间段数*节点数”
%% 第一节:数据准备
%% 第一部分:初始化模型
% 导入epanet动态链接库的搜索路径
addpath(genpath('en2toolkit'));
% 导入epanet的动态链接库
loadlibrary('epanet2.dll','epanet2.h');
% 打开模型
error=calllib('epanet2','ENopen',filename_event,'out','');
%% 第二部分:获取非水库的节点数
% nodenum是总节点数目,可以赋予任意值,可以赋予任意值
nodenum=0;
% 读取管网的节点总数
[error,nodenum]=calllib('epanet2','ENgetcount',0,nodenum);
% tanknum是水源节点数目,可以赋予任意值,但要获取水源节点数目必须初始化
tanknum=0;
% 读取管网的水库节点总数
[error,tanknum]=calllib('epanet2','ENgetcount',1,tanknum);
% 计算除去水库之后的节点总数
nodes=nodenum - tanknum;
%% 第三部分:获取事故时的节点的压力值
% 定义存储节点压力的序列,经过循环之后size为‘节点数*时间段数’
event_pressure=zeros(nodes,0);
% 设置模型的时间周期和开始时间
set_time( time,3600,3600,start_time );
% 定义存储时间和时间步长的参数
t=0;
tstep=1;
% 打开模型的水力计算模块
[error]=calllib('epanet2','ENopenH');
% 初始化模型的水力计算模块
[error]=calllib('epanet2','ENinitH',0);
% 读取固定时间周期和时间步长的节点压力值,存储为‘节点数*时间段数’形式
while tstep>0
% 运行一个时间步长的水力模块
[error,t]=calllib('epanet2','ENrunH',t);
% 定义存储节点一个时间步长压力值的变量
p=zeros(nodes,1);
% 循环读取每一个节点的压力值
for i=1:nodes
[error,p(i)]=calllib('epanet2','ENgetnodevalue',i,11,p(i));
end
% 将该步长内的结果添加到event_pressure之后
event_pressure=[event_pressure,p];
% 调到下一个时间步长
[error,tstep]=calllib('epanet2','ENnextH',tstep);
end
%% 第四部分:关闭系统,保存结果
% 关闭使用结束的水力计算模块
[error]=calllib('epanet2','ENcloseH');
[error]=calllib('epanet2','ENclose');
unloadlibrary('epanet2');
%% 第二节: 水力可靠性计算
%% 第一部分:获取管网水力可靠性计算的必要数据
%1.1 打开动态链接库
% 导入epanet动态链接库的搜索路径
addpath(genpath('en2toolkit'));
% 导入epanet的动态链接库
loadlibrary('epanet2.dll','epanet2.h');
% 打开模型
error=calllib('epanet2','ENopen',filename,'out','');
% 设置模型的时间周期和开始时间
set_time( time,3600,3600,start_time );
% 1.2 获取整个管网节点的压力值
% 定义存储节点压力的序列,经过循环之后size为‘节点数*时间段数’
nodes_pressure=zeros(nodes,0);
% 定义存储时间和时间步长的参数
t=0;
tstep=1;
% 打开模型的水力计算模块
[error]=calllib('epanet2','ENopenH');
% 初始化模型的水力计算模块
[error]=calllib('epanet2','ENinitH',0);
% 读取固定时间周期和时间步长的节点压力值,存储为‘节点数*时间段数’形式
while tstep>0
% 运行一个时间步长的水力模块
[error,t]=calllib('epanet2','ENrunH',t);
% 定义存储节点一个时间步长压力值的变量
p=zeros(nodes,1);
% 循环读取每一个节点的压力值
for i=1:nodes
[error,p(i)]=calllib('epanet2','ENgetnodevalue',i,11,p(i));
end
% 将该步长内的结果添加到nodes_pressure之后
nodes_pressure=[nodes_pressure,p];
% 调到下一个时间步长
[error,tstep]=calllib('epanet2','ENnextH',tstep);
end
% 关闭使用结束的水力计算模块
[error]=calllib('epanet2','ENcloseH');
% 1.3 获得整个管网的平均压力点
% 计算每个时间步长内的压力均值
ppp=mean(nodes_pressure,1);
% 定义一个形如nodes_pressure的变量
pp=zeros(size(nodes_pressure));
% 在pp中存储各节点压力与平均值的差值
for h=1:nodes
pp(h,:)=nodes_pressure(h,:)-ppp;
end
% 找到最接近管网平均压力的节点,将其作为管网的AZP点
[value,index]=min(abs(pp),[],1);
% 将找到的AZP点的压力值存储起来,用以管网水压分配均匀程度的计算
for h=1:min(size(nodes_pressure))
ppp(h)=nodes_pressure(index(h),h);
end
%% 第二部分:管网水力可靠性评价
% 2.1 定义计算水力可靠性的必要数据
% 获取分区节点的个数
area=get_area_set(area,area_num,root);
nodes_area=max(size(area));
% 定义存储分区节点压力的向量
pressure=zeros(1,nodes_area);
% 定义存储分区节点水量的向量
Q=zeros(1,nodes_area);
% 定义管网的最小服务水压
nodes_min_pressure=24*ones(1,nodes_area);
% 定义均衡管网水压可靠性、管网水压分配均匀程度、节点水量可靠性、供水保障率、剩余供水能力的权重
%-------------------------------------------
w=[0.2,0.24,0.19,0.16,0.21];
%-------------------------------------------
% 2.2 进行管网水力可靠性计算
% 定义存储时间和时间步长的参数
t=0;
tstep=1;
% 定义循环计数的变量
num=1;
% 定义存储计算得分的向量
score_hy=[]; %形式为“时间段数*1”
nodes_hydra1=[]; %形式为“时间段数*j节点数”
% 打开模型的水力计算模块
[error]=calllib('epanet2','ENopenH');
% 初始化水力计算模块
[error]=calllib('epanet2','ENinitH',0);
% 循环读取节点的压力和流量
while tstep>0
% 水力计算一个时间步长,之后存储的结果均为该时间段的结果
[error,t]=calllib('epanet2','ENrunH',t);
%定义一个时间步长的节点水压可靠性、管网水压分配均匀程度、节点水量可靠性、供水保障率、剩余供水能力的得分向量
scores=zeros(1,5);
scores(4)=4.5;
scores(5)=4.5;
% 2.2.1 节点水压可靠性计算
%第一步:获取每个节点的节点流量和压力:
for j=1:nodes_area
% 记录节点的index
node=area(j);
% 读取节点的压力和流量
[error,Q(j)]=calllib('epanet2','ENgetnodevalue',node,9,Q(j));
[error,pressure(j)]=calllib('epanet2','ENgetnodevalue',node,11,pressure(j));
end
% 计算该时间步长内的总流量
Q_all=sum(Q);
%第二步:计算节点水压可靠性得分:
% 计算每个节点的水压可靠性
for k=1:nodes_area
scores(1)=scores(1)+Q(k)*get_from_table(1,pressure(k)/nodes_min_pressure(k));
nodes_hydra1(k,num)=w(1)*get_from_table(1,pressure(k)/nodes_min_pressure(k));
end
% 采用归一化的方式得到分区的节点水压可靠性
scores(1)=scores(1)/Q_all;
% 2.2.2 管网水压分配均匀程度
%第一步:确定AZP(管网地区平均压力)点:
% 获取该时间段的AZP点的压力值
p=ppp(num);
%第二步:计算管网水压分配均匀程度得分
% 计算每个节点的分配均匀程度
for i=1:nodes_area
scores(2)=scores(2)+get_from_table(2,(pressure(i)-p)^2);
nodes_hydra1(i,num)=nodes_hydra1(i,num)+w(2)*get_from_table(2,(pressure(i)-p)^2);
end
% 采用归一化的方法得到管网水压分配均匀程度得分
scores(2)=scores(2)/nodes_area;
% 2.2.3 节点水量可靠性计算
% 获取该时间段的节点事故水压
pressure_event=event_pressure(:,num);
% 计算每个节点的水量可靠性得分
for m=1:nodes_area
% 记录节点的index
node=area(m);
if pressure_event(node)<=nodes_min_pressure(m)
scores(3)=scores(3)+Q(m)*get_from_table(3,0);
nodes_hydra1(m,num)=nodes_hydra1(m,num)+w(3)*get_from_table(3,0);
end
if pressure_event(node)>nodes_min_pressure(m) && pressure_event(node)<pressure(m)
scores(3)=scores(3)+Q(m)*get_from_table(3,sqrt((pressure_event(node)-nodes_min_pressure(m))/(pressure(m)-nodes_min_pressure(m))));
nodes_hydra1(m,num)=nodes_hydra1(m,num)+w(3)*get_from_table(3,sqrt((pressure_event(node)-nodes_min_pressure(m))/(pressure(m)-nodes_min_pressure(m))));
end
if pressure_event(node)>=pressure(m)
scores(3)=scores(3)+Q(m)*get_from_table(3,1);
nodes_hydra1(m,num)=nodes_hydra1(m,num)+w(3)*get_from_table(3,1);
end
end
% 归一化得到管网的水量可靠性得分
scores(3)=scores(3)/Q_all;
%管网水力可靠性评价得分
% 综合管网水压可靠性、管网水压分配均匀程度、节点水量可靠性得到综合评分
score=sum(w.*scores);
% 将该时间段的结果添加在变量score_hy里面
score_hy=[score_hy;score];
% 调到下一个时间段
[error,tstep]=calllib('epanet2','ENnextH',tstep);
% 计数加1
num=num+1;
end
nodes_hydra1=nodes_hydra1';
% 完成之后关闭模型的水力计算模块
[error]=calllib('epanet2','ENcloseH');
[error]=calllib('epanet2','ENclose');
unloadlibrary('epanet2');
end
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/tczhilian/Safety-WDN.git
git@gitee.com:tczhilian/Safety-WDN.git
tczhilian
Safety-WDN
供水管网运行安全评价
master

搜索帮助