using System.Text;
namespace Yw.EPAnet
{
///
/// 管网计算拓展
///
public static class NetworkCalcuExtensions
{
///
/// 计算
///
public static CalcuResult Calcu(this Network network)
{
var result = new CalcuResult();
//Null验证
if (network == null)
{
result.Succeed = false;
return result;
}
//获取系统临时文件目录,创建inp临时文件
var inpFilePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N") + ".inp");
var inpString = network.ToInpString();
File.WriteAllText(inpFilePath, inpString);
//加载管网
var epanet = new HydraulicCore(true);
var errOpen = epanet.open(inpFilePath, "", "");
if (errOpen != 0)
{
string txt = epanet.geterrormsg();
result.Succeed = false;
result.FailedList.Add(new CalcuFailed()
{
Code = errOpen,
Message = $"{txt}"
});
return result;
}
//水力计算
var errCalcu = epanet.solveH();
if (errCalcu != 0)
{
string txt = epanet.geterrormsg();
result.Succeed = false;
result.FailedList.Add(new CalcuFailed()
{
Code = errCalcu,
Message = $"{txt}"
});
return result;
}
int nodeCount = 0;
int linkCount = 0;
epanet.getcount((int)eCountType.Node, ref nodeCount);
epanet.getcount((int)eCountType.Link, ref linkCount);
const int MAXID = 31;
var sb = new StringBuilder(MAXID);
for (int i = 1; i <= nodeCount; i++)
{
epanet.getnodeid(i, sb);
var arr = new string[] { "Press", "Head", "Demand" }; //System.Enum.GetValues(typeof(HydraulicModel.NodeValueType));
var arrnum = new int[] { 10, 11, 9 };
var resultNode = new CalcuNode()
{
Id = sb.ToString(),
};
for (var j = 0; j < arr.Length; j++)
{
float v = 0;
//var t = (EPAcore.Core.NodeValueType)j;
epanet.getnodevalue(i, arrnum[j], ref v);
switch (arr[j])
{
case "Press":
resultNode.Press = v;
break;
case "Head":
resultNode.Head = v;
break;
case "Demand":
resultNode.Demand = v;
break;
}
}
result.NodeList.Add(resultNode);
}
for (int i = 1; i <= linkCount; i++)
{
epanet.getlinkid(i, sb);
//var arr = System.Enum.GetValues(typeof(HydraulicModel.LinkValueType));
var arr = new string[] { "Flow", "Velocity", "Headloss" }; //System.Enum.GetValues(typeof(HydraulicModel.NodeValueType));
var arrnum = new int[] { 8, 9, 10 };
var resultLink = new CalcuLink()
{
Id = sb.ToString(),
};
for (var j = 0; j < arr.Length; j++)
{
float v = 0;
//var t = (EPAcore.Core.NodeValueType)j;
epanet.getnodevalue(i, arrnum[j], ref v);
switch (arr[j])
{
case "Flow":
resultLink.Flow = v;
break;
case "Velocity":
resultLink.Velocity = v;
break;
case "Headloss":
resultLink.Headloss = v;
break;
}
}
result.LinkList.Add(resultLink);
}
return result;
}
}
}