diff --git a/src/epanet.c b/src/epanet.c index fd92f6f..34e8d53 100755 --- a/src/epanet.c +++ b/src/epanet.c @@ -1095,7 +1095,7 @@ int DLLEXPORT ENgettimeparam(int code, long *value) { *value = 0; if (!Openflag) return(102); - if (code < EN_DURATION || code > EN_STARTTIME) return(251); + if (code < EN_DURATION || code > EN_NEXTEVENT) return(251); switch (code) { case EN_DURATION: *value = Dur; break; @@ -1108,6 +1108,11 @@ int DLLEXPORT ENgettimeparam(int code, long *value) case EN_STATISTIC: *value = Tstatflag; break; case EN_PERIODS: *value = Nperiods; break; case EN_STARTTIME: *value = Tstart; break; /* Added TNT 10/2/2009 */ + case EN_HTIME: *value = Htime; break; + case EN_NEXTEVENT: + *value = Hstep; // find the lesser of the hydraulic time step length, or the time to next fill/empty + tanktimestep(value); + break; } return(0); } @@ -1252,6 +1257,27 @@ int DLLEXPORT ENgeterror(int errcode, char *errmsg, int n) else return(0); } +int DLLEXPORT ENgetstatistic(int code, int* value) +/*---------------------------------------------------------------- + ** Input: code = type of simulation statistic to retrieve + ** Output: value = value of requested statistic + ** Returns: error code + ** Purpose: retrieves hydraulic simulation statistic + **---------------------------------------------------------------- + */ +{ + switch (code) { + case EN_ITERATIONS: + *value = _iterations; + break; + case EN_RELATIVEERROR: + *value = _relativeError; + break; + default: + break; + } + return 0; +} /* ---------------------------------------------------------------- @@ -1442,7 +1468,12 @@ int DLLEXPORT ENgetnodevalue(int index, int code, float *value) v = 0.0; if ( index > Njuncs ) v = Tank[index-Njuncs].Vmin * Ucf[VOLUME]; break; - + + case EN_MAXVOLUME: // !sph + v = 0.0; + if ( index > Njuncs ) v = Tank[index-Njuncs].Vmax * Ucf[VOLUME]; + break; + case EN_VOLCURVE: v = 0.0; if ( index > Njuncs ) v = Tank[index-Njuncs].Vcurve; @@ -2298,7 +2329,12 @@ int DLLEXPORT ENsettimeparam(int code, long value) */ { if (!Openflag) return(102); - if (OpenHflag || OpenQflag) return(109); + if (OpenHflag || OpenQflag) { + // --> there's nothing wrong with changing certain time parameters during a simulation run + if (code != EN_DURATION) { + return(109); + } + } if (value < 0) return(202); switch(code) { @@ -2335,6 +2371,8 @@ int DLLEXPORT ENsettimeparam(int code, long value) case EN_STATISTIC: if (value > RANGE) return(202); Tstatflag = (char)value; break; + case EN_HTIME: Htime = value; + break; default: return(251); } return(0); @@ -2567,7 +2605,7 @@ int openhydfile() nsize[2] = Ntanks; nsize[3] = Npumps; nsize[4] = Nvalves; - nsize[5] = Dur; + nsize[5] = (int)Dur; fwrite(&magic,sizeof(INT4),1,HydFile); fwrite(&version,sizeof(INT4),1,HydFile); fwrite(nsize,sizeof(INT4),6,HydFile); diff --git a/src/hydraul.c b/src/hydraul.c index 53b77f4..a56e14a 100755 --- a/src/hydraul.c +++ b/src/hydraul.c @@ -204,6 +204,10 @@ int runhyd(long *t) /* Report new status & save results */ if (Statflag) writehydstat(iter,relerr); + /* solution info */ + _relativeError = relerr; + _iterations = iter; + /*** Updated 3/1/01 ***/ /* If system unbalanced and no extra trials */ /* allowed, then activate the Haltflag. */ diff --git a/src/toolkit.h b/src/toolkit.h index 1c56c47..016a31f 100755 --- a/src/toolkit.h +++ b/src/toolkit.h @@ -61,8 +61,8 @@ AUTHOR: L. Rossman #define EN_MAXLEVEL 21 #define EN_MIXFRACTION 22 #define EN_TANK_KBULK 23 - -#define EN_TANKVOLUME 24 /* TNT */ +#define EN_TANKVOLUME 24 +#define EN_MAXVOLUME 25 #define EN_DIAMETER 0 /* Link parameters */ #define EN_LENGTH 1 @@ -91,6 +91,12 @@ AUTHOR: L. Rossman #define EN_STATISTIC 8 #define EN_PERIODS 9 #define EN_STARTTIME 10 /* Added TNT 10/2/2009 */ +#define EN_HTIME 11 +#define EN_HALTFLAG 12 +#define EN_NEXTEVENT 13 + +#define EN_ITERATIONS 0 +#define EN_RELATIVEERROR 1 #define EN_NODECOUNT 0 /* Component counts */ #define EN_TANKCOUNT 1 @@ -206,6 +212,7 @@ extern "C" { int DLLEXPORT ENgetpatternvalue(int, int, float *); int DLLEXPORT ENgetqualtype(int *, int *); int DLLEXPORT ENgeterror(int, char *, int); + int DLLEXPORT ENgetstatistic(int code, int* value); int DLLEXPORT ENgetnodeindex(char *, int *); int DLLEXPORT ENgetnodeid(int, char *); diff --git a/src/vars.h b/src/vars.h index ebd91c1..b8b821b 100755 --- a/src/vars.h +++ b/src/vars.h @@ -158,6 +158,7 @@ EXTERN Svalve *Valve; /* Valve data */ EXTERN Scontrol *Control; /* Control data */ EXTERN HTtable *Nht, *Lht; /* Hash tables for ID labels */ EXTERN Padjlist *Adjlist; /* Node adjacency lists */ +EXTERN int _relativeError, _iterations; /* Info about hydraulic solution */ /* ** NOTE: Hydraulic analysis of the pipe network at a given point in time