Add option to get\set default demand pattern

also updates the net builder test
This commit is contained in:
Elad Salomons
2018-09-15 14:22:20 +03:00
parent 43e5c42d9d
commit dad11cce8d
4 changed files with 53 additions and 13 deletions

View File

@@ -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

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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);