using IStation.Epanet.Enums;
|
|
namespace IStation.Epanet.Analysis
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public class HydraulicAnalysisHelper
|
{
|
|
/// <summary>
|
/// 延时水利分析
|
/// </summary>
|
/// <param name="filePath">inp文件</param>
|
/// <param name="output">输出数据</param>
|
/// <returns></returns>
|
public static string Analysis(string filePath, out Output output)
|
{
|
output = new Output();
|
if (!File.Exists(filePath))
|
{
|
return $"文件不存在!";
|
}
|
|
var err = EpanetMethods.ENopen(filePath, "", "");
|
if (err != 0)
|
{
|
return $"ENopen:{new EnException(err).Message}!";
|
}
|
|
|
int tstep = 0;
|
EpanetMethods.ENopenH();
|
EpanetMethods.ENinitH(0);
|
|
do
|
{
|
const int MAXID = 31;
|
var idBuild = new StringBuilder(MAXID);
|
var jsonBuild = new StringBuilder();
|
|
EpanetMethods.ENrunH(out int t);
|
|
EpanetMethods.ENgetcount(CountType.Node, out int nodeCount);
|
EpanetMethods.ENgetcount(CountType.Link, out int linkCount);
|
|
for (int i = 1; i <= nodeCount; i++)
|
{
|
if (EpanetMethods.ENgetnodeid(i, idBuild) != 0)
|
continue;
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (NodeValue f in Enum.GetValues(typeof(NodeValue)))
|
{
|
EpanetMethods.ENgetnodevalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetnodetype(i, out NodeType type);
|
var outNode = JsonHelper.Json2Object<OutNode>(jsonBuild.ToString());
|
outNode.NodeType = type;
|
outNode.ID = idBuild.ToString();
|
outNode.Time = TimeSpan.FromSeconds(t);
|
|
output.Nodes.Add(outNode);
|
}
|
|
for (int i = 1; i <= linkCount; i++)
|
{
|
if (EpanetMethods.ENgetlinkid(i, idBuild) != 0)
|
continue;
|
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (LinkValue f in Enum.GetValues(typeof(LinkValue)))
|
{
|
EpanetMethods.ENgetlinkvalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetlinktype(i, out LinkType type);
|
var outLink = JsonHelper.Json2Object<OutLink>(jsonBuild.ToString());
|
outLink.LinkType = type;
|
outLink.ID = idBuild.ToString();
|
outLink.Time = TimeSpan.FromSeconds(t);
|
output.Links.Add(outLink);
|
}
|
|
EpanetMethods.ENnextH(out tstep);
|
|
} while (tstep > 0);
|
EpanetMethods.ENcloseH();
|
|
return string.Empty;
|
}
|
|
/// <summary>
|
/// 单时刻水利分析
|
/// </summary>
|
/// <param name="filePath">inp文件</param>
|
/// <param name="timeSpan">时刻</param>
|
/// <param name="output">输出数据</param>
|
/// <returns></returns>
|
public static string Analysis(string filePath, TimeSpan timeSpan, out Output output)
|
{
|
output = new Output();
|
if (!File.Exists(filePath))
|
{
|
return $"文件不存在!";
|
}
|
|
var err = EpanetMethods.ENopen(filePath, "", "");
|
if (err != 0)
|
{
|
return $"ENopen:{new EnException(err).Message}!";
|
}
|
|
|
int tstep = 0;
|
EpanetMethods.ENopenH();
|
EpanetMethods.ENinitH(0);
|
|
do
|
{
|
const int MAXID = 31;
|
var idBuild = new StringBuilder(MAXID);
|
var jsonBuild = new StringBuilder();
|
|
EpanetMethods.ENrunH(out int t);
|
|
if (t == timeSpan.TotalSeconds)
|
{
|
EpanetMethods.ENgetcount(CountType.Node, out int nodeCount);
|
EpanetMethods.ENgetcount(CountType.Link, out int linkCount);
|
|
for (int i = 1; i <= nodeCount; i++)
|
{
|
if (EpanetMethods.ENgetnodeid(i, idBuild) != 0)
|
continue;
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (NodeValue f in Enum.GetValues(typeof(NodeValue)))
|
{
|
EpanetMethods.ENgetnodevalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetnodetype(i, out NodeType type);
|
var outNode = JsonHelper.Json2Object<OutNode>(jsonBuild.ToString());
|
outNode.NodeType = type;
|
outNode.ID = idBuild.ToString();
|
outNode.Time = TimeSpan.FromSeconds(t);
|
|
output.Nodes.Add(outNode);
|
}
|
|
for (int i = 1; i <= linkCount; i++)
|
{
|
if (EpanetMethods.ENgetlinkid(i, idBuild) != 0)
|
continue;
|
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (LinkValue f in Enum.GetValues(typeof(LinkValue)))
|
{
|
EpanetMethods.ENgetlinkvalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetlinktype(i, out LinkType type);
|
var outLink = JsonHelper.Json2Object<OutLink>(jsonBuild.ToString());
|
outLink.LinkType = type;
|
outLink.ID = idBuild.ToString();
|
outLink.Time = TimeSpan.FromSeconds(t);
|
output.Links.Add(outLink);
|
}
|
}
|
EpanetMethods.ENnextH(out tstep);
|
|
|
} while (tstep > 0);
|
EpanetMethods.ENcloseH();
|
|
return string.Empty;
|
}
|
|
/// <summary>
|
/// 单时刻水利分析
|
/// </summary>
|
/// <param name="filePath">inp文件</param>
|
/// <param name="timeSpan">时刻</param>
|
/// <param name="input">输入数据</param>
|
/// <param name="output">输出数据</param>
|
/// <returns></returns>
|
public static string Analysis(string filePath, TimeSpan timeSpan, Input input, out Output output)
|
{
|
output = new Output();
|
if (!File.Exists(filePath))
|
{
|
return $"文件不存在!";
|
}
|
|
|
var err = EpanetMethods.ENopen(filePath, "", "");
|
if (err != 0)
|
{
|
return $"ENopen:{new EnException(err).Message}!";
|
}
|
|
const int MAXID = 31;
|
var idBuild = new StringBuilder(MAXID);
|
var jsonBuild = new StringBuilder();
|
|
EpanetMethods.ENgetcount(CountType.Node, out int nodeCount);
|
EpanetMethods.ENgetcount(CountType.Link, out int linkCount);
|
|
|
EpanetMethods.ENopenH();
|
EpanetMethods.ENinitH(0);
|
|
|
|
if (input.Links != null && input.Links.Any())
|
{
|
foreach (var link in input.Links)
|
{
|
var i = link.Index;
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Status, link.InitStatus);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Setting, link.InitSetting);
|
}
|
}
|
|
|
EpanetMethods.ENsolveH();
|
|
for (int i = 1; i <= nodeCount; i++)
|
{
|
if (EpanetMethods.ENgetnodeid(i, idBuild) != 0)
|
continue;
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (NodeValue f in Enum.GetValues(typeof(NodeValue)))
|
{
|
EpanetMethods.ENgetnodevalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetnodetype(i, out NodeType type);
|
var outNode = JsonHelper.Json2Object<OutNode>(jsonBuild.ToString());
|
outNode.NodeType = type;
|
outNode.Index = i;
|
outNode.ID = idBuild.ToString();
|
|
output.Nodes.Add(outNode);
|
}
|
|
for (int i = 1; i <= linkCount; i++)
|
{
|
if (EpanetMethods.ENgetlinkid(i, idBuild) != 0)
|
continue;
|
|
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (LinkValue f in Enum.GetValues(typeof(LinkValue)))
|
{
|
EpanetMethods.ENgetlinkvalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetlinktype(i, out LinkType type);
|
var outLink = JsonHelper.Json2Object<OutLink>(jsonBuild.ToString());
|
outLink.LinkType = type;
|
outLink.Index = i;
|
outLink.ID = idBuild.ToString();
|
output.Links.Add(outLink);
|
|
}
|
|
|
return string.Empty;
|
}
|
|
|
|
/// <summary>
|
/// 单时刻水利分析
|
/// </summary>
|
/// <param name="filePath">inp文件</param>
|
/// <param name="timeSpan">时刻</param>
|
/// <param name="input">输入数据</param>
|
/// <param name="output">输出数据</param>
|
/// <returns></returns>
|
public static string Analysis_bak(string filePath, TimeSpan timeSpan, Input input, out Output output)
|
{
|
output = new Output();
|
if (!File.Exists(filePath))
|
{
|
return $"文件不存在!";
|
}
|
|
|
var err = EpanetMethods.ENopen(filePath, "", "");
|
if (err != 0)
|
{
|
return $"ENopen:{new EnException(err).Message}!";
|
}
|
|
const int MAXID = 31;
|
var idBuild = new StringBuilder(MAXID);
|
var jsonBuild = new StringBuilder();
|
|
EpanetMethods.ENgetcount(CountType.Node, out int nodeCount);
|
EpanetMethods.ENgetcount(CountType.Link, out int linkCount);
|
|
if (input != null)
|
{
|
if (input.Links != null && input.Links.Any())
|
{
|
|
for (int i = 1; i <= linkCount; i++)
|
{
|
if (EpanetMethods.ENgetlinkid(i, idBuild) != 0)
|
continue;
|
EpanetMethods.ENgetlinktype(i, out LinkType type);
|
if (type != LinkType.Pump)
|
continue;
|
var inputLink = input.Links.Find(x => x.ID == idBuild.ToString());
|
if (inputLink != null)
|
{
|
EpanetMethods.ENgetlinkvalue(i, LinkValue.Diameter, out float diameter);
|
EpanetMethods.ENgetlinkvalue(i, LinkValue.Length, out float length);
|
EpanetMethods.ENgetlinkvalue(i, LinkValue.Roughness, out float roughness);
|
EpanetMethods.ENgetlinkvalue(i, LinkValue.MinorLoss, out float minorLoss);
|
EpanetMethods.ENgetlinkvalue(i, LinkValue.InitSetting, out float initSetting);
|
EpanetMethods.ENgetlinkvalue(i, LinkValue.Kbulk, out float kbulk);
|
EpanetMethods.ENgetlinkvalue(i, LinkValue.Kwall, out float kwall);
|
|
inputLink.Index = i;
|
inputLink.Diameter = diameter;
|
inputLink.Length = length;
|
inputLink.Roughness = roughness;
|
inputLink.MinorLoss = minorLoss;
|
//inputLink.InitStatus = rhs.InitStatus;
|
inputLink.InitSetting = inputLink.InitSetting;
|
inputLink.Kbulk = kbulk;
|
inputLink.Kwall = kwall;
|
}
|
}
|
|
|
foreach (var link in input.Links)
|
{
|
var i = link.Index;
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Diameter, link.Diameter);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Length, link.Length);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Roughness, link.Roughness);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.MinorLoss, link.MinorLoss);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.InitStatus, link.InitStatus);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.InitSetting, 0);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Kbulk, link.Kbulk);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Kwall, link.Kwall);
|
}
|
}
|
if (input.Nodes != null && input.Nodes.Any())
|
{
|
for (int i = 1; i <= nodeCount; i++)
|
{
|
if (EpanetMethods.ENgetnodeid(i, idBuild) != 0)
|
continue;
|
var id = idBuild.ToString();
|
var inputNode = input.Nodes.Find(x => x.ID == id);
|
if (inputNode != null)
|
{
|
EpanetMethods.ENgetnodevalue(i, NodeValue.Elevation, out float elevation);
|
EpanetMethods.ENgetnodevalue(i, NodeValue.Pattern, out float pattern);
|
EpanetMethods.ENgetnodevalue(i, NodeValue.Emitter, out float emitter);
|
|
inputNode.Index = i;
|
inputNode.Elevation = elevation;
|
//inputNode.BaseDemand = rhs.BaseDemand;
|
inputNode.Pattern = pattern;
|
inputNode.Emitter = emitter;
|
}
|
}
|
foreach (var node in input.Nodes)
|
{
|
var i = node.Index;
|
EpanetMethods.ENsetnodevalue(i, NodeValue.Elevation, node.Elevation);
|
EpanetMethods.ENsetnodevalue(i, NodeValue.BaseDemand, node.BaseDemand);
|
EpanetMethods.ENsetnodevalue(i, NodeValue.Pattern, node.Pattern);
|
EpanetMethods.ENsetnodevalue(i, NodeValue.Emitter, node.Emitter);
|
}
|
}
|
}
|
|
|
int tstep = 0;
|
EpanetMethods.ENopenH();
|
EpanetMethods.ENinitH(0);
|
|
do
|
{
|
|
/* EpanetMethods.ENsetlinkvalue(177, LinkValue.Status, 0);
|
EpanetMethods.ENsetlinkvalue(177, LinkValue.Setting, 0);
|
*/
|
EpanetMethods.ENrunH(out int t);
|
|
//泵计算需要在延时循环内
|
/*EpanetMethods.ENsetlinkvalue(177, LinkValue.Status, 0);
|
EpanetMethods.ENsetlinkvalue(177, LinkValue.Setting, 0);
|
|
*/
|
if (input.Links != null && input.Links.Any())
|
{
|
foreach (var link in input.Links)
|
{
|
var i = link.Index;
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Status, link.InitStatus);
|
EpanetMethods.ENsetlinkvalue(i, LinkValue.Setting, link.InitSetting);
|
}
|
}
|
|
if (t == timeSpan.TotalSeconds)
|
{
|
|
|
for (int i = 1; i <= nodeCount; i++)
|
{
|
if (EpanetMethods.ENgetnodeid(i, idBuild) != 0)
|
continue;
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (NodeValue f in Enum.GetValues(typeof(NodeValue)))
|
{
|
EpanetMethods.ENgetnodevalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetnodetype(i, out NodeType type);
|
var outNode = JsonHelper.Json2Object<OutNode>(jsonBuild.ToString());
|
outNode.NodeType = type;
|
outNode.ID = idBuild.ToString();
|
outNode.Time = TimeSpan.FromSeconds(t);
|
|
output.Nodes.Add(outNode);
|
}
|
|
for (int i = 1; i <= linkCount; i++)
|
{
|
if (EpanetMethods.ENgetlinkid(i, idBuild) != 0)
|
continue;
|
|
|
jsonBuild.Clear();
|
jsonBuild.Append("{");
|
foreach (LinkValue f in Enum.GetValues(typeof(LinkValue)))
|
{
|
EpanetMethods.ENgetlinkvalue(i, f, out float v);
|
jsonBuild.Append($"\"{f}\":\"{v}\",");
|
}
|
jsonBuild.Remove(jsonBuild.Length - 1, 1);
|
jsonBuild.Append("}");
|
|
EpanetMethods.ENgetlinktype(i, out LinkType type);
|
var outLink = JsonHelper.Json2Object<OutLink>(jsonBuild.ToString());
|
outLink.LinkType = type;
|
outLink.ID = idBuild.ToString();
|
outLink.Time = TimeSpan.FromSeconds(t);
|
output.Links.Add(outLink);
|
|
|
|
}
|
}
|
EpanetMethods.ENnextH(out tstep);
|
|
} while (tstep > 0);
|
EpanetMethods.ENcloseH();
|
|
return string.Empty;
|
}
|
}
|
|
}
|