diff --git a/appveyor.yml b/appveyor.yml index dd74d6432..893c89d7b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -77,6 +77,9 @@ test_script: on_success: - cd %TEST_HOME%\benchmark - appveyor PushArtifact receipt.json + - cd %EPANET_HOME% + - cd %BUILD_HOME%\bin\Release + - appveyor PushArtifact epanet2.dll on_failure: - cd %TEST_HOME%\benchmark diff --git a/include/epanet2_2.h b/include/epanet2_2.h index eca50957a..b7c1b89bf 100644 --- a/include/epanet2_2.h +++ b/include/epanet2_2.h @@ -1953,6 +1953,7 @@ typedef struct Project *EN_Project; */ int DLLEXPORT EN_setruleenabled(EN_Project ph, int index, int enabled); + #if defined(__cplusplus) } #endif diff --git a/include/epanet2_enums.h b/include/epanet2_enums.h index 2da2e6889..b1a9153e3 100644 --- a/include/epanet2_enums.h +++ b/include/epanet2_enums.h @@ -158,7 +158,8 @@ typedef enum { EN_MASSBALANCE = 4, //!< Cumulative water quality mass balance ratio EN_DEFICIENTNODES = 5, //!< Number of pressure deficient nodes EN_DEMANDREDUCTION = 6, //!< % demand reduction at pressure deficient nodes - EN_LEAKAGELOSS = 7 //!< % flow lost to system leakage + EN_LEAKAGELOSS = 7, //!< % flow lost to system leakage + EN_ERRORNODE = 8 //!< Index of node causing ill-conditioned error } EN_AnalysisStatistic; /// Types of network objects diff --git a/src/epanet.c b/src/epanet.c index 7714ae47a..f7209354b 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -1098,6 +1098,10 @@ int DLLEXPORT EN_getstatistic(EN_Project p, int type, double *value) case EN_MASSBALANCE: *value = p->quality.MassBalance.ratio; break; + case EN_ERRORNODE: + *value = p->hydraul.ErrNode; + break; + default: *value = 0.0; return 251; @@ -5941,3 +5945,4 @@ int DLLEXPORT EN_setruleenabled(EN_Project p, int index, int enabled) } + diff --git a/src/epanet2.c b/src/epanet2.c index 2bbc75fe7..7d55f3847 100644 --- a/src/epanet2.c +++ b/src/epanet2.c @@ -958,4 +958,4 @@ int DLLEXPORT ENgetruleenabled(int index, int *out_enabled) int DLLEXPORT ENsetruleenabled(int index, int enabled) { return EN_setruleenabled(_defaultProject, index, enabled); -} +} \ No newline at end of file diff --git a/src/hydsolver.c b/src/hydsolver.c index e5969bc90..52a74d8e0 100644 --- a/src/hydsolver.c +++ b/src/hydsolver.c @@ -105,6 +105,9 @@ int hydsolve(Project *pr, int *iter, double *relerr) hyd->DeficientNodes = 0; hyd->DemandReduction = 0.0; + // initialize error node + hyd->ErrNode = 0; + // Repeat iterations until convergence or trial limit is exceeded. // (ExtraIter used to increase trials in case of status cycling.) if (rpt->Statflag == FULL) writerelerr(pr, 0, 0); @@ -191,6 +194,7 @@ int hydsolve(Project *pr, int *iter, double *relerr) // Iterations ended - report any errors. if (errcode > 0) { + hyd->ErrNode = sm->Order[errcode]; // Store node causing ill-conditioned error writehyderr(pr, sm->Order[errcode]); // Ill-conditioned matrix error errcode = 110; } diff --git a/src/types.h b/src/types.h index 8c2bfcd71..68f4ebfb7 100755 --- a/src/types.h +++ b/src/types.h @@ -793,7 +793,8 @@ typedef struct { OpenHflag, // Hydraulic system opened flag Haltflag, // Flag to halt simulation DeficientNodes, // Number of pressure deficient nodes - HasLeakage; // TRUE if project has non-zero leakage parameters + HasLeakage, // TRUE if project has non-zero leakage parameters + ErrNode; // Node causing ill-conditioned network error Sleakage *Leakage; // Array of node leakage parameters diff --git a/tests/test_report.cpp b/tests/test_report.cpp index b026f1f77..fdc603f49 100644 --- a/tests/test_report.cpp +++ b/tests/test_report.cpp @@ -42,7 +42,7 @@ BOOST_FIXTURE_TEST_CASE(test_rprt_anlysstats, FixtureOpenClose) BOOST_CHECK(check_cdd_double(test, ref, 3)); double temp; - error = EN_getstatistic(ph, 8, &temp); + error = EN_getstatistic(ph, 9, &temp); BOOST_CHECK(error == 251); }