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;
|
||||
Pdemand demand;
|
||||
Psource source;
|
||||
double Htmp;
|
||||
double value = v;
|
||||
|
||||
if (!Openflag) return(102);
|
||||
@@ -2092,6 +2093,7 @@ int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v)
|
||||
|
||||
case EN_TANKDIAM:
|
||||
if (value <= 0.0) return(202);
|
||||
if (index <= Njuncs) return(251);
|
||||
j = index - Njuncs;
|
||||
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].Vmax = tankvolume(j, Tank[j].Hmax);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(251);
|
||||
}
|
||||
break;
|
||||
|
||||
case EN_MINVOLUME:
|
||||
if (value < 0.0) return(202);
|
||||
if (index <= Njuncs) return(251);
|
||||
j = index - Njuncs;
|
||||
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].Vmax = tankvolume(j, Tank[j].Hmax);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(251);
|
||||
}
|
||||
break;
|
||||
|
||||
case EN_MINLEVEL:
|
||||
if (value < 0.0) return(202);
|
||||
if (index <= Njuncs) return(251); //not a tank or reservoir
|
||||
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);
|
||||
Tank[j].Hmin = value/Ucf[ELEV] + Node[index].El;
|
||||
Tank[j].Hmin = Htmp;
|
||||
Tank[j].Vmin = tankvolume(j, Tank[j].Hmin);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(251);
|
||||
}
|
||||
break;
|
||||
|
||||
case EN_MAXLEVEL:
|
||||
if (value < 0.0) return(202);
|
||||
if (index <= Njuncs) return(251); //not a tank or reservoir
|
||||
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);
|
||||
Tank[j].Hmax = value/Ucf[ELEV] + Node[index].El;
|
||||
Tank[j].Hmax = Htmp;
|
||||
Tank[j].Vmax = tankvolume(j, Tank[j].Hmax);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(251);
|
||||
}
|
||||
break;
|
||||
|
||||
case EN_MIXMODEL:
|
||||
j = ROUND(value);
|
||||
if (index <= Njuncs) return(251);
|
||||
if (j < MIX1 || j > LIFO) return(202);
|
||||
if (index > Njuncs && Tank[index-Njuncs].A > 0.0)
|
||||
{
|
||||
Tank[index-Njuncs].MixModel = (char)j;
|
||||
}
|
||||
else
|
||||
{
|
||||
return(251);
|
||||
}
|
||||
break;
|
||||
|
||||
case EN_MIXFRACTION:
|
||||
if (value < 0.0 || value > 1.0) return(202);
|
||||
if (index <= Njuncs) return(251);
|
||||
j = index - Njuncs;
|
||||
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;
|
||||
|
||||
case EN_TANK_KBULK:
|
||||
if (index <= Njuncs) return(251);
|
||||
j = index - Njuncs;
|
||||
if (j > 0 && Tank[j].A > 0.0)
|
||||
{
|
||||
Tank[j].Kb = value/SECperDAY;
|
||||
Reactflag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return(251);
|
||||
}
|
||||
break;
|
||||
|
||||
/*** New parameter additions ends here. ***/ //(2.00.12 - LR)
|
||||
@@ -3264,7 +3300,7 @@ void freedata()
|
||||
}
|
||||
|
||||
/* Free memory for node coordinates */
|
||||
if (Coordflag == TRUE) free(Coord);
|
||||
if (Coordflag == TRUE) free(Coord);
|
||||
|
||||
/* Free memory for rule base (see RULES.C) */
|
||||
freerules();
|
||||
|
||||
Reference in New Issue
Block a user