using System.Text;
|
|
namespace Yw.EPAnet
|
{
|
/// <summary>
|
/// 管网计算拓展
|
/// </summary>
|
public static class NetworkCalcuMinorExtensions
|
{
|
/// <summary>
|
/// 计算
|
/// </summary>
|
public static CalcuResult CalcuMinorLoss(this Network network)
|
{
|
var minorResult = new CalcuResult();
|
|
|
//Null验证
|
if (network == null)
|
{
|
minorResult.Succeed = false;
|
return minorResult;
|
}
|
|
using (var calcResult = network.Calcu(false))
|
{
|
network.GetAllLinks().ForEach(link =>
|
{
|
if (calcResult.LinkDict.ContainsKey(link.Id))
|
{
|
var resultLink = calcResult.LinkDict[link.Id];
|
link.Flow = resultLink.Flow;
|
}
|
});
|
}
|
|
|
|
|
network.GetAllNodes().ForEach(n =>
|
{
|
if (n is JunctionWT wt)
|
{
|
if (wt.PrevLinks.Count != 1 || wt.NextLinks.Count != 1) return;
|
var preLink = minorResult.GetLink(wt.PrevLinks[0].Id);
|
var nextLink = minorResult.GetLink(wt.NextLinks[0].Id);
|
preLink.MinorlossCoff += wt.MinorLoss_WT / 2;
|
nextLink.MinorlossCoff += wt.MinorLoss_WT / 2;
|
}
|
else if (n is Junction3T j3t)
|
{
|
if (j3t.PrevLinks.Count + j3t.NextLinks.Count != 3 || j3t.PrevLinks.Count==0 || j3t.NextLinks.Count==0) return;
|
List<ILink> branchlinks = new List<ILink>();
|
ILink mainlink = null;
|
if (j3t.PrevLinks.Count==1)//一进,二出
|
{
|
mainlink = j3t.PrevLinks[0];
|
branchlinks= j3t.NextLinks;
|
}
|
else if(j3t.NextLinks.Count == 1)//一出,N进
|
{
|
mainlink = j3t.NextLinks[0];
|
branchlinks = j3t.PrevLinks;
|
}
|
if (branchlinks.Count==2)
|
{
|
var pipe0 = mainlink as Pipe;
|
var pipe1 = branchlinks[0] as Pipe;
|
var pipe2 = branchlinks[1] as Pipe;
|
string Id1 = pipe1.Diameter == pipe0.Diameter ? pipe1.Id : pipe2.Id;
|
string Id2 = pipe1.Diameter == pipe0.Diameter ? pipe2.Id : pipe1.Id;
|
var preLink = minorResult.GetLink(mainlink.Id);
|
var nextLink1 = minorResult.GetLink(Id1);
|
var nextLink2 = minorResult.GetLink(Id2);
|
nextLink1.MinorlossCoff += j3t.MinorLoss_StraightThrough;
|
nextLink2.MinorlossCoff += j3t.MinorLoss_BranchThrough;
|
}
|
else if (branchlinks.Count==1)
|
{
|
var pipe0 = mainlink as Pipe;
|
var pipe1 = branchlinks[0] as Pipe;
|
string Id1 = pipe1.Id;
|
var preLink = minorResult.GetLink(mainlink.Id);
|
var nextLink1 = minorResult.GetLink(Id1);
|
nextLink1.MinorlossCoff += pipe1.Diameter == pipe0.Diameter? j3t.MinorLoss_StraightThrough: j3t.MinorLoss_BranchThrough;
|
}
|
|
}
|
else if (n is Junction4T j4t)
|
{
|
if (j4t.PrevLinks.Count + j4t.NextLinks.Count != 4 ) return;
|
List<ILink> branchlinks = new List<ILink>();
|
|
if (j4t.PrevLinks.Count == 1)//一进,二出
|
{
|
|
branchlinks = j4t.NextLinks;
|
}
|
else if (j4t.NextLinks.Count == 1)//一出,N进
|
{
|
|
branchlinks = j4t.PrevLinks;
|
}
|
else if (j4t.NextLinks.Count==2)
|
{
|
branchlinks = j4t.NextLinks;
|
}
|
branchlinks.ForEach(link =>
|
{
|
var pipe = link as Pipe;
|
var preLink = minorResult.GetLink(link.Id);
|
preLink.MinorlossCoff += j4t.MinorLoss_Crossing;
|
});
|
}
|
});
|
|
|
|
return minorResult;
|
}
|
|
public static Link GetLink(this CalcuResult result, string linkId)
|
{
|
if (!result.LinkDict.ContainsKey(linkId))
|
{
|
result.LinkDict.Add(linkId, new Link() { MinorlossCoff=0});
|
|
|
}
|
return result.LinkDict[linkId] as Link;
|
}
|
}
|
}
|