duheng
2025-03-18 7ee0220b5f5626deef516b6e5c417bfa201e5a88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// 创建一个 Stopwatch 实例 
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 = 0d;
var minDemand = 0;   // 最小总需水量(m³/h)
var maxDemand = 43;  // 最大总需水量(m³/h)
var calcCount = 10;           // 计算次数
var rand = new Random();
 
var list = new List<SimulationResult>(calcCount);
using (var helper = new Yw.Epanet.InteropXHelper())
{
    var err = helper.Open(file_path, "", "");
    err = helper.GetCount(Yw.Epanet.eCountType.Node, out int nodeCount);
    err = helper.OpenH();
 
    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++)
    {
        helper.InitH(false);
        var demands = allDemands[i];
        for (int nodeIdx = 1; nodeIdx <= nodeCount; nodeIdx++)
        {
            double demand = demands.NodeDemands[nodeIdx - 1];
            err = helper.SetNodeValue(nodeIdx, Yw.Epanet.eNodeProperty.BaseDemand, demand);
            if (demand > 1)
            {
 
            }
            err = helper.GetNodeValue(nodeIdx, Yw.Epanet.eNodeProperty.BaseDemand, out double de);
 
        }
 
        helper.RunH(out long t);
 
        var result = new SimulationResult();
        result.TotalDemand = demands.TotalDemand;
        result.RealDemand = demands.NodeDemands.Sum();
        for (int nodeIdx = 1; nodeIdx <= nodeCount; nodeIdx++)
        {
            pressure = 0;
            helper.GetNodeValue(nodeIdx, Yw.Epanet.eNodeProperty.Pressure, out pressure);
            helper.GetNodeValue(nodeIdx, Yw.Epanet.eNodeProperty.BaseDemand, out double de);
            result.UpdateMaxPressure(nodeIdx, pressure);
        }
        helper.NextH(out long tstep);
        list.Add(result);
    }
 
 
    helper.Close();
 
}
 
 
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));
    }
}