epyt-flow 0.14.1__py3-none-any.whl → 0.15.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. epyt_flow/VERSION +1 -1
  2. epyt_flow/__init__.py +0 -37
  3. epyt_flow/data/benchmarks/battledim.py +2 -2
  4. epyt_flow/data/benchmarks/leakdb.py +12 -9
  5. epyt_flow/gym/scenario_control_env.py +32 -33
  6. epyt_flow/simulation/events/actuator_events.py +24 -18
  7. epyt_flow/simulation/events/leakages.py +59 -57
  8. epyt_flow/simulation/events/quality_events.py +21 -30
  9. epyt_flow/simulation/events/system_event.py +3 -3
  10. epyt_flow/simulation/scada/complex_control.py +14 -12
  11. epyt_flow/simulation/scada/custom_control.py +22 -21
  12. epyt_flow/simulation/scada/scada_data.py +108 -105
  13. epyt_flow/simulation/scada/simple_control.py +38 -31
  14. epyt_flow/simulation/scenario_simulator.py +368 -395
  15. epyt_flow/simulation/sensor_config.py +31 -32
  16. epyt_flow/topology.py +11 -10
  17. epyt_flow/uncertainty/model_uncertainty.py +146 -122
  18. epyt_flow/utils.py +66 -0
  19. epyt_flow/visualization/visualization_utils.py +4 -2
  20. {epyt_flow-0.14.1.dist-info → epyt_flow-0.15.0.dist-info}/METADATA +14 -19
  21. epyt_flow-0.15.0.dist-info/RECORD +65 -0
  22. epyt_flow/EPANET/EPANET/SRC_engines/AUTHORS +0 -60
  23. epyt_flow/EPANET/EPANET/SRC_engines/LICENSE +0 -21
  24. epyt_flow/EPANET/EPANET/SRC_engines/enumstxt.h +0 -151
  25. epyt_flow/EPANET/EPANET/SRC_engines/epanet.c +0 -5930
  26. epyt_flow/EPANET/EPANET/SRC_engines/epanet2.c +0 -961
  27. epyt_flow/EPANET/EPANET/SRC_engines/errors.dat +0 -79
  28. epyt_flow/EPANET/EPANET/SRC_engines/flowbalance.c +0 -186
  29. epyt_flow/EPANET/EPANET/SRC_engines/funcs.h +0 -219
  30. epyt_flow/EPANET/EPANET/SRC_engines/genmmd.c +0 -1000
  31. epyt_flow/EPANET/EPANET/SRC_engines/hash.c +0 -177
  32. epyt_flow/EPANET/EPANET/SRC_engines/hash.h +0 -28
  33. epyt_flow/EPANET/EPANET/SRC_engines/hydcoeffs.c +0 -1303
  34. epyt_flow/EPANET/EPANET/SRC_engines/hydraul.c +0 -1172
  35. epyt_flow/EPANET/EPANET/SRC_engines/hydsolver.c +0 -781
  36. epyt_flow/EPANET/EPANET/SRC_engines/hydstatus.c +0 -442
  37. epyt_flow/EPANET/EPANET/SRC_engines/include/epanet2.h +0 -464
  38. epyt_flow/EPANET/EPANET/SRC_engines/include/epanet2_2.h +0 -1960
  39. epyt_flow/EPANET/EPANET/SRC_engines/include/epanet2_enums.h +0 -518
  40. epyt_flow/EPANET/EPANET/SRC_engines/inpfile.c +0 -884
  41. epyt_flow/EPANET/EPANET/SRC_engines/input1.c +0 -672
  42. epyt_flow/EPANET/EPANET/SRC_engines/input2.c +0 -735
  43. epyt_flow/EPANET/EPANET/SRC_engines/input3.c +0 -2265
  44. epyt_flow/EPANET/EPANET/SRC_engines/leakage.c +0 -527
  45. epyt_flow/EPANET/EPANET/SRC_engines/mempool.c +0 -146
  46. epyt_flow/EPANET/EPANET/SRC_engines/mempool.h +0 -24
  47. epyt_flow/EPANET/EPANET/SRC_engines/output.c +0 -853
  48. epyt_flow/EPANET/EPANET/SRC_engines/project.c +0 -1691
  49. epyt_flow/EPANET/EPANET/SRC_engines/quality.c +0 -695
  50. epyt_flow/EPANET/EPANET/SRC_engines/qualreact.c +0 -800
  51. epyt_flow/EPANET/EPANET/SRC_engines/qualroute.c +0 -696
  52. epyt_flow/EPANET/EPANET/SRC_engines/report.c +0 -1557
  53. epyt_flow/EPANET/EPANET/SRC_engines/rules.c +0 -1500
  54. epyt_flow/EPANET/EPANET/SRC_engines/smatrix.c +0 -871
  55. epyt_flow/EPANET/EPANET/SRC_engines/text.h +0 -508
  56. epyt_flow/EPANET/EPANET/SRC_engines/types.h +0 -928
  57. epyt_flow/EPANET/EPANET/SRC_engines/util/cstr_helper.c +0 -59
  58. epyt_flow/EPANET/EPANET/SRC_engines/util/cstr_helper.h +0 -38
  59. epyt_flow/EPANET/EPANET/SRC_engines/util/errormanager.c +0 -92
  60. epyt_flow/EPANET/EPANET/SRC_engines/util/errormanager.h +0 -39
  61. epyt_flow/EPANET/EPANET/SRC_engines/util/filemanager.c +0 -212
  62. epyt_flow/EPANET/EPANET/SRC_engines/util/filemanager.h +0 -81
  63. epyt_flow/EPANET/EPANET/SRC_engines/validate.c +0 -408
  64. epyt_flow/EPANET/EPANET-MSX/MSX_Updates.txt +0 -53
  65. epyt_flow/EPANET/EPANET-MSX/Src/dispersion.h +0 -27
  66. epyt_flow/EPANET/EPANET-MSX/Src/hash.c +0 -107
  67. epyt_flow/EPANET/EPANET-MSX/Src/hash.h +0 -28
  68. epyt_flow/EPANET/EPANET-MSX/Src/include/epanetmsx.h +0 -102
  69. epyt_flow/EPANET/EPANET-MSX/Src/include/epanetmsx_export.h +0 -42
  70. epyt_flow/EPANET/EPANET-MSX/Src/mathexpr.c +0 -937
  71. epyt_flow/EPANET/EPANET-MSX/Src/mathexpr.h +0 -39
  72. epyt_flow/EPANET/EPANET-MSX/Src/mempool.c +0 -204
  73. epyt_flow/EPANET/EPANET-MSX/Src/mempool.h +0 -24
  74. epyt_flow/EPANET/EPANET-MSX/Src/msxchem.c +0 -1285
  75. epyt_flow/EPANET/EPANET-MSX/Src/msxcompiler.c +0 -368
  76. epyt_flow/EPANET/EPANET-MSX/Src/msxdict.h +0 -42
  77. epyt_flow/EPANET/EPANET-MSX/Src/msxdispersion.c +0 -586
  78. epyt_flow/EPANET/EPANET-MSX/Src/msxerr.c +0 -116
  79. epyt_flow/EPANET/EPANET-MSX/Src/msxfile.c +0 -260
  80. epyt_flow/EPANET/EPANET-MSX/Src/msxfuncs.c +0 -175
  81. epyt_flow/EPANET/EPANET-MSX/Src/msxfuncs.h +0 -35
  82. epyt_flow/EPANET/EPANET-MSX/Src/msxinp.c +0 -1504
  83. epyt_flow/EPANET/EPANET-MSX/Src/msxout.c +0 -401
  84. epyt_flow/EPANET/EPANET-MSX/Src/msxproj.c +0 -791
  85. epyt_flow/EPANET/EPANET-MSX/Src/msxqual.c +0 -2010
  86. epyt_flow/EPANET/EPANET-MSX/Src/msxrpt.c +0 -400
  87. epyt_flow/EPANET/EPANET-MSX/Src/msxtank.c +0 -422
  88. epyt_flow/EPANET/EPANET-MSX/Src/msxtoolkit.c +0 -1164
  89. epyt_flow/EPANET/EPANET-MSX/Src/msxtypes.h +0 -551
  90. epyt_flow/EPANET/EPANET-MSX/Src/msxutils.c +0 -524
  91. epyt_flow/EPANET/EPANET-MSX/Src/msxutils.h +0 -56
  92. epyt_flow/EPANET/EPANET-MSX/Src/newton.c +0 -158
  93. epyt_flow/EPANET/EPANET-MSX/Src/newton.h +0 -34
  94. epyt_flow/EPANET/EPANET-MSX/Src/rk5.c +0 -287
  95. epyt_flow/EPANET/EPANET-MSX/Src/rk5.h +0 -39
  96. epyt_flow/EPANET/EPANET-MSX/Src/ros2.c +0 -293
  97. epyt_flow/EPANET/EPANET-MSX/Src/ros2.h +0 -35
  98. epyt_flow/EPANET/EPANET-MSX/Src/smatrix.c +0 -816
  99. epyt_flow/EPANET/EPANET-MSX/Src/smatrix.h +0 -29
  100. epyt_flow/EPANET/EPANET-MSX/readme.txt +0 -14
  101. epyt_flow/EPANET/compile_linux.sh +0 -4
  102. epyt_flow/EPANET/compile_macos.sh +0 -4
  103. epyt_flow/simulation/backend/__init__.py +0 -1
  104. epyt_flow/simulation/backend/my_epyt.py +0 -1101
  105. epyt_flow-0.14.1.dist-info/RECORD +0 -148
  106. {epyt_flow-0.14.1.dist-info → epyt_flow-0.15.0.dist-info}/WHEEL +0 -0
  107. {epyt_flow-0.14.1.dist-info → epyt_flow-0.15.0.dist-info}/licenses/LICENSE +0 -0
  108. {epyt_flow-0.14.1.dist-info → epyt_flow-0.15.0.dist-info}/top_level.txt +0 -0
@@ -1,422 +0,0 @@
1
- /******************************************************************************
2
- ** MODULE: MSXTANK.C
3
- ** PROJECT: EPANET-MSX
4
- ** DESCRIPTION: Storage tank mixing routines.
5
- ** AUTHORS: see AUTHORS
6
- ** Copyright: see AUTHORS
7
- ** License: see LICENSE
8
- ** VERSION: 2.0.00
9
- ** LAST UPDATE: 04/14/2021
10
- ******************************************************************************/
11
-
12
- #include <stdio.h>
13
- #include <math.h>
14
-
15
- #include "msxtypes.h"
16
-
17
- // External variables
18
- //--------------------
19
- extern MSXproject MSX; // MSX project data
20
-
21
- // Imported functions
22
- //--------------------
23
- extern void MSXqual_removeSeg(Pseg seg);
24
- extern Pseg MSXqual_getFreeSeg(double v, double c[]);
25
- extern void MSXqual_addSeg(int k, Pseg seg);
26
- extern int MSXqual_isSame(double c1[], double c2[]);
27
- extern int MSXchem_equil(int zone, int k, double *c);
28
- extern void MSXqual_reversesegs(int k);
29
-
30
- // Exported functions
31
- //--------------------
32
- void MSXtank_mix1(int i, double vin, double *massin, double vnet);
33
- void MSXtank_mix2(int i, double vin, double *massin, double vnet);
34
- void MSXtank_mix3(int i, double vin, double *massin, double vnet);
35
- void MSXtank_mix4(int i, double vin, double *massin, double vnet);
36
-
37
-
38
- //=============================================================================
39
-
40
- void MSXtank_mix1(int i, double vin, double *massin, double vnet)
41
- /*
42
- ** Purpose:
43
- ** computes new WQ at end of time step in a completely mixed tank
44
- ** (after contents have been reacted).
45
- **
46
- ** Input:
47
- ** i = tank index
48
- ** vin = volume of inflow to tank (ft3)
49
- ** massin = massinflow
50
- ** vnet = inflow - outflow
51
- */
52
- {
53
- int k, m, n;
54
- double c;
55
- double vnew;
56
- Pseg seg;
57
-
58
- // --- blend inflow with contents
59
-
60
- n = MSX.Tank[i].node;
61
- k = MSX.Nobjects[LINK] + i;
62
- seg = MSX.FirstSeg[k];
63
- if (seg)
64
- {
65
- vnew = seg->v + vin;
66
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
67
- {
68
- if (MSX.Species[m].type != BULK) continue;
69
- c = seg->c[m];
70
- if (vnew > 0.0)
71
- c = (c*seg->v*LperFT3+massin[m])/(vnew*LperFT3);
72
-
73
- c = MAX(0.0, c);
74
- seg->c[m] = c;
75
- MSX.Tank[i].c[m] = c;
76
- }
77
- seg->v += vnet;
78
- seg->v = MAX(0, seg->v);
79
- }
80
-
81
- // --- update species equilibrium
82
-
83
- if ( vin > 0.0 ) MSXchem_equil(NODE, i, MSX.Tank[i].c);
84
- }
85
-
86
- //=============================================================================
87
-
88
- void MSXtank_mix2(int i, double vin, double *massin, double vnet)
89
- /*
90
- ** Purpose: 2-compartment tank model
91
- **
92
- ** Input: i = tank index
93
- ** vIn = volume of inflow to tank (ft3)
94
- ** massin = massinflow
95
- ** vnet = inflow - outflow
96
- */
97
- {
98
- int k, m, n;
99
- double vt, //transferred volume
100
- vmz; //full mixing zone volume
101
- Pseg mixzone, // Mixing zone segment
102
- stagzone; // Stagnant zone segment
103
-
104
- // --- find inflows & outflows
105
-
106
- n = MSX.Tank[i].node;
107
-
108
- // --- get segments for each zone
109
-
110
- k = MSX.Nobjects[LINK] + i;
111
- mixzone = MSX.LastSeg[k];
112
- stagzone = MSX.FirstSeg[k];
113
- if (mixzone == NULL || stagzone == NULL) return;
114
-
115
-
116
- // Full mixing zone volume
117
- vmz = MSX.Tank[i].vMix;
118
-
119
- vt = 0.0;
120
-
121
-
122
- // --- case of net filling (vnet > 0)
123
-
124
- if (vnet > 0.0)
125
- {
126
- vt = MAX(0.0, (mixzone->v + vnet - vmz));
127
- if (vin > 0)
128
- {
129
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
130
- {
131
- if (MSX.Species[m].type != BULK) continue;
132
-
133
- // --- new quality in mixing zone
134
- mixzone->c[m] = (mixzone->c[m] * mixzone->v * LperFT3 + massin[m]) / ((mixzone->v + vin)*LperFT3);
135
- mixzone->c[m] = MAX(0.0, mixzone->c[m]);
136
- }
137
- }
138
- if (vt > 0)
139
- {
140
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
141
- {
142
- if (MSX.Species[m].type != BULK) continue;
143
-
144
- // --- new quality in stagnant zone
145
-
146
- stagzone->c[m] = (stagzone->c[m] * stagzone->v + mixzone->c[m] * vt) / (stagzone->v + vt);
147
- stagzone->c[m] = MAX(0.0, stagzone->c[m]);
148
- }
149
-
150
-
151
-
152
- }
153
- }
154
- else if (vnet < 0) //tank is draining
155
- {
156
- if (stagzone->v > 0.0) vt = MIN(stagzone->v, (-vnet));
157
- if (vin + vt > 0.0)
158
- {
159
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
160
- {
161
- if (MSX.Species[m].type != BULK) continue;
162
-
163
- // --- new quality in mixing zone
164
- mixzone->c[m] = (mixzone->c[m] * mixzone->v * LperFT3 + massin[m] + stagzone->c[m]*vt*LperFT3) / ((mixzone->v + vin + vt)*LperFT3);
165
- mixzone->c[m] = MAX(0.0, mixzone->c[m]);
166
- }
167
- }
168
- }
169
-
170
- // Update segment volumes
171
- if (vt > 0.0)
172
- {
173
- mixzone->v = vmz;
174
- if (vnet > 0.0) stagzone->v += vt;
175
- else stagzone->v = MAX(0.0, ((stagzone->v) - vt));
176
- }
177
- else
178
- {
179
- mixzone->v += vnet;
180
- mixzone->v = MIN(mixzone->v, vmz);
181
- mixzone->v = MAX(0.0, mixzone->v);
182
- stagzone->v = 0.0;
183
- }
184
-
185
- if (mixzone->v > 0.0) MSXchem_equil(NODE, i, mixzone->c);
186
- if (stagzone->v > 0.0) MSXchem_equil(NODE, i, stagzone->c);
187
-
188
- // --- use quality of mixed compartment (mixzone) to represent quality
189
- // of tank since this is where outflow begins to flow from
190
-
191
- for (m=1; m<=MSX.Nobjects[SPECIES]; m++) MSX.Tank[i].c[m] = mixzone->c[m];
192
- }
193
-
194
- //=============================================================================
195
-
196
- void MSXtank_mix3(int i, double vin, double *massin, double vnet)
197
- /*
198
- ** Purpose: computes concentrations in the segments that form a
199
- ** first-in-first-out (FIFO) tank model.
200
- **
201
- ** Input: i = tank index
202
- ** vIn = volume of inflow to tank (ft3)
203
- ** massin = mass inflow
204
- ** vnet = inflow - outflow
205
- */
206
- {
207
- int k, m, n;
208
- double vout, vseg, vsum;
209
- Pseg seg;
210
-
211
- // --- find inflows & outflows
212
-
213
- k = MSX.Nobjects[LINK] + i;
214
- n = MSX.Tank[i].node;
215
- vout = vin - vnet;
216
-
217
- if (MSX.LastSeg[k] == NULL || MSX.FirstSeg[k] == NULL) return;
218
-
219
- if (vin > 0.0)
220
- {
221
-
222
- // --- quality is the same, so just add flow volume to last seg
223
- seg = MSX.LastSeg[k];
224
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
225
- {
226
- MSX.C1[m] = massin[m] / (vin*LperFT3);
227
- }
228
- if (seg != NULL && MSXqual_isSame(seg->c, MSX.C1))
229
- {
230
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
231
- seg->c[m] = (seg->c[m] * seg->v + MSX.C1[m] * vin) / (seg->v + vin);
232
- seg->v += vin;
233
- }
234
- // --- Otherwise add a new seg to tank
235
- else
236
- {
237
- seg = MSXqual_getFreeSeg(vin, MSX.C1);
238
- MSXqual_addSeg(k, seg);
239
- }
240
- }
241
-
242
-
243
- // --- initialize outflow volume & concentration
244
-
245
- vsum = 0.0;
246
- for (m=1; m<=MSX.Nobjects[SPECIES]; m++)
247
- MSX.C1[m] = 0.0;
248
- // --- withdraw flow from first segment
249
-
250
- while (vout > 0.0)
251
- {
252
- // --- get volume of current first segment
253
- seg = MSX.FirstSeg[k];
254
- if (seg == NULL) break;
255
- vseg = seg->v;
256
- vseg = MIN(vseg, vout);
257
- if ( seg == MSX.LastSeg[k] ) vseg = vout;
258
-
259
- // --- update mass & volume removed
260
- vsum += vseg;
261
- for (m=1; m<=MSX.Nobjects[SPECIES]; m++)
262
- {
263
- MSX.C1[m] += (seg->c[m]) * vseg * LperFT3;
264
- }
265
-
266
- // --- decrease vOut by volume of first segment
267
- vout -= vseg;
268
-
269
- // --- remove segment if all its volume is consumed
270
- if (vout >= 0.0 && vseg >= seg->v)
271
- {
272
- if (seg->prev)
273
- {
274
- MSX.FirstSeg[k] = seg->prev;
275
- // MSXqual_removeSeg(seg);
276
- seg->prev = MSX.FreeSeg;
277
- MSX.FreeSeg = seg;
278
-
279
- }
280
- }
281
-
282
- // --- otherwise just adjust volume of first segment
283
- else seg->v -= vseg;
284
- }
285
-
286
- // --- use quality from first segment to represent overall
287
- // quality of tank since this is where outflow flows from
288
-
289
- for (m=1; m<=MSX.Nobjects[SPECIES]; m++)
290
- {
291
- if (vsum > 0.0) MSX.Tank[i].c[m] = MSX.C1[m]/(vsum * LperFT3);
292
- else if (MSX.FirstSeg[k] == NULL) MSX.Tank[i].c[m] = 0.0;
293
- else MSX.Tank[i].c[m] = MSX.FirstSeg[k]->c[m];
294
- }
295
- // --- add new last segment for new flow entering tank
296
- }
297
-
298
- //=============================================================================
299
-
300
- void MSXtank_mix4(int i, double vin, double *massin, double vnet)
301
- /*
302
- **----------------------------------------------------------
303
- ** Input: i = tank index
304
- ** vin = volume of inflow to tank (ft3)
305
- ** massin = mass inflow
306
- ** vnet = vin - vout
307
- ** Output: none
308
- ** Purpose: Last In-First Out (LIFO) tank model
309
- **----------------------------------------------------------
310
- */
311
- {
312
- int k, m, n;
313
- double vsum, vseg;
314
- Pseg seg;
315
-
316
- // --- find inflows & outflows
317
-
318
- k = MSX.Nobjects[LINK] + i;
319
- n = MSX.Tank[i].node;
320
-
321
- if (MSX.LastSeg[k] == NULL || MSX.FirstSeg[k] == NULL) return;
322
-
323
- // --- keep track of total volume & mass removed from tank
324
-
325
- vsum = 0.0;
326
- if (vin > 0)
327
- {
328
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
329
- MSX.C1[m] = massin[m] / (vin*LperFT3);
330
- }
331
- else
332
- {
333
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
334
- MSX.C1[m] = 0;
335
- }
336
-
337
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
338
- MSX.Tank[i].c[m] = MSX.LastSeg[k]->c[m];
339
-
340
- seg = MSX.LastSeg[k];
341
- // --- if tank filling, then create a new last segment
342
- if ( vnet > 0.0 )
343
- {
344
-
345
- // --- inflow quality = last segment quality so just expand last segment
346
- if (seg != NULL && MSXqual_isSame(seg->c, MSX.C1))
347
- {
348
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
349
- seg->c[m] = (seg->c[m] * seg->v + MSX.C1[m] * vnet) / (seg->v + vnet);
350
- seg->v += vnet;
351
- }
352
-
353
- // --- otherwise add a new last segment to tank
354
-
355
- else
356
- {
357
- seg = MSXqual_getFreeSeg(vnet, MSX.C1);
358
- MSXqual_addSeg(k, seg);
359
- }
360
-
361
- // --- quality of tank is that of inflow
362
-
363
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
364
- MSX.Tank[i].c[m] = MSX.LastSeg[k]->c[m];
365
-
366
- }
367
-
368
- // --- if tank emptying then remove last segments until vNet consumed
369
-
370
- else if (vnet < 0.0)
371
- {
372
- for (m = 1; m <= MSX.Nobjects[SPECIES]; m++)
373
- MSX.C1[m] = 0;
374
- // --- keep removing volume from last segments until vNet is removed
375
- vsum = 0;
376
- vnet = -vnet;
377
- MSXqual_reversesegs(k);
378
- while (vnet > 0.0)
379
- {
380
-
381
- // --- get volume of current last segment
382
- seg = MSX.FirstSeg[k];
383
- if ( seg == NULL ) break;
384
- vseg = seg->v;
385
- vseg = MIN(vseg, vnet);
386
- if ( seg == MSX.LastSeg[k] ) vseg = vnet;
387
-
388
- // --- update mass & volume removed
389
- vsum += vseg;
390
- for (m=1; m<=MSX.Nobjects[SPECIES]; m++)
391
- MSX.C1[m] += (seg->c[m])*vseg*LperFT3;
392
-
393
- // --- reduce vNet by volume of last segment
394
- vnet -= vseg;
395
-
396
- // --- remove segment if all its volume is used up
397
- if (vnet >= 0.0 && vseg >= seg->v)
398
- {
399
- if (seg->prev)
400
- {
401
- MSX.FirstSeg[k] = seg->prev;
402
- MSXqual_removeSeg(seg);
403
-
404
- }
405
- }
406
- // --- otherwise just reduce volume of last segment
407
- else
408
- {
409
- seg->v -= vseg;
410
- }
411
- }
412
- MSXqual_reversesegs(k);
413
- // --- tank quality is mixture of flow released and any inflow
414
-
415
- vsum = vsum + vin;
416
- for (m=1; m<=MSX.Nobjects[SPECIES]; m++)
417
- {
418
- if (vsum > 0.0)
419
- MSX.Tank[i].c[m] = (MSX.C1[m] + massin[m]) / (vsum*LperFT3);
420
- }
421
- }
422
- }