From bdfe7ec28928994b9758a5b8c52965c08338da60 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Tue, 28 Aug 2018 11:23:30 -0400 Subject: [PATCH 1/8] Fixing build for python wrapper --- CMakeLists.txt | 3 +-- include/epanet2.h | 6 +++--- run/CMakeLists.txt | 1 - win_build/WinSDK/Makefile.bat | 8 ++++---- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 466e964..d0fbce6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,12 +75,11 @@ source_group("Library" FILES ${EPANET_LIB_ALL}) # the shared library -add_library(epanet SHARED ${EPANET_SOURCES}) #${EPANET_API_HEADER}) +add_library(epanet SHARED ${EPANET_SOURCES}) target_include_directories(epanet PUBLIC ${PROJECT_SOURCE_DIR}/include) # create export lib so we can link against dll using Visual Studio -add_definitions(-D WITH_GENX) include(GenerateExportHeader) GENERATE_EXPORT_HEADER(epanet BASE_NAME epanet diff --git a/include/epanet2.h b/include/epanet2.h index e6d91c6..3acbc75 100644 --- a/include/epanet2.h +++ b/include/epanet2.h @@ -30,9 +30,7 @@ #define EN_API_FLOAT_TYPE float #endif -#ifdef WITH_GENX - #include "epanet_export.h" -#else +#ifdef NO_GENX // --- define WINDOWS #undef WINDOWS #ifdef _WIN32 @@ -62,6 +60,8 @@ #define DLLEXPORT #endif #endif +#else + #include "epanet_export.h" #endif diff --git a/run/CMakeLists.txt b/run/CMakeLists.txt index 53e792b..4822e95 100644 --- a/run/CMakeLists.txt +++ b/run/CMakeLists.txt @@ -19,7 +19,6 @@ source_group("CLI" FILES ${EPANET_CLI_SOURCES}) # Creates the EPANET command line executable -add_definitions(-D WITH_GENX) add_executable(runepanet ${EPANET_CLI_SOURCES}) if(NOT WIN32) target_link_libraries(runepanet LINK_PUBLIC epanet m) diff --git a/win_build/WinSDK/Makefile.bat b/win_build/WinSDK/Makefile.bat index 91ffc95..e5188c2 100644 --- a/win_build/WinSDK/Makefile.bat +++ b/win_build/WinSDK/Makefile.bat @@ -21,9 +21,9 @@ Find /i "x86" < checkOS.tmp > StringCheck.tmp If %ERRORLEVEL% == 1 ( CALL "%SDK_PATH%bin\"SetEnv.cmd /x64 /release rem : create EPANET2.DLL - cl -o epanet2.dll epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL + cl -o epanet2.dll /D NO_GENX epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL rem : create EPANET2.EXE - cl -o epanet2.exe epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link + cl -o epanet2.exe /D NO_GENX epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link md "%Build_PATH%"\64bit move /y "%SRC_PATH%"\*.dll "%Build_PATH%"\64bit move /y "%SRC_PATH%"\*.exe "%Build_PATH%"\64bit @@ -35,9 +35,9 @@ rem : 32 bit with DEF CALL "%SDK_PATH%bin\"SetEnv.cmd /x86 /release echo "32 bit with epanet2.def mapping" rem : create EPANET2.DLL -cl -o epanet2.dll epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL /def:..\win_build\WinSDK\epanet2.def /MAP +cl -o epanet2.dll /D NO_GENX epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL /def:..\win_build\WinSDK\epanet2.def /MAP rem : create EPANET2.EXE -cl -o epanet2.exe epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link +cl -o epanet2.exe /D NO_GENX epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link md "%Build_PATH%"\32bit move /y "%SRC_PATH%"\*.dll "%Build_PATH%"\32bit move /y "%SRC_PATH%"\*.exe "%Build_PATH%"\32bit From 0188b8e976b2025d068f04091e1cb66c7c9f9014 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Tue, 28 Aug 2018 12:18:27 -0400 Subject: [PATCH 2/8] Fixing compiler warning on Travis build --- src/epanet.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/epanet.c b/src/epanet.c index 6463c08..de468cf 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -132,7 +132,7 @@ execute function x and set the error code equal to its return value. // This single global variable is used only when the library is called // in "legacy mode" with the 2.1-style API. -EN_Project *_defaultModel; +void *_defaultModel; // Local functions @@ -167,9 +167,11 @@ int DLLEXPORT ENepanet(const char *f1, const char *f2, const char *f3, void (*pv ERRCODE(EN_createproject(&_defaultModel)); ERRCODE(EN_open(_defaultModel, f1, f2, f3)); - _defaultModel->viewprog = pviewprog; - if (_defaultModel->out_files.Hydflag != USE) { + EN_Project *p = (EN_Project*)(_defaultModel); + p->viewprog = pviewprog; + + if (p->out_files.Hydflag != USE) { ERRCODE(EN_solveH(_defaultModel)); } From bb047c972f1b72bb7620580dd36d58bcd98c4a55 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Tue, 28 Aug 2018 13:58:47 -0400 Subject: [PATCH 3/8] Fixing build error on Visual Studio 2010 --- src/epanet.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/epanet.c b/src/epanet.c index de468cf..95d99c9 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -164,11 +164,12 @@ void errorLookup(int errcode, char *errmsg, int len); int DLLEXPORT ENepanet(const char *f1, const char *f2, const char *f3, void (*pviewprog)(char *)) { int errcode = 0; + EN_Project *p = NULL; ERRCODE(EN_createproject(&_defaultModel)); ERRCODE(EN_open(_defaultModel, f1, f2, f3)); - EN_Project *p = (EN_Project*)(_defaultModel); + p = (EN_Project*)(_defaultModel); p->viewprog = pviewprog; if (p->out_files.Hydflag != USE) { From edf4a09ebeb2fa9b6ed0417de229151acd9caf41 Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Wed, 29 Aug 2018 15:14:49 +0300 Subject: [PATCH 4/8] Fix EN_addpattern Closes #231. Also adds unit test for the function. --- src/epanet.c | 4 ++-- tests/test_toolkit.cpp | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/epanet.c b/src/epanet.c index 95d99c9..8cb5449 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -3103,7 +3103,7 @@ int DLLEXPORT EN_addpattern(EN_ProjectHandle ph, char *id) { if (!p->Openflag) return set_error(p->error_handle, 102); - if (ENgetpatternindex(id, &i) == 0) + if (EN_getpatternindex(ph, id, &i) == 0) return set_error(p->error_handle, 215); /* Check that id name is not too long */ @@ -3156,7 +3156,7 @@ int DLLEXPORT EN_addpattern(EN_ProjectHandle ph, char *id) { for (i = 0; i <= Npats; i++) free(Pattern[i].F); free(Pattern); - Pattern = tmpPat; + net->Pattern = tmpPat; net->Npats = n; par->MaxPats = n; return set_error(p->error_handle, 0); diff --git a/tests/test_toolkit.cpp b/tests/test_toolkit.cpp index 6ca6322..3c7aa5b 100644 --- a/tests/test_toolkit.cpp +++ b/tests/test_toolkit.cpp @@ -204,4 +204,26 @@ BOOST_FIXTURE_TEST_CASE(test_progressive_stepping, Fixture) } +BOOST_FIXTURE_TEST_CASE(test_addpattern, Fixture) +{ + int pat_index, n_patterns_1, n_patterns_2; + + // get the number of current patterns + error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_1); + BOOST_REQUIRE(error == 0); + + // add a new pattern + error = EN_addpattern(ph, 'new_pattern'); + BOOST_REQUIRE(error == 0); + + // get the new patterns count, shoul dbe the old one + 1 + error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_2); + BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(n_patterns_1 + 1 == n_patterns_2); + + // gwt the new patterns index, should be as the number of patterns + error = EN_getpatternindex(ph, 'new_pattern', &pat_index); + BOOST_REQUIRE(pat_index == n_patterns_2); +} + BOOST_AUTO_TEST_SUITE_END() From 5161ad9972ea629938df1db9caff4aac34f112ac Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Wed, 29 Aug 2018 10:17:36 -0400 Subject: [PATCH 5/8] Fix Appveyor badge Close #246 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c1c01b..4020cb0 100755 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ EPANET {#epanet-readme} ====== ## Build Status -[![Build status](https://ci.appveyor.com/api/projects/status/19wpg4g2cmj3oihl?svg=true)](https://ci.appveyor.com/project/OpenWaterAnalytics/epanet) +[![Build status](https://ci.appveyor.com/api/projects/status/19wpg4g2cmj3oihl?svg=true)](https://ci.appveyor.com/project/OpenWaterAnalytics/epanet/branch/dev) [![Build Status](https://travis-ci.org/OpenWaterAnalytics/EPANET.svg?branch=master)](https://travis-ci.org/OpenWaterAnalytics/EPANET) ## For EPANET-related questions and discussion From f3d680dc54d494e107d848b645d7d7bc5c52dfd1 Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Wed, 29 Aug 2018 18:12:25 +0300 Subject: [PATCH 6/8] Fix test_addpattern test Thanks @mariosmsk Co-Authored-By: Marios S. Kyriakou --- tests/test_toolkit.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_toolkit.cpp b/tests/test_toolkit.cpp index 3c7aa5b..433614e 100644 --- a/tests/test_toolkit.cpp +++ b/tests/test_toolkit.cpp @@ -207,13 +207,14 @@ BOOST_FIXTURE_TEST_CASE(test_progressive_stepping, Fixture) BOOST_FIXTURE_TEST_CASE(test_addpattern, Fixture) { int pat_index, n_patterns_1, n_patterns_2; + char newpat[] = "new_pattern"; // get the number of current patterns error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_1); BOOST_REQUIRE(error == 0); // add a new pattern - error = EN_addpattern(ph, 'new_pattern'); + error = EN_addpattern(ph, newpat); BOOST_REQUIRE(error == 0); // get the new patterns count, shoul dbe the old one + 1 @@ -222,7 +223,7 @@ BOOST_FIXTURE_TEST_CASE(test_addpattern, Fixture) BOOST_REQUIRE(n_patterns_1 + 1 == n_patterns_2); // gwt the new patterns index, should be as the number of patterns - error = EN_getpatternindex(ph, 'new_pattern', &pat_index); + error = EN_getpatternindex(ph, newpat, &pat_index); BOOST_REQUIRE(pat_index == n_patterns_2); } From bcd6877935c33a5e8750084100defd452b86b939 Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Wed, 29 Aug 2018 22:26:32 +0300 Subject: [PATCH 7/8] Add legacy ENinit API Closes #232 --- src/epanet.c | 14 +++++++++++--- win_build/WinSDK/epanet2.def | 3 ++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/epanet.c b/src/epanet.c index 95d99c9..9943d16 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -185,6 +185,14 @@ int DLLEXPORT ENepanet(const char *f1, const char *f2, const char *f3, void (*pv return (errcode); } +int DLLEXPORT ENinit(char *f2, char *f3, int UnitsType, + int HeadlossFormula) { + int errcode = 0; + ERRCODE(EN_createproject(&_defaultModel)); + ERRCODE(EN_init(_defaultModel, f2, f3, UnitsType, HeadlossFormula)); + return (errcode); +} + int DLLEXPORT ENopen(char *f1, char *f2, char *f3) { int errcode = 0; ERRCODE(EN_createproject(&_defaultModel)); @@ -602,7 +610,7 @@ int DLLEXPORT EN_deleteproject(EN_ProjectHandle *ph) } -int DLLEXPORT EN_init(EN_ProjectHandle *ph, char *f2, char *f3, +int DLLEXPORT EN_init(EN_ProjectHandle ph, char *f2, char *f3, EN_FlowUnits UnitsType, EN_FormType HeadlossFormula) /*---------------------------------------------------------------- ** Input: @@ -623,7 +631,7 @@ int DLLEXPORT EN_init(EN_ProjectHandle *ph, char *f2, char *f3, _fpreset(); #endif - EN_Project *pr = (EN_Project*)*ph; + EN_Project *pr = (EN_Project*)ph; /* Set system flags */ pr->Openflag = TRUE; @@ -3643,7 +3651,7 @@ int DLLEXPORT EN_setheadcurveindex(EN_ProjectHandle ph, int index, int curveinde double *Ucf = p->Ucf; int pIdx; Spump *pump; - + if (!p->Openflag) return set_error(p->error_handle, 102); if (index < 1 || index > Nlinks || EN_PUMP != Link[index].Type) { diff --git a/win_build/WinSDK/epanet2.def b/win_build/WinSDK/epanet2.def index 46c82c2..0dcdfc3 100644 --- a/win_build/WinSDK/epanet2.def +++ b/win_build/WinSDK/epanet2.def @@ -67,6 +67,7 @@ EXPORTS ENsetbasedemand = _ENsetbasedemand@12 ENgetaveragepatternvalue = _ENgetaveragepatternvalue@8 ENgetheadcurveindex = _ENgetheadcurveindex@8 + ENsetheadcurveindex = _ENsetheadcurveindex@8 ENgetpumptype = _ENgetpumptype@8 ENgetcurveindex = _ENgetcurveindex@8 ENgetcurveid = _ENgetcurveid@8 @@ -96,4 +97,4 @@ EXPORTS ENgetdemandmodel = _ENgetdemandmodel@16 ENsetdemandmodel = _ENsetdemandmodel@16 ENgetcurvetype = _ENgetcurvetype@8 - + ENinit = _ENinit@16 \ No newline at end of file From dbdafd6352d2e5f2fda7fabe17a2944ffa6df1e0 Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Wed, 29 Aug 2018 22:31:28 +0300 Subject: [PATCH 8/8] Set status for new links in EN_addlink Status is OPEN for pumps\pipes\CV and ACTIVE for valves. Closes #173 --- src/epanet.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/epanet.c b/src/epanet.c index 9943d16..dbcf3f8 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -4806,6 +4806,7 @@ int DLLEXPORT EN_addlink(EN_ProjectHandle ph, char *id, EN_LinkType linkType, ch link->Type = linkType; link->N1 = N1; link->N2 = N2; + link->Stat = OPEN; if (linkType == EN_PUMP) { link->Kc = 1.0; // Speed factor @@ -4821,23 +4822,14 @@ int DLLEXPORT EN_addlink(EN_ProjectHandle ph, char *id, EN_LinkType linkType, ch link->Kc = 0.0; // Valve setting. link->Km = 0.0; // Loss coeff link->Len = 0.0; + link->Stat = ACTIVE; } - // link->Len = 0.0; - // link->Kc = 0.01; - // link->Km = 0; link->Kb = 0; link->Kw = 0; link->R = 0; link->Rc = 0; link->Rpt = 0; - if (linkType == EN_CVPIPE) { - link->Stat = OPEN; - } - else { - link->Stat = CLOSED; - } - ENHashTableInsert(net->LinkHashTable, link->ID, n); return set_error(p->error_handle, 0); }