using System.Data;
|
using System.Drawing;
|
using System.Text;
|
|
namespace Yw.EPAnet
|
{
|
/// <summary>
|
/// 管网路径分析拓展
|
/// </summary>
|
public static class NetworkPathAnalyseExtensions
|
{
|
|
|
public static List<ChartNode> GetChartNodeByPathLinks(this Network network, List<ILink> links)
|
{
|
|
|
|
double length = 0;
|
ChartNode nodeEnd = new ChartNode();
|
List<ChartNode> chartNodes = new List<ChartNode>();
|
for (int i = 0; i < links.Count; i++)
|
{
|
|
var link = links[i];
|
|
var node = link.Flow > 0 ? link.StartNode : link.EndNode;
|
|
|
var Cnode = new ChartNode()
|
{
|
Id = node.Id,
|
StartHead = node.Head,
|
|
EndHead = node.Head,
|
|
Elev = node.Elev
|
};
|
chartNodes.Add(Cnode);
|
|
|
var nodeEnd0 = link.Flow > 0 ? link.EndNode : link.StartNode;
|
nodeEnd.Id = nodeEnd0.Id;
|
nodeEnd.Head = nodeEnd.StartHead = nodeEnd.EndHead = nodeEnd0.Head;
|
nodeEnd.Elev = nodeEnd0.Elev;
|
|
if (link is Pipe p)
|
length += p.Length;
|
}
|
|
chartNodes.Add(nodeEnd);
|
|
for (int i=0;i<links.Count;i++)
|
{
|
|
var link = links[i];
|
|
Pipe p=link as Pipe;
|
|
if (p != null)
|
{
|
//根据p.diameter和p.flow计算流速
|
double velocity = p.Flow / (Math.PI * Math.Pow(p.Diameter / 2, 2));
|
//根据流速计算局部水头损失
|
double minorloss1 = p.StartNodeMinorlossCoff* Math.Pow(velocity, 2) / 2 / 9.81;
|
double minorloss2 = p.EndNodeMinorlossCoff * Math.Pow(velocity, 2) / 2 / 9.81;
|
|
|
if (i < links.Count - 1)
|
{
|
|
chartNodes[i].EndHead = chartNodes[i].Head - minorloss1;
|
|
chartNodes[i + 1].StartHead = chartNodes[i].EndHead - minorloss2;
|
|
|
}
|
else
|
{
|
chartNodes[i].EndHead = chartNodes[i].Head - minorloss1;
|
}
|
|
}
|
|
|
}
|
return chartNodes;
|
|
}
|
|
|
/// <summary>
|
/// 分析下游主要供水路径
|
/// </summary>
|
public static List<ILink> AnalyzeDownstreamPath(this Network network, Junction startJunc)
|
{
|
var visitedNodes = new HashSet<INode>();
|
var maxlink = startJunc.NextLinks.OrderByDescending(o => Math.Abs(o.Flow)).ToList()[0];
|
return network.TraversePipeNetworkALL(maxlink, visitedNodes, 1, true);
|
}
|
|
/// <summary>
|
/// 分析上游主要供水路径
|
/// </summary>
|
/// <param name="network"></param>
|
/// <param name="startJunc"></param>
|
/// <returns></returns>
|
public static List<ILink> AnalyzeUpstreamPath(this Network network, Junction startJunc)
|
{
|
var visitedNodes = new HashSet<INode>();
|
var maxlink = startJunc.NextLinks.OrderByDescending(o => Math.Abs(o.Flow)).ToList()[0];
|
return network.TraversePipeNetworkALL(maxlink, visitedNodes, -1, true);
|
}
|
/// <summary>
|
/// 宽度搜索遍历管网
|
/// </summary>
|
/// <param name="network"></param>
|
/// <param name="startLink">起始管线</param>
|
/// <param name="visitedNodes">遍历的哈希表(用于多点遍历)</param>
|
/// <param name="direction">遍历方向,0表示双向,1表示正向,-1表示反向</param>
|
/// <param name="isOnlyMax">是否只取最大流量的分支</param>
|
/// <returns></returns>
|
public static List<ILink> TraversePipeNetworkALL(this Network network,ILink startLink, HashSet<INode> visitedNodes = null, int direction = 0, bool isOnlyMax = false)
|
{
|
var _links主要路径=new List<ILink>();
|
if (isOnlyMax) _links主要路径.Add(startLink);
|
Queue<ILink> queue = new Queue<ILink>();
|
|
queue.Enqueue(startLink);
|
if (visitedNodes == null)
|
visitedNodes = new HashSet<INode>();
|
|
while (queue.Count > 0)
|
{
|
ILink currentLink = queue.Dequeue();
|
if (isOnlyMax) _links主要路径.Add(currentLink);
|
|
foreach (var node in new INode[] { currentLink.StartNode, currentLink.EndNode })
|
{
|
if (direction == 1 && currentLink.Flow >= 0 && node == currentLink.StartNode) continue;
|
if (direction == -1 && currentLink.Flow <= 0 && node == currentLink.EndNode) continue;
|
if (node != null && !visitedNodes.Contains(node))
|
{
|
visitedNodes.Add(node);
|
List<ILink> list = new List<ILink>();
|
|
foreach (var link in node.Links)
|
{
|
if (!visitedNodes.Contains(link.StartNode) || !visitedNodes.Contains(link.EndNode))
|
{
|
list.Add(link);
|
|
}
|
}
|
if (!isOnlyMax)
|
{
|
foreach (var link in list)
|
{
|
|
queue.Enqueue(link);
|
}
|
}
|
else
|
{
|
if (list.Count >= 1)
|
{
|
var maxlist = list.OrderByDescending(p => Math.Abs(p.Flow)).ToList()[0];
|
queue.Enqueue(maxlist);
|
}
|
|
}
|
}
|
}
|
|
}
|
return _links主要路径;
|
|
|
}
|
|
}
|
|
public class ChartNode
|
{
|
public string Id { get; set; }
|
|
/// <summary>
|
/// 起始水头
|
/// </summary>
|
public double StartHead { get; set; }
|
|
/// <summary>
|
/// 结束水头
|
/// </summary>
|
public double EndHead { get; set; }
|
|
/// <summary>
|
/// 高程
|
/// </summary>
|
public double Elev { get; set; }
|
|
/// <summary>
|
/// 水头
|
/// </summary>
|
public double Head { get; internal set; }
|
|
/// <summary>
|
/// 局部水头损失
|
/// </summary>
|
public double MinorHeadLoss
|
{
|
get
|
{
|
return StartHead - EndHead;
|
}
|
}
|
}
|
}
|