Add option to get\set default demand pattern
also updates the net builder test
This commit is contained in:
@@ -138,6 +138,7 @@ Public Const EN_EMITEXPON = 3
|
|||||||
Public Const EN_DEMANDMULT = 4
|
Public Const EN_DEMANDMULT = 4
|
||||||
Public Const EN_HEADERROR = 5
|
Public Const EN_HEADERROR = 5
|
||||||
Public Const EN_FLOWCHANGE = 6
|
Public Const EN_FLOWCHANGE = 6
|
||||||
|
Public Const EN_DEMANDDEFPAT = 7
|
||||||
|
|
||||||
Public Const EN_LOWLEVEL = 0 ' Control types
|
Public Const EN_LOWLEVEL = 0 ' Control types
|
||||||
Public Const EN_HILEVEL = 1
|
Public Const EN_HILEVEL = 1
|
||||||
|
|||||||
@@ -219,13 +219,14 @@ typedef enum { /* Demand model types. */
|
|||||||
|
|
||||||
/// Simulation Option codes
|
/// Simulation Option codes
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EN_TRIALS = 0,
|
EN_TRIALS = 0,
|
||||||
EN_ACCURACY = 1,
|
EN_ACCURACY = 1,
|
||||||
EN_TOLERANCE = 2,
|
EN_TOLERANCE = 2,
|
||||||
EN_EMITEXPON = 3,
|
EN_EMITEXPON = 3,
|
||||||
EN_DEMANDMULT = 4,
|
EN_DEMANDMULT = 4,
|
||||||
EN_HEADERROR = 5,
|
EN_HEADERROR = 5,
|
||||||
EN_FLOWCHANGE = 6
|
EN_FLOWCHANGE = 6,
|
||||||
|
EN_DEMANDDEFPAT = 7
|
||||||
} EN_Option;
|
} EN_Option;
|
||||||
|
|
||||||
typedef enum {
|
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:
|
case EN_DEMANDMULT:
|
||||||
v = hyd->Dmult;
|
v = hyd->Dmult;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_HEADERROR:
|
case EN_HEADERROR:
|
||||||
v = hyd->HeadErrorLimit * Ucf[HEAD];
|
v = hyd->HeadErrorLimit * Ucf[HEAD];
|
||||||
break;
|
break;
|
||||||
case EN_FLOWCHANGE:
|
case EN_FLOWCHANGE:
|
||||||
v = hyd->FlowChangeLimit * Ucf[FLOW];
|
v = hyd->FlowChangeLimit * Ucf[FLOW];
|
||||||
break;
|
break;
|
||||||
|
case EN_DEMANDDEFPAT:
|
||||||
|
v = hyd->DefPat;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return set_error(pr->error_handle, 251);
|
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;
|
EN_Network *net = &p->network;
|
||||||
parser_data_t *par = &p->parser;
|
parser_data_t *par = &p->parser;
|
||||||
|
hydraulics_t *hyd = &p->hydraulics;
|
||||||
Spattern *Pattern = net->Pattern;
|
Spattern *Pattern = net->Pattern;
|
||||||
|
|
||||||
const int Npats = net->Npats;
|
const int Npats = net->Npats;
|
||||||
@@ -3359,6 +3361,10 @@ int DLLEXPORT EN_addpattern(EN_ProjectHandle ph, char *id) {
|
|||||||
net->Pattern = tmpPat;
|
net->Pattern = tmpPat;
|
||||||
net->Npats = n;
|
net->Npats = n;
|
||||||
par->MaxPats = n;
|
par->MaxPats = n;
|
||||||
|
|
||||||
|
if (strcmp(id, par->DefPatID) == 0) {
|
||||||
|
hyd->DefPat = n;
|
||||||
|
}
|
||||||
return set_error(p->error_handle, 0);
|
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;
|
double *Ucf = p->Ucf;
|
||||||
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
int tmpPat, error;
|
||||||
|
char tmpId[MAXID+1];
|
||||||
|
Pdemand demand; /* Pointer to demand record */
|
||||||
double Ke, n, ucf, value = v;
|
double Ke, n, ucf, value = v;
|
||||||
if (!p->Openflag)
|
if (!p->Openflag)
|
||||||
return set_error(p->error_handle, 102);
|
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);
|
return set_error(p->error_handle, 202);
|
||||||
hyd->Dmult = value;
|
hyd->Dmult = value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_HEADERROR:
|
case EN_HEADERROR:
|
||||||
if (value < 0.0)
|
if (value < 0.0)
|
||||||
return set_error(p->error_handle, 202);
|
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);
|
return set_error(p->error_handle, 202);
|
||||||
hyd->FlowChangeLimit = value / Ucf[FLOW];
|
hyd->FlowChangeLimit = value / Ucf[FLOW];
|
||||||
break;
|
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:
|
default:
|
||||||
return set_error(p->error_handle, 251);
|
return set_error(p->error_handle, 251);
|
||||||
|
|||||||
@@ -90,10 +90,12 @@ BOOST_AUTO_TEST_CASE(test_net_builder)
|
|||||||
|
|
||||||
error = EN_createproject(&ph);
|
error = EN_createproject(&ph);
|
||||||
error = EN_init(ph, "net.rpt", "net.out", EN_GPM, EN_HW);
|
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);
|
BOOST_REQUIRE(error == 0);
|
||||||
error = EN_setpattern(ph, 1, P, 12);
|
error = EN_setpattern(ph, 1, P, 12);
|
||||||
BOOST_REQUIRE(error == 0);
|
BOOST_REQUIRE(error == 0);
|
||||||
|
error = EN_setoption(ph, EN_DEMANDDEFPAT, 1);
|
||||||
|
BOOST_REQUIRE(error == 0);
|
||||||
for (i = 0; i < 9; i++)
|
for (i = 0; i < 9; i++)
|
||||||
{
|
{
|
||||||
error = EN_addnode(ph, juncs[i], EN_JUNCTION);
|
error = EN_addnode(ph, juncs[i], EN_JUNCTION);
|
||||||
@@ -104,8 +106,8 @@ BOOST_AUTO_TEST_CASE(test_net_builder)
|
|||||||
BOOST_REQUIRE(error == 0);
|
BOOST_REQUIRE(error == 0);
|
||||||
error = EN_setcoord(ph, i + 1, X[i], Y[i]);
|
error = EN_setcoord(ph, i + 1, X[i], Y[i]);
|
||||||
BOOST_REQUIRE(error == 0);
|
BOOST_REQUIRE(error == 0);
|
||||||
error = EN_setdemandpattern(ph, i + 1, 1, 1);
|
//error = EN_setdemandpattern(ph, i + 1, 1, 1);
|
||||||
BOOST_REQUIRE(error == 0);
|
//BOOST_REQUIRE(error == 0);
|
||||||
}
|
}
|
||||||
error = EN_addnode(ph, (char *)"9", EN_RESERVOIR);
|
error = EN_addnode(ph, (char *)"9", EN_RESERVOIR);
|
||||||
BOOST_REQUIRE(error == 0);
|
BOOST_REQUIRE(error == 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user