Merge pull request #287 from eladsal/dev-default-pattern
Add option to get\set default demand pattern
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
42
src/epanet.c
42
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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user