Merge pull request #177 from LRossman/contributor-lr

Changes to get Net1.inp to run
This commit is contained in:
Michael Tryby
2018-06-15 11:53:20 -04:00
committed by GitHub
10 changed files with 321 additions and 167 deletions

View File

@@ -1,7 +1,11 @@
MIT License MIT License
<<<<<<< HEAD
Works are copyright (c) 2018 their respective AUTHORS, Works are copyright (c) 2018 their respective AUTHORS,
unless such work is in the Public Domain (again, see 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 Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -9,8 +9,23 @@
version: 2.0.{build} version: 2.0.{build}
image: matrix:
- Visual Studio 2013 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 # called before repo cloning
init: init:
@@ -18,8 +33,11 @@ init:
- set BUILD_HOME=buildprod - set BUILD_HOME=buildprod
- set TEST_HOME=nrtestsuite - set TEST_HOME=nrtestsuite
- set NRTEST_SCRIPT=C:\Python27\Scripts - set NRTEST_SCRIPT=C:\Python27\Scripts
- set GENERATOR="Visual Studio 10 2010" # See values set
- set BOOST_ROOT="C:\\Libraries\\boost" - echo %APPVEYOR_BUILD_WORKER_IMAGE%
- echo %BUILD_HOME%
- echo %GENERATOR%
- echo %BOOST_ROOT%
# called after repo clone # called after repo clone
install: install:
@@ -29,7 +47,7 @@ install:
before_build: before_build:
- mkdir %BUILD_HOME% - mkdir %BUILD_HOME%
- cd %BUILD_HOME% - cd %BUILD_HOME%
- cmake -G %GENERATOR% - cmake -G "%GENERATOR%"
-DBUILD_TESTS=1 -DBUILD_TESTS=1
-DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_ROOT="%BOOST_ROOT%"
-DBoost_USE_STATIC_LIBS="ON" .. -DBoost_USE_STATIC_LIBS="ON" ..

View File

@@ -5,9 +5,9 @@
#define MAXMSG 255 /* Max. # characters in message text */ #define MAXMSG 255 /* Max. # characters in message text */
#define MAXWARNCODE 99 #define MAXWARNCODE 99
/* text copied here, no more need of include "text.h" */ /* 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 <input file> <output file>\n" #define FMT03 "\n Correct syntax is:\n %s <input file> <output file>\n"
#define FMT09 "\nEPANET completed.\n" #define FMT09 "\n\nEPANET completed."
#define FMT10 "\nEPANET completed. There are warnings." #define FMT10 "\nEPANET completed. There are warnings."
#define FMT11 "\nEPANET completed. There are errors." #define FMT11 "\nEPANET completed. There are errors."
@@ -87,7 +87,8 @@ int main(int argc, char *argv[])
/* Call the main control function */ /* Call the main control function */
if (strlen(f2)> 0) { if (strlen(f2)> 0) {
/* use stdout for progress messages */ /* use stdout for progress messages */
errcode = ENepanet(f1,f2,f3,writeConsole); //errcode = ENepanet(f1,f2,f3,writeConsole);
errcode = ENepanet(f1, f2, f3, NULL);
} }
else { else {
/* use stdout for reporting, no progress messages */ /* use stdout for reporting, no progress messages */
@@ -101,21 +102,21 @@ int main(int argc, char *argv[])
return(0); return(0);
} }
else { else {
if (errcode > MAXWARNCODE) printf("\n Fatal Error: ");
ENgeterror(errcode, errmsg, MAXMSG); ENgeterror(errcode, errmsg, MAXMSG);
writeConsole(errmsg); writeConsole(errmsg);
if (errcode > MAXWARNCODE) { if (errcode > MAXWARNCODE) {
/* error */ // error //
writeConsole(FMT11); writeConsole(FMT11);
return(errcode); return(errcode);
} }
else { else {
/* warning */ // warning //
writeConsole(FMT10); writeConsole(FMT10);
return(0); return(0);
} }
} }
} /* End of main */ } /* End of main */

View File

@@ -108,6 +108,10 @@ execute function x and set the error code equal to its return value.
#ifdef __WIN32__ #ifdef __WIN32__
#define WINDOWS #define WINDOWS
#endif #endif
#ifdef WINDOWS
#include <windows.h>
#endif
/************************************************************/ /************************************************************/
#include <stdio.h> #include <stdio.h>
@@ -125,7 +129,6 @@ execute function x and set the error code equal to its return value.
#include "text.h" #include "text.h"
#include "types.h" #include "types.h"
#define EXTERN #define EXTERN
#include "epanet2.h"
#include "vars.h" #include "vars.h"
/**************************************************************** /****************************************************************
@@ -166,218 +169,295 @@ int DLLEXPORT ENepanet(char *f1, char *f2, char *f3,
EN_free(_defaultModel); EN_free(_defaultModel);
return (errcode); return (errcode);
} }
int DLLEXPORT ENopen(char *f1, char *f2, char *f3) { int DLLEXPORT ENopen(char *f1, char *f2, char *f3) {
int errcode = 0; int errcode = 0;
ERRCODE(EN_alloc(&_defaultModel)); ERRCODE(EN_alloc(&_defaultModel));
EN_open(_defaultModel, f1, f2, f3); EN_open(_defaultModel, f1, f2, f3);
return (errcode); return (errcode);
} }
int DLLEXPORT ENsaveinpfile(char *filename) { int DLLEXPORT ENsaveinpfile(char *filename) {
return EN_saveinpfile(_defaultModel, filename); return EN_saveinpfile(_defaultModel, filename);
} }
int DLLEXPORT ENclose() { return EN_close(_defaultModel); } int DLLEXPORT ENclose() { return EN_close(_defaultModel); }
int DLLEXPORT ENsolveH() { return EN_solveH(_defaultModel); } int DLLEXPORT ENsolveH() { return EN_solveH(_defaultModel); }
int DLLEXPORT ENsaveH() { return EN_saveH(_defaultModel); } int DLLEXPORT ENsaveH() { return EN_saveH(_defaultModel); }
int DLLEXPORT ENopenH() { return EN_openH(_defaultModel); } int DLLEXPORT ENopenH() { return EN_openH(_defaultModel); }
int DLLEXPORT ENinitH(int flag) { return EN_initH(_defaultModel, flag); } int DLLEXPORT ENinitH(int flag) { return EN_initH(_defaultModel, flag); }
int DLLEXPORT ENrunH(long *t) { return EN_runH(_defaultModel, t); } int DLLEXPORT ENrunH(long *t) { return EN_runH(_defaultModel, t); }
int DLLEXPORT ENnextH(long *tstep) { return EN_nextH(_defaultModel, tstep); } int DLLEXPORT ENnextH(long *tstep) { return EN_nextH(_defaultModel, tstep); }
int DLLEXPORT ENcloseH() { return EN_closeH(_defaultModel); } int DLLEXPORT ENcloseH() { return EN_closeH(_defaultModel); }
int DLLEXPORT ENsavehydfile(char *filename) { int DLLEXPORT ENsavehydfile(char *filename) {
return EN_savehydfile(_defaultModel, filename); return EN_savehydfile(_defaultModel, filename);
} }
int DLLEXPORT ENusehydfile(char *filename) { int DLLEXPORT ENusehydfile(char *filename) {
return EN_usehydfile(_defaultModel, filename); return EN_usehydfile(_defaultModel, filename);
} }
int DLLEXPORT ENsolveQ() { return EN_solveQ(_defaultModel); } int DLLEXPORT ENsolveQ() { return EN_solveQ(_defaultModel); }
int DLLEXPORT ENopenQ() { return EN_openQ(_defaultModel); } int DLLEXPORT ENopenQ() { return EN_openQ(_defaultModel); }
int DLLEXPORT ENinitQ(int saveflag) { int DLLEXPORT ENinitQ(int saveflag) {
return EN_initQ(_defaultModel, saveflag); return EN_initQ(_defaultModel, saveflag);
} }
int DLLEXPORT ENrunQ(long *t) { return EN_runQ(_defaultModel, t); } int DLLEXPORT ENrunQ(long *t) { return EN_runQ(_defaultModel, t); }
int DLLEXPORT ENnextQ(long *tstep) { return EN_nextQ(_defaultModel, tstep); } int DLLEXPORT ENnextQ(long *tstep) { return EN_nextQ(_defaultModel, tstep); }
int DLLEXPORT ENstepQ(long *tleft) { return EN_stepQ(_defaultModel, tleft); } int DLLEXPORT ENstepQ(long *tleft) { return EN_stepQ(_defaultModel, tleft); }
int DLLEXPORT ENcloseQ() { return EN_closeQ(_defaultModel); } int DLLEXPORT ENcloseQ() { return EN_closeQ(_defaultModel); }
int DLLEXPORT ENwriteline(char *line) { int DLLEXPORT ENwriteline(char *line) {
return EN_writeline(_defaultModel, line); return EN_writeline(_defaultModel, line);
} }
int DLLEXPORT ENreport() { return EN_report(_defaultModel); } int DLLEXPORT ENreport() { return EN_report(_defaultModel); }
int DLLEXPORT ENresetreport() { return EN_resetreport(_defaultModel); } int DLLEXPORT ENresetreport() { return EN_resetreport(_defaultModel); }
int DLLEXPORT ENsetreport(char *s) { return EN_setreport(_defaultModel, s); } int DLLEXPORT ENsetreport(char *s) { return EN_setreport(_defaultModel, s); }
int DLLEXPORT ENgetversion(int *v) { return EN_getversion(v); } int DLLEXPORT ENgetversion(int *v) { return EN_getversion(v); }
int DLLEXPORT ENgetcontrol(int cindex, int *ctype, int *lindex, int DLLEXPORT ENgetcontrol(int cindex, int *ctype, int *lindex,
EN_API_FLOAT_TYPE *setting, int *nindex, EN_API_FLOAT_TYPE *setting, int *nindex,
EN_API_FLOAT_TYPE *level) { EN_API_FLOAT_TYPE *level) {
return EN_getcontrol(_defaultModel, cindex, ctype, lindex, setting, nindex, return EN_getcontrol(_defaultModel, cindex, ctype, lindex, setting, nindex,
level); level);
} }
int DLLEXPORT ENgetcount(int code, int *count) { int DLLEXPORT ENgetcount(int code, int *count) {
return EN_getcount(_defaultModel, (EN_CountType)code, count); return EN_getcount(_defaultModel, (EN_CountType)code, count);
} }
int DLLEXPORT ENgetoption(int code, EN_API_FLOAT_TYPE *value) { int DLLEXPORT ENgetoption(int code, EN_API_FLOAT_TYPE *value) {
return EN_getoption(_defaultModel, (EN_Option)code, value); return EN_getoption(_defaultModel, (EN_Option)code, value);
} }
int DLLEXPORT ENgettimeparam(int code, long *value) { int DLLEXPORT ENgettimeparam(int code, long *value) {
return EN_gettimeparam(_defaultModel, code, value); return EN_gettimeparam(_defaultModel, code, value);
} }
int DLLEXPORT ENgetflowunits(int *code) { int DLLEXPORT ENgetflowunits(int *code) {
return EN_getflowunits(_defaultModel, code); return EN_getflowunits(_defaultModel, code);
} }
int DLLEXPORT ENsetflowunits(int code) { int DLLEXPORT ENsetflowunits(int code) {
return EN_setflowunits(_defaultModel, code); return EN_setflowunits(_defaultModel, code);
} }
int DLLEXPORT ENgetpatternindex(char *id, int *index) { int DLLEXPORT ENgetpatternindex(char *id, int *index) {
return EN_getpatternindex(_defaultModel, id, index); return EN_getpatternindex(_defaultModel, id, index);
} }
int DLLEXPORT ENgetpatternid(int index, char *id) { int DLLEXPORT ENgetpatternid(int index, char *id) {
return EN_getpatternid(_defaultModel, index, id); return EN_getpatternid(_defaultModel, index, id);
} }
int DLLEXPORT ENgetpatternlen(int index, int *len) { int DLLEXPORT ENgetpatternlen(int index, int *len) {
return EN_getpatternlen(_defaultModel, index, len); return EN_getpatternlen(_defaultModel, index, len);
} }
int DLLEXPORT ENgetpatternvalue(int index, int period, int DLLEXPORT ENgetpatternvalue(int index, int period,
EN_API_FLOAT_TYPE *value) { EN_API_FLOAT_TYPE *value) {
return EN_getpatternvalue(_defaultModel, index, period, value); return EN_getpatternvalue(_defaultModel, index, period, value);
} }
int DLLEXPORT ENgetcurveindex(char *id, int *index) { int DLLEXPORT ENgetcurveindex(char *id, int *index) {
return EN_getcurveindex(_defaultModel, id, index); return EN_getcurveindex(_defaultModel, id, index);
} }
int DLLEXPORT ENgetcurveid(int index, char *id) { int DLLEXPORT ENgetcurveid(int index, char *id) {
return EN_getcurveid(_defaultModel, index, id); return EN_getcurveid(_defaultModel, index, id);
} }
int DLLEXPORT ENgetcurvelen(int index, int *len) { int DLLEXPORT ENgetcurvelen(int index, int *len) {
return EN_getcurvelen(_defaultModel, index, len); return EN_getcurvelen(_defaultModel, index, len);
} }
int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x, int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x,
EN_API_FLOAT_TYPE *y) { EN_API_FLOAT_TYPE *y) {
return EN_getcurvevalue(_defaultModel, index, pnt, x, y); return EN_getcurvevalue(_defaultModel, index, pnt, x, y);
} }
int DLLEXPORT ENgetqualtype(int *qualcode, int *tracenode) { int DLLEXPORT ENgetqualtype(int *qualcode, int *tracenode) {
return EN_getqualtype(_defaultModel, qualcode, tracenode); return EN_getqualtype(_defaultModel, qualcode, tracenode);
} }
int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits,
int *tracenode) { int *tracenode) {
return EN_getqualinfo(_defaultModel, qualcode, chemname, chemunits, return EN_getqualinfo(_defaultModel, qualcode, chemname, chemunits,
tracenode); tracenode);
} }
int DLLEXPORT ENgeterror(int errcode, char *errmsg, int n) { int DLLEXPORT ENgeterror(int errcode, char *errmsg, int n) {
return EN_geterror(errcode, errmsg, n); return EN_geterror(errcode, errmsg, n);
} }
int DLLEXPORT ENgetstatistic(int code, EN_API_FLOAT_TYPE *value) { int DLLEXPORT ENgetstatistic(int code, EN_API_FLOAT_TYPE *value) {
return EN_getstatistic(_defaultModel, code, value); return EN_getstatistic(_defaultModel, code, value);
} }
int DLLEXPORT ENgetnodeindex(char *id, int *index) { int DLLEXPORT ENgetnodeindex(char *id, int *index) {
return EN_getnodeindex(_defaultModel, id, index); return EN_getnodeindex(_defaultModel, id, index);
} }
int DLLEXPORT ENgetnodeid(int index, char *id) { int DLLEXPORT ENgetnodeid(int index, char *id) {
return EN_getnodeid(_defaultModel, index, id); return EN_getnodeid(_defaultModel, index, id);
} }
int DLLEXPORT ENgetnodetype(int index, int *code) { int DLLEXPORT ENgetnodetype(int index, int *code) {
return EN_getnodetype(_defaultModel, index, code); return EN_getnodetype(_defaultModel, index, code);
} }
int DLLEXPORT ENgetcoord(int index, EN_API_FLOAT_TYPE *x, int DLLEXPORT ENgetcoord(int index, EN_API_FLOAT_TYPE *x,
EN_API_FLOAT_TYPE *y) { EN_API_FLOAT_TYPE *y) {
return EN_getcoord(_defaultModel, index, x, y); return EN_getcoord(_defaultModel, index, x, y);
} }
int DLLEXPORT ENsetcoord(int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) { int DLLEXPORT ENsetcoord(int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) {
return EN_setcoord(_defaultModel, index, x, y); return EN_setcoord(_defaultModel, index, x, y);
} }
int DLLEXPORT ENgetnodevalue(int index, int code, EN_API_FLOAT_TYPE *value) { int DLLEXPORT ENgetnodevalue(int index, int code, EN_API_FLOAT_TYPE *value) {
return EN_getnodevalue(_defaultModel, index, code, value); return EN_getnodevalue(_defaultModel, index, code, value);
} }
int DLLEXPORT ENgetlinkindex(char *id, int *index) { int DLLEXPORT ENgetlinkindex(char *id, int *index) {
return EN_getlinkindex(_defaultModel, id, index); return EN_getlinkindex(_defaultModel, id, index);
} }
int DLLEXPORT ENgetlinkid(int index, char *id) { int DLLEXPORT ENgetlinkid(int index, char *id) {
return EN_getlinkid(_defaultModel, index, id); return EN_getlinkid(_defaultModel, index, id);
} }
int DLLEXPORT ENgetlinktype(int index, EN_LinkType *code) { int DLLEXPORT ENgetlinktype(int index, EN_LinkType *code) {
return EN_getlinktype(_defaultModel, index, code); return EN_getlinktype(_defaultModel, index, code);
} }
int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2) { int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2) {
return EN_getlinknodes(_defaultModel, index, node1, node2); return EN_getlinknodes(_defaultModel, index, node1, node2);
} }
int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value) { int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value) {
return EN_getlinkvalue(_defaultModel, index, (EN_LinkProperty)code, value); return EN_getlinkvalue(_defaultModel, index, (EN_LinkProperty)code, value);
} }
int DLLEXPORT ENgetcurve(int curveIndex, char *id, int *nValues, int DLLEXPORT ENgetcurve(int curveIndex, char *id, int *nValues,
EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **xValues,
EN_API_FLOAT_TYPE **yValues) { EN_API_FLOAT_TYPE **yValues) {
return EN_getcurve(_defaultModel, curveIndex, id, nValues, xValues, yValues); return EN_getcurve(_defaultModel, curveIndex, id, nValues, xValues, yValues);
} }
int DLLEXPORT ENsetcontrol(int cindex, int ctype, int lindex, int DLLEXPORT ENsetcontrol(int cindex, int ctype, int lindex,
EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE setting, int nindex,
EN_API_FLOAT_TYPE level) { EN_API_FLOAT_TYPE level) {
return EN_setcontrol(_defaultModel, cindex, ctype, lindex, setting, nindex, return EN_setcontrol(_defaultModel, cindex, ctype, lindex, setting, nindex,
level); level);
} }
int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v) { int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v) {
return EN_setnodevalue(_defaultModel, index, code, v); return EN_setnodevalue(_defaultModel, index, code, v);
} }
int DLLEXPORT ENsetlinkvalue(int index, int code, EN_API_FLOAT_TYPE v) { int DLLEXPORT ENsetlinkvalue(int index, int code, EN_API_FLOAT_TYPE v) {
return EN_setlinkvalue(_defaultModel, index, code, v); return EN_setlinkvalue(_defaultModel, index, code, v);
} }
int DLLEXPORT ENaddpattern(char *id) { int DLLEXPORT ENaddpattern(char *id) {
return EN_addpattern(_defaultModel, id); return EN_addpattern(_defaultModel, id);
} }
int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *f, int n) { int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *f, int n) {
return EN_setpattern(_defaultModel, index, f, n); return EN_setpattern(_defaultModel, index, f, n);
} }
int DLLEXPORT ENsetpatternvalue(int index, int period, int DLLEXPORT ENsetpatternvalue(int index, int period,
EN_API_FLOAT_TYPE value) { EN_API_FLOAT_TYPE value) {
return EN_setpatternvalue(_defaultModel, index, period, value); return EN_setpatternvalue(_defaultModel, index, period, value);
} }
int DLLEXPORT ENaddcurve(char *id) { return EN_addcurve(_defaultModel, id); } 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 DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y,
int n) { int n) {
return EN_setcurve(_defaultModel, index, x, y, n); return EN_setcurve(_defaultModel, index, x, y, n);
} }
int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x, int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x,
EN_API_FLOAT_TYPE y) { EN_API_FLOAT_TYPE y) {
return EN_setcurvevalue(_defaultModel, index, pnt, x, y); return EN_setcurvevalue(_defaultModel, index, pnt, x, y);
} }
int DLLEXPORT ENsettimeparam(int code, long value) { int DLLEXPORT ENsettimeparam(int code, long value) {
return EN_settimeparam(_defaultModel, code, value); return EN_settimeparam(_defaultModel, code, value);
} }
int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v) { int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v) {
return EN_setoption(_defaultModel, code, v); return EN_setoption(_defaultModel, code, v);
} }
int DLLEXPORT ENsetstatusreport(int code) { int DLLEXPORT ENsetstatusreport(int code) {
return EN_setstatusreport(_defaultModel, code); return EN_setstatusreport(_defaultModel, code);
} }
int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits,
char *tracenode) { char *tracenode) {
return EN_setqualtype(_defaultModel, qualcode, chemname, chemunits, return EN_setqualtype(_defaultModel, qualcode, chemname, chemunits,
tracenode); tracenode);
} }
int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex) { int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex) {
return EN_getheadcurveindex(_defaultModel, index, curveindex); return EN_getheadcurveindex(_defaultModel, index, curveindex);
} }
int DLLEXPORT ENsetheadcurveindex(int index, int curveindex) { int DLLEXPORT ENsetheadcurveindex(int index, int curveindex) {
return EN_setheadcurveindex(_defaultModel, index, curveindex); return EN_setheadcurveindex(_defaultModel, index, curveindex);
} }
int DLLEXPORT ENgetpumptype(int index, int *type) { int DLLEXPORT ENgetpumptype(int index, int *type) {
return EN_getpumptype(_defaultModel, index, type); return EN_getpumptype(_defaultModel, index, type);
} }
int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands) { int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands) {
return EN_getnumdemands(_defaultModel, nodeIndex, numDemands); return EN_getnumdemands(_defaultModel, nodeIndex, numDemands);
} }
int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIdx, int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIdx,
EN_API_FLOAT_TYPE *baseDemand) { EN_API_FLOAT_TYPE *baseDemand) {
return EN_getbasedemand(_defaultModel, nodeIndex, demandIdx, baseDemand); return EN_getbasedemand(_defaultModel, nodeIndex, demandIdx, baseDemand);
} }
int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx,
EN_API_FLOAT_TYPE baseDemand) { EN_API_FLOAT_TYPE baseDemand) {
return EN_setbasedemand(_defaultModel, nodeIndex, demandIdx, baseDemand); return EN_setbasedemand(_defaultModel, nodeIndex, demandIdx, baseDemand);
} }
int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIdx, int *pattIdx) { int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIdx, int *pattIdx) {
return EN_getdemandpattern(_defaultModel, nodeIndex, demandIdx, pattIdx); return EN_getdemandpattern(_defaultModel, nodeIndex, demandIdx, pattIdx);
} }
int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value) { int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value) {
return EN_getaveragepatternvalue(_defaultModel, index, 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); 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); 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); 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); 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); 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); 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) { int DLLEXPORT ENsetlinktype(char *id, EN_LinkType toType) {
return EN_setlinktype(_defaultModel, id, toType); return EN_setlinktype(_defaultModel, id, toType);
} }
int DLLEXPORT ENaddnode(char *id, EN_NodeType nodeType) { int DLLEXPORT ENaddnode(char *id, EN_NodeType nodeType) {
return EN_addnode(_defaultModel, id, nodeType); return EN_addnode(_defaultModel, id, nodeType);
} }
int DLLEXPORT ENaddlink(char *id, EN_LinkType linkType, char *fromNode, int DLLEXPORT ENaddlink(char *id, EN_LinkType linkType, char *fromNode,
char *toNode) { char *toNode) {
return EN_addlink(_defaultModel, id, linkType, fromNode, toNode); return EN_addlink(_defaultModel, id, linkType, fromNode, toNode);
} }
int DLLEXPORT ENdeletelink(int index) { int DLLEXPORT ENdeletelink(int index) {
return EN_deletelink(_defaultModel, index); return EN_deletelink(_defaultModel, index);
} }
int DLLEXPORT ENdeletenode(int index) { int DLLEXPORT ENdeletenode(int index) {
return EN_deletenode(_defaultModel, index); return EN_deletenode(_defaultModel, index);
} }
@@ -707,7 +795,6 @@ int DLLEXPORT EN_solveH(EN_Project *p)
tstep = 0; tstep = 0;
ERRCODE(EN_runH(p, &t)); ERRCODE(EN_runH(p, &t));
ERRCODE(EN_nextH(p, &tstep)); ERRCODE(EN_nextH(p, &tstep));
/*** Updated 6/24/02 ***/ /*** Updated 6/24/02 ***/
writecon("\b\b\b\b\b\b\b\b\b\b"); writecon("\b\b\b\b\b\b\b\b\b\b");
} while (tstep > 0); } while (tstep > 0);
@@ -825,8 +912,10 @@ int DLLEXPORT EN_initH(EN_Project *p, int flag)
errcode = openhydfile(p); errcode = openhydfile(p);
if (!errcode) if (!errcode)
p->save_options.Saveflag = TRUE; p->save_options.Saveflag = TRUE;
else else {
errmsg(p, errcode); errmsg(p, errcode);
return errcode;
}
} }
/* Initialize hydraulics */ /* Initialize hydraulics */
@@ -1546,7 +1635,7 @@ int DLLEXPORT EN_geterror(int errcode, char *errmsg, int n) {
strncpy(errmsg, WARN6, n); strncpy(errmsg, WARN6, n);
break; break;
default: default:
geterrmsg(n, newMsg); geterrmsg(errcode, newMsg);
strncpy(errmsg, newMsg, n); strncpy(errmsg, newMsg, n);
} }
if (strlen(errmsg) == 0) if (strlen(errmsg) == 0)
@@ -3330,7 +3419,7 @@ int openhydfile(EN_Project *p)
out->HydFile = NULL; out->HydFile = NULL;
switch (out->Hydflag) { switch (out->Hydflag) {
case SCRATCH: case SCRATCH:
getTmpName(p, out->HydFname); getTmpName(out->HydFname);
out->HydFile = fopen(out->HydFname, "w+b"); out->HydFile = fopen(out->HydFname, "w+b");
break; break;
case SAVE: case SAVE:
@@ -3423,7 +3512,7 @@ int openoutfile(EN_Project *p)
// else if ( (OutFile = tmpfile()) == NULL) // else if ( (OutFile = tmpfile()) == NULL)
else else
{ {
getTmpName(p, out->OutFname); getTmpName(out->OutFname);
if ((out->OutFile = fopen(out->OutFname, "w+b")) == NULL) if ((out->OutFile = fopen(out->OutFname, "w+b")) == NULL)
{ {
writecon(FMT08); writecon(FMT08);
@@ -3441,7 +3530,7 @@ int openoutfile(EN_Project *p)
if (!errcode) { if (!errcode) {
if (rep->Tstatflag != SERIES) { if (rep->Tstatflag != SERIES) {
// if ( (TmpOutFile = tmpfile()) == NULL) errcode = 304; // if ( (TmpOutFile = tmpfile()) == NULL) errcode = 304;
getTmpName(p, out->TmpFname); getTmpName(out->TmpFname);
out->TmpOutFile = fopen(out->TmpFname, "w+b"); out->TmpOutFile = fopen(out->TmpFname, "w+b");
if (out->TmpOutFile == NULL) if (out->TmpOutFile == NULL)
errcode = 304; errcode = 304;
@@ -3748,17 +3837,35 @@ void freedata(EN_Project *p)
---------------------------------------------------------------- ----------------------------------------------------------------
*/ */
/*** New function for 2.00.12 ***/ char *getTmpName(char *fname)
char *getTmpName(EN_Project *p, char *fname)
// //
// Input: fname = file name string // Input: fname = file name string
// Output: returns pointer to file name // Output: returns pointer to file name
// Purpose: creates a temporary file name with path prepended to it. // 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: // --- for Windows systems:
#ifdef WINDOWS #ifdef WINDOWS
out_file_t *out = &p->out_files;
// --- use system function tmpnam() to create a temporary file name // --- use system function tmpnam() to create a temporary file name
char name[MAXFNAME + 1]; char name[MAXFNAME + 1];
int n; int n;
@@ -3782,6 +3889,7 @@ char *getTmpName(EN_Project *p, char *fname)
// --- now add the prefix to the file name // --- now add the prefix to the file name
strcat(fname, name); strcat(fname, name);
*/
// --- for non-Windows systems: // --- for non-Windows systems:
#else #else

View File

@@ -40,7 +40,7 @@ int openfiles(EN_Project *p, char *,char *,char *); /* Opens input & report
int openhydfile(EN_Project *p); /* Opens hydraulics file */ int openhydfile(EN_Project *p); /* Opens hydraulics file */
int openoutfile(EN_Project *p); /* Opens binary output file */ int openoutfile(EN_Project *p); /* Opens binary output file */
int strcomp(char *, char *); /* Compares two strings */ int strcomp(char *, char *); /* Compares two strings */
char* getTmpName(EN_Project *p, char* fname); /* Gets temporary file name */ char* getTmpName(char* fname); /* Gets temporary file name */
double interp(int, double *,double *, double); /* Interpolates a data curve */ double interp(int, double *,double *, double); /* Interpolates a data curve */
int findnode(EN_Network *n, char *); /* Finds node's index from ID */ int findnode(EN_Network *n, char *); /* Finds node's index from ID */
@@ -120,6 +120,8 @@ int allocrules(EN_Project *pr); /* Allocates memory for rule
int ruledata(EN_Project *pr); /* Processes rule input data */ 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 */ 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 --------------*/ /* ------------- REPORT.C --------------*/
int writereport(EN_Project *pr); /* Writes formatted report */ int writereport(EN_Project *pr); /* Writes formatted report */
@@ -157,11 +159,14 @@ int nexthyd(EN_Project *pr, long *); /* Moves to next time
void closehyd(EN_Project *pr); /* Closes hydraulics solver */ void closehyd(EN_Project *pr); /* Closes hydraulics solver */
int allocmatrix(EN_Project *pr); /* Allocates matrix coeffs. */ int allocmatrix(EN_Project *pr); /* Allocates matrix coeffs. */
void freematrix(EN_Project *pr); /* Frees matrix coeffs. */ void freematrix(EN_Project *pr); /* Frees matrix coeffs. */
void initlinkflow(EN_Project *pr, int, char, double); /* Initializes link flow */ void initlinkflow(EN_Project *pr, int, char,
double); /* Initializes link flow */
void setlinkflow(EN_Project *pr, int, double); /* Sets link flow via headloss*/ 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 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 */ void demands(EN_Project *pr); /* Computes current demands */
@@ -171,7 +176,8 @@ int tanktimestep(EN_Project *pr, long *); /* Time till tanks fil
void controltimestep(EN_Project *pr, long *); /* Time till control action */ void controltimestep(EN_Project *pr, long *); /* Time till control action */
void ruletimestep(EN_Project *pr, long *); /* Time till rule action */ void ruletimestep(EN_Project *pr, long *); /* Time till rule action */
void addenergy(EN_Project *pr, long); /* Accumulates energy usage */ void addenergy(EN_Project *pr, long); /* Accumulates energy usage */
void getenergy(EN_Project *pr, int, double *, double *); /* Computes link energy use */ void getenergy(EN_Project *pr, int, double *,
double *); /* Computes link energy use */
void tanklevels(EN_Project *pr, long); /* Computes new tank levels */ void tanklevels(EN_Project *pr, long); /* Computes new tank levels */
double tankvolume(EN_Project *pr, int,double); /* Finds tank vol. from grade */ double tankvolume(EN_Project *pr, int,double); /* Finds tank vol. from grade */
double tankgrade(EN_Project *pr, int,double); /* Finds tank grade from vol. */ double tankgrade(EN_Project *pr, int,double); /* Finds tank grade from vol. */
@@ -179,13 +185,17 @@ int netsolve(EN_Project *pr, int *,double *); /* Solves network equa
int badvalve(EN_Project *pr, int); /* Checks for bad valve */ int badvalve(EN_Project *pr, int); /* Checks for bad valve */
int valvestatus(EN_Project *pr); /* Updates valve status */ int valvestatus(EN_Project *pr); /* Updates valve status */
int linkstatus(EN_Project *pr); /* Updates link status */ int linkstatus(EN_Project *pr); /* Updates link status */
StatType cvstatus(EN_Project *pr, StatType,double,double); /* Updates CV status */ StatType cvstatus(EN_Project *pr, StatType,
double,double); /* Updates CV status */
StatType pumpstatus(EN_Project *pr, int,double); /* Updates pump 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 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 */ int pswitch(EN_Project *pr); /* Pressure switch controls */
@@ -200,7 +210,8 @@ void pumpcoeff(EN_Project *pr, int); /* Computes pump coeff
/*** Updated 10/25/00 ***/ /*** Updated 10/25/00 ***/
/*** Updated 12/29/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 gpvcoeff(EN_Project *pr, int iLink); /* Computes GPV coeff. */
@@ -231,7 +242,7 @@ int storesparse(EN_Project *pr, int); /* Stores sparse matri
int ordersparse(hydraulics_t *h, int); /* Orders matrix storage */ int ordersparse(hydraulics_t *h, int); /* Orders matrix storage */
void transpose(int,int *,int *, /* Transposes sparse matrix */ void transpose(int,int *,int *, /* Transposes sparse matrix */
int *,int *,int *,int *,int *); 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 ---------------*/ /* ----------- QUALITY.C ---------------*/
int openqual(EN_Project *pr); /* Opens WQ solver system */ int openqual(EN_Project *pr); /* Opens WQ solver system */
@@ -262,10 +273,14 @@ double sourcequal(EN_Project *pr, Psource); /* Finds WQ input from
double avgqual(EN_Project *pr, int); /* Finds avg. quality in pipe */ double avgqual(EN_Project *pr, int); /* Finds avg. quality in pipe */
void ratecoeffs(EN_Project *pr); /* Finds wall react. coeffs. */ void ratecoeffs(EN_Project *pr); /* Finds wall react. coeffs. */
double piperate(EN_Project *pr, int); /* Finds wall react. coeff. */ 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 pipereact(EN_Project *pr, int,double,
double tankreact(EN_Project *pr, double,double,double,long); /* Reacts water in a tank */ double,long); /* Reacts water in a pipe */
double bulkrate(EN_Project *pr, double,double,double); /* Finds bulk reaction rate */ double tankreact(EN_Project *pr, double,double,
double wallrate(EN_Project *pr, double,double,double,double);/* Finds wall reaction rate */ 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 ---------------*/ /* ------------ OUTPUT.C ---------------*/
@@ -276,12 +291,15 @@ int saveenergy(EN_Project *pr); /* Saves energy usage
int readhyd(EN_Project *pr, long *); /* Reads hydraulics from file */ int readhyd(EN_Project *pr, long *); /* Reads hydraulics from file */
int readhydstep(FILE *hydFile, long *); /* Reads time step from file */ int readhydstep(FILE *hydFile, long *); /* Reads time step from file */
int saveoutput(EN_Project *pr); /* Saves results to file */ int saveoutput(EN_Project *pr); /* Saves results to file */
int nodeoutput(EN_Project *pr, int, REAL4 *, double); /* Saves node results to file */ int nodeoutput(EN_Project *pr, int, REAL4 *,
int linkoutput(EN_Project *pr, int, REAL4 *, double); /* Saves link results to file */ 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 savefinaloutput(EN_Project *pr); /* Finishes saving output */
int savetimestat(EN_Project *pr, REAL4 *, HdrType); /* Saves time stats to file */ int savetimestat(EN_Project *pr, REAL4 *,
int savenetreacts(EN_Project *pr, double, double,double, double); HdrType); /* Saves time stats to file */
/* Saves react. rates 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 */ int saveepilog(EN_Project *pr); /* Saves output file epilog */

View File

@@ -680,6 +680,7 @@ void demands(EN_Project *pr)
setlinksetting(pr, i, net->Pattern[j].F[k], &hyd->LinkStatus[i], &hyd->LinkSetting[i]); setlinksetting(pr, i, net->Pattern[j].F[k], &hyd->LinkStatus[i], &hyd->LinkSetting[i]);
} }
} }
} /* End of demands */ } /* End of demands */

View File

@@ -40,8 +40,7 @@ AUTHOR: L. Rossman
--------------------- Module Global Variables ---------------------- --------------------- Module Global Variables ----------------------
*/ */
#define MAXITER \ #define MAXITER 200 /* Default max. # hydraulic iterations */
200 /* Default max. # hydraulic iterations */
#define HACC 0.001 /* Default hydraulics convergence ratio */ #define HACC 0.001 /* Default hydraulics convergence ratio */
#define HTOL 0.0005 /* Default hydraulic head tolerance (ft) */ #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 RQTOL 1E-7 /* Default low flow resistance tolerance */
#define CHECKFREQ 2 /* Default status check frequency */ #define CHECKFREQ 2 /* Default status check frequency */
#define MAXCHECK 10 /* Default # iterations for status checks */ #define MAXCHECK 10 /* Default # iterations for status checks */
#define DAMPLIMIT \ #define DAMPLIMIT 0 /* Default damping threshold */
0 /* Default damping threshold */
extern char *Fldname[]; /* Defined in enumstxt.h in EPANET.C */ extern char *Fldname[]; /* Defined in enumstxt.h in EPANET.C */
extern char *RptFlowUnitsTxt[]; extern char *RptFlowUnitsTxt[];

View File

@@ -70,7 +70,8 @@ int savenetdata(EN_Project *pr)
ibuf[0] = MAGICNUMBER; ibuf[0] = MAGICNUMBER;
/*** CODEVERSION replaces VERSION ***/ /*** 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[2] = net->Nnodes;
ibuf[3] = net->Ntanks; ibuf[3] = net->Ntanks;

View File

@@ -161,6 +161,9 @@ void initqual(EN_Project *pr)
net->Node[i].S->Smass = 0.0; net->Node[i].S->Smass = 0.0;
} }
qu->QTempVolumes =
calloc(net->Ntanks,
sizeof(double)); // keep track of next tank volumes.
qu->QTankVolumes = qu->QTankVolumes =
calloc(net->Ntanks, calloc(net->Ntanks,
sizeof(double)); // keep track of previous step's tank volumes. 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 */ long hydstep; /* Hydraulic solution time step */
int errcode = 0; int errcode = 0;
double *tankVolumes; //double *tankVolumes = NULL;
int i; int i;
EN_Network *net; EN_Network *net;
hydraulics_t *hyd; 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 // if we're operating in stepwise mode, capture the tank levels so we can
// restore them later. // restore them later.
if (hyd->OpenHflag) { if (hyd->OpenHflag) {
tankVolumes = calloc(net->Ntanks, sizeof(double)); //tankVolumes = calloc(net->Ntanks, sizeof(double));
for (i = 1; i <= net->Ntanks; ++i) { for (i = 1; i <= net->Ntanks; ++i) {
if (net->Tank[i].A != 0) { // skip reservoirs 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++) { for (i = 1; i <= net->Ntanks; i++) {
if (net->Tank[i].A != 0) { // skip reservoirs again if (net->Tank[i].A != 0) { // skip reservoirs again
int n = net->Tank[i].Node; 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); 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); return (errcode);
@@ -448,6 +451,7 @@ int closequal(EN_Project *pr)
free(qu->MassIn); free(qu->MassIn);
free(qu->PipeRateCoeff); free(qu->PipeRateCoeff);
free(qu->TempQual); free(qu->TempQual);
free(qu->QTempVolumes);
free(qu->QTankVolumes); free(qu->QTankVolumes);
free(qu->QLinkFlow); free(qu->QLinkFlow);
return (errcode); return (errcode);

View File

@@ -542,6 +542,7 @@ typedef struct {
Climit, /// Limiting potential quality Climit, /// Limiting potential quality
*NodeQual, /// Node quality state *NodeQual, /// Node quality state
*TempQual, /// General purpose array for water quality *TempQual, /// General purpose array for water quality
*QTempVolumes,
*QTankVolumes, *QTankVolumes,
*QLinkFlow, *QLinkFlow,
*PipeRateCoeff; *PipeRateCoeff;