Merge pull request #287 from eladsal/dev-default-pattern

Add option to get\set default demand pattern
This commit is contained in:
Elad Salomons
2018-09-21 17:22:28 +03:00
committed by GitHub
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_HEADERROR = 5
Public Const EN_FLOWCHANGE = 6
Public Const EN_DEMANDDEFPAT = 7
Public Const EN_LOWLEVEL = 0 ' Control types
Public Const EN_HILEVEL = 1

View File

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

View File

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

View File

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