Skip to content

Commit

Permalink
Merge pull request #812 from Mariosmsk/add-EN_loadpatternfile
Browse files Browse the repository at this point in the history
Add the `EN_loadpatternfile` function to load pattern data from a `.pat` file into INP
  • Loading branch information
LRossman authored Aug 6, 2024
2 parents 2f4ae4c + 3604f3f commit fbd005d
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 1 deletion.
4 changes: 3 additions & 1 deletion include/epanet2.h
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ extern "C" {
********************************************************************/

int DLLEXPORT ENaddpattern(const char *id);

int DLLEXPORT ENdeletepattern(int index);

int DLLEXPORT ENgetpatternindex(const char *id, int *index);
Expand All @@ -346,6 +346,8 @@ extern "C" {
int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value);

int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *values, int len);

int DLLEXPORT ENloadpatternfile(const char *filename, const char *id);

/********************************************************************
Expand Down
9 changes: 9 additions & 0 deletions include/epanet2_2.h
Original file line number Diff line number Diff line change
Expand Up @@ -1478,6 +1478,15 @@ typedef struct Project *EN_Project;
use @ref EN_setpatternvalue to revise pattern factors one at a time.
*/
int DLLEXPORT EN_setpattern(EN_Project ph, int index, double *values, int len);

/**
@brief Loads time patterns from a file into a project under a specific pattern ID.
@param ph an EPANET project handle.
@param filename the name of the file containing pattern data.
@param id the ID name of the new pattern to load.
@return an error code.
*/
int DLLEXPORT EN_loadpatternfile(EN_Project p, const char *filename, const char *id);

/********************************************************************
Expand Down
64 changes: 64 additions & 0 deletions src/epanet.c
Original file line number Diff line number Diff line change
Expand Up @@ -4514,6 +4514,70 @@ int DLLEXPORT EN_addpattern(EN_Project p, const char *id)
return 0;
}

int DLLEXPORT EN_loadpatternfile(EN_Project p, const char *filename, const char *id)
/*----------------------------------------------------------------
** Input: filename = name of the file containing pattern data
** id = ID for the new pattern
** Output: none
** Returns: error code
** Purpose: loads time patterns from a file into a project under a specific pattern ID
**----------------------------------------------------------------
*/
{
FILE *file;
char line[MAXLINE+1];
char *tok;
int err = 0;
int i;
int len = 0;
double value;
double *values = NULL;
int CHUNK = 50;

if (!p->Openflag) return 102;

file = fopen(filename, "r");
if (file == NULL) return 302;

// Add a new pattern or use an existing pattern.
err = EN_getpatternindex(p, id, &i);
if (err == 205) {
if ((err = EN_addpattern(p, id)) != 0) {
fclose(file);
return err;
}
i = p->network.Npats;
}

// Read pattern values
while (fgets(line, sizeof(line), file) != NULL) {

// Skip lines that don't contain valid numbers
tok = strtok(line, SEPSTR);
if (tok == NULL) continue;
if (!getfloat(tok, &value)) continue;

// Resize multiplier array if it's full
if (len % CHUNK == 0) {
values = (double *) realloc(values, (len + CHUNK) * sizeof(double));

// Abort if memory allocation error
if (values == NULL) {
fclose(file);
return 101;
}
}
values[len] = value;
len++;
}
fclose(file);

// Transfer multipliers to pattern
err = EN_setpattern(p, i, values, len);
free(values);
return err;
}

int DLLEXPORT EN_deletepattern(EN_Project p, int index)
/*----------------------------------------------------------------
** Input: index = index of the pattern to delete
Expand Down
5 changes: 5 additions & 0 deletions src/epanet2.c
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,11 @@ int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *values, int len)
return errcode;
}

int DLLEXPORT ENloadpatternfile(const char *filename, const char *id)
{
return EN_loadpatternfile(_defaultProject, filename, id);
}

/********************************************************************
Data Curve Functions
Expand Down

0 comments on commit fbd005d

Please sign in to comment.