lixiaojun
2025-01-07 59a54652c0ca8d064ead157802d21e06b0ea34e6
Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs
@@ -35,13 +35,8 @@
            /// <summary>
            /// 局部水头损失
            /// </summary>
            public double MinorHeadLoss
            {
                get
                {
                    return StartHead - EndHead;
                }
            }
            public double MinorHeadLoss { get; set; } = 0;
            public double Distance { get; set; }
        }
@@ -69,6 +64,7 @@
                {
                    Id = node.Id,
                    StartHead = dictNodes[node.Id].Head,
                    Head = dictNodes[node.Id].Head,
                    EndHead = dictNodes[node.Id].Head,
                    Elev = elev,
                    Distance = length
@@ -85,7 +81,7 @@
                    length += p.Length;
            }
            nodeEnd.Distance = length;
            chartNodes.Add(nodeEnd);
            for (int i=0;i<links.Count;i++)
@@ -100,22 +96,24 @@
                    //根据p.diameter和p.flow计算流速
                    double velocity = dictLinks[ p.Id].Flow/ (Math.PI * Math.Pow(p.Diameter / 2, 2));
                    //根据流速计算局部水头损失
                    double minorloss1 = p.StartMinorloss* Math.Pow(velocity, 2) / 2 / 9.81;
                    double minorloss2 = p.EndMinorloss * Math.Pow(velocity, 2) / 2 / 9.81;
                    double minorloss1 = dictLinks[p.Id].StartMinorLoss;
                    double minorloss2 = dictLinks[p.Id].EndMinorLoss;
                    if (i < links.Count - 1)
                    {
                        chartNodes[i].EndHead = chartNodes[i].Head - minorloss1;
                        chartNodes[i].MinorHeadLoss += minorloss1;
                        chartNodes[i + 1].StartHead = chartNodes[i+1].Head + minorloss2;
                        chartNodes[i + 1].MinorHeadLoss += minorloss2;
                        chartNodes[i + 1].StartHead = chartNodes[i].EndHead - minorloss2;
                    }
                    else
                    {
                        chartNodes[i].EndHead = chartNodes[i].Head - minorloss1;
                        chartNodes[i].MinorHeadLoss += minorloss1;
                    }
                    
                }
@@ -168,11 +166,12 @@
            var dictLinks = calcuResult.LinkList.ToDictionary(p => p.Id);
            var dictNodes = calcuResult.NodeList.ToDictionary(p => p.Id);
            var visitedNodes = new HashSet<Node>();
            visitedNodes.Add(startJunc);
            var nextLinks = startJunc.GetNextLinks(calcuResult.LinkList);
            if (nextLinks.Count <= 0) return nextLinks;
            if (nextLinks==null || nextLinks.Count <= 0) return nextLinks;
            var maxlink = nextLinks.OrderByDescending(o => Math.Abs(dictLinks[o.Id].Flow)).ToList()[0];
            return  network.TraversePipeNetworkALL(maxlink, visitedNodes, 1, true);
            var maxlink =  nextLinks.OrderByDescending(o => Math.Abs(dictLinks[o.Id].Flow)).ToList()[0];
            return  network.TraversePipeNetworkALL(maxlink, visitedNodes, 1, true, calcuResult);
        }
        
        /// <summary>
@@ -198,7 +197,7 @@
        /// <param name="direction">遍历方向,0表示双向,1表示正向,-1表示反向</param>
        /// <param name="isOnlyMax">是否只取最大流量的分支</param>
        /// <returns></returns>
        public static List<Link> TraversePipeNetworkALL(this Network network, Link startLink, HashSet<Node> visitedNodes = null, int direction = 0, bool isOnlyMax = false,CalcuResult calcuResult=null)
        public static List<Link> TraversePipeNetworkALL(this Network network, Link startLink, HashSet<Node> visitedNodes, int direction = 0, bool isOnlyMax = false,CalcuResult calcuResult=null)
        {
            var dictLinks = calcuResult.LinkList.ToDictionary(p => p.Id);
            var dictNodes = calcuResult.NodeList.ToDictionary(p => p.Id);
@@ -207,8 +206,7 @@
            Queue<Link> queue = new Queue<Link>();
            queue.Enqueue(startLink);
            if (visitedNodes == null)
                visitedNodes = new HashSet<Node>();
            while (queue.Count > 0)
            {