using IStation.Epanet;
|
using IStation.Epanet.Enums;
|
using System.Diagnostics;
|
using System.Text;
|
using static PBS.Console.Test.WaterDistributionSystemHelper;
|
|
|
|
Console.WriteLine("开始模拟...");
|
Stopwatch stopwatch = new Stopwatch();
|
stopwatch.Start();
|
|
var file_path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "1897563622226399232.inp");
|
|
var pressure = 0f;
|
var minDemand = 0; // 最小总需水量(m³/h)
|
var maxDemand = 43; // 最大总需水量(m³/h)
|
var calcCount = 20000; // 计算次数
|
var rand = new Random();
|
|
var list = new List<SimulationResult>(calcCount);
|
|
var err = EpanetMethods.ENopen(file_path, "", "");
|
err = EpanetMethods.ENgetcount(CountType.Node, out int nodeCount);
|
err = EpanetMethods.ENopenH();
|
|
|
var config = new Config
|
{
|
NodeCount = nodeCount,
|
TotalRuns = calcCount,
|
MinDemand = minDemand,
|
MaxDemand = maxDemand,
|
NodeLimits = new()
|
};
|
|
for (int nodeIndex = 1; nodeIndex <= nodeCount; nodeIndex++)
|
{
|
config.NodeLimits.Add(new(0, rand.NextDouble() * 5));
|
}
|
|
|
var generator = new DemandAllocator(config);
|
var allDemands = generator.GenerateAllocationMatrix();
|
|
|
for (int i = 0; i < calcCount; i++)
|
{
|
EpanetMethods.ENinitH(0);
|
var demands = allDemands[i];
|
for (int nodeIdx = 1; nodeIdx <= nodeCount; nodeIdx++)
|
{
|
double demand = demands.NodeDemands[nodeIdx - 1];
|
err = EpanetMethods.ENsetnodevalue(nodeIdx, NodeValue.BaseDemand, (float)demand);
|
err = EpanetMethods.ENgetnodevalue(nodeIdx, NodeValue.BaseDemand, out float de);
|
}
|
|
EpanetMethods.ENrunH(out int t);
|
|
var result = new SimulationResult();
|
result.TotalDemand = demands.TotalDemand;
|
result.RealDemand = demands.NodeDemands.Sum();
|
for (int nodeIdx = 1; nodeIdx <= nodeCount; nodeIdx++)
|
{
|
pressure = 0;
|
EpanetMethods.ENgetnodevalue(nodeIdx, NodeValue.Pressure, out pressure);
|
EpanetMethods.ENgetnodevalue(nodeIdx, NodeValue.Demand, out float de);
|
result.UpdateMaxPressure(nodeIdx, pressure);
|
}
|
EpanetMethods.ENnextH(out int tstep);
|
list.Add(result);
|
}
|
|
|
EpanetMethods.ENcloseH();
|
EpanetMethods.ENclose();
|
|
|
stopwatch.Stop();
|
|
Console.WriteLine("所有模拟已完成。");
|
Console.WriteLine($"总时间:{stopwatch.Elapsed.TotalSeconds}");
|
|
list = list.OrderBy(x => x.TotalDemand).ToList();
|
var strBuild = new StringBuilder();
|
foreach (var item in list)
|
{
|
var pressureList = item.PressuresDict.Values.ToList();
|
var a = item.PressuresDict.OrderBy(x => x.Value).ToList();
|
strBuild.AppendLine($"{item.TotalDemand},{item.RealDemand}///{a[0].Value},{a[0].Key}");
|
}
|
|
|
Console.WriteLine(strBuild.ToString());
|
Console.ReadLine();
|
Console.ReadKey();
|
|
|
|
public class SimulationResult
|
{
|
public double TotalDemand { get; set; }
|
public double RealDemand { get; set; }
|
public Dictionary<int, double> PressuresDict { get; set; } = new();
|
//public ConcurrentDictionary<int, double> MaxPressures { get; } = new();
|
|
public void UpdateMaxPressure(int nodeId, double pressure)
|
{
|
PressuresDict.Add(nodeId, pressure);
|
//MaxPressures.AddOrUpdate(nodeId, pressure,
|
// (id, old) => Math.Max(old, pressure));
|
}
|
}
|