diff --git a/LICENSE b/LICENSE index b347c9c..828c521 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,11 @@ MIT License +<<<<<<< HEAD Works are copyright (c) 2018 their respective AUTHORS, unless such work is in the Public Domain (again, see AUTHORS) +======= +Copyright (c) 2017 Open Water Analytics +>>>>>>> master Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/appveyor.yml b/appveyor.yml index e831634..d9ef393 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,8 +9,23 @@ version: 2.0.{build} -image: - - Visual Studio 2013 +matrix: + allow_failures: + #GROUP: (SUPPORTED/EXPERIMENTAL) + #EXPERIMENTAL is allowed to fail under build matrix + - GROUP: "EXPERIMENTAL" + +environment: + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + GENERATOR: "Visual Studio 10 2010" + GROUP: "SUPPORTED" + BOOST_ROOT: "C:/Libraries/boost" + # New build on Visual Studio 15 2017 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + GENERATOR: "Visual Studio 15 2017" + GROUP: "EXPERIMENTAL" + BOOST_ROOT: "C:/Libraries/boost_1_67_0" # called before repo cloning init: @@ -18,8 +33,11 @@ init: - set BUILD_HOME=buildprod - set TEST_HOME=nrtestsuite - set NRTEST_SCRIPT=C:\Python27\Scripts - - set GENERATOR="Visual Studio 10 2010" - - set BOOST_ROOT="C:\\Libraries\\boost" + # See values set + - echo %APPVEYOR_BUILD_WORKER_IMAGE% + - echo %BUILD_HOME% + - echo %GENERATOR% + - echo %BOOST_ROOT% # called after repo clone install: @@ -29,7 +47,7 @@ install: before_build: - mkdir %BUILD_HOME% - cd %BUILD_HOME% - - cmake -G %GENERATOR% + - cmake -G "%GENERATOR%" -DBUILD_TESTS=1 -DBOOST_ROOT="%BOOST_ROOT%" -DBoost_USE_STATIC_LIBS="ON" .. diff --git a/run/main.c b/run/main.c index c2480b1..bda132f 100644 --- a/run/main.c +++ b/run/main.c @@ -5,9 +5,9 @@ #define MAXMSG 255 /* Max. # characters in message text */ #define MAXWARNCODE 99 /* text copied here, no more need of include "text.h" */ -#define FMT01 "\nEPANET Version %d.%d.%d\n" +#define FMT01 "\nEPANET Version %d.%d.%d" #define FMT03 "\n Correct syntax is:\n %s \n" -#define FMT09 "\nEPANET completed.\n" +#define FMT09 "\n\nEPANET completed." #define FMT10 "\nEPANET completed. There are warnings." #define FMT11 "\nEPANET completed. There are errors." @@ -87,7 +87,8 @@ int main(int argc, char *argv[]) /* Call the main control function */ if (strlen(f2)> 0) { /* use stdout for progress messages */ - errcode = ENepanet(f1,f2,f3,writeConsole); + //errcode = ENepanet(f1,f2,f3,writeConsole); + errcode = ENepanet(f1, f2, f3, NULL); } else { /* use stdout for reporting, no progress messages */ @@ -101,21 +102,21 @@ int main(int argc, char *argv[]) return(0); } else { + if (errcode > MAXWARNCODE) printf("\n Fatal Error: "); ENgeterror(errcode, errmsg, MAXMSG); writeConsole(errmsg); if (errcode > MAXWARNCODE) { - /* error */ + // error // writeConsole(FMT11); return(errcode); } else { - /* warning */ + // warning // writeConsole(FMT10); return(0); } } - } /* End of main */ diff --git a/src/epanet.c b/src/epanet.c index b4768ed..602e0ed 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -108,6 +108,10 @@ execute function x and set the error code equal to its return value. #ifdef __WIN32__ #define WINDOWS #endif +#ifdef WINDOWS +#include +#endif + /************************************************************/ #include @@ -125,7 +129,6 @@ execute function x and set the error code equal to its return value. #include "text.h" #include "types.h" #define EXTERN -#include "epanet2.h" #include "vars.h" /**************************************************************** @@ -166,218 +169,295 @@ int DLLEXPORT ENepanet(char *f1, char *f2, char *f3, EN_free(_defaultModel); return (errcode); } + int DLLEXPORT ENopen(char *f1, char *f2, char *f3) { int errcode = 0; ERRCODE(EN_alloc(&_defaultModel)); EN_open(_defaultModel, f1, f2, f3); return (errcode); } + int DLLEXPORT ENsaveinpfile(char *filename) { return EN_saveinpfile(_defaultModel, filename); } + int DLLEXPORT ENclose() { return EN_close(_defaultModel); } + int DLLEXPORT ENsolveH() { return EN_solveH(_defaultModel); } + int DLLEXPORT ENsaveH() { return EN_saveH(_defaultModel); } + int DLLEXPORT ENopenH() { return EN_openH(_defaultModel); } + int DLLEXPORT ENinitH(int flag) { return EN_initH(_defaultModel, flag); } + int DLLEXPORT ENrunH(long *t) { return EN_runH(_defaultModel, t); } + int DLLEXPORT ENnextH(long *tstep) { return EN_nextH(_defaultModel, tstep); } + int DLLEXPORT ENcloseH() { return EN_closeH(_defaultModel); } + int DLLEXPORT ENsavehydfile(char *filename) { return EN_savehydfile(_defaultModel, filename); } + int DLLEXPORT ENusehydfile(char *filename) { return EN_usehydfile(_defaultModel, filename); } + int DLLEXPORT ENsolveQ() { return EN_solveQ(_defaultModel); } + int DLLEXPORT ENopenQ() { return EN_openQ(_defaultModel); } + int DLLEXPORT ENinitQ(int saveflag) { return EN_initQ(_defaultModel, saveflag); } + int DLLEXPORT ENrunQ(long *t) { return EN_runQ(_defaultModel, t); } + int DLLEXPORT ENnextQ(long *tstep) { return EN_nextQ(_defaultModel, tstep); } + int DLLEXPORT ENstepQ(long *tleft) { return EN_stepQ(_defaultModel, tleft); } + int DLLEXPORT ENcloseQ() { return EN_closeQ(_defaultModel); } + int DLLEXPORT ENwriteline(char *line) { return EN_writeline(_defaultModel, line); } + int DLLEXPORT ENreport() { return EN_report(_defaultModel); } + int DLLEXPORT ENresetreport() { return EN_resetreport(_defaultModel); } + int DLLEXPORT ENsetreport(char *s) { return EN_setreport(_defaultModel, s); } + int DLLEXPORT ENgetversion(int *v) { return EN_getversion(v); } + int DLLEXPORT ENgetcontrol(int cindex, int *ctype, int *lindex, EN_API_FLOAT_TYPE *setting, int *nindex, EN_API_FLOAT_TYPE *level) { return EN_getcontrol(_defaultModel, cindex, ctype, lindex, setting, nindex, level); } + int DLLEXPORT ENgetcount(int code, int *count) { return EN_getcount(_defaultModel, (EN_CountType)code, count); } + int DLLEXPORT ENgetoption(int code, EN_API_FLOAT_TYPE *value) { return EN_getoption(_defaultModel, (EN_Option)code, value); } + int DLLEXPORT ENgettimeparam(int code, long *value) { return EN_gettimeparam(_defaultModel, code, value); } + int DLLEXPORT ENgetflowunits(int *code) { return EN_getflowunits(_defaultModel, code); } + int DLLEXPORT ENsetflowunits(int code) { return EN_setflowunits(_defaultModel, code); } + int DLLEXPORT ENgetpatternindex(char *id, int *index) { return EN_getpatternindex(_defaultModel, id, index); } + int DLLEXPORT ENgetpatternid(int index, char *id) { return EN_getpatternid(_defaultModel, index, id); } + int DLLEXPORT ENgetpatternlen(int index, int *len) { return EN_getpatternlen(_defaultModel, index, len); } + int DLLEXPORT ENgetpatternvalue(int index, int period, EN_API_FLOAT_TYPE *value) { return EN_getpatternvalue(_defaultModel, index, period, value); } + int DLLEXPORT ENgetcurveindex(char *id, int *index) { return EN_getcurveindex(_defaultModel, id, index); } + int DLLEXPORT ENgetcurveid(int index, char *id) { return EN_getcurveid(_defaultModel, index, id); } + int DLLEXPORT ENgetcurvelen(int index, int *len) { return EN_getcurvelen(_defaultModel, index, len); } + int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) { return EN_getcurvevalue(_defaultModel, index, pnt, x, y); } + int DLLEXPORT ENgetqualtype(int *qualcode, int *tracenode) { return EN_getqualtype(_defaultModel, qualcode, tracenode); } + int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, int *tracenode) { return EN_getqualinfo(_defaultModel, qualcode, chemname, chemunits, tracenode); } + int DLLEXPORT ENgeterror(int errcode, char *errmsg, int n) { return EN_geterror(errcode, errmsg, n); } + int DLLEXPORT ENgetstatistic(int code, EN_API_FLOAT_TYPE *value) { return EN_getstatistic(_defaultModel, code, value); } + int DLLEXPORT ENgetnodeindex(char *id, int *index) { return EN_getnodeindex(_defaultModel, id, index); } + int DLLEXPORT ENgetnodeid(int index, char *id) { return EN_getnodeid(_defaultModel, index, id); } + int DLLEXPORT ENgetnodetype(int index, int *code) { return EN_getnodetype(_defaultModel, index, code); } + int DLLEXPORT ENgetcoord(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) { return EN_getcoord(_defaultModel, index, x, y); } + int DLLEXPORT ENsetcoord(int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) { return EN_setcoord(_defaultModel, index, x, y); } + int DLLEXPORT ENgetnodevalue(int index, int code, EN_API_FLOAT_TYPE *value) { return EN_getnodevalue(_defaultModel, index, code, value); } + int DLLEXPORT ENgetlinkindex(char *id, int *index) { return EN_getlinkindex(_defaultModel, id, index); } + int DLLEXPORT ENgetlinkid(int index, char *id) { return EN_getlinkid(_defaultModel, index, id); } + int DLLEXPORT ENgetlinktype(int index, EN_LinkType *code) { return EN_getlinktype(_defaultModel, index, code); } + int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2) { return EN_getlinknodes(_defaultModel, index, node1, node2); } + int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value) { return EN_getlinkvalue(_defaultModel, index, (EN_LinkProperty)code, value); } + int DLLEXPORT ENgetcurve(int curveIndex, char *id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues) { return EN_getcurve(_defaultModel, curveIndex, id, nValues, xValues, yValues); } + int DLLEXPORT ENsetcontrol(int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level) { return EN_setcontrol(_defaultModel, cindex, ctype, lindex, setting, nindex, level); } + int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v) { return EN_setnodevalue(_defaultModel, index, code, v); } + int DLLEXPORT ENsetlinkvalue(int index, int code, EN_API_FLOAT_TYPE v) { return EN_setlinkvalue(_defaultModel, index, code, v); } + int DLLEXPORT ENaddpattern(char *id) { return EN_addpattern(_defaultModel, id); } + int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *f, int n) { return EN_setpattern(_defaultModel, index, f, n); } + int DLLEXPORT ENsetpatternvalue(int index, int period, EN_API_FLOAT_TYPE value) { return EN_setpatternvalue(_defaultModel, index, period, value); } + int DLLEXPORT ENaddcurve(char *id) { return EN_addcurve(_defaultModel, id); } + int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int n) { return EN_setcurve(_defaultModel, index, x, y, n); } + int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) { return EN_setcurvevalue(_defaultModel, index, pnt, x, y); } + int DLLEXPORT ENsettimeparam(int code, long value) { return EN_settimeparam(_defaultModel, code, value); } + int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v) { return EN_setoption(_defaultModel, code, v); } + int DLLEXPORT ENsetstatusreport(int code) { return EN_setstatusreport(_defaultModel, code); } + int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, char *tracenode) { return EN_setqualtype(_defaultModel, qualcode, chemname, chemunits, tracenode); } + int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex) { return EN_getheadcurveindex(_defaultModel, index, curveindex); } + int DLLEXPORT ENsetheadcurveindex(int index, int curveindex) { return EN_setheadcurveindex(_defaultModel, index, curveindex); } + int DLLEXPORT ENgetpumptype(int index, int *type) { return EN_getpumptype(_defaultModel, index, type); } + int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands) { return EN_getnumdemands(_defaultModel, nodeIndex, numDemands); } + int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE *baseDemand) { return EN_getbasedemand(_defaultModel, nodeIndex, demandIdx, baseDemand); } + int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand) { return EN_setbasedemand(_defaultModel, nodeIndex, demandIdx, baseDemand); } + int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIdx, int *pattIdx) { return EN_getdemandpattern(_defaultModel, nodeIndex, demandIdx, pattIdx); } + int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value) { return EN_getaveragepatternvalue(_defaultModel, index, value); } -int DLLEXPORT ENgetrule(int index, int *nPremises, int *nTrueActions, int *nFalseActions, EN_API_FLOAT_TYPE *priority) { + +int DLLEXPORT ENgetrule(int index, int *nPremises, int *nTrueActions, + int *nFalseActions, EN_API_FLOAT_TYPE *priority) { return EN_getrule(_defaultModel, index, nPremises, nTrueActions, nFalseActions, priority); } @@ -405,19 +485,23 @@ int DLLEXPORT ENsetpremisevalue(int indexRule, int indexPremise, EN_API_FLOAT_TY return EN_setpremisevalue(_defaultModel, indexRule, indexPremise, value); } -int DLLEXPORT ENgettrueaction(int indexRule, int indexAction, int *indexLink, int *status, EN_API_FLOAT_TYPE *setting){ +int DLLEXPORT ENgettrueaction(int indexRule, int indexAction, int *indexLink, + int *status, EN_API_FLOAT_TYPE *setting){ return EN_gettrueaction(_defaultModel, indexRule, indexAction, indexLink, status, setting); } -int DLLEXPORT ENsettrueaction(int indexRule, int indexAction, int indexLink, int status, EN_API_FLOAT_TYPE setting){ +int DLLEXPORT ENsettrueaction(int indexRule, int indexAction, int indexLink, + int status, EN_API_FLOAT_TYPE setting){ return EN_settrueaction(_defaultModel, indexRule, indexAction, indexLink, status, setting); } -int DLLEXPORT ENgetfalseaction(int indexRule, int indexAction, int *indexLink, int *status, EN_API_FLOAT_TYPE *setting){ +int DLLEXPORT ENgetfalseaction(int indexRule, int indexAction, int *indexLink, + int *status, EN_API_FLOAT_TYPE *setting){ return EN_getfalseaction(_defaultModel, indexRule, indexAction, indexLink, status, setting); } -int DLLEXPORT ENsetfalseaction(int indexRule, int indexAction, int indexLink, int status, EN_API_FLOAT_TYPE setting){ +int DLLEXPORT ENsetfalseaction(int indexRule, int indexAction, int indexLink, + int status, EN_API_FLOAT_TYPE setting){ return EN_setfalseaction(_defaultModel, indexRule, indexAction, indexLink, status, setting); } @@ -428,16 +512,20 @@ int DLLEXPORT ENgetruleID(int indexRule, char* id){ int DLLEXPORT ENsetlinktype(char *id, EN_LinkType toType) { return EN_setlinktype(_defaultModel, id, toType); } + int DLLEXPORT ENaddnode(char *id, EN_NodeType nodeType) { return EN_addnode(_defaultModel, id, nodeType); } + int DLLEXPORT ENaddlink(char *id, EN_LinkType linkType, char *fromNode, char *toNode) { return EN_addlink(_defaultModel, id, linkType, fromNode, toNode); } + int DLLEXPORT ENdeletelink(int index) { return EN_deletelink(_defaultModel, index); } + int DLLEXPORT ENdeletenode(int index) { return EN_deletenode(_defaultModel, index); } @@ -707,7 +795,6 @@ int DLLEXPORT EN_solveH(EN_Project *p) tstep = 0; ERRCODE(EN_runH(p, &t)); ERRCODE(EN_nextH(p, &tstep)); - /*** Updated 6/24/02 ***/ writecon("\b\b\b\b\b\b\b\b\b\b"); } while (tstep > 0); @@ -825,8 +912,10 @@ int DLLEXPORT EN_initH(EN_Project *p, int flag) errcode = openhydfile(p); if (!errcode) p->save_options.Saveflag = TRUE; - else + else { errmsg(p, errcode); + return errcode; + } } /* Initialize hydraulics */ @@ -1546,7 +1635,7 @@ int DLLEXPORT EN_geterror(int errcode, char *errmsg, int n) { strncpy(errmsg, WARN6, n); break; default: - geterrmsg(n, newMsg); + geterrmsg(errcode, newMsg); strncpy(errmsg, newMsg, n); } if (strlen(errmsg) == 0) @@ -3330,7 +3419,7 @@ int openhydfile(EN_Project *p) out->HydFile = NULL; switch (out->Hydflag) { case SCRATCH: - getTmpName(p, out->HydFname); + getTmpName(out->HydFname); out->HydFile = fopen(out->HydFname, "w+b"); break; case SAVE: @@ -3423,7 +3512,7 @@ int openoutfile(EN_Project *p) // else if ( (OutFile = tmpfile()) == NULL) else { - getTmpName(p, out->OutFname); + getTmpName(out->OutFname); if ((out->OutFile = fopen(out->OutFname, "w+b")) == NULL) { writecon(FMT08); @@ -3441,7 +3530,7 @@ int openoutfile(EN_Project *p) if (!errcode) { if (rep->Tstatflag != SERIES) { // if ( (TmpOutFile = tmpfile()) == NULL) errcode = 304; - getTmpName(p, out->TmpFname); + getTmpName(out->TmpFname); out->TmpOutFile = fopen(out->TmpFname, "w+b"); if (out->TmpOutFile == NULL) errcode = 304; @@ -3748,17 +3837,35 @@ void freedata(EN_Project *p) ---------------------------------------------------------------- */ -/*** New function for 2.00.12 ***/ -char *getTmpName(EN_Project *p, char *fname) +char *getTmpName(char *fname) // // Input: fname = file name string // Output: returns pointer to file name // Purpose: creates a temporary file name with path prepended to it. // { - out_file_t *out = &p->out_files; + +#ifdef _WIN32 + + char* name = NULL; + + // --- use Windows _tempnam function to get a pointer to an + // unused file name that begins with "en" + name = _tempnam(NULL, "en"); + if (name == NULL) return NULL; + + // --- copy the file name to fname + if (strlen(name) < MAXFNAME) strncpy(fname, name, MAXFNAME); + else fname = NULL; + + // --- free the pointer returned by _tempnam + if (name) free(name); + +/* +/////////////////// DEPRECATED ///////////////////////////////////// // --- for Windows systems: #ifdef WINDOWS + out_file_t *out = &p->out_files; // --- use system function tmpnam() to create a temporary file name char name[MAXFNAME + 1]; int n; @@ -3782,6 +3889,7 @@ char *getTmpName(EN_Project *p, char *fname) // --- now add the prefix to the file name strcat(fname, name); +*/ // --- for non-Windows systems: #else diff --git a/src/funcs.h b/src/funcs.h index b006c78..79490c6 100755 --- a/src/funcs.h +++ b/src/funcs.h @@ -31,32 +31,32 @@ AUTHOR: L. Rossman #include "types.h" -void initpointers(EN_Project *p); /* Initializes pointers */ -int allocdata(EN_Project *p); /* Allocates memory */ -void freeTmplist(STmplist *); /* Frees items in linked list */ -void freeFloatlist(SFloatlist *); /* Frees list of floats */ -void freedata(EN_Project *p); /* Frees allocated memory */ +void initpointers(EN_Project *p); /* Initializes pointers */ +int allocdata(EN_Project *p); /* Allocates memory */ +void freeTmplist(STmplist *); /* Frees items in linked list */ +void freeFloatlist(SFloatlist *); /* Frees list of floats */ +void freedata(EN_Project *p); /* Frees allocated memory */ int openfiles(EN_Project *p, char *,char *,char *); /* Opens input & report files */ -int openhydfile(EN_Project *p); /* Opens hydraulics file */ -int openoutfile(EN_Project *p); /* Opens binary output file */ -int strcomp(char *, char *); /* Compares two strings */ -char* getTmpName(EN_Project *p, char* fname); /* Gets temporary file name */ -double interp(int, double *,double *, double); /* Interpolates a data curve */ +int openhydfile(EN_Project *p); /* Opens hydraulics file */ +int openoutfile(EN_Project *p); /* Opens binary output file */ +int strcomp(char *, char *); /* Compares two strings */ +char* getTmpName(char* fname); /* Gets temporary file name */ +double interp(int, double *,double *, double); /* Interpolates a data curve */ -int findnode(EN_Network *n, char *); /* Finds node's index from ID */ -int findlink(EN_Network *n, char *); /* Finds link's index from ID */ -int findtank(EN_Network *n, int); /* Find tank index from node index */ // (AH) -int findvalve(EN_Network *n, int); /* Find valve index from node index */ // (AH) -int findpump(EN_Network *n, int); /* Find pump index from node index */ // (AH) -char *geterrmsg(int errcode, char *msg); /* Gets text of error message */ -void errmsg(EN_Project *p, int); /* Reports program error */ -void writecon(char *); /* Writes text to console */ +int findnode(EN_Network *n, char *); /* Finds node's index from ID */ +int findlink(EN_Network *n, char *); /* Finds link's index from ID */ +int findtank(EN_Network *n, int); /* Find tank index from node index */ // (AH) +int findvalve(EN_Network *n, int); /* Find valve index from node index */ // (AH) +int findpump(EN_Network *n, int); /* Find pump index from node index */ // (AH) +char *geterrmsg(int errcode, char *msg); /* Gets text of error message */ +void errmsg(EN_Project *p, int); /* Reports program error */ +void writecon(char *); /* Writes text to console */ void writewin(void (*vp)(char *), char *); /* Passes text to calling app */ /* ------- INPUT1.C --------------------*/ int getdata(EN_Project *pr); /* Gets network data */ void setdefaults(EN_Project *pr); /* Sets default values */ -void initreport(report_options_t *r); /* Initializes report options */ +void initreport(report_options_t *r); /* Initializes report options */ void adjustdata(EN_Project *pr); /* Adjusts input data */ int inittanks(EN_Project *pr); /* Initializes tank levels */ void initunits(EN_Project *pr); /* Determines reporting units */ @@ -65,23 +65,23 @@ void convertunits(EN_Project *pr); /* Converts data to std. uni /* -------- INPUT2.C -------------------*/ int netsize(EN_Project *pr); /* Determines network size */ int readdata(EN_Project *pr); /* Reads in network data */ -int newline(EN_Project *pr, int, char *); /* Processes new line of data */ -int addnodeID(EN_Network *n, int, char *); /* Adds node ID to data base */ -int addlinkID(EN_Network *n, int, char *); /* Adds link ID to data base */ -int addpattern(parser_data_t *par, char *); /* Adds pattern to data base */ -int addcurve(parser_data_t *par, char *); /* Adds curve to data base */ -STmplist *findID(char *, STmplist *); /* Locates ID on linked list */ +int newline(EN_Project *pr, int, char *); /* Processes new line of data */ +int addnodeID(EN_Network *n, int, char *); /* Adds node ID to data base */ +int addlinkID(EN_Network *n, int, char *); /* Adds link ID to data base */ +int addpattern(parser_data_t *par, char *); /* Adds pattern to data base */ +int addcurve(parser_data_t *par, char *); /* Adds curve to data base */ +STmplist *findID(char *, STmplist *); /* Locates ID on linked list */ int unlinked(EN_Project *pr); /* Checks for unlinked nodes */ int getpumpparams(EN_Project *pr); /* Computes pump curve coeffs.*/ int getpatterns(EN_Project *pr); /* Gets pattern data from list*/ int getcurves(EN_Project *pr); /* Gets curve data from list */ -int findmatch(char *, char *[]); /* Finds keyword in line */ -int match(const char *, const char *); /* Checks for word match */ +int findmatch(char *, char *[]); /* Finds keyword in line */ +int match(const char *, const char *); /* Checks for word match */ int gettokens(char *s, char** Tok, int maxToks, char *comment); /* Tokenizes input line */ -int getfloat(char *, double *); /* Converts string to double */ -double hour(char *, char *); /* Converts time to hours */ -int setreport(EN_Project *pr, char *); /* Processes reporting command*/ -void inperrmsg(EN_Project *pr, int,int,char *); /* Input error message */ +int getfloat(char *, double *); /* Converts string to double */ +double hour(char *, char *); /* Converts time to hours */ +int setreport(EN_Project *pr, char *); /* Processes reporting command*/ +void inperrmsg(EN_Project *pr, int,int,char *); /* Input error message */ /* ---------- INPUT3.C -----------------*/ int juncdata(EN_Project *pr); /* Processes junction data */ @@ -104,188 +104,206 @@ int statusdata(EN_Project *pr); /* Processes link status dat int reportdata(EN_Project *pr); /* Processes report options */ int timedata(EN_Project *pr); /* Processes time options */ int optiondata(EN_Project *pr); /* Processes analysis options */ -int optionchoice(EN_Project *pr, int); /* Processes option choices */ -int optionvalue(EN_Project *pr, int); /* Processes option values */ -int getpumpcurve(EN_Project *pr, int); /* Constructs a pump curve */ -int powercurve(double, double, double,/* Coeffs. of power pump curve*/ +int optionchoice(EN_Project *pr, int); /* Processes option choices */ +int optionvalue(EN_Project *pr, int); /* Processes option values */ +int getpumpcurve(EN_Project *pr, int); /* Constructs a pump curve */ +int powercurve(double, double, double, /* Coeffs. of power pump curve*/ double, double, double *, double *, double *); -int valvecheck(EN_Project *pr, int, int, int); /* Checks valve placement */ +int valvecheck(EN_Project *pr, int, int, int); /* Checks valve placement */ void changestatus(EN_Network *net, int, StatType, double); /* Changes status of a link */ /* -------------- RULES.C --------------*/ void initrules(rules_t *rules); /* Initializes rule base */ -void addrule(parser_data_t *par, char *); /* Adds rule to rule base */ +void addrule(parser_data_t *par, char *); /* Adds rule to rule base */ int allocrules(EN_Project *pr); /* Allocates memory for rule */ int ruledata(EN_Project *pr); /* Processes rule input data */ -int checkrules(EN_Project *pr, long); /* Checks all rules */ +int checkrules(EN_Project *pr, long); /* Checks all rules */ void freerules(EN_Project *pr); /* Frees rule base memory */ +int writeRuleinInp(EN_Project *pr, FILE *f, /* Writes rule to an INP file */ + int RuleIdx); /* ------------- REPORT.C --------------*/ int writereport(EN_Project *pr); /* Writes formatted report */ void writelogo(EN_Project *pr); /* Writes program logo */ void writesummary(EN_Project *pr); /* Writes network summary */ -void writehydstat(EN_Project *pr, int,double); /* Writes hydraulic status */ +void writehydstat(EN_Project *pr, int,double); /* Writes hydraulic status */ void writeenergy(EN_Project *pr); /* Writes energy usage */ int writeresults(EN_Project *pr); /* Writes node/link results */ -void writeheader(EN_Project *pr, int,int); /* Writes heading on report */ -void writeline(EN_Project *pr, char *); /* Writes line to report file */ -void writerelerr(EN_Project *pr, int, double); /* Writes convergence error */ +void writeheader(EN_Project *pr, int,int); /* Writes heading on report */ +void writeline(EN_Project *pr, char *); /* Writes line to report file */ +void writerelerr(EN_Project *pr, int, double); /* Writes convergence error */ void writestatchange(EN_Project *pr, int,char,char); /* Writes link status change */ void writecontrolaction(EN_Project *pr, int, int); /* Writes control action taken*/ void writeruleaction(EN_Project *pr, int, char *); /* Writes rule action taken */ int writehydwarn(EN_Project *pr, int,double); /* Writes hydraulic warnings */ void writehyderr(EN_Project *pr, int); /* Writes hydraulic error msg.*/ -int disconnected(EN_Project *pr); /* Checks for disconnections */ +int disconnected(EN_Project *pr); /* Checks for disconnections */ void marknodes(EN_Project *pr, int, int *, char *); /* Identifies connected nodes */ void getclosedlink(EN_Project *pr, int, char *); /* Finds a disconnecting link */ void writelimits(EN_Project *pr, int,int); /* Writes reporting limits */ int checklimits(report_options_t *rep, double *,int,int); /* Checks variable limits */ void writetime(EN_Project *pr, char *); /* Writes current clock time */ -char *clocktime(char *, long); /* Converts time to hrs:min */ -char *fillstr(char *, char, int); /* Fills string with character*/ -int getnodetype(EN_Network *net, int); /* Determines node type */ +char *clocktime(char *, long); /* Converts time to hrs:min */ +char *fillstr(char *, char, int); /* Fills string with character*/ +int getnodetype(EN_Network *net, int); /* Determines node type */ /* --------- HYDRAUL.C -----------------*/ int openhyd(EN_Project *pr); /* Opens hydraulics solver */ /*** Updated 3/1/01 ***/ -void inithyd(EN_Project *pr, int initFlags); /* Re-sets initial conditions */ +void inithyd(EN_Project *pr, int initFlags); /* Re-sets initial conditions */ -int runhyd(EN_Project *pr, long *); /* Solves 1-period hydraulics */ -int nexthyd(EN_Project *pr, long *); /* Moves to next time period */ +int runhyd(EN_Project *pr, long *); /* Solves 1-period hydraulics */ +int nexthyd(EN_Project *pr, long *); /* Moves to next time period */ void closehyd(EN_Project *pr); /* Closes hydraulics solver */ int allocmatrix(EN_Project *pr); /* Allocates matrix coeffs. */ void freematrix(EN_Project *pr); /* Frees matrix coeffs. */ -void initlinkflow(EN_Project *pr, int, char, double); /* Initializes link flow */ -void setlinkflow(EN_Project *pr, int, double); /* Sets link flow via headloss*/ -void setlinkstatus(EN_Project *pr, int, char, StatType *, double *); /* Sets link status */ +void initlinkflow(EN_Project *pr, int, char, + double); /* Initializes link flow */ +void setlinkflow(EN_Project *pr, int, double); /* Sets link flow via headloss*/ +void setlinkstatus(EN_Project *pr, int, char, + StatType *, double *); /* Sets link status */ -void setlinksetting(EN_Project *pr, int, double, StatType *, double *); /* Sets pump/valve setting */ +void setlinksetting(EN_Project *pr, int, double, + StatType *, double *); /* Sets pump/valve setting */ -void resistance(EN_Project *pr, int); /* Computes resistance coeff. */ +void resistance(EN_Project *pr, int); /* Computes resistance coeff. */ void demands(EN_Project *pr); /* Computes current demands */ int controls(EN_Project *pr); /* Controls link settings */ long timestep(EN_Project *pr); /* Computes new time step */ -int tanktimestep(EN_Project *pr, long *); /* Time till tanks fill/drain */ -void controltimestep(EN_Project *pr, long *); /* Time till control action */ -void ruletimestep(EN_Project *pr, long *); /* Time till rule action */ -void addenergy(EN_Project *pr, long); /* Accumulates energy usage */ -void getenergy(EN_Project *pr, int, double *, double *); /* Computes link energy use */ -void tanklevels(EN_Project *pr, long); /* Computes new tank levels */ -double tankvolume(EN_Project *pr, int,double); /* Finds tank vol. from grade */ -double tankgrade(EN_Project *pr, int,double); /* Finds tank grade from vol. */ -int netsolve(EN_Project *pr, int *,double *); /* Solves network equations */ -int badvalve(EN_Project *pr, int); /* Checks for bad valve */ +int tanktimestep(EN_Project *pr, long *); /* Time till tanks fill/drain */ +void controltimestep(EN_Project *pr, long *); /* Time till control action */ +void ruletimestep(EN_Project *pr, long *); /* Time till rule action */ +void addenergy(EN_Project *pr, long); /* Accumulates energy usage */ +void getenergy(EN_Project *pr, int, double *, + double *); /* Computes link energy use */ +void tanklevels(EN_Project *pr, long); /* Computes new tank levels */ +double tankvolume(EN_Project *pr, int,double); /* Finds tank vol. from grade */ +double tankgrade(EN_Project *pr, int,double); /* Finds tank grade from vol. */ +int netsolve(EN_Project *pr, int *,double *); /* Solves network equations */ +int badvalve(EN_Project *pr, int); /* Checks for bad valve */ int valvestatus(EN_Project *pr); /* Updates valve status */ int linkstatus(EN_Project *pr); /* Updates link status */ -StatType cvstatus(EN_Project *pr, StatType,double,double); /* Updates CV status */ -StatType pumpstatus(EN_Project *pr, int,double); /* Updates pump status */ -StatType prvstatus(EN_Project *pr, int,StatType,double,double,double); /* Updates PRV status */ +StatType cvstatus(EN_Project *pr, StatType, + double,double); /* Updates CV status */ +StatType pumpstatus(EN_Project *pr, int,double); /* Updates pump status */ +StatType prvstatus(EN_Project *pr, int,StatType, + double,double,double); /* Updates PRV status */ -StatType psvstatus(EN_Project *pr, int,StatType,double,double,double); /* Updates PSV status */ +StatType psvstatus(EN_Project *pr, int,StatType, + double,double,double); /* Updates PSV status */ -StatType fcvstatus(EN_Project *pr, int,StatType,double,double); /* Updates FCV status */ +StatType fcvstatus(EN_Project *pr, int,StatType, + double,double); /* Updates FCV status */ -void tankstatus(EN_Project *pr, int,int,int); /* Checks if tank full/empty */ +void tankstatus(EN_Project *pr, int,int,int); /* Checks if tank full/empty */ int pswitch(EN_Project *pr); /* Pressure switch controls */ double newflows(EN_Project *pr); /* Updates link flows */ void newcoeffs(EN_Project *pr); /* Computes matrix coeffs. */ void linkcoeffs(EN_Project *pr); /* Computes link coeffs. */ void nodecoeffs(EN_Project *pr); /* Computes node coeffs. */ void valvecoeffs(EN_Project *pr); /* Computes valve coeffs. */ -void pipecoeff(EN_Project *pr, int); /* Computes pipe coeff. */ -double DWcoeff(EN_Project *pr, int, double *); /* Computes D-W coeff. */ -void pumpcoeff(EN_Project *pr, int); /* Computes pump coeff. */ +void pipecoeff(EN_Project *pr, int); /* Computes pipe coeff. */ +double DWcoeff(EN_Project *pr, int, double *); /* Computes D-W coeff. */ +void pumpcoeff(EN_Project *pr, int); /* Computes pump coeff. */ /*** Updated 10/25/00 ***/ /*** Updated 12/29/00 ***/ -void curvecoeff(EN_Project *pr, int,double,double *,double *); /* Computes curve coeffs. */ +void curvecoeff(EN_Project *pr, int,double, + double *,double *); /* Computes curve coeffs. */ -void gpvcoeff(EN_Project *pr, int iLink); /* Computes GPV coeff. */ -void pbvcoeff(EN_Project *pr, int iLink); /* Computes PBV coeff. */ -void tcvcoeff(EN_Project *pr, int iLink); /* Computes TCV coeff. */ -void prvcoeff(EN_Project *pr, int iLink, int n1, int n2); /* Computes PRV coeff. */ -void psvcoeff(EN_Project *pr, int iLink, int n1, int n2); /* Computes PSV coeff. */ -void fcvcoeff(EN_Project *pr, int iLink, int n1, int n2); /* Computes FCV coeff. */ +void gpvcoeff(EN_Project *pr, int iLink); /* Computes GPV coeff. */ +void pbvcoeff(EN_Project *pr, int iLink); /* Computes PBV coeff. */ +void tcvcoeff(EN_Project *pr, int iLink); /* Computes TCV coeff. */ +void prvcoeff(EN_Project *pr, int iLink, int n1, int n2); /* Computes PRV coeff. */ +void psvcoeff(EN_Project *pr, int iLink, int n1, int n2); /* Computes PSV coeff. */ +void fcvcoeff(EN_Project *pr, int iLink, int n1, int n2); /* Computes FCV coeff. */ void emittercoeffs(EN_Project *pr); /* Computes emitter coeffs. */ -double emitflowchange(EN_Project *pr, int); /* Computes new emitter flow */ +double emitflowchange(EN_Project *pr, int); /* Computes new emitter flow */ /* ----------- SMATRIX.C ---------------*/ int createsparse(EN_Project *pr); /* Creates sparse matrix */ int allocsparse(EN_Project *pr); /* Allocates matrix memory */ void freesparse(EN_Project *pr); /* Frees matrix memory */ -int buildlists(EN_Project *pr, int); /* Builds adjacency lists */ -int paralink(EN_Project *pr, int, int, int); /* Checks for parallel links */ +int buildlists(EN_Project *pr, int); /* Builds adjacency lists */ +int paralink(EN_Project *pr, int, int, int); /* Checks for parallel links */ void xparalinks(EN_Project *pr); /* Removes parallel links */ void freelists(EN_Project *pr); /* Frees adjacency lists */ void countdegree(EN_Project *pr); /* Counts links at each node */ int reordernodes(EN_Project *pr); /* Finds a node re-ordering */ -int mindegree(solver_t *s, int, int); /* Finds min. degree node */ -int growlist(EN_Project *pr, int); /* Augments adjacency list */ -int newlink(EN_Project *pr, Padjlist); /* Adds fill-ins for a node */ -int linked(EN_Network *net, int, int); /* Checks if 2 nodes linked */ -int addlink(EN_Network *net, int, int, int); /* Creates new fill-in */ -int storesparse(EN_Project *pr, int); /* Stores sparse matrix */ -int ordersparse(hydraulics_t *h, int); /* Orders matrix storage */ -void transpose(int,int *,int *, /* Transposes sparse matrix */ +int mindegree(solver_t *s, int, int); /* Finds min. degree node */ +int growlist(EN_Project *pr, int); /* Augments adjacency list */ +int newlink(EN_Project *pr, Padjlist); /* Adds fill-ins for a node */ +int linked(EN_Network *net, int, int); /* Checks if 2 nodes linked */ +int addlink(EN_Network *net, int, int, int); /* Creates new fill-in */ +int storesparse(EN_Project *pr, int); /* Stores sparse matrix */ +int ordersparse(hydraulics_t *h, int); /* Orders matrix storage */ +void transpose(int,int *,int *, /* Transposes sparse matrix */ int *,int *,int *,int *,int *); -int linsolve(solver_t *s, int); /* via Cholesky factorization */ +int linsolve(solver_t *s, int); /* Solves set of linear eqns. */ /* ----------- QUALITY.C ---------------*/ int openqual(EN_Project *pr); /* Opens WQ solver system */ void initqual(EN_Project *pr); /* Initializes WQ solver */ -int runqual(EN_Project *pr, long *); /* Gets current WQ results */ -int nextqual(EN_Project *pr, long *); /* Updates WQ by hyd.timestep */ -int stepqual(EN_Project *pr, long *); /* Updates WQ by WQ time step */ +int runqual(EN_Project *pr, long *); /* Gets current WQ results */ +int nextqual(EN_Project *pr, long *); /* Updates WQ by hyd.timestep */ +int stepqual(EN_Project *pr, long *); /* Updates WQ by WQ time step */ int closequal(EN_Project *pr); /* Closes WQ solver system */ -int gethyd(EN_Project *pr, long *, long *); /* Gets next hyd. results */ +int gethyd(EN_Project *pr, long *, long *); /* Gets next hyd. results */ char setReactflag(EN_Project *pr); /* Checks for reactive chem. */ -void transport(EN_Project *pr, long); /* Transports mass in network */ +void transport(EN_Project *pr, long); /* Transports mass in network */ void initsegs(EN_Project *pr); /* Initializes WQ segments */ void reorientsegs(EN_Project *pr); /* Re-orients WQ segments */ -void updatesegs(EN_Project *pr, long); /* Updates quality in segments*/ -void removesegs(EN_Project *pr, int); /* Removes a WQ segment */ -void addseg(EN_Project *pr, int,double,double); /* Adds a WQ segment to pipe */ -void accumulate(EN_Project *pr, long); /* Sums mass flow into node */ -void updatenodes(EN_Project *pr, long); /* Updates WQ at nodes */ -void sourceinput(EN_Project *pr, long); /* Computes source inputs */ -void release(EN_Project *pr, long); /* Releases mass from nodes */ -void updatetanks(EN_Project *pr, long); /* Updates WQ in tanks */ -void updatesourcenodes(EN_Project *pr, long); /* Updates WQ at source nodes */ -void tankmix1(EN_Project *pr, int, long); /* Complete mix tank model */ -void tankmix2(EN_Project *pr, int, long); /* 2-compartment tank model */ -void tankmix3(EN_Project *pr, int, long); /* FIFO tank model */ -void tankmix4(EN_Project *pr, int, long); /* LIFO tank model */ -double sourcequal(EN_Project *pr, Psource); /* Finds WQ input from source */ -double avgqual(EN_Project *pr, int); /* Finds avg. quality in pipe */ +void updatesegs(EN_Project *pr, long); /* Updates quality in segments*/ +void removesegs(EN_Project *pr, int); /* Removes a WQ segment */ +void addseg(EN_Project *pr, int,double,double); /* Adds a WQ segment to pipe */ +void accumulate(EN_Project *pr, long); /* Sums mass flow into node */ +void updatenodes(EN_Project *pr, long); /* Updates WQ at nodes */ +void sourceinput(EN_Project *pr, long); /* Computes source inputs */ +void release(EN_Project *pr, long); /* Releases mass from nodes */ +void updatetanks(EN_Project *pr, long); /* Updates WQ in tanks */ +void updatesourcenodes(EN_Project *pr, long); /* Updates WQ at source nodes */ +void tankmix1(EN_Project *pr, int, long); /* Complete mix tank model */ +void tankmix2(EN_Project *pr, int, long); /* 2-compartment tank model */ +void tankmix3(EN_Project *pr, int, long); /* FIFO tank model */ +void tankmix4(EN_Project *pr, int, long); /* LIFO tank model */ +double sourcequal(EN_Project *pr, Psource); /* Finds WQ input from source */ +double avgqual(EN_Project *pr, int); /* Finds avg. quality in pipe */ void ratecoeffs(EN_Project *pr); /* Finds wall react. coeffs. */ -double piperate(EN_Project *pr, int); /* Finds wall react. coeff. */ -double pipereact(EN_Project *pr, int,double,double,long);/* Reacts water in a pipe */ -double tankreact(EN_Project *pr, double,double,double,long); /* Reacts water in a tank */ -double bulkrate(EN_Project *pr, double,double,double); /* Finds bulk reaction rate */ -double wallrate(EN_Project *pr, double,double,double,double);/* Finds wall reaction rate */ +double piperate(EN_Project *pr, int); /* Finds wall react. coeff. */ +double pipereact(EN_Project *pr, int,double, + double,long); /* Reacts water in a pipe */ +double tankreact(EN_Project *pr, double,double, + double,long); /* Reacts water in a tank */ +double bulkrate(EN_Project *pr, double,double, + double); /* Finds bulk reaction rate */ +double wallrate(EN_Project *pr, double,double, + double,double); /* Finds wall reaction rate */ /* ------------ OUTPUT.C ---------------*/ int savenetdata(EN_Project *pr); /* Saves basic data to file */ -int savehyd(EN_Project *pr, long *); /* Saves hydraulic solution */ -int savehydstep(EN_Project *pr, long *); /* Saves hydraulic timestep */ +int savehyd(EN_Project *pr, long *); /* Saves hydraulic solution */ +int savehydstep(EN_Project *pr, long *); /* Saves hydraulic timestep */ int saveenergy(EN_Project *pr); /* Saves energy usage */ -int readhyd(EN_Project *pr, long *); /* Reads hydraulics from file */ -int readhydstep(FILE *hydFile, long *); /* Reads time step from file */ +int readhyd(EN_Project *pr, long *); /* Reads hydraulics from file */ +int readhydstep(FILE *hydFile, long *); /* Reads time step from file */ int saveoutput(EN_Project *pr); /* Saves results to file */ -int nodeoutput(EN_Project *pr, int, REAL4 *, double); /* Saves node results to file */ -int linkoutput(EN_Project *pr, int, REAL4 *, double); /* Saves link results to file */ +int nodeoutput(EN_Project *pr, int, REAL4 *, + double); /* Saves node results to file */ +int linkoutput(EN_Project *pr, int, REAL4 *, + double); /* Saves link results to file */ int savefinaloutput(EN_Project *pr); /* Finishes saving output */ -int savetimestat(EN_Project *pr, REAL4 *, HdrType); /* Saves time stats to file */ -int savenetreacts(EN_Project *pr, double, double,double, double); - /* Saves react. rates to file */ +int savetimestat(EN_Project *pr, REAL4 *, + HdrType); /* Saves time stats to file */ +int savenetreacts(EN_Project *pr, double, + double,double, double); /* Saves react. rates to file */ int saveepilog(EN_Project *pr); /* Saves output file epilog */ /* ------------ INPFILE.C --------------*/ -int saveinpfile(EN_Project *pr, char *); /* Saves network to text file */ +int saveinpfile(EN_Project *pr, char *); /* Saves network to text file */ #endif diff --git a/src/hydraul.c b/src/hydraul.c index 8f1bcd7..f4eb45c 100755 --- a/src/hydraul.c +++ b/src/hydraul.c @@ -628,7 +628,7 @@ void demands(EN_Project *pr) long k,p; double djunc, sum; Pdemand demand; - + EN_Network *net = &pr->network; hydraulics_t *hyd = &pr->hydraulics; time_options_t *top = &pr->time_options; @@ -680,6 +680,7 @@ void demands(EN_Project *pr) setlinksetting(pr, i, net->Pattern[j].F[k], &hyd->LinkStatus[i], &hyd->LinkSetting[i]); } } + } /* End of demands */ diff --git a/src/input1.c b/src/input1.c index 6da3bae..8bb0658 100644 --- a/src/input1.c +++ b/src/input1.c @@ -40,8 +40,7 @@ AUTHOR: L. Rossman --------------------- Module Global Variables ---------------------- */ -#define MAXITER \ - 200 /* Default max. # hydraulic iterations */ +#define MAXITER 200 /* Default max. # hydraulic iterations */ #define HACC 0.001 /* Default hydraulics convergence ratio */ #define HTOL 0.0005 /* Default hydraulic head tolerance (ft) */ @@ -62,8 +61,7 @@ AUTHOR: L. Rossman #define RQTOL 1E-7 /* Default low flow resistance tolerance */ #define CHECKFREQ 2 /* Default status check frequency */ #define MAXCHECK 10 /* Default # iterations for status checks */ -#define DAMPLIMIT \ - 0 /* Default damping threshold */ +#define DAMPLIMIT 0 /* Default damping threshold */ extern char *Fldname[]; /* Defined in enumstxt.h in EPANET.C */ extern char *RptFlowUnitsTxt[]; diff --git a/src/output.c b/src/output.c index 7e231ac..91c54ea 100644 --- a/src/output.c +++ b/src/output.c @@ -70,7 +70,8 @@ int savenetdata(EN_Project *pr) ibuf[0] = MAGICNUMBER; /*** CODEVERSION replaces VERSION ***/ - ibuf[1] = CODEVERSION; + //ibuf[1] = CODEVERSION; + ibuf[1] = 20012; // keep version at 2.00.12 so that GUI will run ibuf[2] = net->Nnodes; ibuf[3] = net->Ntanks; diff --git a/src/quality.c b/src/quality.c index 5308e2c..03e29b6 100644 --- a/src/quality.c +++ b/src/quality.c @@ -161,6 +161,9 @@ void initqual(EN_Project *pr) net->Node[i].S->Smass = 0.0; } + qu->QTempVolumes = + calloc(net->Ntanks, + sizeof(double)); // keep track of next tank volumes. qu->QTankVolumes = calloc(net->Ntanks, sizeof(double)); // keep track of previous step's tank volumes. @@ -287,7 +290,7 @@ int nextqual(EN_Project *pr, long *tstep) { long hydstep; /* Hydraulic solution time step */ int errcode = 0; - double *tankVolumes; + //double *tankVolumes = NULL; int i; EN_Network *net; hydraulics_t *hyd; @@ -315,10 +318,10 @@ int nextqual(EN_Project *pr, long *tstep) // if we're operating in stepwise mode, capture the tank levels so we can // restore them later. if (hyd->OpenHflag) { - tankVolumes = calloc(net->Ntanks, sizeof(double)); + //tankVolumes = calloc(net->Ntanks, sizeof(double)); for (i = 1; i <= net->Ntanks; ++i) { if (net->Tank[i].A != 0) { // skip reservoirs - tankVolumes[i - 1] = net->Tank[i].V; + qu->QTempVolumes[i - 1] = net->Tank[i].V; } } @@ -359,7 +362,7 @@ int nextqual(EN_Project *pr, long *tstep) for (i = 1; i <= net->Ntanks; i++) { if (net->Tank[i].A != 0) { // skip reservoirs again int n = net->Tank[i].Node; - net->Tank[i].V = tankVolumes[i - 1]; + net->Tank[i].V = qu->QTempVolumes[i - 1]; hyd->NodeHead[n] = tankgrade(pr, i, net->Tank[i].V); } } @@ -370,7 +373,7 @@ int nextqual(EN_Project *pr, long *tstep) } } - free(tankVolumes); + //free(tankVolumes); } return (errcode); @@ -448,6 +451,7 @@ int closequal(EN_Project *pr) free(qu->MassIn); free(qu->PipeRateCoeff); free(qu->TempQual); + free(qu->QTempVolumes); free(qu->QTankVolumes); free(qu->QLinkFlow); return (errcode); diff --git a/src/types.h b/src/types.h index 920c779..a3aa962 100755 --- a/src/types.h +++ b/src/types.h @@ -542,6 +542,7 @@ typedef struct { Climit, /// Limiting potential quality *NodeQual, /// Node quality state *TempQual, /// General purpose array for water quality + *QTempVolumes, *QTankVolumes, *QLinkFlow, *PipeRateCoeff; @@ -551,12 +552,12 @@ typedef struct { Qtime; /// Current quality time (sec) char OutOfMemory; /* Out of memory indicator */ - alloc_handle_t *SegPool; // Memory pool for water quality segments + alloc_handle_t *SegPool; // Memory pool for water quality segments Pseg FreeSeg; /* Pointer to unused segment */ Pseg *FirstSeg, /* First (downstream) segment in each pipe */ - *LastSeg; /* Last (upstream) segment in each pipe */ - FlowDirection *FlowDir; /* Flow direction for each pipe */ + *LastSeg; /* Last (upstream) segment in each pipe */ + FlowDirection *FlowDir; /* Flow direction for each pipe */ double *VolIn; /* Total volume inflow to node */ double *MassIn; /* Total mass inflow to node */ double Sc; /* Schmidt Number */