using IStation.Epanet.Analysis;
using IStation.Epanet.Enums;
using System.Text;
using Yw;
namespace IStation.Epanet
{
///
/// 水力模型调度
///
public class ScheduleHelper
{
///
/// 延时水利分析
///
/// inp文件
/// 输出数据
///
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(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(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;
}
///
/// 单时刻水利分析
///
/// inp文件
/// 时刻
/// 输出数据
///
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(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(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;
}
///
/// 单时刻水利分析
///
/// inp文件
/// 时刻
/// 输入数据
/// 输出数据
///
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(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(jsonBuild.ToString());
outLink.LinkType = type;
outLink.Index = i;
outLink.ID = idBuild.ToString();
output.Links.Add(outLink);
}
return string.Empty;
}
///
/// 单时刻水利分析
///
/// inp文件
/// 时刻
/// 输入数据
/// 输出数据
///
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.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(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(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;
}
}
}