Adding leakage model
This commit is contained in:
66
src/epanet.c
66
src/epanet.c
@@ -7,7 +7,7 @@
|
||||
Authors: see AUTHORS
|
||||
Copyright: see AUTHORS
|
||||
License: see LICENSE
|
||||
Last Updated: 09/28/2023
|
||||
Last Updated: 06/26/2024
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
@@ -510,6 +510,10 @@ int DLLEXPORT EN_initH(EN_Project p, int initFlag)
|
||||
return errcode;
|
||||
}
|
||||
}
|
||||
|
||||
// Open pipe leakage modeling system
|
||||
errcode = openleakage(p);
|
||||
if (errcode) return errcode;
|
||||
|
||||
// Initialize hydraulics solver
|
||||
inithyd(p, fflag);
|
||||
@@ -564,7 +568,11 @@ int DLLEXPORT EN_closeH(EN_Project p)
|
||||
*/
|
||||
{
|
||||
if (!p->Openflag) return 102;
|
||||
if (p->hydraul.OpenHflag) closehyd(p);
|
||||
if (p->hydraul.OpenHflag)
|
||||
{
|
||||
closeleakage(p);
|
||||
closehyd(p);
|
||||
}
|
||||
p->hydraul.OpenHflag = FALSE;
|
||||
return 0;
|
||||
}
|
||||
@@ -1044,6 +1052,9 @@ int DLLEXPORT EN_getstatistic(EN_Project p, int type, double *value)
|
||||
case EN_DEMANDREDUCTION:
|
||||
*value = p->hydraul.DemandReduction;
|
||||
break;
|
||||
case EN_LEAKAGELOSS:
|
||||
*value = p->hydraul.LeakageLoss;
|
||||
break;
|
||||
case EN_MASSBALANCE:
|
||||
*value = p->quality.MassBalance.ratio;
|
||||
break;
|
||||
@@ -1864,8 +1875,10 @@ int DLLEXPORT EN_addnode(EN_Project p, const char *id, int nodeType, int *index)
|
||||
hyd->NodeDemand = (double *)realloc(hyd->NodeDemand, size);
|
||||
qual->NodeQual = (double *)realloc(qual->NodeQual, size);
|
||||
hyd->NodeHead = (double *)realloc(hyd->NodeHead, size);
|
||||
hyd->DemandFlow = (double *)realloc(hyd->DemandFlow, size);
|
||||
hyd->FullDemand = (double *)realloc(hyd->FullDemand, size);
|
||||
hyd->EmitterFlow = (double *)realloc(hyd->EmitterFlow, size);
|
||||
hyd->LeakageFlow = (double *)realloc(hyd->LeakageFlow, size);
|
||||
hyd->DemandFlow = (double *)realloc(hyd->DemandFlow, size);
|
||||
|
||||
// Actions taken when a new Junction is added
|
||||
if (nodeType == EN_JUNCTION)
|
||||
@@ -2256,7 +2269,7 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val
|
||||
Ucf[VOLUME];
|
||||
break;
|
||||
|
||||
case EN_DEMAND:
|
||||
case EN_DEMAND: // Consumer Demand + Emitter Flow + Leakage Flow
|
||||
v = hyd->NodeDemand[index] * Ucf[FLOW];
|
||||
break;
|
||||
|
||||
@@ -2336,11 +2349,10 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val
|
||||
|
||||
case EN_DEMANDDEFICIT:
|
||||
if (index > nJuncs) return 0;
|
||||
// After an analysis, DemandFlow contains node's required demand
|
||||
// while NodeDemand contains delivered demand + emitter flow
|
||||
if (hyd->DemandFlow[index] < 0.0) return 0;
|
||||
v = (hyd->DemandFlow[index] -
|
||||
(hyd->NodeDemand[index] - hyd->EmitterFlow[index])) * Ucf[FLOW];
|
||||
// FullDemand contains node's required consumer demand
|
||||
// while DemandFlow contains delivered consumer demand
|
||||
if (hyd->FullDemand[index] <= 0.0) return 0;
|
||||
v = (hyd->FullDemand[index] - hyd->DemandFlow[index]) * Ucf[FLOW];
|
||||
break;
|
||||
|
||||
case EN_NODE_INCONTROL:
|
||||
@@ -2350,6 +2362,18 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val
|
||||
case EN_EMITTERFLOW:
|
||||
v = hyd->EmitterFlow[index] * Ucf[FLOW];
|
||||
break;
|
||||
|
||||
case EN_LEAKAGEFLOW:
|
||||
v = hyd->LeakageFlow[index] * Ucf[FLOW];
|
||||
break;
|
||||
|
||||
case EN_DEMANDFLOW: // Consumer demand delivered
|
||||
v = hyd->DemandFlow[index] * Ucf[FLOW];
|
||||
break;
|
||||
|
||||
case EN_FULLDEMAND: // Consumer demand requested
|
||||
v = hyd->FullDemand[index] * Ucf[FLOW];
|
||||
break;
|
||||
|
||||
default:
|
||||
return 251;
|
||||
@@ -3352,6 +3376,8 @@ int DLLEXPORT EN_addlink(EN_Project p, const char *id, int linkType,
|
||||
}
|
||||
link->Kb = 0;
|
||||
link->Kw = 0;
|
||||
link->LeakArea = 0;
|
||||
link->LeakExpan = 0;
|
||||
link->R = 0;
|
||||
link->Rc = 0;
|
||||
link->Rpt = 0;
|
||||
@@ -3923,6 +3949,18 @@ int DLLEXPORT EN_getlinkvalue(EN_Project p, int index, int property, double *val
|
||||
v = (double)incontrols(p, LINK, index);
|
||||
break;
|
||||
|
||||
case EN_LEAK_AREA:
|
||||
v = Link[index].LeakArea * Ucf[LENGTH];
|
||||
break;
|
||||
|
||||
case EN_LEAK_EXPAN:
|
||||
v = Link[index].LeakExpan * Ucf[LENGTH];
|
||||
break;
|
||||
|
||||
case EN_LINK_LEAKAGE:
|
||||
v = findlinkleakage(p, index) * Ucf[FLOW];
|
||||
break;
|
||||
|
||||
default:
|
||||
return 251;
|
||||
}
|
||||
@@ -4163,6 +4201,16 @@ int DLLEXPORT EN_setlinkvalue(EN_Project p, int index, int property, double valu
|
||||
}
|
||||
break;
|
||||
|
||||
case EN_LEAK_AREA: // leak area in sq mm per 100 pipe length units
|
||||
if (value < 0.0) return 211;
|
||||
Link[index].LeakArea = value / Ucf[LENGTH];
|
||||
break;
|
||||
|
||||
case EN_LEAK_EXPAN: // leak area expansion slope (sq mm per unit of head)
|
||||
if (value < 0.0) return 211;
|
||||
Link[index].LeakExpan = value / Ucf[LENGTH];
|
||||
break;
|
||||
|
||||
default:
|
||||
return 251;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user