lixiaojun
2023-03-20 14801a2e40bc79833c41151a37fe4cb0acbc5c7f
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace IStation.Calculation.Epanet
    /// <summary>
    /// 计算 (长兴岛) 
    public class CalcCxd2
    {
 
        private  string _inpFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EpanetFile", "cxd_method1_2_3.inp");
 
        #region 方法1  
        public List<EpaCalcuIDto> CalcuPressByLevelAndFlow(EpanetMethod1ContextItem context)
        {
            if (context == null)
                return default;
            var nodeList = new List<EpanetNode>();
 
            nodeList.Add(GetInputModel("987319", EpanetNode.eType.level, (float)context.Level));//水池水位 
 
            nodeList.Add(GetInputModel("975126", EpanetNode.eType.flow, (float)context.Flow1));//出站流量1 
            nodeList.Add(GetInputModel("975197", EpanetNode.eType.flow, (float)context.Flow2));//出站流量2     
 
            nodeList.Add(GetInputModel("971898", EpanetNode.eType.pump_run, (float)context.Hz1));//1号泵
            nodeList.Add(GetInputModel("971861", EpanetNode.eType.pump_run, (float)context.Hz2));//2号泵
            nodeList.Add(GetInputModel("971824", EpanetNode.eType.pump_run, (float)context.Hz3));//3号泵
            nodeList.Add(GetInputModel("970046", EpanetNode.eType.pump_run, (float)context.Hz4));//4号泵  
 
            nodeList.Add(GetInputModel("1", EpanetNode.eType.valve_initstatus, context.valve1));//1号阀门(模型里是节点)
            nodeList.Add(GetInputModel("2", EpanetNode.eType.valve_initstatus, context.valve2));//2号阀门(模型里是管线)
            nodeList.Add(GetInputModel("975057", EpanetNode.eType.valve_initstatus, context.valve3));//中间阀门
 
            var helper = new CalcPressByLevelAndFlowHelper();
            helper.Initial(_inpFilePath);
            var scheme = helper.CalcPressByLevelAndFlow(nodeList);
            if (scheme == null)
                return default;
 
            var convetHelper = new EpaCacluItemHelper();
            var list = new List<EpaCalcuIDto>();
            scheme.OutputLinkList?.ForEach(link =>
            {
                var item = convetHelper.LinkConvert(link);
                list.Add(item);
            });
 
            scheme.OutputNodeList?.ForEach(node =>
            {
                var item = convetHelper.NodeConvert(node);
                list.Add(item);
            });
            return list;
        }
        #endregion
 
        #region 方法2 
        public List<EpaCalcuIDto> CalcuFlowByPressAndPumpStatus(EpanetMethod2ContextItem context)
        {
            var nodeList = new List<EpanetNode>();
 
            nodeList.Add(GetInputModel("987319", EpanetNode.eType.level, (float)context.Level));//水池水位 
 
            nodeList.Add(GetInputModel("P1", EpanetNode.eType.press_out, (float)context.Press1));//出站压力1
            nodeList.Add(GetInputModel("P2", EpanetNode.eType.press_out, (float)context.Press2));//出站压力2
 
            nodeList.Add(GetInputModel("971898", EpanetNode.eType.pump_run, (float)context.Hz1));//1号泵
            nodeList.Add(GetInputModel("971861", EpanetNode.eType.pump_run, (float)context.Hz2));//2号泵
            nodeList.Add(GetInputModel("971824", EpanetNode.eType.pump_run, (float)context.Hz3));//3号泵
            nodeList.Add(GetInputModel("970046", EpanetNode.eType.pump_run, (float)context.Hz4));//4号泵  
 
            nodeList.Add(GetInputModel("1", EpanetNode.eType.valve_initstatus, context.valve1));//1号阀门(模型里是节点)
            nodeList.Add(GetInputModel("2", EpanetNode.eType.valve_initstatus, context.valve2));//2号阀门(模型里是管线)
            nodeList.Add(GetInputModel("975057", EpanetNode.eType.valve_initstatus, context.valve3));//中间阀门
 
            var helper = new GetFlowByPressAndPumpStatusHelper();
            helper.Initial(_inpFilePath);
            var scheme = helper.GetFlowByPressAndPumpStatus(nodeList);
            if (scheme == null)
                return default;
            var convetHelper = new EpaCacluItemHelper();
            var list = new List<EpaCalcuIDto>();
            scheme.OutputLinkList?.ForEach(link =>
            {
                var item = convetHelper.LinkConvert(link);
                list.Add(item);
            });
 
            scheme.OutputNodeList?.ForEach(node =>
            {
                var item = convetHelper.NodeConvert(node);
                list.Add(item);
            });
            return list;
        }
        #endregion
 
        #region 方法3
 
        public List<List<EpaCalcuIDto>> CalcuPumpStatusByFlowAndPress(EpanetMethod3ContextItem context)
        {
            var nodeList = new List<EpanetNode>();
            List<string> openPumpIds = new List<string>();
 
            nodeList.Add(GetInputModel("987319", EpanetNode.eType.level, (float)context.Level));//水池水位
 
            if (context.RunStatus1)
            {
                nodeList.Add(GetInputModel("971898", EpanetNode.eType.pump_isFrequece, 1));//1号泵
                openPumpIds.Add("971898");
            }
            else
            {
                nodeList.Add(GetInputModel("971898", EpanetNode.eType.pump_isFrequece, 0));//1号泵
            }
 
            if (context.RunStatus2)
            {
                nodeList.Add(GetInputModel("971861", EpanetNode.eType.pump_isFrequece, 1));//2号泵
                openPumpIds.Add("971861");
            }
            else
            {
                nodeList.Add(GetInputModel("971861", EpanetNode.eType.pump_isFrequece, 0));//2号泵
            }
 
            if (context.RunStatus3)
            {
                nodeList.Add(GetInputModel("971824", EpanetNode.eType.pump_isFrequece, 1));//3号泵
                openPumpIds.Add("971824");
            }
            else
            {
                nodeList.Add(GetInputModel("971824", EpanetNode.eType.pump_isFrequece, 0));//3号泵
            }
 
            if (context.RunStatus4)
            {
                nodeList.Add(GetInputModel("970046", EpanetNode.eType.pump_isFrequece, 1));//4号泵
                openPumpIds.Add("970046");
            }
            else
            {
                nodeList.Add(GetInputModel("970046", EpanetNode.eType.pump_isFrequece, 0));//4号泵
            }
 
 
            nodeList.Add(GetInputModel("975126", EpanetNode.eType.press_out, (float)context.Press1));//出站压力1 
            nodeList.Add(GetInputModel("975197", EpanetNode.eType.press_out, (float)context.Press2));//出站压力2
 
            nodeList.Add(GetInputModel("975126", EpanetNode.eType.flow, (float)context.Flow1));//出站流量1 
            nodeList.Add(GetInputModel("975197", EpanetNode.eType.flow, (float)context.Flow2));//出站流量2     
 
            nodeList.Add(GetInputModel("1", EpanetNode.eType.valve_initstatus, context.valve1));//1号阀门(模型里是节点)
            nodeList.Add(GetInputModel("2", EpanetNode.eType.valve_initstatus, context.valve2));//2号阀门(模型里是管线)
            nodeList.Add(GetInputModel("975057", EpanetNode.eType.valve_initstatus, context.valve3));//中间阀门
 
 
            var helper = new GetPumpStatusByFlowAndPressHelper();
            helper.Initial(_inpFilePath);
            var shcemeList = helper.GetPumpStatusByFlowAndPress(nodeList, new List<List<string>>() { openPumpIds });
            if (shcemeList == null)
                return default;
 
            var dtoList = new List<List<EpaCalcuIDto>>();
            var convetHelper = new EpaCacluItemHelper();
            foreach (var scheme in shcemeList)
            { 
                var list = new List<EpaCalcuIDto>();
                scheme.OutputLinkList?.ForEach(link =>
                {
                    var item = convetHelper.LinkConvert(link);
                    list.Add(item);
                });
 
                scheme.OutputNodeList?.ForEach(node =>
                {
                    var item = convetHelper.NodeConvert(node);
                    list.Add(item);
                });
                dtoList.Add(list);
            }
            return dtoList;
        }
 
        #endregion
 
        /// <summary>
        /// 获取类
        /// </summary> 
        EpanetNode GetInputModel(string objId, EpanetNode.eType type, float value)
        {
            var model = new EpanetNode();
            model.ObjectID = objId;
            model.Type = type;
            model.Value = value;
            return model;
        }
 
    }
}
 
 
 
/*算法注意事项:
1.节点压力单位(M)
2.每个算法对输入输出的要求不一样
3.算法2只会计算出节点的压力,不会返回流量
4.方法1、2 控制泵的开关是 pump_run 
5. 方法3 控制泵的开关是 pump_isFrequece
6. 方法3 关闭中间阀的情况下    (1号管流量太小—计算失败) (2号管与预期流量不符)
 
 */
 
/* 问题:
 1.止回阀的起始节点和终止节点有没有影响?
 2. 关阀后 2号管的流量控制不了,入参2000方 出参4000方(解决)
 3.模型算出来的负值 算法返回来0 (解决)
 4. 模型 管路中的歪斜程度会不会影响 流量 (不会)
 5. 方法3的用法
 */
 
/* 注意事项
 * 1.方法1 方法3 只需要控制中间阀   管道的限定 需要根据流量值大小来判断 (关闭1号管 1号管路入参流量设置为0)
 * 2.方法2 出口压力定在水库上 可以控制3个阀门 
 * 3.方法3 出站压力和出站流量定在水库上
 * 4.方法3 能耗越低小 
 * 5.方法2 两个管路的压力值 不能相差太大  不然计算精度有偏差
 */
 
/*错误
 * 1 开停机状态是要输入频率的
 *  
 * 
 */