PDA fixes

This commit is contained in:
Lew Rossman
2019-07-22 09:50:41 -04:00
parent 3fe11b98ee
commit a89f339525
18 changed files with 814 additions and 221 deletions

View File

@@ -7,7 +7,7 @@
Authors: see AUTHORS
Copyright: see AUTHORS
License: see LICENSE
Last Updated: 05/15/2019
Last Updated: 07/18/2019
******************************************************************************
*/
@@ -68,7 +68,6 @@ int DLLEXPORT EN_deleteproject(EN_Project p)
remove(p->TmpOutFname);
remove(p->TmpStatFname);
free(p);
p = NULL;
return 0;
}
@@ -1040,19 +1039,25 @@ int DLLEXPORT EN_getstatistic(EN_Project p, int type, double *value)
switch (type)
{
case EN_ITERATIONS:
*value = (double)p->hydraul.Iterations;
*value = p->hydraul.Iterations;
break;
case EN_RELATIVEERROR:
*value = (double)p->hydraul.RelativeError;
*value = p->hydraul.RelativeError;
break;
case EN_MAXHEADERROR:
*value = (double)(p->hydraul.MaxHeadError * p->Ucf[HEAD]);
*value = p->hydraul.MaxHeadError * p->Ucf[HEAD];
break;
case EN_MAXFLOWCHANGE:
*value = (double)(p->hydraul.MaxFlowChange * p->Ucf[FLOW]);
*value = p->hydraul.MaxFlowChange * p->Ucf[FLOW];
break;
case EN_DEFICIENTNODES:
*value = p->hydraul.DeficientNodes;
break;
case EN_DEMANDREDUCTION:
*value = p->hydraul.DemandReduction;
break;
case EN_MASSBALANCE:
*value = (double)(p->quality.MassBalance.ratio);
*value = p->quality.MassBalance.ratio;
break;
default:
*value = 0.0;
@@ -2050,7 +2055,6 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val
int nJuncs = net->Njuncs;
double *Ucf = p->Ucf;
double *NodeDemand = hyd->NodeDemand;
double *NodeHead = hyd->NodeHead;
double *NodeQual = qual->NodeQual;
@@ -2128,7 +2132,7 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val
break;
case EN_DEMAND:
v = NodeDemand[index] * Ucf[FLOW];
v = hyd->NodeDemand[index] * Ucf[FLOW];
break;
case EN_HEAD:
@@ -2204,7 +2208,16 @@ int DLLEXPORT EN_getnodevalue(EN_Project p, int index, int property, double *val
if (Node[index].Type != TANK) return 0;
v = Tank[index - nJuncs].CanOverflow;
break;
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];
break;
default:
return 251;
}
@@ -2702,9 +2715,9 @@ int DLLEXPORT EN_getdemandmodel(EN_Project p, int *model, double *pmin,
*/
{
*model = p->hydraul.DemandModel;
*pmin = (double)(p->hydraul.Pmin * p->Ucf[PRESSURE]);
*preq = (double)(p->hydraul.Preq * p->Ucf[PRESSURE]);
*pexp = (double)(p->hydraul.Pexp);
*pmin = p->hydraul.Pmin * p->Ucf[PRESSURE];
*preq = p->hydraul.Preq * p->Ucf[PRESSURE];
*pexp = p->hydraul.Pexp;
return 0;
}
@@ -2722,7 +2735,12 @@ int DLLEXPORT EN_setdemandmodel(EN_Project p, int model, double pmin,
*/
{
if (model < 0 || model > EN_PDA) return 251;
if (pmin > preq || pexp <= 0.0) return 209;
if (model == EN_PDA)
{
if (pexp <= 0.0) return 208;
if (pmin < 0.0) return 208;
if (preq - pmin < MINPDIFF) return 208;
}
p->hydraul.DemandModel = model;
p->hydraul.Pmin = pmin / p->Ucf[PRESSURE];
p->hydraul.Preq = preq / p->Ucf[PRESSURE];