From dad11cce8dc128e511f85c3c4baa812abc536bcc Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Sat, 15 Sep 2018 14:22:20 +0300 Subject: [PATCH] Add option to get\set default demand pattern also updates the net builder test --- include/epanet2.bas | 1 + include/epanet2.h | 15 +++++++------- src/epanet.c | 42 +++++++++++++++++++++++++++++++++++--- tests/test_net_builder.cpp | 8 +++++--- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/include/epanet2.bas b/include/epanet2.bas index 685944c..da0f66e 100644 --- a/include/epanet2.bas +++ b/include/epanet2.bas @@ -138,6 +138,7 @@ Public Const EN_EMITEXPON = 3 Public Const EN_DEMANDMULT = 4 Public Const EN_HEADERROR = 5 Public Const EN_FLOWCHANGE = 6 +Public Const EN_DEMANDDEFPAT = 7 Public Const EN_LOWLEVEL = 0 ' Control types Public Const EN_HILEVEL = 1 diff --git a/include/epanet2.h b/include/epanet2.h index dc3d362..c7ccf1e 100644 --- a/include/epanet2.h +++ b/include/epanet2.h @@ -219,13 +219,14 @@ typedef enum { /* Demand model types. */ /// Simulation Option codes typedef enum { - EN_TRIALS = 0, - EN_ACCURACY = 1, - EN_TOLERANCE = 2, - EN_EMITEXPON = 3, - EN_DEMANDMULT = 4, - EN_HEADERROR = 5, - EN_FLOWCHANGE = 6 + EN_TRIALS = 0, + EN_ACCURACY = 1, + EN_TOLERANCE = 2, + EN_EMITEXPON = 3, + EN_DEMANDMULT = 4, + EN_HEADERROR = 5, + EN_FLOWCHANGE = 6, + EN_DEMANDDEFPAT = 7 } EN_Option; typedef enum { diff --git a/src/epanet.c b/src/epanet.c index cc1aa44..2776daf 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -1527,13 +1527,15 @@ int DLLEXPORT EN_getoption(EN_ProjectHandle ph, EN_Option code, case EN_DEMANDMULT: v = hyd->Dmult; break; - case EN_HEADERROR: v = hyd->HeadErrorLimit * Ucf[HEAD]; break; case EN_FLOWCHANGE: v = hyd->FlowChangeLimit * Ucf[FLOW]; break; + case EN_DEMANDDEFPAT: + v = hyd->DefPat; + break; default: return set_error(pr->error_handle, 251); @@ -3293,7 +3295,7 @@ int DLLEXPORT EN_addpattern(EN_ProjectHandle ph, char *id) { EN_Network *net = &p->network; parser_data_t *par = &p->parser; - + hydraulics_t *hyd = &p->hydraulics; Spattern *Pattern = net->Pattern; const int Npats = net->Npats; @@ -3359,6 +3361,10 @@ int DLLEXPORT EN_addpattern(EN_ProjectHandle ph, char *id) { net->Pattern = tmpPat; net->Npats = n; par->MaxPats = n; + + if (strcmp(id, par->DefPatID) == 0) { + hyd->DefPat = n; + } return set_error(p->error_handle, 0); } @@ -3679,6 +3685,9 @@ int DLLEXPORT EN_setoption(EN_ProjectHandle ph, int code, EN_API_FLOAT_TYPE v) double *Ucf = p->Ucf; int i, j; + int tmpPat, error; + char tmpId[MAXID+1]; + Pdemand demand; /* Pointer to demand record */ double Ke, n, ucf, value = v; if (!p->Openflag) return set_error(p->error_handle, 102); @@ -3716,7 +3725,6 @@ int DLLEXPORT EN_setoption(EN_ProjectHandle ph, int code, EN_API_FLOAT_TYPE v) return set_error(p->error_handle, 202); hyd->Dmult = value; break; - case EN_HEADERROR: if (value < 0.0) return set_error(p->error_handle, 202); @@ -3727,6 +3735,34 @@ int DLLEXPORT EN_setoption(EN_ProjectHandle ph, int code, EN_API_FLOAT_TYPE v) return set_error(p->error_handle, 202); hyd->FlowChangeLimit = value / Ucf[FLOW]; break; + case EN_DEMANDDEFPAT: + //check that the pattern exists or is set to zero to delete the default pattern + if (value < 0 || value > net->Npats) + return set_error(p->error_handle, 205); + tmpPat = hyd->DefPat; + //get the new pattern ID + if (value == 0) + { + strncpy(tmpId, "1", MAXID); // should be DEFPATID + } + else + { + error = EN_getpatternid(p, value, &*tmpId); + if (error != 0) + return set_error(p->error_handle, error); + } + // replace node patterns for default + for (i = 1; i <= net->Nnodes; i++) { + Snode *node = &net->Node[i]; + for (demand = node->D; demand != NULL; demand = demand->next) { + if (demand->Pat == tmpPat) { + demand->Pat = value; + } + } + } + strncpy(p->parser.DefPatID, tmpId, MAXID); + hyd->DefPat = value; + break; default: return set_error(p->error_handle, 251); diff --git a/tests/test_net_builder.cpp b/tests/test_net_builder.cpp index 7721fe8..f6f7bea 100644 --- a/tests/test_net_builder.cpp +++ b/tests/test_net_builder.cpp @@ -90,10 +90,12 @@ BOOST_AUTO_TEST_CASE(test_net_builder) error = EN_createproject(&ph); error = EN_init(ph, "net.rpt", "net.out", EN_GPM, EN_HW); - error = EN_addpattern(ph, (char *)"1"); + error = EN_addpattern(ph, (char *)"pat1"); BOOST_REQUIRE(error == 0); error = EN_setpattern(ph, 1, P, 12); BOOST_REQUIRE(error == 0); + error = EN_setoption(ph, EN_DEMANDDEFPAT, 1); + BOOST_REQUIRE(error == 0); for (i = 0; i < 9; i++) { error = EN_addnode(ph, juncs[i], EN_JUNCTION); @@ -104,8 +106,8 @@ BOOST_AUTO_TEST_CASE(test_net_builder) BOOST_REQUIRE(error == 0); error = EN_setcoord(ph, i + 1, X[i], Y[i]); BOOST_REQUIRE(error == 0); - error = EN_setdemandpattern(ph, i + 1, 1, 1); - BOOST_REQUIRE(error == 0); + //error = EN_setdemandpattern(ph, i + 1, 1, 1); + //BOOST_REQUIRE(error == 0); } error = EN_addnode(ph, (char *)"9", EN_RESERVOIR); BOOST_REQUIRE(error == 0);