diff --git a/src/epanet.c b/src/epanet.c index 47882ba..be8c83d 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -1847,7 +1847,7 @@ int DLLEXPORT EN_addnode(EN_Project p, char *id, int nodeType, int *index) tank->Pat = 0; tank->Vcurve = 0; tank->MixModel = 0; - tank->V1max = 10000; + tank->V1frac = 1; tank->CanOverflow = FALSE; } net->Nnodes++; @@ -2164,7 +2164,9 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val case EN_MIXZONEVOL: v = 0.0; - if (index > nJuncs) v = Tank[index - nJuncs].V1max * Ucf[VOLUME]; + if (index > nJuncs) + v = Tank[index - nJuncs].V1frac * Tank[index - nJuncs].Vmax * + Ucf[VOLUME]; break; case EN_DEMAND: @@ -2224,9 +2226,9 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val case EN_MIXFRACTION: v = 1.0; - if (index > nJuncs && Tank[index - nJuncs].Vmax > 0.0) + if (index > nJuncs) { - v = Tank[index - nJuncs].V1max / Tank[index - nJuncs].Vmax; + v = Tank[index - nJuncs].V1frac; } break; @@ -2293,7 +2295,6 @@ int DLLEXPORT EN_setnodevalue(EN_Project p, int index, int property, double valu int i, j, n; Psource source; double hTmp; - double vTmp; if (!p->Openflag) return 102; if (index <= 0 || index > nNodes) return 203; @@ -2418,9 +2419,7 @@ int DLLEXPORT EN_setnodevalue(EN_Project p, int index, int property, double valu // shape below Hmin. Vmin can always be changed by setting // EN_MINVOLUME in a subsequent function call. Tank[j].V0 = tankvolume(p, j, Tank[j].H0); // new init. volume - vTmp = Tank[j].Vmax; // old max. volume Tank[j].Vmax = tankvolume(p, j, Tank[j].Hmax); // new max. volume - Tank[j].V1max *= Tank[j].Vmax / vTmp; // new mix zone volume break; case EN_MINVOLUME: @@ -2450,9 +2449,7 @@ int DLLEXPORT EN_setnodevalue(EN_Project p, int index, int property, double valu // Since Vmin changes the other volumes need updating Tank[j].V0 = tankvolume(p, j, Tank[j].H0); // new init. volume - vTmp = Tank[j].Vmax; // old max. volume Tank[j].Vmax = tankvolume(p, j, Tank[j].Hmax); // new max. volume - Tank[j].V1max *= Tank[j].Vmax / vTmp; // new mix zone volume } break; @@ -2477,9 +2474,7 @@ int DLLEXPORT EN_setnodevalue(EN_Project p, int index, int property, double valu Tank[j].Vcurve = i; // assign curve to tank Tank[j].Vmin = tankvolume(p, j, Tank[j].Hmin); // new min. volume Tank[j].V0 = tankvolume(p, j, Tank[j].H0); // new init. volume - vTmp = Tank[j].Vmax; // old max. volume Tank[j].Vmax = tankvolume(p, j, Tank[j].Hmax); // new max. volume - Tank[j].V1max *= Tank[j].Vmax / vTmp; // new mix zone volume Tank[j].A = (curve->Y[n] - curve->Y[0]) / // nominal area (curve->X[n] - curve->X[0]); break; @@ -2521,9 +2516,7 @@ int DLLEXPORT EN_setnodevalue(EN_Project p, int index, int property, double valu if (value > curve->X[n]) return 225; // new level is off curve } Tank[j].Hmax = hTmp; // new max. head - vTmp = Tank[j].Vmax; // old max. volume Tank[j].Vmax = tankvolume(p, j, hTmp); // new max. volume - Tank[j].V1max *= Tank[j].Vmax / vTmp; // new mix zone volume break; case EN_MIXMODEL: @@ -2542,7 +2535,7 @@ int DLLEXPORT EN_setnodevalue(EN_Project p, int index, int property, double valu j = index - nJuncs; if (Tank[j].A > 0.0) { - Tank[j].V1max = value * Tank[j].Vmax; + Tank[j].V1frac = value; } break; diff --git a/src/inpfile.c b/src/inpfile.c index 39e361f..c8eb1a9 100644 --- a/src/inpfile.c +++ b/src/inpfile.c @@ -523,7 +523,7 @@ int saveinpfile(Project *pr, const char *fname) tank = &net->Tank[i]; if (tank->A == 0.0) continue; fprintf(f, "\n %-31s %-8s %12.4f", net->Node[tank->Node].ID, - MixTxt[tank->MixModel], (tank->V1max / tank->Vmax)); + MixTxt[tank->MixModel], tank->V1frac); } // Write [REACTIONS] section diff --git a/src/input1.c b/src/input1.c index 10a6f95..e79da83 100644 --- a/src/input1.c +++ b/src/input1.c @@ -588,7 +588,6 @@ void convertunits(Project *pr) tank->Kb /= SECperDAY; tank->V = tank->V0; tank->C = node->C0; - tank->V1max *= tank->Vmax; } // Convert hydraulic convergence criteria diff --git a/src/input3.c b/src/input3.c index 28570fc..e89d6e1 100644 --- a/src/input3.c +++ b/src/input3.c @@ -252,7 +252,7 @@ int tankdata(Project *pr) tank->Vcurve = curve; tank->MixModel = MIX1; // Completely mixed - tank->V1max = 1.0; // Mixing compartment size fraction + tank->V1frac = 1.0; // Mixing compartment size fraction return 0; } @@ -1288,7 +1288,7 @@ int mixingdata(Project *pr) i = j - net->Njuncs; if (net->Tank[i].A == 0.0) return 0; net->Tank[i].MixModel = (char)m; - net->Tank[i].V1max = v; + net->Tank[i].V1frac = v; return 0; } diff --git a/src/qualreact.c b/src/qualreact.c index 1042527..1fc5710 100644 --- a/src/qualreact.c +++ b/src/qualreact.c @@ -525,7 +525,7 @@ void tankmix2(Project *pr, int i, double vin, double win, double vnet) if (mixzone == NULL || stagzone == NULL) return; // Full mixing zone volume - vmz = tank->V1max; + vmz = tank->V1frac * tank->Vmax; // Tank is filling vt = 0.0; diff --git a/src/qualroute.c b/src/qualroute.c index 592f92f..b71f218 100644 --- a/src/qualroute.c +++ b/src/qualroute.c @@ -612,7 +612,7 @@ void initsegs(Project *pr) if (net->Tank[j].MixModel == MIX2) { // ... mixing zone segment - v1 = MAX(0, v - net->Tank[j].V1max); + v1 = MAX(0, v - net->Tank[j].V1frac * net->Tank[j].Vmax); qual->FirstSeg[k]->v = v1; // ... stagnant zone segment diff --git a/src/types.h b/src/types.h index 50dc50a..902a22d 100755 --- a/src/types.h +++ b/src/types.h @@ -7,7 +7,7 @@ Authors: see AUTHORS Copyright: see AUTHORS License: see LICENSE - Last Updated: 10/29/2019 + Last Updated: 07/11/2020 ****************************************************************************** */ @@ -428,7 +428,7 @@ typedef struct // Tank Object int Pat; // fixed grade time pattern int Vcurve; // volume v. elev. curve index MixType MixModel; // type of mixing model - double V1max; // mixing compartment size + double V1frac; // mixing compartment fraction int CanOverflow; // tank can overflow or not } Stank;