Add more checks for ENsetnodevalue tank properties
Work in progress for issue #29
This commit is contained in:
46
src/epanet.c
46
src/epanet.c
@@ -1972,6 +1972,7 @@ int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v)
|
|||||||
int j;
|
int j;
|
||||||
Pdemand demand;
|
Pdemand demand;
|
||||||
Psource source;
|
Psource source;
|
||||||
|
double Htmp;
|
||||||
double value = v;
|
double value = v;
|
||||||
|
|
||||||
if (!Openflag) return(102);
|
if (!Openflag) return(102);
|
||||||
@@ -2092,6 +2093,7 @@ int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v)
|
|||||||
|
|
||||||
case EN_TANKDIAM:
|
case EN_TANKDIAM:
|
||||||
if (value <= 0.0) return(202);
|
if (value <= 0.0) return(202);
|
||||||
|
if (index <= Njuncs) return(251);
|
||||||
j = index - Njuncs;
|
j = index - Njuncs;
|
||||||
if (j > 0 && Tank[j].A > 0.0)
|
if (j > 0 && Tank[j].A > 0.0)
|
||||||
{
|
{
|
||||||
@@ -2101,10 +2103,15 @@ int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v)
|
|||||||
Tank[j].V0 = tankvolume(j, Tank[j].H0);
|
Tank[j].V0 = tankvolume(j, Tank[j].H0);
|
||||||
Tank[j].Vmax = tankvolume(j, Tank[j].Hmax);
|
Tank[j].Vmax = tankvolume(j, Tank[j].Hmax);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(251);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_MINVOLUME:
|
case EN_MINVOLUME:
|
||||||
if (value < 0.0) return(202);
|
if (value < 0.0) return(202);
|
||||||
|
if (index <= Njuncs) return(251);
|
||||||
j = index - Njuncs;
|
j = index - Njuncs;
|
||||||
if (j > 0 && Tank[j].A > 0.0)
|
if (j > 0 && Tank[j].A > 0.0)
|
||||||
{
|
{
|
||||||
@@ -2112,41 +2119,65 @@ int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v)
|
|||||||
Tank[j].V0 = tankvolume(j, Tank[j].H0);
|
Tank[j].V0 = tankvolume(j, Tank[j].H0);
|
||||||
Tank[j].Vmax = tankvolume(j, Tank[j].Hmax);
|
Tank[j].Vmax = tankvolume(j, Tank[j].Hmax);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(251);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_MINLEVEL:
|
case EN_MINLEVEL:
|
||||||
if (value < 0.0) return(202);
|
if (value < 0.0) return(202);
|
||||||
|
if (index <= Njuncs) return(251); //not a tank or reservoir
|
||||||
j = index - Njuncs;
|
j = index - Njuncs;
|
||||||
if (j > 0 && Tank[j].A > 0.0)
|
if (Tank[j].A == 0.0) return(251); //node is a reservoir
|
||||||
|
Htmp = value/Ucf[ELEV] + Node[index].El;
|
||||||
|
if (Htmp < Tank[j].Hmax && Htmp <= Tank[j].H0)
|
||||||
{
|
{
|
||||||
if (Tank[j].Vcurve > 0) return(202);
|
if (Tank[j].Vcurve > 0) return(202);
|
||||||
Tank[j].Hmin = value/Ucf[ELEV] + Node[index].El;
|
Tank[j].Hmin = Htmp;
|
||||||
Tank[j].Vmin = tankvolume(j, Tank[j].Hmin);
|
Tank[j].Vmin = tankvolume(j, Tank[j].Hmin);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(251);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_MAXLEVEL:
|
case EN_MAXLEVEL:
|
||||||
if (value < 0.0) return(202);
|
if (value < 0.0) return(202);
|
||||||
|
if (index <= Njuncs) return(251); //not a tank or reservoir
|
||||||
j = index - Njuncs;
|
j = index - Njuncs;
|
||||||
if (j > 0 && Tank[j].A > 0.0)
|
if (Tank[j].A == 0.0) return(251); //node is a reservoir
|
||||||
|
Htmp = value/Ucf[ELEV] + Node[index].El;
|
||||||
|
if (Htmp > Tank[j].Hmin && Htmp >= Tank[j].H0)
|
||||||
{
|
{
|
||||||
if (Tank[j].Vcurve > 0) return(202);
|
if (Tank[j].Vcurve > 0) return(202);
|
||||||
Tank[j].Hmax = value/Ucf[ELEV] + Node[index].El;
|
Tank[j].Hmax = Htmp;
|
||||||
Tank[j].Vmax = tankvolume(j, Tank[j].Hmax);
|
Tank[j].Vmax = tankvolume(j, Tank[j].Hmax);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(251);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_MIXMODEL:
|
case EN_MIXMODEL:
|
||||||
j = ROUND(value);
|
j = ROUND(value);
|
||||||
|
if (index <= Njuncs) return(251);
|
||||||
if (j < MIX1 || j > LIFO) return(202);
|
if (j < MIX1 || j > LIFO) return(202);
|
||||||
if (index > Njuncs && Tank[index-Njuncs].A > 0.0)
|
if (index > Njuncs && Tank[index-Njuncs].A > 0.0)
|
||||||
{
|
{
|
||||||
Tank[index-Njuncs].MixModel = (char)j;
|
Tank[index-Njuncs].MixModel = (char)j;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(251);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_MIXFRACTION:
|
case EN_MIXFRACTION:
|
||||||
if (value < 0.0 || value > 1.0) return(202);
|
if (value < 0.0 || value > 1.0) return(202);
|
||||||
|
if (index <= Njuncs) return(251);
|
||||||
j = index - Njuncs;
|
j = index - Njuncs;
|
||||||
if (j > 0 && Tank[j].A > 0.0)
|
if (j > 0 && Tank[j].A > 0.0)
|
||||||
{
|
{
|
||||||
@@ -2155,12 +2186,17 @@ int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_TANK_KBULK:
|
case EN_TANK_KBULK:
|
||||||
|
if (index <= Njuncs) return(251);
|
||||||
j = index - Njuncs;
|
j = index - Njuncs;
|
||||||
if (j > 0 && Tank[j].A > 0.0)
|
if (j > 0 && Tank[j].A > 0.0)
|
||||||
{
|
{
|
||||||
Tank[j].Kb = value/SECperDAY;
|
Tank[j].Kb = value/SECperDAY;
|
||||||
Reactflag = 1;
|
Reactflag = 1;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(251);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*** New parameter additions ends here. ***/ //(2.00.12 - LR)
|
/*** New parameter additions ends here. ***/ //(2.00.12 - LR)
|
||||||
@@ -3264,7 +3300,7 @@ void freedata()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Free memory for node coordinates */
|
/* Free memory for node coordinates */
|
||||||
if (Coordflag == TRUE) free(Coord);
|
if (Coordflag == TRUE) free(Coord);
|
||||||
|
|
||||||
/* Free memory for rule base (see RULES.C) */
|
/* Free memory for rule base (see RULES.C) */
|
||||||
freerules();
|
freerules();
|
||||||
|
|||||||
Reference in New Issue
Block a user