diff --git a/src/epanet.c b/src/epanet.c index 91b9fcf..95a3712 100755 --- a/src/epanet.c +++ b/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();