From b63f23288456beed16b7a36b19b394e72b8ff733 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Fri, 30 Nov 2018 15:49:28 -0500 Subject: [PATCH 01/16] Initial commit interface for python wrap --- .gitignore | 3 +- CMakeLists.txt | 4 +-- include/epanet_py.h | 33 ++++++++++++++++++ src/epanet_py.c | 52 +++++++++++++++++++++++++++++ src/util/errormanager.c | 74 +++++++++++++++++++++++++++++++++++++++++ src/util/errormanager.h | 27 +++++++++++++++ 6 files changed, 190 insertions(+), 3 deletions(-) create mode 100644 include/epanet_py.h create mode 100644 src/epanet_py.c create mode 100644 src/util/errormanager.c create mode 100644 src/util/errormanager.h diff --git a/.gitignore b/.gitignore index 628cb20..3c617e0 100755 --- a/.gitignore +++ b/.gitignore @@ -224,5 +224,6 @@ temp/ nrtestsuite/ tests/data/ -#Cmake generated export headers +#Cmake stuff +buildprod*/ *_export.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2756b71..268f55e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,8 +69,8 @@ ENDIF (MSVC) # configure file groups -file(GLOB EPANET_SOURCES src/*.c) -file(GLOB EPANET_LIB_ALL src/*.c src/*.h) +file(GLOB EPANET_SOURCES src/*.c src/util/*.c) +file(GLOB EPANET_LIB_ALL src/* src/util/*) source_group("Library" FILES ${EPANET_LIB_ALL}) diff --git a/include/epanet_py.h b/include/epanet_py.h new file mode 100644 index 0000000..dac4a2e --- /dev/null +++ b/include/epanet_py.h @@ -0,0 +1,33 @@ + + + + +#ifndef EPANET_PY_H +#define EPANET_PY_H + + +#include "epanet2_export.h" +#include "epanet2_enums.h" + + +#if defined(__cplusplus) +extern "C" { +#endif + +// Opaque pointer to project +typedef void *Handle; + + +int DLLEXPORT create_project(Handle *ph); + +int DLLEXPORT delete_project(Handle *ph); + +int DLLEXPORT run_project(Handle ph, const char *input_path, + const char *report_path, const char *output_path); + + +#if defined(__cplusplus) +} +#endif + +#endif //EPANET_PY_H diff --git a/src/epanet_py.c b/src/epanet_py.c new file mode 100644 index 0000000..abfedb9 --- /dev/null +++ b/src/epanet_py.c @@ -0,0 +1,52 @@ + + +#include + +#include "epanet_py.h" +#include "util/errormanager.h" +#include "epanet2_2.h" +#include "types.h" + + +typedef struct { + Project *project; + error_handle_t *error; +}handle_t; + + +int DLLEXPORT create_project(Handle *ph) +{ + handle_t *handle = (handle_t *)calloc(1, sizeof(handle_t)); + + if (handle != NULL) + { + EN_createproject(&handle->project); + handle->error = error_new_manager(&EN_geterror); + *ph = handle; + return 0; + } + return -1; +} + +int DLLEXPORT delete_project(Handle *ph) +{ + handle_t *handle = (handle_t *)*ph; + + if (handle == NULL) + return -1; + else + { + EN_deleteproject(&handle->project); + error_dst_manager(handle->error); + } + return 0; +} + +int DLLEXPORT run_project(Handle ph, const char *input_path, + const char *report_path, const char *output_path) +{ + handle_t *pr = (handle_t *)ph; + + return error_set(pr->error, + EN_runproject(pr->project, input_path, report_path, output_path, NULL)); +} diff --git a/src/util/errormanager.c b/src/util/errormanager.c new file mode 100644 index 0000000..3f4f47c --- /dev/null +++ b/src/util/errormanager.c @@ -0,0 +1,74 @@ +//----------------------------------------------------------------------------- +// +// errormanager.c +// +// Purpose: Provides a simple interface for managing runtime error messages. +// +// Date: 08/25/2017 +// +// Author: Michael E. Tryby +// US EPA - ORD/NRMRL +//----------------------------------------------------------------------------- +#include +#include +#include "errormanager.h" + +error_handle_t* error_new_manager(void (*p_error_message)(int, char*, int)) +// +// Purpose: Constructs a new error handle. +// +{ + error_handle_t* error_handle; + error_handle = (error_handle_t*)calloc(1, sizeof(error_handle_t)); + + error_handle->p_msg_lookup = p_error_message; + + return error_handle; +} + +void error_dst_manager(error_handle_t* error_handle) +// +// Purpose: Destroys the error handle. +// +{ + free(error_handle); +} + +int error_set(error_handle_t* error_handle, int errorcode) +// +// Purpose: Sets an error code in the handle. +// +{ + // If the error code is 0 no action is taken and 0 is returned. + // This is a feature not a bug. + if (errorcode) + error_handle->error_status = errorcode; + + return errorcode; +} + +char* error_check(error_handle_t* error_handle) +// +// Purpose: Returns the error message or NULL. +// +// Note: Caller must free memory allocated by check_error +// +{ + char* temp = NULL; + + if (error_handle->error_status != 0) { + temp = (char*) calloc(ERR_MAXMSG, sizeof(char)); + + if (temp) + error_handle->p_msg_lookup(error_handle->error_status, temp, ERR_MAXMSG); + } + return temp; +} + +void error_clear(error_handle_t* error_handle) +// +// Purpose: Clears the error from the handle. +// +{ + error_handle->error_status = 0; +} diff --git a/src/util/errormanager.h b/src/util/errormanager.h new file mode 100644 index 0000000..2a8099f --- /dev/null +++ b/src/util/errormanager.h @@ -0,0 +1,27 @@ +/* + * errormanager.h + * + * Created on: Aug 25, 2017 + * + * Author: Michael E. Tryby + * US EPA - ORD/NRMRL + */ + +#ifndef ERRORMANAGER_H_ +#define ERRORMANAGER_H_ + +#define ERR_MAXMSG 256 + +typedef struct error_s { + int error_status; + void (*p_msg_lookup)(int, char*, int); +} error_handle_t; + +error_handle_t* error_new_manager(void (*p_error_message)(int, char*, int)); +void error_dst_manager(error_handle_t* error_handle); + +int error_set(error_handle_t* error_handle, int errorcode); +char* error_check(error_handle_t* error_handle); +void error_clear(error_handle_t* error_handle); + +#endif /* ERRORMANAGER_H_ */ From c1adfd514d20bc4840c796e410ff0bf8a31a489b Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Tue, 4 Dec 2018 17:54:39 -0500 Subject: [PATCH 02/16] Fleshing out api for swig wrap --- include/epanet2_2.h | 1 + include/epanet_py.h | 73 ++++++++-- src/epanet_py.c | 330 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 387 insertions(+), 17 deletions(-) diff --git a/include/epanet2_2.h b/include/epanet2_2.h index 66fbe49..42139d0 100644 --- a/include/epanet2_2.h +++ b/include/epanet2_2.h @@ -80,6 +80,7 @@ typedef struct Project *EN_Project; int DLLEXPORT EN_createproject(EN_Project *ph); int DLLEXPORT EN_deleteproject(EN_Project *ph); + int DLLEXPORT EN_runproject(EN_Project ph, const char *f1, const char *f2, const char *f3, void (*pviewprog)(char *)); int DLLEXPORT EN_init(EN_Project ph, const char *rptFile, const char *outFile, diff --git a/include/epanet_py.h b/include/epanet_py.h index dac4a2e..93a036b 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -6,28 +6,81 @@ #define EPANET_PY_H -#include "epanet2_export.h" -#include "epanet2_enums.h" - - -#if defined(__cplusplus) -extern "C" { +#ifndef EN_API_FLOAT_TYPE + #define EN_API_FLOAT_TYPE float #endif // Opaque pointer to project typedef void *Handle; -int DLLEXPORT create_project(Handle *ph); +#include "epanet2_enums.h" -int DLLEXPORT delete_project(Handle *ph); +#include "epanet2_export.h" -int DLLEXPORT run_project(Handle ph, const char *input_path, - const char *report_path, const char *output_path); + +#if defined(__cplusplus) +extern "C" { +#endif + + +int DLLEXPORT proj_create(Handle *ph_out); +int DLLEXPORT proj_delete(Handle *ph_inout); +int DLLEXPORT proj_run(Handle ph, const char *input_path, const char *report_path, const char *output_path); +int DLLEXPORT proj_init(Handle ph, const char *rptFile, const char *outFile, EN_FlowUnits unitsType, EN_HeadLossType headLossType); +int DLLEXPORT proj_open(Handle ph, const char *inpFile, const char *rptFile, const char *binOutFile); +int DLLEXPORT proj_savefile(Handle ph, const char *inpfilename); +int DLLEXPORT proj_close(Handle ph); + +int DLLEXPORT hyd_solve(Handle ph); +int DLLEXPORT hyd_save(Handle ph); +int DLLEXPORT hyd_open(Handle ph); +int DLLEXPORT hyd_init(Handle ph, EN_SaveOption saveFlag); +int DLLEXPORT hyd_run(Handle ph, long *currentTime); +int DLLEXPORT hyd_next(Handle ph, long *tStep); +int DLLEXPORT hyd_close(Handle ph); +int DLLEXPORT hyd_savefile(Handle ph, char *filename); +int DLLEXPORT hyd_usefile(Handle ph, char *filename); + +int DLLEXPORT qual_solve(Handle ph); +int DLLEXPORT qual_open(Handle ph); +int DLLEXPORT qual_init(Handle ph, EN_SaveOption saveFlag); +int DLLEXPORT qual_run(Handle ph, long *currentTime); +int DLLEXPORT qual_next(Handle ph, long *tStep); +int DLLEXPORT qual_step(Handle ph, long *timeLeft); +int DLLEXPORT qual_close(Handle ph); + +int DLLEXPORT rpt_writeline(Handle ph, char *line); +int DLLEXPORT rpt_writeresults(Handle ph); +int DLLEXPORT rpt_reset(Handle ph); +int DLLEXPORT rpt_set(Handle ph, char *reportCommand); +int DLLEXPORT rpt_setlevel(Handle ph, EN_StatusReport code); +int DLLEXPORT rpt_getcount(Handle ph, EN_CountType code, int *count); +int DLLEXPORT rpt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value); + +int DLLEXPORT anlys_getoption(Handle ph, EN_Option opt, EN_API_FLOAT_TYPE *value); +int DLLEXPORT anlys_setoption(Handle ph, int code, EN_API_FLOAT_TYPE value); +int DLLEXPORT anlys_getflowunits(Handle ph, EN_FlowUnits *code); +int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code); +int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeProperty code, long *value); +int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeProperty code, long value); +int DLLEXPORT anlys_getqualinfo(Handle ph, EN_QualityType *qualcode, char *chemname, char *chemunits, int *tracenode); +int DLLEXPORT anlys_getqualtype(Handle ph, EN_QualityType *qualcode, int *tracenode); +int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode); + + + + + +void DLLEXPORT err_clear(Handle ph); +int DLLEXPORT err_check(Handle ph, char** msg_buffer); +void DLLEXPORT toolkit_free(void **memory); +int DLLEXPORT toolkit_getversion(int *version); #if defined(__cplusplus) } #endif + #endif //EPANET_PY_H diff --git a/src/epanet_py.c b/src/epanet_py.c index abfedb9..1814760 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -1,10 +1,12 @@ #include +#include #include "epanet_py.h" #include "util/errormanager.h" #include "epanet2_2.h" +#include "text.h" #include "types.h" @@ -12,23 +14,27 @@ typedef struct { Project *project; error_handle_t *error; }handle_t; +// Extern functions +extern char *geterrmsg(int, char *); +// Local functions +void error_lookup(int errcode, char *errmsg, int len); -int DLLEXPORT create_project(Handle *ph) +int DLLEXPORT proj_create(Handle *ph) { handle_t *handle = (handle_t *)calloc(1, sizeof(handle_t)); if (handle != NULL) { EN_createproject(&handle->project); - handle->error = error_new_manager(&EN_geterror); + handle->error = error_new_manager(&error_lookup); *ph = handle; return 0; } return -1; } -int DLLEXPORT delete_project(Handle *ph) +int DLLEXPORT proj_delete(Handle *ph) { handle_t *handle = (handle_t *)*ph; @@ -39,14 +45,324 @@ int DLLEXPORT delete_project(Handle *ph) EN_deleteproject(&handle->project); error_dst_manager(handle->error); } + free(handle); + *ph = NULL; + return 0; } -int DLLEXPORT run_project(Handle ph, const char *input_path, +int DLLEXPORT proj_run(Handle ph, const char *input_path, const char *report_path, const char *output_path) { handle_t *pr = (handle_t *)ph; - - return error_set(pr->error, - EN_runproject(pr->project, input_path, report_path, output_path, NULL)); + return error_set(pr->error, EN_runproject(pr->project, input_path, report_path, output_path, NULL)); } + +int DLLEXPORT proj_init(Handle ph, const char *rptFile, const char *outFile, + EN_FlowUnits unitsType, EN_HeadLossType headLossType) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_init(pr->project, rptFile, outFile, unitsType, headLossType)); +} + +int DLLEXPORT proj_open(Handle ph, const char *inpFile, const char *rptFile, + const char *binOutFile) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_open(pr->project, inpFile, rptFile, binOutFile)); +} + +int DLLEXPORT proj_savefile(Handle ph, const char *filename) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_saveinpfile(pr->project, filename)); +} + +int DLLEXPORT proj_close(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_close(pr->project)); +} + + + + +int DLLEXPORT hyd_solve(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_solveH(pr->project)); +} + +int DLLEXPORT hyd_save(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_saveH(pr->project)); +} + +int DLLEXPORT hyd_open(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_openH(pr->project)); +} + +int DLLEXPORT hyd_init(Handle ph, EN_SaveOption saveFlag) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_initH(pr->project, saveFlag)); +} + +int DLLEXPORT hyd_run(Handle ph, long *currentTime) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_runH(pr->project, currentTime)); +} + +int DLLEXPORT hyd_next(Handle ph, long *tStep) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_nextH(pr->project, tStep)); +} + +int DLLEXPORT hyd_close(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_closeH(pr->project)); +} + +int DLLEXPORT hyd_savefile(Handle ph, char *filename) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_savehydfile(pr->project, filename)); +} + +int DLLEXPORT hyd_usefile(Handle ph, char *filename) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_usehydfile(pr->project, filename)); +} + + + + +int DLLEXPORT qual_solve(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_solveQ(pr->project)); +} + +int DLLEXPORT qual_open(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_openQ(pr->project)); +} + +int DLLEXPORT qual_init(Handle ph, EN_SaveOption saveFlag) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_initQ(pr->project, saveFlag)); +} + +int DLLEXPORT qual_run(Handle ph, long *currentTime) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_runQ(pr->project, currentTime)); +} + +int DLLEXPORT qual_next(Handle ph, long *tStep) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_nextQ(pr->project, tStep)); +} + +int DLLEXPORT qual_step(Handle ph, long *timeLeft) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_stepQ(pr->project, timeLeft)); +} + +int DLLEXPORT qual_close(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_closeQ(pr->project)); +} + + + + +int DLLEXPORT rpt_writeline(Handle ph, char *line) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_writeline(pr->project, line)); +} + +int DLLEXPORT rpt_writeresults(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_report(pr->project)); +} + +int DLLEXPORT rpt_reset(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_resetreport(pr->project)); +} + +int DLLEXPORT rpt_set(Handle ph, char *reportCommand) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setreport(pr->project, reportCommand)); +} + +int DLLEXPORT rpt_setlevel(Handle ph, EN_StatusReport code) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setstatusreport(pr->project, code)); +} + +int DLLEXPORT rpt_getcount(Handle ph, EN_CountType code, int *count) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcount(pr->project, code, count)); +} + +int DLLEXPORT rpt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getstatistic(pr->project, code, value)); +} + + + + +int DLLEXPORT anlys_getoption(Handle ph, EN_Option code, EN_API_FLOAT_TYPE *value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getoption(pr->project, code, value)); +} + +int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, EN_API_FLOAT_TYPE value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setoption(pr->project, code, value)); +} + +int DLLEXPORT anlys_getflowunits(Handle ph, EN_FlowUnits *code) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getflowunits(pr->project, (int *)code)); +} + +int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setflowunits(pr->project, code)); +} + +int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeProperty code, long *value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_gettimeparam(pr->project, code, value)); +} + +int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeProperty code, long value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_settimeparam(pr->project, code, value)); +} + +int DLLEXPORT anlys_getqualinfo(Handle ph, EN_QualityType *qualcode, char *chemname, char *chemunits, int *tracenode) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getqualinfo(pr->project, (int *)qualcode, chemname, chemunits, tracenode)); +} + +int DLLEXPORT anlys_getqualtype(Handle ph, EN_QualityType *qualcode, int *tracenode) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getqualtype(pr->project, (int *)qualcode, tracenode)); +} + +int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setqualtype(pr->project, qualcode, chemname, chemunits, tracenode)); +} + + + + + + +void DLLEXPORT err_clear(Handle ph) +{ + handle_t *pr = (handle_t *)ph; + error_clear(pr->error); +} + + +int DLLEXPORT err_check(Handle ph, char** msg_buffer) +// +// Purpose: Returns the error message or NULL. +// +// Note: Caller must free memory allocated by EN_check_error +// +{ + int errorcode = 0; + char *temp = NULL; + + handle_t *pr = (handle_t *)ph; + + + if (pr == NULL) return -1; + else + { + errorcode = pr->error->error_status; + if (errorcode) + temp = error_check(pr->error); + + *msg_buffer = temp; + } + + return errorcode; +} + +int DLLEXPORT toolkit_getversion(int *version) +{ + return EN_getversion(version); +} + +void DLLEXPORT toolkit_free(void **memory) +{ + free(*memory); + *memory = NULL; +} + +void error_lookup(int errcode, char *dest_msg, int dest_len) +// Purpose: takes error code returns error message +{ + char *msg = NULL; + + switch (errcode) + { + case 1: msg = WARN1; + break; + case 2: msg = WARN2; + break; + case 3: msg = WARN3; + break; + case 4: msg = WARN4; + break; + case 5: msg = WARN5; + break; + case 6: msg = WARN6; + break; + default: + { + char new_msg[MAXMSG + 1]; + msg = geterrmsg(errcode, new_msg); + } + } + strncpy(dest_msg, msg, dest_len); +} + + From d5de19caa035b3c5a0925a8378db1c5defb87879 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Thu, 6 Dec 2018 17:48:32 -0500 Subject: [PATCH 03/16] Ongoing dev --- include/epanet_py.h | 95 ++++++++++-- src/epanet_py.c | 348 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 411 insertions(+), 32 deletions(-) diff --git a/include/epanet_py.h b/include/epanet_py.h index 93a036b..3722731 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -32,15 +32,17 @@ int DLLEXPORT proj_open(Handle ph, const char *inpFile, const char *rptFile, con int DLLEXPORT proj_savefile(Handle ph, const char *inpfilename); int DLLEXPORT proj_close(Handle ph); -int DLLEXPORT hyd_solve(Handle ph); -int DLLEXPORT hyd_save(Handle ph); -int DLLEXPORT hyd_open(Handle ph); -int DLLEXPORT hyd_init(Handle ph, EN_SaveOption saveFlag); -int DLLEXPORT hyd_run(Handle ph, long *currentTime); -int DLLEXPORT hyd_next(Handle ph, long *tStep); -int DLLEXPORT hyd_close(Handle ph); -int DLLEXPORT hyd_savefile(Handle ph, char *filename); -int DLLEXPORT hyd_usefile(Handle ph, char *filename); + +int DLLEXPORT hydr_solve(Handle ph); +int DLLEXPORT hydr_save(Handle ph); +int DLLEXPORT hydr_open(Handle ph); +int DLLEXPORT hydr_init(Handle ph, EN_SaveOption saveFlag); +int DLLEXPORT hydr_run(Handle ph, long *currentTime); +int DLLEXPORT hydr_next(Handle ph, long *tStep); +int DLLEXPORT hydr_close(Handle ph); +int DLLEXPORT hydr_savefile(Handle ph, char *filename); +int DLLEXPORT hydr_usefile(Handle ph, char *filename); + int DLLEXPORT qual_solve(Handle ph); int DLLEXPORT qual_open(Handle ph); @@ -50,13 +52,15 @@ int DLLEXPORT qual_next(Handle ph, long *tStep); int DLLEXPORT qual_step(Handle ph, long *timeLeft); int DLLEXPORT qual_close(Handle ph); -int DLLEXPORT rpt_writeline(Handle ph, char *line); -int DLLEXPORT rpt_writeresults(Handle ph); -int DLLEXPORT rpt_reset(Handle ph); -int DLLEXPORT rpt_set(Handle ph, char *reportCommand); -int DLLEXPORT rpt_setlevel(Handle ph, EN_StatusReport code); -int DLLEXPORT rpt_getcount(Handle ph, EN_CountType code, int *count); -int DLLEXPORT rpt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value); + +int DLLEXPORT rprt_writeline(Handle ph, char *line); +int DLLEXPORT rprt_writeresults(Handle ph); +int DLLEXPORT rprt_reset(Handle ph); +int DLLEXPORT rprt_set(Handle ph, char *reportCommand); +int DLLEXPORT rprt_setlevel(Handle ph, EN_StatusReport code); +int DLLEXPORT rprt_getcount(Handle ph, EN_CountType code, int *count); +int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value); + int DLLEXPORT anlys_getoption(Handle ph, EN_Option opt, EN_API_FLOAT_TYPE *value); int DLLEXPORT anlys_setoption(Handle ph, int code, EN_API_FLOAT_TYPE value); @@ -69,8 +73,67 @@ int DLLEXPORT anlys_getqualtype(Handle ph, EN_QualityType *qualcode, int *tracen int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode); +int DLLEXPORT node_add(Handle ph, char *id, EN_NodeType nodeType); +int DLLEXPORT node_delete(Handle ph, int index, int actionCode); +int DLLEXPORT node_getindex(Handle ph, char *id, int *index); +int DLLEXPORT node_getid(Handle ph, int index, char *id); +int DLLEXPORT node_setid(Handle ph, int index, char *newid); +int DLLEXPORT node_gettype(Handle ph, int index, int *code); +int DLLEXPORT node_getvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE *value); +int DLLEXPORT node_setvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE value); +int DLLEXPORT node_getcoord(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); +int DLLEXPORT node_setcoord(Handle ph, int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); +int DLLEXPORT dmnd_getmodel(Handle ph, int *type, EN_API_FLOAT_TYPE *pmin, EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); +int DLLEXPORT dmnd_setmodel(Handle ph, int type, EN_API_FLOAT_TYPE pmin, EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); +int DLLEXPORT dmnd_getcount(Handle ph, int nodeIndex, int *numDemands); +int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE *baseDemand); +int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE baseDemand); +int DLLEXPORT dmnd_getpattern(Handle ph, int nodeIndex, int demandIndex, int *pattIndex); +int DLLEXPORT dmnd_setpattern(Handle ph, int nodeIndex, int demandIndex, int patIndex); +int DLLEXPORT dmnd_getname(Handle ph, int nodeIndex, int demandIdx, char *demandName); +int DLLEXPORT dmnd_setname(Handle ph, int nodeIndex, int demandIdx, char *demandName); + + +int DLLEXPORT link_add(Handle ph, char *id, EN_LinkType linkType, char *fromNode, char *toNode); +int DLLEXPORT link_delete(Handle ph, int index, int actionCode); +int DLLEXPORT link_getindex(Handle ph, char *id, int *index); +int DLLEXPORT link_getid(Handle ph, int index, char *id); +int DLLEXPORT link_setid(Handle ph, int index, char *newid); +int DLLEXPORT link_gettype(Handle ph, int index, int *code); +int DLLEXPORT link_settype(Handle ph, int *index, EN_LinkType type, int actionCode); +int DLLEXPORT link_getnodes(Handle ph, int index, int *node1, int *node2); +int DLLEXPORT link_setnodes(Handle ph, int index, int node1, int node2); +int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, EN_API_FLOAT_TYPE *value); +int DLLEXPORT link_setvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE v); + + +int DLLEXPORT pump_gettype(Handle ph, int linkIndex, int *outType); +int DLLEXPORT pump_getheadcurveindex(Handle ph, int pumpIndex, int *curveIndex); +int DLLEXPORT pump_setheadcurveindex(Handle ph, int pumpIndex, int curveIndex); + + +int DLLEXPORT ptrn_add(Handle ph, char *id); +int DLLEXPORT ptrn_getindex(Handle ph, char *id, int *index); +int DLLEXPORT ptrn_getid(Handle ph, int index, char *id); +int DLLEXPORT ptrn_getlength(Handle ph, int index, int *len); +int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE *value); +int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE value); +int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, EN_API_FLOAT_TYPE *value); +int DLLEXPORT ptrn_set(Handle ph, int index, EN_API_FLOAT_TYPE *f, int len); + + +int DLLEXPORT curv_add(Handle ph, char *id); +int DLLEXPORT curv_getindex(Handle ph, char *id, int *index); +int DLLEXPORT curv_getid(Handle ph, int index, char *id); +int DLLEXPORT curv_getlength(Handle ph, int index, int *len); +int DLLEXPORT curv_gettype(Handle ph, int curveIndex, int *outType); +int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); +int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); +int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues); +int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len); + void DLLEXPORT err_clear(Handle ph); int DLLEXPORT err_check(Handle ph, char** msg_buffer); diff --git a/src/epanet_py.c b/src/epanet_py.c index 1814760..394df5f 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -87,55 +87,55 @@ int DLLEXPORT proj_close(Handle ph) -int DLLEXPORT hyd_solve(Handle ph) +int DLLEXPORT hydr_solve(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_solveH(pr->project)); } -int DLLEXPORT hyd_save(Handle ph) +int DLLEXPORT hydr_save(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_saveH(pr->project)); } -int DLLEXPORT hyd_open(Handle ph) +int DLLEXPORT hydr_open(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_openH(pr->project)); } -int DLLEXPORT hyd_init(Handle ph, EN_SaveOption saveFlag) +int DLLEXPORT hydr_init(Handle ph, EN_SaveOption saveFlag) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_initH(pr->project, saveFlag)); } -int DLLEXPORT hyd_run(Handle ph, long *currentTime) +int DLLEXPORT hydr_run(Handle ph, long *currentTime) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_runH(pr->project, currentTime)); } -int DLLEXPORT hyd_next(Handle ph, long *tStep) +int DLLEXPORT hydr_next(Handle ph, long *tStep) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_nextH(pr->project, tStep)); } -int DLLEXPORT hyd_close(Handle ph) +int DLLEXPORT hydr_close(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_closeH(pr->project)); } -int DLLEXPORT hyd_savefile(Handle ph, char *filename) +int DLLEXPORT hydr_savefile(Handle ph, char *filename) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_savehydfile(pr->project, filename)); } -int DLLEXPORT hyd_usefile(Handle ph, char *filename) +int DLLEXPORT hydr_usefile(Handle ph, char *filename) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_usehydfile(pr->project, filename)); @@ -189,43 +189,43 @@ int DLLEXPORT qual_close(Handle ph) -int DLLEXPORT rpt_writeline(Handle ph, char *line) +int DLLEXPORT rprt_writeline(Handle ph, char *line) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_writeline(pr->project, line)); } -int DLLEXPORT rpt_writeresults(Handle ph) +int DLLEXPORT rprt_writeresults(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_report(pr->project)); } -int DLLEXPORT rpt_reset(Handle ph) +int DLLEXPORT rprt_reset(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_resetreport(pr->project)); } -int DLLEXPORT rpt_set(Handle ph, char *reportCommand) +int DLLEXPORT rprt_set(Handle ph, char *reportCommand) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setreport(pr->project, reportCommand)); } -int DLLEXPORT rpt_setlevel(Handle ph, EN_StatusReport code) +int DLLEXPORT rprt_setlevel(Handle ph, EN_StatusReport code) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setstatusreport(pr->project, code)); } -int DLLEXPORT rpt_getcount(Handle ph, EN_CountType code, int *count) +int DLLEXPORT rprt_getcount(Handle ph, EN_CountType code, int *count) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcount(pr->project, code, count)); } -int DLLEXPORT rpt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value) +int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getstatistic(pr->project, code, value)); @@ -291,6 +291,322 @@ int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemna +int DLLEXPORT node_add(Handle ph, char *id, EN_NodeType nodeType) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_addnode(pr->project, id, nodeType)); +} + +int DLLEXPORT node_delete(Handle ph, int index, int actionCode) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_deletenode(pr->project, index, actionCode)); +} + +int DLLEXPORT node_getindex(Handle ph, char *id, int *index) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getnodeindex(pr->project, id, index)); +} + +int DLLEXPORT node_getid(Handle ph, int index, char *id) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getnodeid(pr->project, index, id)); +} + +int DLLEXPORT node_setid(Handle ph, int index, char *newid) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getnodeid(pr->project, index, newid)); +} + +int DLLEXPORT node_gettype(Handle ph, int index, int *code) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getnodetype(pr->project, index, code)); +} + +int DLLEXPORT node_getvalue(Handle ph, int index, EN_NodeProperty code, EN_API_FLOAT_TYPE *value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getnodevalue(pr->project, index, code, value)); +} + +int DLLEXPORT node_setvalue(Handle ph, int index, EN_NodeProperty code, EN_API_FLOAT_TYPE value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setnodevalue(pr->project, index, code, value)); +} + +int DLLEXPORT node_getcoord(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcoord(pr->project, index, x, y)); +} + +int DLLEXPORT node_setcoord(Handle ph, int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setcoord(pr->project, index, x, y)); +} + + + + +int DLLEXPORT dmnd_getmodel(Handle ph, int *type, EN_API_FLOAT_TYPE *pmin, EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getdemandmodel(pr->project, type, pmin, preq, pexp)); +} + +int DLLEXPORT dmnd_setmodel(Handle ph, int type, EN_API_FLOAT_TYPE pmin, EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setdemandmodel(pr->project, type, pmin, preq, pexp)); +} + +int DLLEXPORT dmnd_getcount(Handle ph, int nodeIndex, int *numDemands) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getnumdemands(pr->project, nodeIndex, numDemands)); +} + +int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE *baseDemand) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getbasedemand(pr->project, nodeIndex, demandIndex, baseDemand)); +} + +int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE baseDemand) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setbasedemand(pr->project, nodeIndex, demandIndex, baseDemand)); +} + +int DLLEXPORT dmnd_getpattern(Handle ph, int nodeIndex, int demandIndex, int *patIndex) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getdemandpattern(pr->project, nodeIndex, demandIndex, patIndex)); +} + +int DLLEXPORT dmnd_setpattern(Handle ph, int nodeIndex, int demandIndex, int patIndex) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setdemandpattern(pr->project, nodeIndex, demandIndex, patIndex)); +} + +int DLLEXPORT dmnd_getname(Handle ph, int nodeIndex, int demandIdx, char *demandName) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getdemandname(pr->project, nodeIndex, demandIdx, demandName)); +} + +int DLLEXPORT dmnd_setname(Handle ph, int nodeIndex, int demandIdx, char *demandName) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setdemandname(pr->project, nodeIndex, demandIdx, demandName)); +} + + + + +int DLLEXPORT link_add(Handle ph, char *id, EN_LinkType linkType, char *fromNode, char *toNode) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_addlink(pr->project, id, linkType, fromNode, toNode)); +} + +int DLLEXPORT link_delete(Handle ph, int index, int actionCode) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_deletelink(pr->project, index, actionCode)); +} + +int DLLEXPORT link_getindex(Handle ph, char *id, int *index) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getlinkindex(pr->project, id, index)); +} + +int DLLEXPORT link_getid(Handle ph, int index, char *id) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getlinkid(pr->project, index, id)); +} + +int DLLEXPORT link_setid(Handle ph, int index, char *newid) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setlinkid(pr->project, index, newid)); +} + +int DLLEXPORT link_gettype(Handle ph, int index, int *code) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getlinktype(pr->project, index, (EN_LinkType *)code)); +} + +int DLLEXPORT link_settype(Handle ph, int *index, EN_LinkType type, int actionCode) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setlinktype(pr->project, index, type, actionCode)); +} + +int DLLEXPORT link_getnodes(Handle ph, int index, int *node1, int *node2) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getlinknodes(pr->project, index, node1, node2)); +} + +int DLLEXPORT link_setnodes(Handle ph, int index, int node1, int node2) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setlinknodes(pr->project, index, node1, node2)); +} + +int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, EN_API_FLOAT_TYPE *value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getlinkvalue(pr->project, index, code, value)); +} + +int DLLEXPORT link_setvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setlinkvalue(pr->project, index, code, value)); +} + + + + +int DLLEXPORT pump_gettype(Handle ph, int linkIndex, int *outType) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getpumptype(pr->project, linkIndex, outType)); +} + +int DLLEXPORT pump_getheadcurveindex(Handle ph, int pumpIndex, int *curveIndex) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getheadcurveindex(pr->project, pumpIndex, curveIndex)); +} + +int DLLEXPORT pump_setheadcurveindex(Handle ph, int pumpIndex, int curveIndex) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setheadcurveindex(pr->project, pumpIndex, curveIndex)); +} + + + + +int DLLEXPORT ptrn_add(Handle ph, char *id) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_addpattern(pr->project, id)); +} + +int DLLEXPORT ptrn_getindex(Handle ph, char *id, int *index) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getpatternindex(pr->project, id, index)); +} + +int DLLEXPORT ptrn_getid(Handle ph, int index, char *id) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getpatternid(pr->project, index, id)); +} + +int DLLEXPORT ptrn_getlength(Handle ph, int index, int *len) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getpatternlen(pr->project, index, len)); +} + +int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE *value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getpatternvalue(pr->project, index, period, value)); +} + +int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setpatternvalue(pr->project, index, period, value)); +} + +int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, EN_API_FLOAT_TYPE *value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getaveragepatternvalue(pr->project, index, value)); +} + +int DLLEXPORT ptrn_set(Handle ph, int index, EN_API_FLOAT_TYPE *values, int len) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setpattern(pr->project, index, values, len)); +} + + + + +int DLLEXPORT curv_add(Handle ph, char *id) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_addcurve(pr->project, id)); +} + +int DLLEXPORT curv_getindex(Handle ph, char *id, int *index) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcurveindex(pr->project, id, index)); +} + +int DLLEXPORT curv_getid(Handle ph, int index, char *id) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcurveid(pr->project, index, id)); +} + +int DLLEXPORT curv_getlength(Handle ph, int index, int *len) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcurvelen(pr->project, index, len)); +} + +int DLLEXPORT curv_gettype(Handle ph, int index, int *type) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcurvetype(pr->project, index, type)); +} + +int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcurvevalue(pr->project, curveIndex, pointIndex, x, y)); +} + +int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setcurvevalue(pr->project, curveIndex, pointIndex, x, y)); +} + +int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcurve(pr->project, curveIndex, id, nValues, xValues, yValues)); +} + +int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setcurve(pr->project, index, x, y, len)); +} + + void DLLEXPORT err_clear(Handle ph) From fca9c42411764709656a86b820c2a2434aa1e9f8 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Fri, 7 Dec 2018 16:23:12 -0500 Subject: [PATCH 04/16] Fixing arg as return with enum type --- include/epanet_py.h | 2 +- src/epanet_py.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/epanet_py.h b/include/epanet_py.h index 3722731..202d97d 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -64,7 +64,7 @@ int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT int DLLEXPORT anlys_getoption(Handle ph, EN_Option opt, EN_API_FLOAT_TYPE *value); int DLLEXPORT anlys_setoption(Handle ph, int code, EN_API_FLOAT_TYPE value); -int DLLEXPORT anlys_getflowunits(Handle ph, EN_FlowUnits *code); +int DLLEXPORT anlys_getflowunits(Handle ph, int *code); int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code); int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeProperty code, long *value); int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeProperty code, long value); diff --git a/src/epanet_py.c b/src/epanet_py.c index 394df5f..6757340 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -246,10 +246,10 @@ int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, EN_API_FLOAT_TYPE value return error_set(pr->error, EN_setoption(pr->project, code, value)); } -int DLLEXPORT anlys_getflowunits(Handle ph, EN_FlowUnits *code) +int DLLEXPORT anlys_getflowunits(Handle ph, int *code) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_getflowunits(pr->project, (int *)code)); + return error_set(pr->error, EN_getflowunits(pr->project, code)); } int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code) From 51795d86e9a90f2119e767d4bfc97cf205a372cb Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Mon, 10 Dec 2018 15:53:38 -0500 Subject: [PATCH 05/16] Adding API for simple and rule based controls --- include/epanet_py.h | 26 ++++++++- src/epanet_py.c | 127 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 143 insertions(+), 10 deletions(-) diff --git a/include/epanet_py.h b/include/epanet_py.h index 202d97d..fd81651 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -68,8 +68,8 @@ int DLLEXPORT anlys_getflowunits(Handle ph, int *code); int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code); int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeProperty code, long *value); int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeProperty code, long value); -int DLLEXPORT anlys_getqualinfo(Handle ph, EN_QualityType *qualcode, char *chemname, char *chemunits, int *tracenode); -int DLLEXPORT anlys_getqualtype(Handle ph, EN_QualityType *qualcode, int *tracenode); +int DLLEXPORT anlys_getqualinfo(Handle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode); +int DLLEXPORT anlys_getqualtype(Handle ph, int *qualcode, int *tracenode); int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode); @@ -135,6 +135,28 @@ int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, EN_API int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len); +int DLLEXPORT scntl_add(Handle ph, int *cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); +int DLLEXPORT scntl_delete(Handle ph, int index); +int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, int *nodeIndex, EN_API_FLOAT_TYPE *level); +int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); + + +int DLLEXPORT rcntl_add(Handle ph, char *rule); +int DLLEXPORT rcntl_delete(Handle ph, int index); +int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, EN_API_FLOAT_TYPE *priority); +int DLLEXPORT rcntl_getid(Handle ph, int index, char* id); +int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, EN_API_FLOAT_TYPE *value); +int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, EN_API_FLOAT_TYPE value); +int DLLEXPORT rcntl_setpremiseindex(Handle ph, int ruleIndex, int premiseIndex, int objIndex); +int DLLEXPORT rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, int status); +int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, EN_API_FLOAT_TYPE value); +int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); +int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting); +int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); +int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting); +int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, EN_API_FLOAT_TYPE priority); + + void DLLEXPORT err_clear(Handle ph); int DLLEXPORT err_check(Handle ph, char** msg_buffer); void DLLEXPORT toolkit_free(void **memory); diff --git a/src/epanet_py.c b/src/epanet_py.c index 6757340..56d0878 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -270,16 +270,16 @@ int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeProperty code, long value) return error_set(pr->error, EN_settimeparam(pr->project, code, value)); } -int DLLEXPORT anlys_getqualinfo(Handle ph, EN_QualityType *qualcode, char *chemname, char *chemunits, int *tracenode) +int DLLEXPORT anlys_getqualinfo(Handle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_getqualinfo(pr->project, (int *)qualcode, chemname, chemunits, tracenode)); + return error_set(pr->error, EN_getqualinfo(pr->project, qualcode, chemname, chemunits, tracenode)); } -int DLLEXPORT anlys_getqualtype(Handle ph, EN_QualityType *qualcode, int *tracenode) +int DLLEXPORT anlys_getqualtype(Handle ph, int *qualcode, int *tracenode) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_getqualtype(pr->project, (int *)qualcode, tracenode)); + return error_set(pr->error, EN_getqualtype(pr->project, qualcode, tracenode)); } int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode) @@ -609,13 +609,126 @@ int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_ +int DLLEXPORT scntl_add(Handle ph, int *cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_addcontrol(pr->project, cindex, ctype, lindex, setting, nindex, level)); +} + +int DLLEXPORT scntl_delete(Handle ph, int index) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_deletecontrol(pr->project, index)); +} + +int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, int *nodeIndex, EN_API_FLOAT_TYPE *level) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getcontrol(pr->project, controlIndex, controlType, linkIndex, setting, nodeIndex, level)); +} + +int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setcontrol(pr->project, cindex, ctype, lindex, setting, nindex, level)); +} + + + + +int DLLEXPORT rcntl_add(Handle ph, char *rule) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_addrule(pr->project, rule)); +} + +int DLLEXPORT rcntl_delete(Handle ph, int index) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_deleterule(pr->project, index)); +} + +int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, EN_API_FLOAT_TYPE *priority) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getrule(pr->project, index, nPremises, nThenActions, nElseActions, priority)); +} + +int DLLEXPORT rcntl_getid(Handle ph, int index, char *id) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getruleID(pr->project, index, id)); +} + +int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, EN_API_FLOAT_TYPE *value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getpremise(pr->project, ruleIndex, premiseIndex, logop, object, objIndex, variable, relop, status, value)); +} + +int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, EN_API_FLOAT_TYPE value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setpremise(pr->project, ruleIndex, premiseIndex, logop, object, objIndex, variable, relop, status, value)); +} + +int DLLEXPORT rcntl_setpremiseindex(Handle ph, int ruleIndex, int premiseIndex, int objIndex) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setpremiseindex(pr->project, ruleIndex, premiseIndex, objIndex)); +} + +int DLLEXPORT rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, int status) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setpremisestatus(pr->project, ruleIndex, premiseIndex, status)); +} + +int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, EN_API_FLOAT_TYPE value) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setpremisevalue(pr->project, ruleIndex, premiseIndex, value)); +} + +int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getthenaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); +} + +int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setthenaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); +} + +int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_getelseaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); +} + +int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setelseaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); +} + +int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, EN_API_FLOAT_TYPE priority) +{ + handle_t *pr = (handle_t *)ph; + return error_set(pr->error, EN_setrulepriority(pr->project, index, priority)); +} + + + + void DLLEXPORT err_clear(Handle ph) { handle_t *pr = (handle_t *)ph; error_clear(pr->error); } - int DLLEXPORT err_check(Handle ph, char** msg_buffer) // // Purpose: Returns the error message or NULL. @@ -672,7 +785,7 @@ void error_lookup(int errcode, char *dest_msg, int dest_len) break; case 6: msg = WARN6; break; - default: + default: { char new_msg[MAXMSG + 1]; msg = geterrmsg(errcode, new_msg); @@ -680,5 +793,3 @@ void error_lookup(int errcode, char *dest_msg, int dest_len) } strncpy(dest_msg, msg, dest_len); } - - From 186c17bb153f56681f88e9447330b0de64818d75 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Mon, 10 Dec 2018 17:30:47 -0500 Subject: [PATCH 06/16] Adding file headers --- include/epanet_py.h | 14 ++++++++-- src/epanet_py.c | 12 ++++++++ tests/test_epanet_py.cpp | 59 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 tests/test_epanet_py.cpp diff --git a/include/epanet_py.h b/include/epanet_py.h index fd81651..ffadb7b 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -1,5 +1,15 @@ - - +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet_py.h + Description: EPANET API functions for Python SWIG wrap + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 12/10/2018 + ****************************************************************************** +*/ #ifndef EPANET_PY_H diff --git a/src/epanet_py.c b/src/epanet_py.c index 56d0878..f1e8dc9 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -1,3 +1,15 @@ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet_py.c + Description: EPANET API functions for Python SWIG wrap + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 12/10/2018 + ****************************************************************************** +*/ #include diff --git a/tests/test_epanet_py.cpp b/tests/test_epanet_py.cpp new file mode 100644 index 0000000..f7d0a2b --- /dev/null +++ b/tests/test_epanet_py.cpp @@ -0,0 +1,59 @@ + + + + +#define BOOST_TEST_MODULE "toolkit" +#include + +#include +#include "epanet_py.h" + +// NOTE: Project Home needs to be updated to run unit test +#define DATA_PATH_INP "./net1.inp" +#define DATA_PATH_RPT "./test.rpt" +#define DATA_PATH_OUT "./test.out" + +using namespace std; + + +BOOST_AUTO_TEST_SUITE (test_toolkit) + +BOOST_AUTO_TEST_CASE (test_alloc_free) +{ + int error = 0; + Handle ph = NULL; + + error = create_project(&ph); + + BOOST_REQUIRE(error == 0); + BOOST_CHECK(ph != NULL); + + error = delete_project(&ph); + + BOOST_REQUIRE(error == 0); + BOOST_CHECK(ph == NULL); +} + +BOOST_AUTO_TEST_CASE(test_epanet) +{ + string path_inp(DATA_PATH_INP); + string path_rpt(DATA_PATH_RPT); + string path_out(DATA_PATH_OUT); + + char *msg = nullptr; + + Handle ph = NULL; + + create_project(&ph); + clear_error(ph); + + int error = run_project(ph, path_inp.c_str(), path_rpt.c_str(), path_out.c_str()); + BOOST_CHECK(error == 0); + + check_error(ph, &msg); + toolkit_free((void **)&msg); + + delete_project(&ph); +} + +BOOST_AUTO_TEST_SUITE_END() From 9d83955129db7718d4db50320c74fb35236ff029 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Mon, 10 Dec 2018 17:32:13 -0500 Subject: [PATCH 07/16] Deleting test_epanet_py --- tests/test_epanet_py.cpp | 59 ---------------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 tests/test_epanet_py.cpp diff --git a/tests/test_epanet_py.cpp b/tests/test_epanet_py.cpp deleted file mode 100644 index f7d0a2b..0000000 --- a/tests/test_epanet_py.cpp +++ /dev/null @@ -1,59 +0,0 @@ - - - - -#define BOOST_TEST_MODULE "toolkit" -#include - -#include -#include "epanet_py.h" - -// NOTE: Project Home needs to be updated to run unit test -#define DATA_PATH_INP "./net1.inp" -#define DATA_PATH_RPT "./test.rpt" -#define DATA_PATH_OUT "./test.out" - -using namespace std; - - -BOOST_AUTO_TEST_SUITE (test_toolkit) - -BOOST_AUTO_TEST_CASE (test_alloc_free) -{ - int error = 0; - Handle ph = NULL; - - error = create_project(&ph); - - BOOST_REQUIRE(error == 0); - BOOST_CHECK(ph != NULL); - - error = delete_project(&ph); - - BOOST_REQUIRE(error == 0); - BOOST_CHECK(ph == NULL); -} - -BOOST_AUTO_TEST_CASE(test_epanet) -{ - string path_inp(DATA_PATH_INP); - string path_rpt(DATA_PATH_RPT); - string path_out(DATA_PATH_OUT); - - char *msg = nullptr; - - Handle ph = NULL; - - create_project(&ph); - clear_error(ph); - - int error = run_project(ph, path_inp.c_str(), path_rpt.c_str(), path_out.c_str()); - BOOST_CHECK(error == 0); - - check_error(ph, &msg); - toolkit_free((void **)&msg); - - delete_project(&ph); -} - -BOOST_AUTO_TEST_SUITE_END() From c877730f6eb3ca1fc5e7f0a89ac5a097fe6e3fed Mon Sep 17 00:00:00 2001 From: "Marios S. Kyriakou" Date: Mon, 28 Jan 2019 17:24:07 +0200 Subject: [PATCH 08/16] added the ENopenQ; in example code for the hydraulic and water quality analysis steps --- ReleaseNotes2_1.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ReleaseNotes2_1.md b/ReleaseNotes2_1.md index ae8f0e5..90760a2 100644 --- a/ReleaseNotes2_1.md +++ b/ReleaseNotes2_1.md @@ -80,6 +80,7 @@ Contributors to this version (listed in order of first contribution): ``` ENopenH(); + ENopenQ(); ENinitH(0); ENinitQ(EN_NOSAVE); do { From d5e467fe4759b6750d3b51633d39e855a928d3a2 Mon Sep 17 00:00:00 2001 From: "Marios S. Kyriakou" Date: Mon, 28 Jan 2019 17:25:21 +0200 Subject: [PATCH 09/16] Update ReleaseNotes2_1.md --- ReleaseNotes2_1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes2_1.md b/ReleaseNotes2_1.md index 90760a2..3cf4445 100644 --- a/ReleaseNotes2_1.md +++ b/ReleaseNotes2_1.md @@ -86,8 +86,8 @@ Contributors to this version (listed in order of first contribution): do { ENrunH(&t); ENrunQ(&qt); - ENnextQ(&qstep); // collect results + ENnextQ(&qstep); ENnextH(&tstep); } while (tstep > 0); ENcloseQ(); From b339ff22ca680182c6abd51ff496bc9c69ee9d7d Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Mon, 28 Jan 2019 11:23:25 -0500 Subject: [PATCH 10/16] Merging dev into dev-swig-redux --- include/epanet2_2.h.orig | 1613 ++++++++++++++++++++++++++++++++++++++ include/epanet2_enums.h | 14 +- include/epanet_py.h | 13 +- src/epanet_py.c | 14 +- 4 files changed, 1633 insertions(+), 21 deletions(-) create mode 100644 include/epanet2_2.h.orig diff --git a/include/epanet2_2.h.orig b/include/epanet2_2.h.orig new file mode 100644 index 0000000..4fae1ce --- /dev/null +++ b/include/epanet2_2.h.orig @@ -0,0 +1,1613 @@ +/** @file epanet2_2.h + @see http://github.com/openwateranalytics/epanet + */ + +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet2.h + Description: API function declarations + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 01/08/2019 + ****************************************************************************** + */ + +#ifndef EPANET2_2_H +#define EPANET2_2_H + +#ifdef WITH_GENX + #include "epanet2_export.h" +#else + // --- define WINDOWS + #undef WINDOWS + #ifdef _WIN32 + #define WINDOWS + #endif + #ifdef __WIN32__ + #define WINDOWS + #endif + + // --- define DLLEXPORT + #ifndef DLLEXPORT + #ifdef WINDOWS + #ifdef __cplusplus + #define DLLEXPORT __declspec(dllexport) + #else + #define DLLEXPORT __declspec(dllexport) __stdcall + #endif // __cplusplus + #elif defined(CYGWIN) + #define DLLEXPORT __stdcall + #else + #define DLLEXPORT + #endif + #endif +#endif + +#include "epanet2_enums.h" + +// --- Declare the EPANET toolkit functions +#if defined(__cplusplus) +extern "C" { +#endif + +/** + @brief The EPANET Project wrapper object +*/ +typedef struct Project *EN_Project; + +/******************************************************************** + + System Functions + +********************************************************************/ + + /** + @brief Creates an EPANET project. + @param[out] ph an EPANET project handle that is passed into all other API functions. + @return an error code. + + EN_createproject must be called before any other API functions are used. + */ + int DLLEXPORT EN_createproject(EN_Project *ph); + + /** + @brief Deletes a currently opened EPANET project. + @param[in,out] ph an EPANET project handle which is returned as NULL. + @return an error code. + + EN_deleteproject should be called after all network analysis has been completed. + */ + int DLLEXPORT EN_deleteproject(EN_Project *ph); + +<<<<<<< HEAD + int DLLEXPORT EN_runproject(EN_Project ph, const char *f1, const char *f2, const char *f3, + void (*pviewprog)(char *)); +======= + /** + @brief Runs a complete EPANET simulation. + @param ph an EPANET project handle. + @param inpFile the name of an existing EPANET-formatted input file. + @param rptFile the name of a report file to be created (or "" if not needed) + @param outFile the name of a binary output file to be created (or "" if not needed) + @param pviewprog a callback function that takes a character string (char *) as its only parameter. + @return an error code + + The callback function should reside in and be used by the calling code to display + the progress messages that EPANET generates as it carries out its computations. Here is + an example of a such a function that displays progress messages to stdout: + \code {.c} + void writeConsole(char *s) + { + fprintf(stdout, "\n%s", s); + } + \endcode + It would be passed into EN_runproject as `&writeConsole`. If this feature is not needed then + the pviewprog argument should be NULL. + */ + int DLLEXPORT EN_runproject(EN_Project ph, const char *inpFile, const char *rptFile, + const char *outFile, void (*pviewprog)(char *)); + + /** + @brief Initializes an EPANET project. + @param ph an EPANET project handle. + @param rptFile the name of a report file to be created (or "" if not needed). + @param outFile the name of a binary output file to be created (or "" if not needed). + @param unitsType the choice of flow units (see @ref EN_FlowUnits). + @param headLossType the choice of head loss formula (see @ref EN_HeadLossType). + @return an error code. + + This function should be called immediately after ::EN_createproject if an EPANET-formatted input + file will not be used to supply network data. If the project receives it's network data + from an input file then there is no need to call this function. + */ +>>>>>>> dev + int DLLEXPORT EN_init(EN_Project ph, const char *rptFile, const char *outFile, + int unitsType, int headLossType); + + /** + @brief Opens an EPANET input file & reads in network data. + @param ph an EPANET project handle. + @param inpFile the name of an existing EPANET-formatted input file. + @param rptFile the name of a report file to be created (or "" if not needed). + @param outFile the name of a binary output file to be created (or "" if not needed). + @return an error code. + + This function should be called immediately after ::EN_createproject if an EPANET-formatted + input file will be used to supply network data. + */ + int DLLEXPORT EN_open(EN_Project ph, const char *inpFile, const char *rptFile, + const char *outFile); + + /** + @brief Saves a project's data to an EPANET-formatted text file. + @param ph an EPANET project handle. + @param filename the name of the file to create. + @return Error code + */ + int DLLEXPORT EN_saveinpfile(EN_Project ph, const char *filename); + + /** + @brief Closes a project and frees all of its memory. + @param ph an EPANET project handle. + @return Error code + + This function clears all existing data from a project but does not delete the + project, so it can be re-used with another set of network data. Use ::EN_deleteproject + to actually delete a project from memory. + */ + int DLLEXPORT EN_close(EN_Project ph); + + /******************************************************************** + + Hydraulic Analysis Functions + + ********************************************************************/ + + /** + @brief Runs a complete hydraulic simulation with results for all time periods + written to a temporary hydraulics file. + @param ph an EPANET project handle. + @return an error code. + + Use ::EN_solveH to generate a complete hydraulic solution which can stand alone + or be used as input to a water quality analysis. This function will not allow one to + examine intermediate hydraulic results as they are generated. It can also be followed by calls + to ::EN_saveH and ::EN_report to write hydraulic results to the report file. + + The sequence ::EN_openH - ::EN_initH - ::EN_runH - ::EN_nextH - ::EN_closeH + can be used instead to gain access to results at intermediate time periods and + directly adjust link status and control settings as a simulation proceeds. + + Example: + \code {.c} + EN_Project ph; + EN_createproject(&ph); + EN_open(ph, "net1.inp", "net1.rpt", ""); + EN_solveH(ph); + EN_solveQ(ph); + EN_report(ph); + EN_deleteproject(&ph); + \endcode + */ + int DLLEXPORT EN_solveH(EN_Project ph); + + /** + @brief Uses a previously saved binary hydraulics file to supply a project's hydraulics. + @param ph an EPANET project handle. + @param filename the name of the binary file containing hydraulic results. + @return an error code. + + Call this function to re-use a set of hydraulic analysis results saved previously. This + can save computational time if water quality analyses are being made under the same set + of hydraulic conditions. + + Do not call this function while the hydraulics solver is open. + */ + int DLLEXPORT EN_usehydfile(EN_Project ph, char *filename); + + /** + @brief Opens a project's hydraulic solver. + @param ph an EPANET project handle. + @return an error code. + + Call ::EN_openH prior to running the first hydraulic analysis using the + ::EN_initH - ::EN_runH - ::EN_nextH sequence. Multiple analyses can be made before + calling ::EN_closeH to close the hydraulic solver. + + Do not call this function if ::EN_solveH is being used to run a complete hydraulic + analysis or if hydraulics are being supplied by a previously saved hydraulics file + using ::EN_usehydfile. + */ + int DLLEXPORT EN_openH(EN_Project ph); + + /** + @brief Initializes a network prior to running a hydraulic analysis. + @param ph an EPANET project handle. + @param initFlag a 2-digit initialization flag (see @ref EN_InitHydOption). + @return an error code. + + This function initializes storage tank levels, link status and settings, and + the simulation time clock prior to running a hydraulic analysis. + + The initialization flag is a two digit number where the 1st (left) digit + indicates if link flows should be re-initialized (1) or not (0), and the + 2nd digit indicates if hydraulic results should be saved to a temporary + binary hydraulics file (1) or not (0). + + Be sure to call ::EN_initH prior to running a hydraulic analysis using a + ::EN_runH - ::EN_nextH loop. + + Choose to save hydraulics results if you will be: + - making a subsequent water quality run, + - using ::EN_report to generate a report + - using ::EN_savehydfile to save the binary hydraulics file. + + There is no need to save hydraulics if you will be writing custom code to + process hydraulic results as they are generated using the functions ::EN_getnodevalue + and ::EN_getlinkvalue. + */ + int DLLEXPORT EN_initH(EN_Project ph, int initFlag); + + /** + @brief Computes a hydraulic solution for the current point in time. + @param ph an EPANET project handle. + @param[out] currentTime the current simulation time in seconds. + @return an error or warning code. + + This function is used in a loop with ::EN_nextH to run an extended period hydraulic + simulation. This process automatically updates the simulation clock time so currentTime + should be treated as a read-only variable. + + ::EN_initH must have been called prior to running the ::EN_runH - ::EN_nextH loop. + + See ::EN_nextH for an example of using this function. + */ + int DLLEXPORT EN_runH(EN_Project ph, long *currentTime); + + /** + @brief Determines the length of time until the next hydraulic event occurs in an + extended period simulation. + @param ph an EPANET project handle. + @param[out] tStep the time (in seconds) until the next hydraulic event or 0 if at + the end of the full simulation duration. + @return an error code. + + This function is used in a loop with ::EN_runH to run an extended period hydraulic + simulation. + + The value of tstep should be treated as a read-only variable. It is automatically + computed as the smaller of: + - the time interval until the next hydraulic time step begins + - the time interval until the next reporting time step begins + - the time interval until the next change in demands occurs + - the time interval until a tank becomes full or empty + - the time interval until a control or rule fires. + + Example: + \code {.c} + long t, tstep; + EN_openH(ph); + EN_initH(ph, EN_NOSAVE); + do { + EN_runH(ph, &t); + // Retrieve hydraulic results for time t + EN_nextH(ph, &tstep); + } while (tstep > 0); + EN_closeH(ph); + \endcode + */ + int DLLEXPORT EN_nextH(EN_Project ph, long *tStep); + + /** + @brief Transfers a project's hydraulics results from its temporary hydraulics file + to its binary output file, where results are only reported at uniform reporting intervals. + @param ph an EPANET project handle. + @return an error code. + + ::EN_saveH is used when only a hydraulic analysis is run and results at uniform reporting + intervals need to be transferred to a project's binary output file. Such would be the case + when results are to be written in formatted fashion to the project's report file using ::EN_report. + */ + int DLLEXPORT EN_saveH(EN_Project ph); + + /** + @brief Saves a project's temporary hydraulics file to disk. + @param ph an EPANET project handle. + @param filename the name of the file to be created. + @return an error code. + + Use this function to save the current set of hydraulics results to a file, either for + post-processing or to be used at a later time by calling the ::EN_usehydfile function. + + The hydraulics file contains nodal demands and heads and link flows, status, and settings + for all hydraulic time steps, even intermediate ones. + + Before calling this function hydraulic results must have been generated and saved by having + called ::EN_solveH or the ::EN_initH - ::EN_runH - ::EN_nextH sequence with the initflag + argument of ::EN_initH set to `EN_SAVE` or `EN_SAVE_AND_INIT`. + */ + int DLLEXPORT EN_savehydfile(EN_Project ph, char *filename); + + /** + @brief Closes the hydraulic solver freeing all of its allocated memory. + @return an error code. + + Call ::EN_closeH after all hydraulics analyses have been made using + ::EN_initH - ::EN_runH - ::EN_nextH. Do not call this function if ::EN_solveH is being used. + */ + int DLLEXPORT EN_closeH(EN_Project ph); + + /******************************************************************** + + Water Quality Analysis Functions + + ********************************************************************/ + + /** + @brief Runs a complete water quality simulation with results at uniform + reporting intervals written to the project's binary output file. + @param ph an EPANET project handle. + @return an error code. + + A hydraulic analysis must have been run and saved to a hydraulics file before + calling ::EN_solveQ. This function will not allow one to examine intermediate water + quality results as they are generated. It can be followed by a call to ::EN_report + to write all hydraulic and water quality results to a formatted report file. + + One can instead use the ::EN_openQ - ::EN_initQ - ::EN_runQ - ::EN_nextQ - ::EN_closeQ + sequence to gain access to gain access to water quality results at intermediate time + periods. + + Example: see ::EN_solveH. + */ + int DLLEXPORT EN_solveQ(EN_Project ph); + + /** + @brief Opens a project's water quality solver. + @param ph n EPANET project handle. + @return an error code. + + Call ::EN_openQ prior to running the first water quality analysis using an + ::EN_initQ - ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) sequence. Multiple water + quality analyses can be made before calling ::EN_closeQ to close the water + quality solver. + + Do not call this function if a complete water quality analysis will be made + using ::EN_solveQ. + */ + int DLLEXPORT EN_openQ(EN_Project ph); + + /** + @brief Initializes a network prior to running a water quality analysis. + @param ph n EPANET project handle. + @param saveFlag set to `EN_SAVE` (1) if results are to be saved to the project's + binary output file, or to `EN_NOSAVE` (0) if not. + @return an error code. + + Call ::EN_initQ prior to running a water quality analysis using ::EN_runQ in + conjunction with either ::EN_nextQ or ::EN_stepQ. + + ::EN_openQ must have been called prior to calling EN_initQ. + + Do not call ::EN_initQ if a complete water quality analysis will be made using ::EN_solveQ. + */ + int DLLEXPORT EN_initQ(EN_Project ph, int saveFlag); + + /** + @brief Makes hydraulic and water quality results at the start of the current time + period available to a project's water quality solver. + @param ph an EPANET project handle. + @param[out] currentTime current simulation time in seconds. + @return an error code. + + Use ::EN_runQ along with ::EN_nextQ in a loop to access water quality results at the + start of each hydraulic period in an extended period simulation. Or use it in a loop + with ::EN_stepQ to access results at the start of each water quality time step. See + each of these functions for examples of how to code such loops. + + ::EN_initQ must have been called prior to running an ::EN_runQ - ::EN_nextQ + (or ::EN_stepQ) loop. + + The current time of the simulation is determined from information saved with the + hydraulic analysis that preceded the water quality analysis. Treat it as a read-only + variable. + */ + int DLLEXPORT EN_runQ(EN_Project ph, long *currentTime); + + /** + @brief Advances a water quality simulation over the time until the next hydraulic event. + @param ph an EPANET project handle. + @param[out] tStep time (in seconds) until the next hydraulic event or 0 if at the end + of the full simulation duration. + @return an error code. + + This function is used in a loop with ::EN_runQ to perform an extended period water + quality analysis. It reacts and routes a project's water quality constituent over a + time step determined by when the next hydraulic event occurs. Use ::EN_stepQ instead + if you wish to generate results over each water quality time step. + + The value of `tStep` is determined from information produced by the hydraulic analysis + that preceded the water quality analysis. Treat it as a read-only variable. + + Example: + \code {.c} + long t, tStep; + EN_solveH(ph); // Generate & save hydraulics + EN_openQ(ph); + EN_initQ(ph, EN_NOSAVE); + do { + EN_runQ(ph, &t); + // Monitor results at time t, which + // begins a new hydraulic time period + EN_nextQ(ph, &tStep); + } while (tStep > 0); + EN_closeQ(ph); + \endcode + */ + int DLLEXPORT EN_nextQ(EN_Project ph, long *tStep); + + /** + @brief Advances a water quality simulation by a single water quality time step. + @param ph an EPANET project handle. + @param[out] timeLeft time left (in seconds) to the overall simulation duration. + @return an error code. + + This function is used in a loop with ::EN_runQ to perform an extended period water + quality simulation. It allows one to generate water quality results at each water + quality time step of the simulation, rather than over each hydraulic event period + as with ::EN_nextQ. + + Use the argument `timeLeft` to determine when no more calls to ::EN_runQ are needed + because the end of the simulation period has been reached (i.e., when `timeLeft = 0`). + */ + int DLLEXPORT EN_stepQ(EN_Project ph, long *timeLeft); + + /** + @brief Closes the water quality solver, freeing all of its allocated memory. + @param ph an EPANET project handle. + @return an error code. + + Call ::EN_closeQ after all water quality analyses have been made using the + ::EN_initQ - ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) sequence of function calls. + + Do not call this function if ::EN_solveQ is being used. + */ + int DLLEXPORT EN_closeQ(EN_Project ph); + + /******************************************************************** + + Reporting Functions + + ********************************************************************/ + + /** + @brief Writes a line of text to a project's report file. + @param ph an EPANET project handle. + @param line a text string to write. + @return an error code. + */ + int DLLEXPORT EN_writeline(EN_Project ph, char *line); + + /** + @brief Writes simulation results in a tabular format to a project's report file. + @param ph an EPANET project handle. + @return an error code + + Either a full hydraulic analysis or full hydraulic and water quality analysis must + have been run, with results saved to file, before ::EN_report is called. In the + former case, ::EN_saveH must also be called first to transfer results from the + project's intermediate hydraulics file to its output file. + + The format of the report is controlled by commands issued with ::EN_setreport. + */ + int DLLEXPORT EN_report(EN_Project ph); + + /** + @brief Resets a project's report options to their default values. + @param ph an EPANET project handle. + @return an error code + + After calling this function the default reporting options are in effect. These are: + - no status report + - no energy report + - no nodes reported on + - no links reported on + - node variables reported to 2 decimal places + - link variables reported to 2 decimal places (3 for friction factor) + - node variables reported are elevation, head, pressure, and quality + - link variables reported are flow, velocity, and head loss. + */ + int DLLEXPORT EN_resetreport(EN_Project ph); + + /** + @brief Processes a reporting format command. + @param ph an EPANET project handle. + @param format a report formatting command. + @return an error code + + Acceptable report formatting commands are described in Appendix C of the + EPANET 2 Users Manual. + + Formatted results of a simulation can be written to a project's report file + using the ::EN_report function. + */ + int DLLEXPORT EN_setreport(EN_Project ph, char *format); + + /** + @brief Sets the level of hydraulic status reporting. + @param ph an EPANET project handle. + @param level a status reporting level code (see @ref EN_StatusReport). + @return an error code. + + Status reporting writes changes in the hydraulics status of network elements to a + project's report file as a hydraulic simulation unfolds. There are three levels + of reporting: `EN_NO_REPORT` (no status reporting), `EN_NORMAL_REPORT` (normal + reporting) `EN_FULL_REPORT` (full status reporting). + + The full status report contains information at each trial of the solution to the + system hydraulic equations at each time step of a simulation. It is useful mainly + for debugging purposes. + + If many hydraulic analyses will be run in the application it is recommended that + status reporting be turned off (`level = EN_NO_REPORT`). + */ + int DLLEXPORT EN_setstatusreport(EN_Project ph, int level); + + /** + @brief Retrieves the toolkit API version number. + @param[out] version the version of the OWA-EPANET toolkit. + @return an error code. + + The version number is to be interpreted with implied decimals, i.e., + "20100" == "2(.)01(.)00" + */ + int DLLEXPORT EN_getversion(int *version); + + /** + @brief Retrieves the number of objects of a given type in a project. + @param ph an EPANET project handle. + @param object a type of object to count (see @ref EN_CountType) + @param[out] count number of objects of the specified type + @return an error code + */ + int DLLEXPORT EN_getcount(EN_Project ph, int object, int *count); + + /** + @brief Returns the text of an error message generated by an error code. + @param errcode an error code. + @param[out] errmsg the error message generated by the error code + @param maxLen maximum number of characters that errmsg can hold + @return an error code + + Error message strings should be at least @ref EN_MAXMSG characters in length. + */ + int DLLEXPORT EN_geterror(int errcode, char *errmsg, int maxLen); + + /** + @brief Retrieves a particular simulation statistic. + @param ph an EPANET project handle. + @param type the type of statistic to retrieve (see @ref EN_AnalysisStatistic). + @param[out] value the value of the statistic. + @return an error code + */ + int DLLEXPORT EN_getstatistic(EN_Project ph, int type, double* value); + + /******************************************************************** + + Analysis Options Functions + + ********************************************************************/ + + /** + @brief Retrieves the value of an analysis option. + @param ph an EPANET project handle. + @param option a type of analysis option (see @ref EN_Option). + @param[out] value the current value of the option. + @return an error code + */ + int DLLEXPORT EN_getoption(EN_Project ph, int option, double *value); + + /** + @brief Sets the value for an anlysis option. + @param ph an EPANET project handle. + @param option a type of analysis option (see @ref EN_Option). + @param value the new value assigned to the option. + @return an error code. + @see EN_Option + */ + int DLLEXPORT EN_setoption(EN_Project ph, int option, double value); + + /** + @brief Retrieves a project's flow units. + @param ph an EPANET project handle. + @param[out] units a flow units code (see @ref EN_FlowUnits) + @return an error code. + + Flow units in liters or cubic meters implies that SI metric units are used for all + other quantities in addition to flow. Otherwise US Customary units are employed. + */ + int DLLEXPORT EN_getflowunits(EN_Project ph, int *units); + + /** + @brief Sets a project's flow units. + @param ph an EPANET project handle. + @param units a flow units code (see @ref EN_FlowUnits) + @return an error code. + + Flow units in liters or cubic meters implies that SI metric units are used for all + other quantities in addition to flow. Otherwise US Customary units are employed. + */ + int DLLEXPORT EN_setflowunits(EN_Project ph, int units); + + /** + @brief Retrieves the value of a time parameter. + @param ph an EPANET project handle. + @param param a time parameter code (see @ref EN_TimeParameter). + @param[out] value the current value of the time parameter (in seconds). + @return an error code. + */ + int DLLEXPORT EN_gettimeparam(EN_Project ph, int param, long *value); + + /** + @brief Sets the value of a time parameter. + @param ph an EPANET project handle. + @param param a time parameter code (see @ref EN_TimeParameter). + @param value the new value of the time parameter (in seconds) + @return an error code. + */ + int DLLEXPORT EN_settimeparam(EN_Project ph, int param, long value); + + /** + @brief Gets information about the type of water quality analysis requested. + @param ph an EPANET project handle. + @param[out] qualType type of analysis to run (see @ref EN_QualityType). + @param[out] chemName name of chemical constituent. + @param[out] chemUnits concentration units of the constituent. + @param[out] traceNode index of the node being traced (if applicable). + @return an error code. + */ + int DLLEXPORT EN_getqualinfo(EN_Project ph, int *qualType, char *chemName, + char *chemUnits, int *traceNode); + + /** + @brief Retrieves the type of water quality analysis to be run. + @param ph an EPANET project handle. + @param[out] qualType the type of analysis to run (see @ref EN_QualityType). + @param[out] traceNode the index of node being traced, if `qualType = EN_TRACE`. + @return an error code. + */ + int DLLEXPORT EN_getqualtype(EN_Project ph, int *qualType, int *traceNode); + + /** + @brief Sets the type of water quality analysis to run. + @param ph an EPANET project handle. + @param qualType the type of analysis to run (see @ref EN_QualityType). + @param chemName the name of the quality constituent. + @param chemUnits the concentration units of the constituent. + @param traceNode the ID name of the node being traced if `qualType = EN_TRACE`. + @return an error code. + + Chemical name and units can be an empty string if the analysis is not for a chemical. + The same holds for the trace node if the analysis is not for source tracing. + + Note that the trace node is specified by ID name and not by index. + */ + int DLLEXPORT EN_setqualtype(EN_Project ph, int qualType, char *chemName, + char *chemUnits, char *traceNode); + + /******************************************************************** + + Node Functions + + ********************************************************************/ + + /** + @brief Adds a new node to a project. + @param ph an EPANET project handle. + @param id the ID name of the node to be added. + @param nodeType the type of node being added (see @ref EN_NodeType) + @return an error code. + + When a new node is created all of it's properties (see @ref EN_NodeProperty) are set to 0. + */ + int DLLEXPORT EN_addnode(EN_Project ph, char *id, int nodeType); + + /** + @brief Deletes a node from a project. + @param ph an EPANET project handle. + @param index the index of the node to be deleted. + @param actionCode the action taken if any control contains the node and its links. + @return an error code. + + If `actionCode` is `EN_UNCONDITIONAL` then the node, its incident links and all + simple and rule-based controls that contain them are deleted. If set to + `EN_CONDITIONAL` then the node is not deleted if it or its incident links appear + in any controls and error code 261 is returned. + + */ + int DLLEXPORT EN_deletenode(EN_Project ph, int index, int actionCode); + + /** + @brief Gets the index of a node given its ID name. + @param ph an EPANET project handle. + @param id a node ID name. + @param[out] index the node's index (starting from 1). + @return an error code + */ + int DLLEXPORT EN_getnodeindex(EN_Project ph, char *id, int *index); + + /** + @brief Gets the ID name of a node given its index. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param[out] id the node's ID name. + @return an error code + + The ID name must be sized to hold at least @ref EN_MAXID characters. + */ + int DLLEXPORT EN_getnodeid(EN_Project ph, int index, char *id); + + /** + @brief Changes the ID name of a node. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param newid the new ID name for the node. + @return an error code. + + The ID name must not be longer than @ref EN_MAXID characters. + */ + int DLLEXPORT EN_setnodeid(EN_Project ph, int index, char *newid); + + /** + @brief Retrieves a node's type given its index. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param[out] nodeType the node's type (see @ref EN_NodeType). + @return an error code. + */ + int DLLEXPORT EN_getnodetype(EN_Project ph, int index, int *nodeType); + + /** + @brief Retrieves a property value for a node. + @param ph an EPANET project handle. + @param index a node's index. + @param property the property to retrieve (see @ref EN_NodeProperty). + @param[out] value the current value of the property. + @return an error code. + + Values are returned in units that depend on the units used for flow rate + (see @ref Units). + */ + int DLLEXPORT EN_getnodevalue(EN_Project ph, int index, int property, double *value); + + /** + @brief Sets a property value for a node. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param property the property to set (see @ref EN_NodeProperty). + @param value the new value for the property. + @return an error code. + + Values are in units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setnodevalue(EN_Project ph, int index, int property, double value); + + /** + @brief Sets a group of properties for a junction node. + @param ph an EPANET project handle. + @param index a junction node's index (starting from 1). + @param elev the value of the junction's elevation. + @param dmnd the value of the junction's primary base demand. + @param dmndpat the ID name of the demand's time pattern ("" for no pattern) + @return an error code. + + These properties have units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setjuncdata(EN_Project ph, int index, double elev, double dmnd, + char *dmndpat); + + /** + @brief Sets a group of properties for a tank node. + @param ph an EPANET project handle. + @param index a tank node's index (starting from 1). + @param elev the tank's bottom elevation. + @param initlvl the initial water level in the tank. + @param minlvl the minimum water level for the tank. + @param maxlvl the maximum water level for the tank. + @param diam the tank's diameter (0 if a volume curve is supplied). + @param minvol the volume of the tank at its minimum water level. + @param volcurve the name of the tank's volume curve ("" for no curve) + @return an error code. + + These properties have units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_settankdata(EN_Project ph, int index, double elev, double initlvl, + double minlvl, double maxlvl, double diam, double minvol, char *volcurve); + + /** + @brief Gets the (x,y) coordinates of a node. + @param ph an EPANET project handle. + @param index a node index (starting from 1). + @param[out] x the node's X-coordinate value. + @param[out] y the node's Y-coordinate value. + @return an error code. + */ + int DLLEXPORT EN_getcoord(EN_Project ph, int index, double *x, double *y); + + /** + @brief Sets the (x,y) coordinates of a node. + @param ph an EPANET project handle. + @param index a node index (starting from 1). + @param x the node's X-coordinate value. + @param y the node's Y-coordinate value. + @return an error code. + */ + int DLLEXPORT EN_setcoord(EN_Project ph, int index, double x, double y); + + /******************************************************************** + + Nodal Demand Functions + + ********************************************************************/ + + /** + @brief Retrieves the type of demand model in use and its parameters. + @param ph an EPANET project handle. + @param[out] type Type of demand model (see @ref EN_DemandModel). + @param[out] pmin Pressure below which there is no demand. + @param[out] preq Pressure required to deliver full demand. + @param[out] pexp Pressure exponent in demand function. + @return an error code. + + Parameters `pmin`, `preq`, and `pexp` are only used when the demand model is `EN_PDA`. + */ + int DLLEXPORT EN_getdemandmodel(EN_Project ph, int *type, double *pmin, + double *preq, double *pexp); + + /** + @brief Sets the type of demand model to use and its parameters. + @param ph an EPANET project handle. + @param type Type of demand model (see @ref EN_DemandModel). + @param pmin Pressure below which there is no demand. + @param preq Pressure required to deliver full demand. + @param pexp Pressure exponent in demand function. + @return an error code. + + Set `type` to `EN_DDA` for a traditional demand driven analysis (in which case the + remaining three parameter values are ignored) or to `EN_PDA` for a pressure driven + analysis. In the latter case a node's demand is computed as: + > `Dfull * [ (P - pmin) / (preq - pmin) ] ^ pexp` + where `Dfull` is the full demand and `P` is the current pressure. + + Setting `preq` equal to `pmin` will result in a solution with the smallest amount of + demand reductions needed to insure that no node delivers positive demand at a pressure + below `pmin`. + */ + int DLLEXPORT EN_setdemandmodel(EN_Project ph, int type, double pmin, + double preq, double pexp); + + /** + @brief Retrieves the number of demand categories for a junction node. + @param ph an EPANET project handle. + @param nodeIndex the index of a node (starting from 1). + @param[out] numDemands the number of demand categories assigned to the node. + @return an error code. + */ + int DLLEXPORT EN_getnumdemands(EN_Project ph, int nodeIndex, int *numDemands); + + /** + @brief Gets the base demand for one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of a demand category for the node (starting from 1). + @param[out] baseDemand the category's base demand. + @return an error code. + */ + int DLLEXPORT EN_getbasedemand(EN_Project ph, int nodeIndex, int demandIndex, + double *baseDemand); + + /** + @brief Sets the base demand for one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of a demand category for the node (starting from 1). + @param baseDemand the new base demand for the category. + @return an error code. + */ + int DLLEXPORT EN_setbasedemand(EN_Project ph, int nodeIndex, int demandIndex, + double baseDemand); + + /** + @brief Retrieves the index of a time pattern assigned to one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex the node's index (starting from 1). + @param demandIndex the index of a demand category for the node (starting from 1). + @param[out] patIndex the index of the category's time pattern. + @return an error code. + + A returned pattern index of 0 indicates that no time pattern has been assigned to the + demand category. + */ + int DLLEXPORT EN_getdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, + int *patIndex); + + /** + @brief Sets the index of a time pattern used for one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of one of the node's demand categories (starting from 1). + @param patIndex the index of the time pattern assigned to the category. + @return an error code. + + Specifying a pattern index of 0 indicates that no time pattern is assigned to the + demand category. + */ + int DLLEXPORT EN_setdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, int patIndex); + + /** + @brief Retrieves the name of a node's demand category. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of one of the node's demand categories (starting from 1). + @param[out] demandName The name of the selected category. + @return an error code. + + `demandName` must be sized to contain at least @ref EN_MAXID characters. + */ + int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIndex, char *demandName); + + /** + @brief Assigns a name to a node's demand category. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIdx the index of one of the node's demand categories (starting from 1). + @param demandName the new name assigned to the category. + @return Error code. + + The category name must contain no more than @ref EN_MAXID characters. + */ + int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, char *demandName); + + /******************************************************************** + + Link Functions + + ********************************************************************/ + + /** + @brief Adds a new link to a project. + @param ph an EPANET project handle. + @param id the ID name of the link to be added. + @param linkType The type of link being added (see @ref EN_LinkType) + @param fromNode The ID name of the link's starting node. + @param toNode The ID name of the link's ending node. + @return an error code. + + A new pipe is assigned a diameter of 10 inches (or 254 mm), a length of 100 + feet (or meters), a roughness coefficient of 100 and 0 for all other properties. + + A new pump has a status of `EN_OPEN`, a speed setting of 1, and has no pump + curve or power rating assigned to it. + + A new valve has a diameter of 10 inches (or 254 mm) and all other properties set to 0. + + See @ref EN_LinkProperty. + */ + int DLLEXPORT EN_addlink(EN_Project ph, char *id, int linkType, char *fromNode, char *toNode); + + /** + @brief Deletes a link from the project. + @param ph an EPANET project handle. + @param index the index of the link to be deleted. + @param actionCode The action taken if any control contains the link. + @return an error code. + + If `actionCode` is `EN_UNCONDITIONAL` then the link and all simple and rule-based + controls that contain it are deleted. If set to `EN_CONDITIONAL` then the link + is not deleted if it appears in any control and error 261 is returned. + */ + int DLLEXPORT EN_deletelink(EN_Project ph, int index, int actionCode); + + /** + @brief Gets the index of a link given its ID name. + @param ph an EPANET project handle. + @param id a link's ID name. + @param[out] index the link's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getlinkindex(EN_Project ph, char *id, int *index); + + /** + @brief Gets the ID name of a link given its index. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param[out] id The link's ID name. + @return an error code. + + The ID name must be sized to hold at least @ref EN_MAXID characters. + */ + int DLLEXPORT EN_getlinkid(EN_Project ph, int index, char *id); + + /** + @brief Changes the ID name of a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param newid the new ID name for the link. + @return Error code. + + The ID name must not be longer than @ref EN_MAXID characters. + */ + int DLLEXPORT EN_setlinkid(EN_Project ph, int index, char *newid); + + /** + @brief Retrieves a link's type. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param[out] linkType the link's type (see @ref EN_LinkType). + @return an error code. + */ + int DLLEXPORT EN_getlinktype(EN_Project ph, int index, int *linkType); + + /** + @brief Changes a link's type. + @param ph an EPANET project handle. + @param[in,out] index the link's index before [in] and after [out] the type change. + @param linkType the new type to change the link to (see @ref EN_LinkType). + @param actionCode the action taken if any controls contain the link. + @return an error code. + + If `actionCode` is `EN_UNCONDITIONAL` then all simple and rule-based controls that + contain the link are deleted when the link's type is changed. If set to + `EN_CONDITIONAL` then the type change is cancelled if the link appears in any + control and error 261 is returned. + */ + int DLLEXPORT EN_setlinktype(EN_Project ph, int *index, int linkType, int actionCode); + + /** + @brief Gets the indexes of a link's start- and end-nodes. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param[out] node1 the index of the link's start node (starting from 1). + @param[out] node2 the index of the link's end node (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getlinknodes(EN_Project ph, int index, int *node1, int *node2); + + /** + @brief Sets the indexes of a link's start- and end-nodes. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param node1 The index of the link's start node (starting from 1). + @param node2 The index of the link's end node (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_setlinknodes(EN_Project ph, int index, int node1, int node2); + + /** + @brief Retrieves a property value for a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param property the property to retrieve (see @ref EN_LinkProperty). + @param[out] value the current value of the property. + @return an error code. + + Values are returned in units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_getlinkvalue(EN_Project ph, int index, int property, double *value); + + /** + @brief Sets a property value for a link. + @param ph an EPANET project handle. + @param index a link's index. + @param property the property to set (see @ref EN_LinkProperty). + @param value the new value for the property. + @return an error code. + + Values are in units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setlinkvalue(EN_Project ph, int index, int property, double value); + + /** + @brief Sets a group of properties for a pipe link. + @param ph an EPANET project handle. + @param index the index of a pipe link (starting from 1). + @param length the pipe's length. + @param diam the pipe's diameter. + @param rough the pipe's roughness coefficient. + @param mloss the pipe's minor loss coefficient. + @return an error code. + + These properties have units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setpipedata(EN_Project ph, int index, double length, double diam, + double rough, double mloss); + + + /******************************************************************** + + Pump Functions + + ********************************************************************/ + + /** + @brief Retrieves the type of head curve used by a pump. + @param ph an EPANET project handle. + @param linkIndex the index of a pump link (starting from 1). + @param[out] pumpType the type of head curve used by the pump (see @ref EN_PumpType). + @return an error code. + */ + int DLLEXPORT EN_getpumptype(EN_Project ph, int linkIndex, int *pumpType); + + /** + @brief Retrieves the curve assigned to a pump's head curve. + @param ph an EPANET project handle. + @param linkIndex the index of a pump link (starting from 1). + @param[out] curveIndex the index of the curve assigned to the pump's head curve. + @return an error code. + */ + int DLLEXPORT EN_getheadcurveindex(EN_Project ph, int linkIndex, int *curveIndex); + + /** + @brief Assigns a curve to a pump's head curve. + @param ph an EPANET project handle. + @param linkIndex the index of a pump link (starting from 1). + @param curveIndex the index of a curve to be assigned as the pump's head curve. + @return an error code. + */ + int DLLEXPORT EN_setheadcurveindex(EN_Project ph, int linkIndex, int curveIndex); + + /******************************************************************** + + Time Pattern Functions + + ********************************************************************/ + + /** + @brief Adds a new time pattern to a project. + @param ph an EPANET project handle. + @param id the ID name of the pattern to add. + @return an error code. + + The new pattern contains a single time period whose factor is 1.0. + */ + int DLLEXPORT EN_addpattern(EN_Project ph, char *id); + + /** + @brief Retrieves the index of a time pattern given its ID name. + @param ph an EPANET project handle. + @param id the ID name of a time pattern. + @param[out] index the time pattern's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getpatternindex(EN_Project ph, char *id, int *index); + + /** + @brief Retrieves the ID name of a time pattern given its index. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param[out] id the time pattern's ID name. + @return an error code. + + The ID name must be sized to hold at least @ref EN_MAXID characters. + */ + int DLLEXPORT EN_getpatternid(EN_Project ph, int index, char *id); + + /** + @brief Retrieves the number of time periods in a time pattern. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param[out] len the number of time periods in the pattern. + @return an error code. + */ + int DLLEXPORT EN_getpatternlen(EN_Project ph, int index, int *len); + + /** + @brief Retrieves a time pattern's factor for a given time period. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param period a time period in the pattern (starting from 1). + @param[out] value the pattern factor for the given time period. + @return an error code. + */ + int DLLEXPORT EN_getpatternvalue(EN_Project ph, int index, int period, double *value); + + /** + @brief Sets a time pattern's factor for a given time period. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param period a time period in the pattern (starting from 1). + @param value the new value of the pattern factor for the given time period. + @return an error code. + */ + int DLLEXPORT EN_setpatternvalue(EN_Project ph, int index, int period, double value); + + /** + @brief Retrieves the average of all pattern factors in a time pattern. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param[out] value The average of all of the time pattern's factors. + @return an error code. + */ + int DLLEXPORT EN_getaveragepatternvalue(EN_Project ph, int index, double *value); + + /** + @brief Sets the pattern factors for a given time pattern. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param values an array of new pattern factor values. + @param len the number of factor values supplied. + @return an error code. + + `values` is a zero-based array that contains `len` elements. + + Use this function to redefine (and resize) a time pattern all at once; + 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); + + /******************************************************************** + + Data Curve Functions + + ********************************************************************/ + + /** + @brief Adds a new data curve to a project. + @param ph an EPANET project handle. + @param id The ID name of the curve to be added. + @return an error code. + + The new curve contains a single data point (1.0, 1.0). + */ + int DLLEXPORT EN_addcurve(EN_Project ph, char *id); + + /** + @brief Retrieves the index of a curve given its ID name. + @param ph an EPANET project handle. + @param id the ID name of a curve. + @param[out] index The curve's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getcurveindex(EN_Project ph, char *id, int *index); + + /** + @brief Retrieves the ID name of a curve given its index. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] id the curve's ID name. + @return an error code. + + The ID name must be sized to hold at least @ref EN_MAXID characters. + */ + int DLLEXPORT EN_getcurveid(EN_Project ph, int index, char *id); + + /** + @brief Retrieves the number of points in a curve. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] len The number of data points assigned to the curve. + @return an error code. + */ + int DLLEXPORT EN_getcurvelen(EN_Project ph, int index, int *len); + + /** + @brief Retrieves a curve's type. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] type the curve's type (see @ref EN_CurveType). + @return an error code. + */ + int DLLEXPORT EN_getcurvetype(EN_Project ph, int index, int *type); + + /** + @brief Retrieves the value of a single data point for a curve. + @param ph an EPANET project handle. + @param curveIndex a curve's index (starting from 1). + @param pointIndex the index of a point on the curve (starting from 1). + @param[out] x the point's x-value. + @param[out] y the point's y-value. + @return an error code. + */ + int DLLEXPORT EN_getcurvevalue(EN_Project ph, int curveIndex, int pointIndex, + double *x, double *y); + + /** + @brief Sets the value of a single data point for a curve. + @param ph an EPANET project handle. + @param curveIndex a curve's index (starting from 1). + @param pointIndex the index of a point on the curve (starting from 1). + @param x the point's new x-value. + @param y the point's new y-value. + @return an error code. + */ + int DLLEXPORT EN_setcurvevalue(EN_Project ph, int curveIndex, int pointIndex, + double x, double y); + + /** + @brief Retrieves all of a curve's data. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] id the curve's ID name. + @param[out] nPoints the number of data points on the curve. + @param[out] xValues the curve's x-values. + @param[out] yValues the curve's y-values. + @return an error code. + + The calling program is responsible for making `xValues` and `yValues` large enough + to hold `nPoints` number of data points and for sizing `id` to hold at least + @ref EN_MAXID characters. + */ + int DLLEXPORT EN_getcurve(EN_Project ph, int index, char* id, int *nPoints, + double **xValues, double **yValues); + + /** + @brief assigns a set of data points to a curve. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param xValues an array of new x-values for the curve. + @param yValues an array of new y-values for the curve. + @param nPoints the new number of data points for the curve. + @return an error code. + + `xValues` and `yValues` are zero-based arrays that contains `nPoints` elements. + + Use this function to redefine (and resize) a curve all at once; + use @ref EN_setcurvevalue to revise a curve's data points one at a time. + */ + int DLLEXPORT EN_setcurve(EN_Project ph, int index, double *xValues, + double *yValues, int nPoints); + + /******************************************************************** + + Simple Controls Functions + + ********************************************************************/ + + /** + @brief Adds a new simple control to a project. + @param ph an EPANET project handle. + @param type the type of control to add (see @ref EN_ControlType). + @param linkIndex the index of a link to control (starting from 1). + @param setting control setting applied to the link. + @param nodeIndex index of the node used to control the link + (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). + @param level action level (tank level, junction pressure, or time in seconds) + that triggers the control. + @param[out] index index of the new control. + @return an error code. + */ + int DLLEXPORT EN_addcontrol(EN_Project ph, int type, int linkIndex, + double setting, int nodeIndex, double level, int *index); + + /** + @brief Deletes an existing simple control. + @param ph an EPANET project handle. + @param index the index of the control to delete (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_deletecontrol(EN_Project ph, int index); + + /** + @brief Retrieves the properties of a simple control. + @param ph an EPANET project handle. + @param index the control's index (starting from 1). + @param[out] type the type of control (see @ref EN_ControlType). + @param[out] linkIndex the index of the link being controlled. + @param[out] setting the control setting applied to the link. + @param[out] nodeIndex the index of the node used to trigger the control + (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). + @param[out] level the action level (tank level, junction pressure, or time in seconds) + that triggers the control. + @return an error code. + */ + int DLLEXPORT EN_getcontrol(EN_Project ph, int index, int *type, int *linkIndex, + double *setting, int *nodeIndex, double *level); + + /** + @brief Sets the properties of an existing simple control. + @param ph an EPANET project handle. + @param index the control's index (starting from 1). + @param type the type of control (see @ref EN_ControlType). + @param linkIndex the index of the link being controlled. + @param setting the control setting applied to the link. + @param nodeIndex the index of the node used to trigger the control + (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). + @param level the action level (tank level, junction pressure, or time in seconds) + that triggers the control. + @return an error code. + */ + int DLLEXPORT EN_setcontrol(EN_Project ph, int index, int type, int linkIndex, + double setting, int nodeIndex, double level); + + + /******************************************************************** + + Rule-Based Controls Functions + + ********************************************************************/ + + /** + @brief Adds a new rule-based control to a project. + @param ph an EPANET project handle. + @param rule text of the rule following the format used in an EPANET input file. + @return an error code. + + Consult Appendix C of the EPANET 2 Users Manual + to learn about a rule's format. Each clause of the rule must end with a newline character `\n`. + */ + int DLLEXPORT EN_addrule(EN_Project ph, char *rule); + + /** + @brief Deletes an existing rule-based control. + @param ph an EPANET project handle. + @param index the index of the rule to be deleted (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_deleterule(EN_Project ph, int index); + + /** + @brief Retrieves summary information about a rule-based control. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param[out] nPremises number of premises in the rule's IF section. + @param[out] nThenActions number of actions in the rule's THEN section. + @param[out] nElseActions number of actions in the rule's ELSE section. + @param[out] priority the rule's priority value. + @return an error code. + */ + int DLLEXPORT EN_getrule(EN_Project ph, int index, int *nPremises, + int *nThenActions, int *nElseActions, double *priority); + + /** + @brief Gets the ID name of a rule-based control given its index. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param[out] id the rule's ID name. + @return Error code. + + The ID name must be sized to hold at least @ref EN_MAXID characters. + */ + int DLLEXPORT EN_getruleID(EN_Project ph, int index, char* id); + + /** + @brief Gets the properties of a premise in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the position of the premise in the rule's list of premises + (starting from 1). + @param[out] logop the premise's logical operator (`IF` = 1, `AND` = 2, `OR` = 3). + @param[out] object the type of object the premise refers to (see @ref EN_RuleObject). + @param[out] objIndex the index of the object (e.g. the index of a tank). + @param[out] variable the object's variable being compared (see @ref EN_RuleVariable). + @param[out] relop the premise's comparison operator (see @ref EN_RuleOperator). + @param[out] status the status that the object's status is compared to + (see @ref EN_RuleStatus). + @param[out] value the value that the object's variable is compared to. + @return an error code. + */ + int DLLEXPORT EN_getpremise(EN_Project ph, int ruleIndex, int premiseIndex, + int *logop, int *object, int *objIndex, int *variable, + int *relop, int *status, double *value); + + /** + @brief Sets the properties of a premise in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the position of the premise in the rule's list of premises. + @param logop the premise's logical operator (`IF` = 1, `AND` = 2, `OR` = 3). + @param object the type of object the premise refers to (see @ref EN_RuleObject). + @param objIndex the index of the object (e.g. the index of a tank). + @param variable the object's variable being compared (see @ref EN_RuleVariable). + @param relop the premise's comparison operator (see @ref EN_RuleOperator). + @param status the status that the object's status is compared to + (see @ref EN_RuleStatus). + @param value the value that the object's variable is compared to. + @return an error code. + */ + int DLLEXPORT EN_setpremise(EN_Project ph, int ruleIndex, int premiseIndex, + int logop, int object, int objIndex, int variable, int relop, + int status, double value); + + /** + @brief Sets the index of an object in a premise of a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the premise's index (starting from 1). + @param objIndex the index of the premise's object (e.g. the index of a tank). + @return an error code. + */ + int DLLEXPORT EN_setpremiseindex(EN_Project ph, int ruleIndex, int premiseIndex, + int objIndex); + + /** + @brief Sets the status being compared to in a premise of a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the premise's index (starting from 1). + @param status the status that the premise's object status is compared to + (see @ref EN_RuleStatus). + @return an error code. + */ + int DLLEXPORT EN_setpremisestatus(EN_Project ph, int ruleIndex, int premiseIndex, + int status); + + /** + @brief Sets the value in a premise of a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (staring from 1). + @param premiseIndex the premise's index (starting from 1). + @param value The value that the premise's variable is compared to. + @return an error code. + */ + int DLLEXPORT EN_setpremisevalue(EN_Project ph, int ruleIndex, int premiseIndex, + double value); + + /** + @brief Gets the properties of a THEN action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the THEN action to retrieve (starting from 1). + @param[out] linkIndex the index of the link in the action (starting from 1). + @param[out] status the status assigned to the link (see @ref EN_RuleStatus) + @param[out] setting the value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_getthenaction(EN_Project ph, int ruleIndex, int actionIndex, + int *linkIndex, int *status, double *setting); + + /** + @brief Sets the properties of a THEN action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the THEN action to modify (starting from 1). + @param linkIndex the index of the link in the action. + @param status the new status assigned to the link (see @ref EN_RuleStatus). + @param setting the new value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_setthenaction(EN_Project ph, int ruleIndex, int actionIndex, + int linkIndex, int status, double setting); + + /** + @brief Gets the properties of an ELSE action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the ELSE action to retrieve (starting from 1). + @param[out] linkIndex the index of the link in the action. + @param[out] status the status assigned to the link (see @ref EN_RuleStatus). + @param[out] setting the value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_getelseaction(EN_Project ph, int ruleIndex, int actionIndex, + int *linkIndex, int *status, double *setting); + + /** + @brief Sets the properties of an ELSE action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the ELSE action being modified (starting from 1). + @param linkIndex the index of the link in the action (starting from 1). + @param status the new status assigned to the link (see @ref EN_RuleStatus) + @param setting the new value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_setelseaction(EN_Project ph, int ruleIndex, int actionIndex, + int linkIndex, int status, double setting); + + /** + @brief Sets the priority of a rule-based control. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param priority the priority value assigned to the rule. + @return an error code. + */ + int DLLEXPORT EN_setrulepriority(EN_Project ph, int index, double priority); + +#if defined(__cplusplus) +} +#endif + +#endif //EPANET2_2_H diff --git a/include/epanet2_enums.h b/include/epanet2_enums.h index 656386c..a445846 100644 --- a/include/epanet2_enums.h +++ b/include/epanet2_enums.h @@ -191,7 +191,7 @@ typedef enum { EN_PUMP_CLOSED = 2, //!< Pump closed EN_PUMP_OPEN = 3, //!< Pump open EN_PUMP_XFLOW = 5 //!< Pump open - cannot supply flow -} EN_PumpStateType; +} EN_PumpStateType; /// Types of water quality analyses /** @@ -249,7 +249,7 @@ typedef enum { EN_LPM = 6, //!< Liters per minute EN_MLD = 7, //!< Million liters per day EN_CMH = 8, //!< Cubic meters per hour - EN_CMD = 9 //!< Cubic meters per day + EN_CMD = 9 //!< Cubic meters per day } EN_FlowUnits; /// Types of demand models @@ -261,7 +261,7 @@ A demand driven analysis requires that a junction's full demand be supplied in each time period independent of how much pressure is available. A pressure driven analysis makes demand be a power function of pressure, up to the point where the full demand is met. -*/ +*/ typedef enum { EN_DDA = 0, //!< Demand driven analysis EN_PDA = 1 //!< Pressure driven analysis @@ -272,7 +272,7 @@ typedef enum { These options specify hydraulic convergence criteria, choice of head loss formula, and several other parameters applied on a network-wide basis. They are accessed using the @ref EN_getoption and @ref EN_setoption functions. -*/ +*/ typedef enum { EN_TRIALS = 0, //!< Maximum hydraulic trials allowed EN_ACCURACY = 1, //!< Maximum total relative flow change for hydraulic convergence @@ -308,7 +308,7 @@ These options determine what kind of statistical post-processing should be done the time series of simulation results generated before they are reported using @ref EN_report. An option can be chosen by using `STATISTIC option` as the argument to @ref EN_setreport. -*/ +*/ typedef enum { EN_SERIES = 0, //!< Report all time series points EN_AVERAGE = 1, //!< Report average value over simulation period @@ -408,7 +408,7 @@ typedef enum { EN_R_TIME = 9, //!< Elapsed simulation time EN_R_CLOCKTIME = 10, //!< Time of day EN_R_FILLTIME = 11, //!< Time to fill a tank - EN_R_DRAINTIME = 12 //!< Time to drain a tank + EN_R_DRAINTIME = 12 //!< Time to drain a tank } EN_RuleVariable; /// Comparison operators used in rule-based controls @@ -422,7 +422,7 @@ typedef enum { EN_R_IS = 6, //!< Is equal to EN_R_NOT = 7, //!< Is not equal to EN_R_BELOW = 8, //!< Is below - EN_R_ABOVE = 9 //!< Is above + EN_R_ABOVE = 9 //!< Is above } EN_RuleOperator; /// Link status codes used in rule-based controls diff --git a/include/epanet_py.h b/include/epanet_py.h index ffadb7b..ad05fe3 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -17,7 +17,7 @@ #ifndef EN_API_FLOAT_TYPE - #define EN_API_FLOAT_TYPE float + #define EN_API_FLOAT_TYPE double #endif // Opaque pointer to project @@ -46,7 +46,7 @@ int DLLEXPORT proj_close(Handle ph); int DLLEXPORT hydr_solve(Handle ph); int DLLEXPORT hydr_save(Handle ph); int DLLEXPORT hydr_open(Handle ph); -int DLLEXPORT hydr_init(Handle ph, EN_SaveOption saveFlag); +int DLLEXPORT hydr_init(Handle ph, EN_InitHydOption saveFlag); int DLLEXPORT hydr_run(Handle ph, long *currentTime); int DLLEXPORT hydr_next(Handle ph, long *tStep); int DLLEXPORT hydr_close(Handle ph); @@ -56,7 +56,7 @@ int DLLEXPORT hydr_usefile(Handle ph, char *filename); int DLLEXPORT qual_solve(Handle ph); int DLLEXPORT qual_open(Handle ph); -int DLLEXPORT qual_init(Handle ph, EN_SaveOption saveFlag); +int DLLEXPORT qual_init(Handle ph, EN_InitHydOption saveFlag); int DLLEXPORT qual_run(Handle ph, long *currentTime); int DLLEXPORT qual_next(Handle ph, long *tStep); int DLLEXPORT qual_step(Handle ph, long *timeLeft); @@ -76,8 +76,8 @@ int DLLEXPORT anlys_getoption(Handle ph, EN_Option opt, EN_API_FLOAT_TYPE *value int DLLEXPORT anlys_setoption(Handle ph, int code, EN_API_FLOAT_TYPE value); int DLLEXPORT anlys_getflowunits(Handle ph, int *code); int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code); -int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeProperty code, long *value); -int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeProperty code, long value); +int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value); +int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeParameter code, long value); int DLLEXPORT anlys_getqualinfo(Handle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode); int DLLEXPORT anlys_getqualtype(Handle ph, int *qualcode, int *tracenode); int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode); @@ -144,8 +144,7 @@ int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FL int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues); int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len); - -int DLLEXPORT scntl_add(Handle ph, int *cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); +int DLLEXPORT scntl_add(Handle ph, int type, int linkIndex, double setting, int nodeIndex, double level, int *index); int DLLEXPORT scntl_delete(Handle ph, int index); int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, int *nodeIndex, EN_API_FLOAT_TYPE *level); int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); diff --git a/src/epanet_py.c b/src/epanet_py.c index f1e8dc9..f1b0a2a 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -117,7 +117,7 @@ int DLLEXPORT hydr_open(Handle ph) return error_set(pr->error, EN_openH(pr->project)); } -int DLLEXPORT hydr_init(Handle ph, EN_SaveOption saveFlag) +int DLLEXPORT hydr_init(Handle ph, EN_InitHydOption saveFlag) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_initH(pr->project, saveFlag)); @@ -168,7 +168,7 @@ int DLLEXPORT qual_open(Handle ph) return error_set(pr->error, EN_openQ(pr->project)); } -int DLLEXPORT qual_init(Handle ph, EN_SaveOption saveFlag) +int DLLEXPORT qual_init(Handle ph, EN_InitHydOption saveFlag) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_initQ(pr->project, saveFlag)); @@ -270,13 +270,13 @@ int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code) return error_set(pr->error, EN_setflowunits(pr->project, code)); } -int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeProperty code, long *value) +int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_gettimeparam(pr->project, code, value)); } -int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeProperty code, long value) +int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeParameter code, long value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_settimeparam(pr->project, code, value)); @@ -456,7 +456,7 @@ int DLLEXPORT link_setid(Handle ph, int index, char *newid) int DLLEXPORT link_gettype(Handle ph, int index, int *code) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_getlinktype(pr->project, index, (EN_LinkType *)code)); + return error_set(pr->error, EN_getlinktype(pr->project, index, code)); } int DLLEXPORT link_settype(Handle ph, int *index, EN_LinkType type, int actionCode) @@ -621,10 +621,10 @@ int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_ -int DLLEXPORT scntl_add(Handle ph, int *cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level) +int DLLEXPORT scntl_add(Handle ph, int type, int linkIndex, double setting, int nodeIndex, double level, int *index) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_addcontrol(pr->project, cindex, ctype, lindex, setting, nindex, level)); + return error_set(pr->error, EN_addcontrol(pr->project, type, linkIndex, setting, nodeIndex, level, index)); } int DLLEXPORT scntl_delete(Handle ph, int index) From 8d12664061f510491e743a02774cb4299a1ad7ee Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Mon, 28 Jan 2019 11:31:31 -0500 Subject: [PATCH 11/16] Removing EN_API_FLOAT_TYPE --- include/epanet_py.h | 69 +++++++++++++++++++++------------------------ src/epanet_py.c | 64 ++++++++++++++++++++--------------------- 2 files changed, 64 insertions(+), 69 deletions(-) diff --git a/include/epanet_py.h b/include/epanet_py.h index ad05fe3..251cb6a 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -16,16 +16,11 @@ #define EPANET_PY_H -#ifndef EN_API_FLOAT_TYPE - #define EN_API_FLOAT_TYPE double -#endif - // Opaque pointer to project typedef void *Handle; #include "epanet2_enums.h" - #include "epanet2_export.h" @@ -69,11 +64,11 @@ int DLLEXPORT rprt_reset(Handle ph); int DLLEXPORT rprt_set(Handle ph, char *reportCommand); int DLLEXPORT rprt_setlevel(Handle ph, EN_StatusReport code); int DLLEXPORT rprt_getcount(Handle ph, EN_CountType code, int *count); -int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value); +int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* value); -int DLLEXPORT anlys_getoption(Handle ph, EN_Option opt, EN_API_FLOAT_TYPE *value); -int DLLEXPORT anlys_setoption(Handle ph, int code, EN_API_FLOAT_TYPE value); +int DLLEXPORT anlys_getoption(Handle ph, EN_Option opt, double *value); +int DLLEXPORT anlys_setoption(Handle ph, int code, double value); int DLLEXPORT anlys_getflowunits(Handle ph, int *code); int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code); int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value); @@ -89,17 +84,17 @@ int DLLEXPORT node_getindex(Handle ph, char *id, int *index); int DLLEXPORT node_getid(Handle ph, int index, char *id); int DLLEXPORT node_setid(Handle ph, int index, char *newid); int DLLEXPORT node_gettype(Handle ph, int index, int *code); -int DLLEXPORT node_getvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE *value); -int DLLEXPORT node_setvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE value); -int DLLEXPORT node_getcoord(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); -int DLLEXPORT node_setcoord(Handle ph, int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); +int DLLEXPORT node_getvalue(Handle ph, int index, int code, double *value); +int DLLEXPORT node_setvalue(Handle ph, int index, int code, double value); +int DLLEXPORT node_getcoord(Handle ph, int index, double *x, double *y); +int DLLEXPORT node_setcoord(Handle ph, int index, double x, double y); -int DLLEXPORT dmnd_getmodel(Handle ph, int *type, EN_API_FLOAT_TYPE *pmin, EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); -int DLLEXPORT dmnd_setmodel(Handle ph, int type, EN_API_FLOAT_TYPE pmin, EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); +int DLLEXPORT dmnd_getmodel(Handle ph, int *type, double *pmin, double *preq, double *pexp); +int DLLEXPORT dmnd_setmodel(Handle ph, int type, double pmin, double preq, double pexp); int DLLEXPORT dmnd_getcount(Handle ph, int nodeIndex, int *numDemands); -int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE *baseDemand); -int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE baseDemand); +int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, double *baseDemand); +int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, double baseDemand); int DLLEXPORT dmnd_getpattern(Handle ph, int nodeIndex, int demandIndex, int *pattIndex); int DLLEXPORT dmnd_setpattern(Handle ph, int nodeIndex, int demandIndex, int patIndex); int DLLEXPORT dmnd_getname(Handle ph, int nodeIndex, int demandIdx, char *demandName); @@ -115,8 +110,8 @@ int DLLEXPORT link_gettype(Handle ph, int index, int *code); int DLLEXPORT link_settype(Handle ph, int *index, EN_LinkType type, int actionCode); int DLLEXPORT link_getnodes(Handle ph, int index, int *node1, int *node2); int DLLEXPORT link_setnodes(Handle ph, int index, int node1, int node2); -int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, EN_API_FLOAT_TYPE *value); -int DLLEXPORT link_setvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE v); +int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, double *value); +int DLLEXPORT link_setvalue(Handle ph, int index, int code, double v); int DLLEXPORT pump_gettype(Handle ph, int linkIndex, int *outType); @@ -128,10 +123,10 @@ int DLLEXPORT ptrn_add(Handle ph, char *id); int DLLEXPORT ptrn_getindex(Handle ph, char *id, int *index); int DLLEXPORT ptrn_getid(Handle ph, int index, char *id); int DLLEXPORT ptrn_getlength(Handle ph, int index, int *len); -int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE *value); -int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE value); -int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, EN_API_FLOAT_TYPE *value); -int DLLEXPORT ptrn_set(Handle ph, int index, EN_API_FLOAT_TYPE *f, int len); +int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, double *value); +int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, double value); +int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, double *value); +int DLLEXPORT ptrn_set(Handle ph, int index, double *f, int len); int DLLEXPORT curv_add(Handle ph, char *id); @@ -139,31 +134,31 @@ int DLLEXPORT curv_getindex(Handle ph, char *id, int *index); int DLLEXPORT curv_getid(Handle ph, int index, char *id); int DLLEXPORT curv_getlength(Handle ph, int index, int *len); int DLLEXPORT curv_gettype(Handle ph, int curveIndex, int *outType); -int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); -int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); -int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues); -int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len); +int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, double *x, double *y); +int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, double x, double y); +int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, double **xValues, double **yValues); +int DLLEXPORT curv_set(Handle ph, int index, double *x, double *y, int len); int DLLEXPORT scntl_add(Handle ph, int type, int linkIndex, double setting, int nodeIndex, double level, int *index); int DLLEXPORT scntl_delete(Handle ph, int index); -int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, int *nodeIndex, EN_API_FLOAT_TYPE *level); -int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); +int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, double *setting, int *nodeIndex, double *level); +int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, double setting, int nindex, double level); int DLLEXPORT rcntl_add(Handle ph, char *rule); int DLLEXPORT rcntl_delete(Handle ph, int index); -int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, EN_API_FLOAT_TYPE *priority); +int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, double *priority); int DLLEXPORT rcntl_getid(Handle ph, int index, char* id); -int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, EN_API_FLOAT_TYPE *value); -int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, EN_API_FLOAT_TYPE value); +int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, double *value); +int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, double value); int DLLEXPORT rcntl_setpremiseindex(Handle ph, int ruleIndex, int premiseIndex, int objIndex); int DLLEXPORT rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, int status); -int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, EN_API_FLOAT_TYPE value); -int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); -int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting); -int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); -int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting); -int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, EN_API_FLOAT_TYPE priority); +int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, double value); +int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting); +int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting); +int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting); +int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting); +int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, double priority); void DLLEXPORT err_clear(Handle ph); diff --git a/src/epanet_py.c b/src/epanet_py.c index f1b0a2a..fad6501 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -237,7 +237,7 @@ int DLLEXPORT rprt_getcount(Handle ph, EN_CountType code, int *count) return error_set(pr->error, EN_getcount(pr->project, code, count)); } -int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT_TYPE* value) +int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getstatistic(pr->project, code, value)); @@ -246,13 +246,13 @@ int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, EN_API_FLOAT -int DLLEXPORT anlys_getoption(Handle ph, EN_Option code, EN_API_FLOAT_TYPE *value) +int DLLEXPORT anlys_getoption(Handle ph, EN_Option code, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getoption(pr->project, code, value)); } -int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, EN_API_FLOAT_TYPE value) +int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setoption(pr->project, code, value)); @@ -339,25 +339,25 @@ int DLLEXPORT node_gettype(Handle ph, int index, int *code) return error_set(pr->error, EN_getnodetype(pr->project, index, code)); } -int DLLEXPORT node_getvalue(Handle ph, int index, EN_NodeProperty code, EN_API_FLOAT_TYPE *value) +int DLLEXPORT node_getvalue(Handle ph, int index, EN_NodeProperty code, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getnodevalue(pr->project, index, code, value)); } -int DLLEXPORT node_setvalue(Handle ph, int index, EN_NodeProperty code, EN_API_FLOAT_TYPE value) +int DLLEXPORT node_setvalue(Handle ph, int index, EN_NodeProperty code, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setnodevalue(pr->project, index, code, value)); } -int DLLEXPORT node_getcoord(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) +int DLLEXPORT node_getcoord(Handle ph, int index, double *x, double *y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcoord(pr->project, index, x, y)); } -int DLLEXPORT node_setcoord(Handle ph, int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) +int DLLEXPORT node_setcoord(Handle ph, int index, double x, double y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcoord(pr->project, index, x, y)); @@ -366,13 +366,13 @@ int DLLEXPORT node_setcoord(Handle ph, int index, EN_API_FLOAT_TYPE x, EN_API_FL -int DLLEXPORT dmnd_getmodel(Handle ph, int *type, EN_API_FLOAT_TYPE *pmin, EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp) +int DLLEXPORT dmnd_getmodel(Handle ph, int *type, double *pmin, double *preq, double *pexp) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getdemandmodel(pr->project, type, pmin, preq, pexp)); } -int DLLEXPORT dmnd_setmodel(Handle ph, int type, EN_API_FLOAT_TYPE pmin, EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp) +int DLLEXPORT dmnd_setmodel(Handle ph, int type, double pmin, double preq, double pexp) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setdemandmodel(pr->project, type, pmin, preq, pexp)); @@ -384,13 +384,13 @@ int DLLEXPORT dmnd_getcount(Handle ph, int nodeIndex, int *numDemands) return error_set(pr->error, EN_getnumdemands(pr->project, nodeIndex, numDemands)); } -int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE *baseDemand) +int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, double *baseDemand) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getbasedemand(pr->project, nodeIndex, demandIndex, baseDemand)); } -int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, EN_API_FLOAT_TYPE baseDemand) +int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, double baseDemand) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setbasedemand(pr->project, nodeIndex, demandIndex, baseDemand)); @@ -477,13 +477,13 @@ int DLLEXPORT link_setnodes(Handle ph, int index, int node1, int node2) return error_set(pr->error, EN_setlinknodes(pr->project, index, node1, node2)); } -int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, EN_API_FLOAT_TYPE *value) +int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getlinkvalue(pr->project, index, code, value)); } -int DLLEXPORT link_setvalue(Handle ph, int index, int code, EN_API_FLOAT_TYPE value) +int DLLEXPORT link_setvalue(Handle ph, int index, int code, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setlinkvalue(pr->project, index, code, value)); @@ -537,25 +537,25 @@ int DLLEXPORT ptrn_getlength(Handle ph, int index, int *len) return error_set(pr->error, EN_getpatternlen(pr->project, index, len)); } -int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE *value) +int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpatternvalue(pr->project, index, period, value)); } -int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, EN_API_FLOAT_TYPE value) +int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpatternvalue(pr->project, index, period, value)); } -int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, EN_API_FLOAT_TYPE *value) +int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getaveragepatternvalue(pr->project, index, value)); } -int DLLEXPORT ptrn_set(Handle ph, int index, EN_API_FLOAT_TYPE *values, int len) +int DLLEXPORT ptrn_set(Handle ph, int index, double *values, int len) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpattern(pr->project, index, values, len)); @@ -594,25 +594,25 @@ int DLLEXPORT curv_gettype(Handle ph, int index, int *type) return error_set(pr->error, EN_getcurvetype(pr->project, index, type)); } -int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) +int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, double *x, double *y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurvevalue(pr->project, curveIndex, pointIndex, x, y)); } -int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) +int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, double x, double y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcurvevalue(pr->project, curveIndex, pointIndex, x, y)); } -int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues) +int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, double **xValues, double **yValues) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurve(pr->project, curveIndex, id, nValues, xValues, yValues)); } -int DLLEXPORT curv_set(Handle ph, int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int len) +int DLLEXPORT curv_set(Handle ph, int index, double *x, double *y, int len) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcurve(pr->project, index, x, y, len)); @@ -633,13 +633,13 @@ int DLLEXPORT scntl_delete(Handle ph, int index) return error_set(pr->error, EN_deletecontrol(pr->project, index)); } -int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, int *nodeIndex, EN_API_FLOAT_TYPE *level) +int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, double *setting, int *nodeIndex, double *level) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcontrol(pr->project, controlIndex, controlType, linkIndex, setting, nodeIndex, level)); } -int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level) +int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, double setting, int nindex, double level) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcontrol(pr->project, cindex, ctype, lindex, setting, nindex, level)); @@ -660,7 +660,7 @@ int DLLEXPORT rcntl_delete(Handle ph, int index) return error_set(pr->error, EN_deleterule(pr->project, index)); } -int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, EN_API_FLOAT_TYPE *priority) +int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, double *priority) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getrule(pr->project, index, nPremises, nThenActions, nElseActions, priority)); @@ -672,13 +672,13 @@ int DLLEXPORT rcntl_getid(Handle ph, int index, char *id) return error_set(pr->error, EN_getruleID(pr->project, index, id)); } -int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, EN_API_FLOAT_TYPE *value) +int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpremise(pr->project, ruleIndex, premiseIndex, logop, object, objIndex, variable, relop, status, value)); } -int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, EN_API_FLOAT_TYPE value) +int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpremise(pr->project, ruleIndex, premiseIndex, logop, object, objIndex, variable, relop, status, value)); @@ -696,37 +696,37 @@ int DLLEXPORT rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, return error_set(pr->error, EN_setpremisestatus(pr->project, ruleIndex, premiseIndex, status)); } -int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, EN_API_FLOAT_TYPE value) +int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpremisevalue(pr->project, ruleIndex, premiseIndex, value)); } -int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting) +int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getthenaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting) +int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setthenaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting) +int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getelseaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting) +int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setelseaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, EN_API_FLOAT_TYPE priority) +int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, double priority) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setrulepriority(pr->project, index, priority)); From 67947e5ea87634b852af182d701b41c45736094d Mon Sep 17 00:00:00 2001 From: Lew Rossman Date: Tue, 29 Jan 2019 09:46:14 -0500 Subject: [PATCH 12/16] Minor edits to documentation --- ReleaseNotes2_2.md | 4 +- doc/DataFlow.eps | 326 +++++++++++++++++++++--------------------- doc/DataFlow.png | Bin 48494 -> 48451 bytes doc/toolkit-usage.dox | 2 +- 4 files changed, 166 insertions(+), 166 deletions(-) diff --git a/ReleaseNotes2_2.md b/ReleaseNotes2_2.md index 19d42eb..df1e9c0 100644 --- a/ReleaseNotes2_2.md +++ b/ReleaseNotes2_2.md @@ -109,8 +109,8 @@ int ENgetdemandmodel(int *modelType, double *pMin, double *pReq, double *pExp); ``` for the legacy API and ``` -int EN_setdemandmodel(EN_Project *pr, int modelType, double pMin, double pReq, double pExp); -int EN_getdemandmodel(EN_Project *pr, int *modelType, double *pMin, double *pReq, double *pExp); +int EN_setdemandmodel(EN_Project ph, int modelType, double pMin, double pReq, double pExp); +int EN_getdemandmodel(EN_Project ph, int *modelType, double *pMin, double *pReq, double *pExp); ``` for the thread-safe API. Some additional points regarding the new **PDA** option are: diff --git a/doc/DataFlow.eps b/doc/DataFlow.eps index febe439..041b043 100644 --- a/doc/DataFlow.eps +++ b/doc/DataFlow.eps @@ -1,7 +1,7 @@ %!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) -%%Title: (/srv/www/vhosts/git_exclude/save/processed/f/e/b/feb24f93-0578-4fbd-bacd-cea373ca6d55/01_974b6e74f4a6ddd6b9fc94889edcc782_png_intermediate_eps/DataFlow3.eps) -%%CreationDate: (2019-01-23T17:53:26+01:00) +%%Title: (/srv/www/vhosts/git_exclude/save/processed/5/f/7/5f73a081-3008-4947-be6b-2ae45f4afa5d/01_0631f921834777aef3d754c155093225_png_intermediate_eps/DataFlow.eps) +%%CreationDate: (2019-01-27T17:06:23+01:00) %%BoundingBox: -0 -0 393 292 %%HiResBoundingBox: 0 0 393.041 292 %%DocumentData: Clean7Bit @@ -7292,8 +7292,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA97A4B530619E3770B6 407ECA64C1F7FFEBE5647ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA3F7CC7 -3D78C13A74BB3871B7366DB22E5E9A4C5F76EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFEFEFEFEFEFE -FDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +3D78C13A74BB3871B7366DB22E5E9A4C5F76EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFFFFFF @@ -7333,7 +7333,7 @@ EAEAEA97A4B530619E3770B63A74BD3B77C03D79C43F7CC7407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA3F7CC73D78C13A74BB3871B7366DB22E5E9A4C5F76EAEAEAF8F8F8FDFDFD -FEFEFEFEFEFEFCFCFCDBDBDB4646460000005E5E5EFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEBEBEB2F2F2F080808757575 @@ -7373,8 +7373,8 @@ C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBE5647ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA3F7CC73D78C13A74BB3871B7366DB22E5E9A -4C5F76EAEAEAF8F8F8FCFCFCFCFCFCEAEAEA737373070707000000000000070707F6F6F6FCFCFC -FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +4C5F76EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFA B7B7B7000000000000000000171717929292FBFBFBFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFEFEFE @@ -7413,8 +7413,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA97A4B530619D3770B63A74BD FFFFF7A694CA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA3F7CC73D78C1 -3A74BB3871B7366DB22E5E9A4C5F76E9E9E9F6F6F6F9F9F9929292161616000000000000000000 -000000858585EFEFEFF9F9F9FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +3A74BB3871B7366DB22E5E9A4C5F76EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDFDFDF7F7F7EBEBEB454545000000000000000000000000353535C2C2C2FBFBFB @@ -7453,8 +7453,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA 407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA407ECA -407ECA407ECA3F7CC73D78C13A74BB3871B7366DB22E5E994C5F76E6E6E6BCBCBC2D2D2D000000 -000000000000000000313131A9A9A9D8D8D8EAEAEAF7F7F7FDFDFDFFFFFFFFFFFFFFFFFFFFFFFF +407ECA407ECA3F7CC73D78C13A74BB3871B7366DB22E5E9A4C5F76EAEAEAF8F8F8FDFDFDFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF4F4F4E5E5E5D3D3D3888888181818000000 @@ -7493,8 +7493,8 @@ FFFFFFFDFDFDF8F8F8EAEAEA97A4B530619D3770B53A74BC3B77BF3D79C33F7CC7407EC9407EC9 407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9 407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9 407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9 -407EC9407EC9407EC9407EC9407EC9407EC93F7CC63D78C03A74BA3871B6366DB02D5D97435468 -4D4D4D0000000000000000000000001818187F7F7FBCBCBCC7C7C7D9D9D9EAEAEAF6F6F6FBFBFB +407EC9407EC9407EC9407EC9407EC9407EC93F7CC63D78C03A74B93871B5366CB02E5D984B5E75 +E7E7E7F5F5F5FAFAFAFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFAFAFAF3F3F3E6E6E6 @@ -7533,8 +7533,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA97A4B530619D3770B53A74BC3B76BF 407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9 407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9 407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9 -407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC93F7CC63D78C03A74B9 -3870B53368A9162D49020303000000000000000000000000000000000000000000000000000000 +407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC9407EC93F7CC63D78BF3973B8 +1B3759000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 @@ -7574,7 +7574,7 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA97A4B5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFED857DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC9 3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC9 3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC9 -3F7DC93F7BC63C77C03A72B92F609C050A10000000000000000000000000000000000000000000 +3F7DC93F7BC63C76BE3870B51A3556000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 @@ -7614,7 +7614,7 @@ FDFDFDF8F8F8EAEAEA96A4B52F609D366FB53974BC3A75BF3C78C33E7BC63F7DC93F7DC93F7DC9 85D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A694C93F7DC93F7DC93F7DC93F7DC9 3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC9 3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC9 -3F7DC93F7DC93F7DC93F7DC93F7DC93E7BC63B77BF3871B7356BAE2750820A1420000000000000 +3F7DC93F7DC93F7DC93F7DC93F7DC93E7BC53A75BD366DB1183251000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 @@ -7654,9 +7654,9 @@ FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA96A4B52F609D366FB53974BC3A75BE3C78C2 3F7DC93F7DC93F7DC93F7DDBC4FFFFE1C1D33F7DC93FAAEDFFFFED857DC93F7DC964C1F6FFD5DB 3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC9 3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC9 -3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93E7BC53B77BE3870B63469AA -2F5F9B254C7B252E390F0F0F000000000000000000000000444444A3A3A3B4B4B4B8B8B8BABABA -BBBBBBBBBBBBBBBBBBBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC +3F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93F7DC93E7BC43A74BB356BAE30629E +2A568E234774384657ADADADB7B7B7BBBBBBBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC +BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC BBBBBBBBBBBBBBBBBBBABABAB7B7B7B3B3B38C8C8C2A2A2A0000000000000000000000002D2D2D @@ -7695,8 +7695,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA96A4B52F609C 857DC83F7DC83F94E4E1FFED857DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 -3E7BC53B77BD3871B5346AAB2F609D264D7D3947589E9E9E525252050505000000000000000000 -0B0B0B676767BCBCBCBFBFBFC0C0C0C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 +3E7BC43A75BA366CAE30629F2B59902449763A4859B1B1B1BCBCBCBFBFBFC1C1C1C1C1C1C1C1C1 +C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C0C0C0BEBEBEAFAFAF4F4F4F000000000000000000 @@ -7735,8 +7735,8 @@ F8F8F8EAEAEA96A4B52F609C366FB43974BB3A75BE3C78C23E7BC53F7DC83F7DC83F7DC83F7DC8 C4AAC83F7DC83F7DDBC4FFF6A694C83F7DC83FAAEDFFFFED857DC83F7DC83F7DC83F7DC83F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 -3F7DC83F7DC83F7DC83F7DC83E7BC53B77BD3872B7356CAF3164A42852863E4E60B2B2B2B1B1B1 -969696343434000000000000000000000000202020A9A9A9D4D4D4D6D6D6D6D6D6D7D7D7D7D7D7 +3F7DC83F7DC83F7DC83F7DC83E7BC43A76BC376EB23367A72F5F9B275082405063C5C5C5D1D1D1 +D5D5D5D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6D6D6D5D5D5D3D3D38080800C0C0C @@ -7775,9 +7775,9 @@ FFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA96A4B52F609C366FB43974BB3A75BE3C78C23E7BC5 3F7DC83F7DC83F7DC885D5FFFFD5DB3F7DC83F7DD2A6EAFFFFFFFFFFFFFFFFFFFFFFD5DB3F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 -3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83E7BC53B77BE3973B8366FB33369AA -2B588F445569C7C7C7C5C5C5BEBEBEB4B4B48383831B1B1B000000000000000000151515E5E5E5 -EAEAEAECECECEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED +3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83E7BC53B76BD3871B5356CAF3266A6 +2B578E47586DD9D9D9E6E6E6EBEBEBEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED +EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDECECECECECEC E9E9E9B8B8B80000000000000000000000003737379A9A9AB7B7B7C2C2C2CFCFCFDDDDDDE9E9E9 @@ -7816,8 +7816,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA96A4B52F609C366FB4 FFFFFFFFFFED857DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC8 3F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83F7DC83E7BC5 -3B77BE3973B93770B4356BAF2D5B95495B70D9D9D9DCDCDCD3D3D3C8C8C8BDBDBDB6B6B6666666 -0C0C0C000000292929EAEAEAF4F4F4F8F8F8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 +3B77BE3973B8366FB3346AAD2D5B954A5D72E4E4E4F2F2F2F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9 +F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 F9F9F9F9F9F9F9F9F9F7F7F7F2F2F2CACACA0707070000001D1D1D838383B7B7B7C0C0C0CCCCCC @@ -7856,8 +7856,8 @@ EAEAEA96A4B42F609B366FB33974BA3A75BD3C78C03E7BC43F7DC73F7DC73F7DC73F7DC73F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC7 -3F7DC73F7DC73F7DC73E7BC43B77BE3973B83770B4356CAE2E5D964B5E74E4E4E4EBEBEBE8E8E8 -DFDFDFD2D2D2C6C6C6BEBEBEB1B1B1949494CACACAEAEAEAF7F7F7FCFCFCFEFEFEFEFEFEFEFEFE +3F7DC73F7DC73F7DC73E7BC43B77BE3973B83770B3356CAE2E5D964C5F75E9E9E9F7F7F7FCFCFC +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFBFBFBF4F4F4E5E5E5B8B8B8929292BDBDBD @@ -7897,8 +7897,8 @@ FFFFFFFFFFFFFDFDFDF8F8F8EAEAEA96A4B42F609B366FB33974BA3A75BD3C78C03E7BC43F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73E7BC43B77BD3973B83770B4356CAF2E5D97 -4C5F75E8E8E8F4F4F4F5F5F5F0F0F0E7E7E7DCDCDCD1D1D1CBCBCBCECECEDBDBDBECECECF8F8F8 -FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +4C5F75EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF5F5F5 E8E8E8D7D7D7CCCCCCCCCCCCD4D4D4DFDFDFEAEAEAF2F2F2F8F8F8FCFCFCFEFEFEFEFEFEFEFEFE @@ -7937,8 +7937,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA96A4B42E609B366EB33873BA 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC7 3F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73F7DC73D7AC43B76BD -3972B8376FB4356CAF2D5D974C5F75EAEAEAF7F7F7FBFBFBFAFAFAF5F5F5EFEFEFE6E6E6E0E0E0 -E0E0E0E8E8E8F2F2F2FAFAFAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +3972B8376FB4356CAF2D5D974C5F75EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDFDFDF9F9F9F0F0F0E5E5E5E0E0E0E2E2E2E9E9E9F0F0F0F7F7F7FBFBFBFDFDFD @@ -7977,8 +7977,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA FFFFFFFFFFFFFFFFFFFFFFFFE1C0D03E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC7 3E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC7 3E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC7 -3E7CC73E7CC73D79C43A75BD3872B8366FB4346BAF2D5D974C5E75EAEAEAF8F8F8FDFDFDFEFEFE -FCFCFCF9F9F9F5F5F5F2F2F2F1F1F1F5F5F5F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +3E7CC73E7CC73D79C43A75BD3872B8366FB4346BAF2D5D974C5E75EAEAEAF8F8F8FDFDFDFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF8F8F8F3F3F3F1F1F1F3F3F3F7F7F7 @@ -8018,7 +8018,7 @@ FFD5DA3E7CC73E7CC73E7CC73E7CC73E7CC73E7CD0A5EAFFFFFFF6A593C73E7CC73E7CC73E7CC7 3E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC7 3E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73E7CC7 3E7CC73E7CC73E7CC73E7CC73E7CC73E7CC73D79C33A75BD3872B8366FB4346BAF2D5D974C5E75 -EAEAEAF8F8F8FDFDFDFFFFFFFEFEFEFEFEFEFCFCFCFBFBFBFBFBFBFCFCFCFDFDFDFEFEFEFFFFFF +EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD @@ -8058,8 +8058,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA96A4B42E5F9A356EB23873B93974BC FFD5D93E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC6 3E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC6 3E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63E7CC63D79C23A75BC3872B7 -366FB3346BAE2D5D964C5E75EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFE -FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +366FB3346BAE2D5D964C5E75EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF @@ -10235,7 +10235,7 @@ A4E9FFE1BDC83B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC 3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC 3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC3B75BC 3B75BC3B75BC3B75BC3B75BC3B75BC3A73B9386FB3366CAE3469AA3165A52B578F4B5C72EAEAEA -F8F8F8FDFDFDFFFFFFFFFFFFFEFEFEFEFEFEFDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF +F8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF @@ -10275,8 +10275,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B22C5A923268A8356CAF376EB23870B5 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3A73B8386FB3366CAE3469A9 -3165A42B578E4B5C71EAEAEAF8F8F8FDFDFDFEFEFEFEFEFEFCFCFCDBDBDB4646460000005E5E5E -FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +3165A42B578E4B5C71EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEBEBEB2F2F2F080808757575EBEBEBFDFDFDFEFEFE @@ -10315,8 +10315,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B22C5A92 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB -3A73B8386FB3366CAE3469A93165A42B578E4B5C71EAEAEAF8F8F8FCFCFCFCFCFCEAEAEA737373 -070707000000000000070707F6F6F6FCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +3A73B8386FB3366CAE3469A93165A42B578E4B5C71EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFBFBBEBEBE000000000000 @@ -10355,8 +10355,8 @@ F8F8F8EAEAEA95A2B22C5A923268A8356CAF376EB23870B53A73B83B75BB3B75BB3B75BB3B75BB 82D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9DE6075BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB -3B75BB3B75BB3B75BB3B75BB3A73B8386FB3366CAE3469A93165A42B578E4B5C71E9E9E9F6F6F6 -F9F9F9929292161616000000000000000000000000858585EFEFEFF9F9F9FEFEFEFFFFFFFFFFFF +3B75BB3B75BB3B75BB3B75BB3A73B8386FB3366CAE3469A93165A42B578E4B5C71EAEAEAF8F8F8 +FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD @@ -10396,8 +10396,8 @@ FFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B22C5A923268A8356CAF376EB23870B53A73B8 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB 3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3B75BB3A73B8386FB3366CAE3469A93165A4 -2B578D4B5C71E6E6E6BCBCBC2D2D2D000000000000000000000000313131A9A9A9D8D8D8EAEAEA -F7F7F7FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +2B578E4B5C71EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFEFCFCFCF4F4F4E6E6E6D3D3D3888888181818000000000000000000000000 @@ -10436,8 +10436,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B22C5A913268A7 3B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B9 3B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B9 3B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93A73B7 -386FB2366CAD3469A83165A22A568B4252644D4D4D0000000000000000000000001818187F7F7F -BCBCBCC7C7C7D9D9D9EAEAEAF6F6F6FBFBFBFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC +386FB2366CAC3469A73164A22B568C4A5B70E7E7E7F5F5F5FAFAFAFCFCFCFCFCFCFCFCFCFCFCFC +FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFAFAFAF4F4F4E6E6E6D4D4D4C4C4C4B4B4B4 @@ -10476,7 +10476,7 @@ EAEAEA95A2B12C5A913268A7356CAE376EB13870B43A73B73B75B93B75B93B75B93B75B93B75B9 3B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B9 3B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B9 3B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B93B75B9 -3B75B93B75B93B75B93A73B7386FB2366CAC3468A72E609B142A43020303000000000000000000 +3B75B93B75B93B75B93A73B7386FB1356BAB193352000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 @@ -10516,7 +10516,7 @@ FFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B12B59913267A7346BAE366DB1376FB43972B73A74B9 5FBCF3FFFFFFFFFFFFFFFFFFE1BCC53A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 -3A74B93A74B93A74B93A74B93A74B93A74B93A74B93972B7376EB2356AAC2C599004090F000000 +3A74B93A74B93A74B93A74B93A74B93A74B93A74B93972B7376DB13468A818314F000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 @@ -10556,8 +10556,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B12B59913167A7346BAE 3A74B93A74B93A74B95FBCF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D03A74B93A74B93A74B9 3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 -3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93972B7376EB1 -3469AA3164A1234A7809121E000000000000000000000000000000000000000000000000000000 +3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93972B6366CAF +3266A4172E4B000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 @@ -10597,8 +10597,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA FFFFF3A38DB93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 3A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B93A74B9 -3A74B93A74B93972B6376EB03468A830629E2A588F224671232C360F0F0F000000000000000000 -000000444444A3A3A3B4B4B4B8B8B8BABABABBBBBBBBBBBBBBBBBBBCBCBCBCBCBCBCBCBCBCBCBC +3A74B93A74B93972B5366BAD3164A12C5B9226508220426B374454ADADADB7B7B7BBBBBBBCBCBC +BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBBBBBBBBBBBBBBBBBB @@ -10637,8 +10637,8 @@ FFFFFFFDFDFDF8F8F8EAEAEA95A2B12B59903167A6346BAD366DB0376FB23972B63A74B83A74B8 3A74B83A74B83A74B83A74D0C2FFFFC2A5B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 -3A74B83A74B83A74B83A74B83A74B83A74B83972B6376EB03469A930629E2B5990224774374555 -9E9E9E5252520505050000000000000000000B0B0B676767BCBCBCBFBFBFC0C0C0C1C1C1C1C1C1 +3A74B83A74B83A74B83A74B83A74B83A74B83972B5366CAE3265A22D5B9327528521446D384656 +B1B1B1BCBCBCBFBFBFC1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 @@ -10677,9 +10677,9 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B12B59903167A6346BAD366DB0 3A74B83A74D0C2FFFFC2A5B83A74B83A74B83A74B83A74D0C2FFFFC2A5B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 -3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83972B6376EB0346AAA -3165A22D5D97254C7C3D4B5DB2B2B2B1B1B1969696343434000000000000000000000000202020 -A9A9A9D4D4D4D6D6D6D6D6D6D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 +3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83972B5366DAF3367A5 +2F609A2A588F244A793E4E5FC5C5C5D1D1D1D5D5D5D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 +D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6D6D6D6D6D6D3D3D38080800C0C0C000000000000000000 @@ -10718,8 +10718,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B1 FFFFFFFFFFFFFFFFFFFFFFFFFFE9DC5F74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 -3A74B83972B6376EB1356BAB3267A52E619D285284425365C7C7C7C5C5C5BEBEBEB4B4B4838383 -1B1B1B000000000000000000151515E5E5E5EAEAEAECECECEDEDEDEDEDEDEDEDEDEDEDEDEDEDED +3A74B83972B6376DB03469A93164A12D5F99275183455669D9D9D9E6E6E6EBEBEBEDEDEDEDEDED +EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDECECECECECECE9E9E9BFBFBF000000 @@ -10758,8 +10758,8 @@ FDFDFDF8F8F8EAEAEA95A2B12B59903167A6346BAD366DB0376FB23972B63A74B83A74B83A74B8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE78274B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 3A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B83A74B8 -3A74B83A74B83A74B83A74B83A74B83972B6376EB0356BAC3368A63063A129558947586CD9D9D9 -DCDCDCD3D3D3C8C8C8BDBDBDB6B6B66666660C0C0C000000292929EAEAEAF4F4F4F8F8F8F9F9F9 +3A74B83A74B83A74B83A74B83A74B83972B6376EB0356BAB3267A52F629F295589485A6EE4E4E4 +F2F2F2F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 @@ -10798,9 +10798,9 @@ FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B12B598F3167A5346BAC366DAF376FB1 3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B7 3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B7 3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B7 -3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73972B5376EB0356BAB3368A6 -3064A02A578B495B6FE4E4E4EBEBEBE8E8E8DFDFDFD2D2D2C6C6C6BEBEBEB1B1B1949494CACACA -EAEAEAF7F7F7FCFCFCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE +3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73972B5376EB0356BAB3368A5 +3064A02A578B4A5C70E9E9E9F7F7F7FCFCFCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFDFDFDFBFBFBF4F4F4E5E5E5B8B8B8929292BDBDBDC0C0C0C9C9C9D6D6D6 @@ -10839,8 +10839,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B12B598F 3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B7 3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B7 3A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B73A74B7 -3972B5376EAF356BAB3368A63064A12A578C4A5C70E8E8E8F4F4F4F5F5F5F0F0F0E7E7E7DCDCDC -D1D1D1CBCBCBCECECEDBDBDBECECECF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +3972B5376EAF356BAB3368A63064A12A578C4A5C70EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF6F6F6E8E8E8D7D7D7CCCCCC @@ -10879,8 +10879,8 @@ F8F8F8EAEAEA95A2B12A598F3166A5336AAC356CAF376EB13871B53973B73973B73973B73973B7 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B7 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B7 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B7 -3973B73973B73973B73973B73871B5366EAF346AAB3267A63063A129568C4A5C70EAEAEAF7F7F7 -FBFBFBFAFAFAF5F5F5EFEFEFE6E6E6E0E0E0E0E0E0E8E8E8F2F2F2FAFAFAFEFEFEFFFFFFFFFFFF +3973B73973B73973B73973B73871B5366EAF346AAB3267A63063A129568C4A5C70EAEAEAF8F8F8 +FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD @@ -10920,8 +10920,8 @@ FFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B12A588F3166A5336AAC356CAF366EB13871B5 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B7 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B7 3973B73973B73973B73973B73973B73973B73973B73973B73871B5366DAF346AAB3267A62F63A1 -29568C4A5B70EAEAEAF8F8F8FDFDFDFEFEFEFCFCFCF9F9F9F5F5F5F2F2F2F1F1F1F5F5F5F9F9F9 -FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +29568C4A5B70EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF8F8F8F3F3F3F1F1F1F3F3F3F7F7F7FAFAFAFDFDFDFEFEFE @@ -10960,8 +10960,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA95A2B12A588F3166A5 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B7 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B7 3973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73973B73871B4 -366DAF346AAA3267A62F63A129568C4A5B70EAEAEAF8F8F8FDFDFDFFFFFFFEFEFEFEFEFEFCFCFC -FBFBFBFBFBFBFCFCFCFDFDFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +366DAF346AAA3267A62F63A129568C4A5B70EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFBFBFBFBFBFBFCFCFC @@ -11001,7 +11001,7 @@ EAEAEA95A2B12A588E3166A4336AAB356CAD366EB03871B43973B63973B63973B63973B63973B6 3973B63973B63973B63973B63973B63973B63973B63973B63973B63973B63973B63973B63973B6 3973B63973B63973B63973B63973B63973B63973B63973B63973B63973B63973B63973B63973B6 3973B63973B63973B63871B4366DAE346AAA3267A52F63A029568B4A5B70EAEAEAF8F8F8FDFDFD -FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF @@ -13423,7 +13423,7 @@ FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA94A0AE2751842D5E9830619E3164A13366A4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFDFDFDFEFEFEFFFFFF FFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EB0B52A89A331A1BE34A8C736ABCA37AECE39B1D13AB3D4 3AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D4 3AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D43AB3D4 @@ -13463,8 +13463,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA94A0AE275184 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EB0B42A88A2309FBD33A7C6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDEBEBEB2F2F2F +080808757575EBEBEBFDFDFDFEFEFEFEFEFEFAFAFAF1F1F1DCDCDC9EB0B42A88A2309FBD33A7C6 35AAC936ADCC38B0D039B2D239B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D3 39B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D3 39B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D339B2D3 @@ -13504,7 +13504,7 @@ FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC +FEFEFEFBFBFBBEBEBE000000000000000000171717929292FBFBFBFCFCFCF9F9F9F1F1F1DCDCDC 9EB0B42987A1309EBC33A6C535A9C836ACCB38AFCF39B1D139B1D139B1D139B1D139B1D139B1D1 39B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D1 39B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D139B1D1 @@ -13544,8 +13544,8 @@ FFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA94A0AE2751842C5D982F619E3064A13266A43368A6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FEFEFEFAFAFAF1F1F1DCDCDC9EB0B42987A0309EBB33A5C334A8C736ABCA38AECD39B1D039B1D0 +FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF7F7F7EBEBEB4D4D4D0000000000000000000000002D2D2D +B9B9B9F6F6F6EFEFEFDBDBDB9EB0B42987A0309EBB33A5C334A8C736ABCA38AECD39B1D039B1D0 39B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D0 39B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D0 39B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039B1D039CCF0FFFFF7A3BFD0 @@ -13584,8 +13584,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA94A0AE2751842C5D98 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAFB429869F2F9DBA32A4C234A7C5 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF4F4F4E6E6E6D3D3D3888888 +181818000000000000000000000000525252D5D5D5D9D9D99DAEB329869F2F9DBA32A4C234A7C5 35AAC937ADCC38AFCF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF 38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF 38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF38B0CF @@ -13620,13 +13620,13 @@ EAEAEA94A0AE2751842C5D982F619E3063A13265A33368A6356AAA356AAA356AAA356AAA356AAA 356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA 356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA 356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA356AAA -356AAA356AAA356AAA3367A63164A12F619D2D5E982B5B94264F8049596CEAEAEAF8F8F8FDFDFD -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAFB4 -28859E2F9CB931A3C133A6C435A9C836ACCB38AECD38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE +356AAA356AAA356AAA3367A63164A12F619D2D5E972B5B93264E7F48586BE8E8E8F5F5F5FAFAFA +FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC +FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC +FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC +FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFAFAFA +F4F4F4E6E6E6D4D4D4C4C4C4B4B4B462626206060600000000000000000007070769696996A7AA +28849D2F9BB831A3C133A6C435A9C836ACCB38AECD38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE 38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE 38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE38AFCE 38AFCE38AFCE38AFCE38AFCE38AFCE38CAEFFFFFF7A2BDCE38AFCE38AFCE38CAEFFFFFFFE1D8D6 @@ -13660,13 +13660,13 @@ FFFFFFFFFFFFFDFDFDF8F8F8EAEAEA94A0AE2750832C5D972F609D3063A03265A33367A53569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 -3569A93569A93569A93569A93569A93569A93569A93367A53163A02F609C2D5D972B5A93264E80 -49586CEAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE -FAFAFAF1F1F1DCDCDC9EAFB428849D2E9BB831A2C032A5C334A8C636ABCA37ADCC37ADCC37ADCC +3569A93569A93569A93569A93569A93569A93569A93367A53163A02F609B2C5C95152C48000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000E10101A54642D99B531A1BF32A5C334A8C636ABCA37ADCC37ADCC37ADCC 37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC 37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC 37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC37ADCC36C9EEFFFFFFFFFFFFFFFFFF @@ -13701,12 +13701,12 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAE2750832C5D972F609D 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93367A53163A0 -2F609C2D5D972B5A93264E8049586CEAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAFB328839C2E9AB631A1BF32A4C234A7C5 +2F5F9B2C5A93142A45000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000C2A312E99B632A3C134A7C5 36AAC937ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB 37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB 37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB37ACCB @@ -13741,13 +13741,13 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 -3569A93569A93367A53163A02F609C2D5D972B5A93264E8049586CEAEAEAF8F8F8FDFDFDFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAFB327829B -2D98B5309FBD31A2C133A5C435A8C736ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA +3569A93569A93367A531639F2E5E9A2B588F132842000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000E2E37 +257F972E99B630A0BF33A4C335A8C736ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA 36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA 36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA36ABCA 36ABCA36ABCA36ABCA36ABCA36C8EDFFFFF7A2B9CA36ABCA36ABCA5DD6F7FFFFF7A2B9CA36ABCA @@ -13781,13 +13781,13 @@ FFFFFFFDFDFDF8F8F8EAEAEA949FAE2750832C5C972F609D3062A03265A33367A53569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 3569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A93569A9 -3569A93569A93569A93569A93569A93569A93367A53163A02F609C2D5D972B5A93264E8049586C -EAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFA -F1F1F1DCDCDC9EAFB327829A2D98B4309FBC31A2BF33A4C335A7C636AAC936AAC936AAC936AAC9 +3569A93569A93569A93569A93569A93569A93367A531639F2E5E982A578D254E801E3E66374352 +ADADADB7B7B7BBBBBBBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC +BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC +BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC +BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC +BCBCBCBCBCBCBBBBBBBBBBBBBBBBBBBABABAB7B7B7B3B3B38C8C8C2A2A2A000000000000000000 +000000222222616B6E206B7F2888A12E98B3309FBC33A3C235A7C636AAC936AAC936AAC936AAC9 36AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC9 36AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC9 36AAC936AAC936AAC936AAC936AAC936AAC936AAC936AAC936C8EDFFFFF6A2B9C936AAC936AAC9 @@ -13821,13 +13821,13 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAE2650832C5C972E609D3062A0 3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A9 3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A9 3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A9 -3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93367A53163A02F609C -2D5D972B5A93254E8048586CEAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAFB32781992D97B3309EBB31A1BE33A4C135A7C5 +3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93367A531639F2E5E99 +2A588E264F811E4069384454B2B2B2BCBCBCBFBFBFC1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 +C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 +C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 +C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 +C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C0C0C0BEBEBEAFAFAF4F4F4F000000 +0000000000000000000F0F0F6A6A6A9C9C9C79878A216C802989A22E97B3309FBC33A3C035A7C5 36A9C736AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC8 36AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC8 36AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836AAC836C8ED @@ -13862,13 +13862,13 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAE 3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A9 3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A9 3469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A93469A9 -3469A93266A43063A02E609B2C5D972A5992254E7F48586CEAEAEAF8F8F8FDFDFDFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAEB32680982D96B2 -2F9DBA31A0BD32A3C034A6C435A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C6 +3469A93266A430639F2D5F992A59912752872145703E4B5CC5C5C5D1D1D1D5D5D5D7D7D7D7D7D7 +D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 +D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 +D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 +D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D6D6D6D6D6D6D3D3D3 +8080800C0C0C0000000000000000000505054F4F4FA7A7A7AFAFAFABABAB8491962272872A8DA8 +2E99B6319FBC32A3C034A6C435A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C6 35A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C6 35A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C635A8C6 35A8C635A8C635A8C635C6EDFFFFF6A1B8C635A8C635A8C635A8C65CD5F6FFFFFFC1C6C635A8C6 @@ -13902,13 +13902,13 @@ FDFDFDF8F8F8EAEAEA949FAD264F822C5C962E5F9C2F619F3164A13266A43468A83468A83468A8 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 -3468A83468A83468A83468A83468A83265A430629F2E5F9B2C5C962A5992254D7F48586BEAEAEA -F8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1 -DCDCDC9EAEB3267F972C95B12F9CB9309FBC32A2BF34A4C235A7C535A7C535A7C535A7C535A7C5 +3468A83468A83468A83468A83468A83265A430629F2E5E9A2B5A9329568D234978435264D9D9D9 +E6E6E6EBEBEBEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED +EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED +EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED +EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED +ECECECECECECE9E9E9BFBFBF0000000000000000000000003737379A9A9AB6B6B6BEBEBEC4C4C4 +BFBFBF909FA424798F2B91AD2F9BB8309EBB32A2BF34A4C235A7C535A7C535A7C535A7C535A7C5 35A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C5 35A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C535A7C5 35A7C535A7C535A7C535A7C535A7C535A7C535A7C535C5ECFFFFF6A1B6C535A7C535A7C535A7C5 @@ -13942,13 +13942,13 @@ FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAD264F822B5C962E5F9C2F619F3164A1 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 -3468A83468A83468A83468A83468A83468A83468A83468A83468A83265A430629F2E5F9B2C5C96 -2A5992254D7F48586BEAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAEB2267F962C95B02F9CB8309EBB32A1BE34A4C135A7C4 +3468A83468A83468A83468A83468A83468A83468A83468A83468A83265A430629F2E5F9B2C5C95 +2A5890244C7D475669E4E4E4F2F2F2F7F7F7F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 +F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 +F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 +F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 +F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F7F7F7F2F2F2D1D1D10707070000001D1D1D838383B7B7B7 +C0C0C0CBCBCBD5D5D5D8D8D8CECECE98A8AC257D942C94AF2F9BB7309EBB32A1BE34A4C135A7C4 35A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C4 35A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C4 35A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C435A7C4 @@ -13983,12 +13983,12 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAD264F82 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 3468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A83468A8 -3265A430629F2E5F9B2C5C962A5992254D7F48586BEAEAEAF8F8F8FDFDFDFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EAEB2267E952C93AE2E9AB6 +3265A430629F2E5F9B2C5C962A5991254D7F48586BE9E9E9F7F7F7FCFCFCFEFEFEFEFEFEFEFEFE +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE +FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFBFBFBF4F4F4E5E5E5B8B8B8 +929292BDBDBDC0C0C0C9C9C9D6D6D6E1E1E1E8E8E8E7E7E7D8D8D89CACB0267E942C93AE2E9AB6 309DB932A0BD33A3C035A5C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C3 35A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C3 35A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C335A6C3 @@ -14027,9 +14027,9 @@ F8F8F8EAEAEA949FAD264F822B5C962E5F9C2F619F3164A13266A43468A83468A83468A83468A8 FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC -9EAEB2257D942B92AD2E99B52F9CB8319FBB33A2BF34A4C134A5C234A5C234A5C234A5C234A5C2 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE +FCFCFCF6F6F6E8E8E8D7D7D7CCCCCCCCCCCCD4D4D4DFDFDFEAEAEAF1F1F1F3F3F3EEEEEEDBDBDB +9DADB1257D942B92AD2E99B52F9CB8319FBB33A2BF34A4C134A5C234A5C234A5C234A5C234A5C2 34A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C2 34A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C2 34A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C234A5C2 @@ -14068,8 +14068,8 @@ FFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAD264F822B5C962E5F9C2F619F3164A13266A4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FEFEFEFAFAFAF1F1F1DCDCDC9EAEB2257C932B91AD2E98B52F9BB8319EBB33A1BE34A3C134A4C1 +FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF9F9F9F0F0F0E6E6E6E0E0E0E2E2E2E9E9E9F0F0F0F7F7F7 +FAFAFAF8F8F8F0F0F0DCDCDC9EAEB2257C932B91AD2E98B52F9BB8319EBB33A1BE34A3C134A4C1 34A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C1 34A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C1 34A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C134A4C1 @@ -14108,8 +14108,8 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAD264F822B5C95 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9EADB2257B932B90AC2E97B42F9AB7 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCF8F8F8F3F3F3F1F1F1 +F3F3F3F7F7F7FAFAFAFDFDFDFDFDFDFAFAFAF1F1F1DCDCDC9EADB2257B932B90AC2E97B42F9AB7 319DBA339FBD34A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C0 34A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C0 34A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C034A2C0 @@ -14149,7 +14149,7 @@ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9DADB2 +FEFEFEFDFDFDFBFBFBFBFBFBFCFCFCFDFDFDFEFEFEFFFFFFFEFEFEFAFAFAF1F1F1DCDCDC9DADB2 257A922B8FAB2D96B32F98B6309BB9329EBC33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF 33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF 33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF33A0BF @@ -14189,7 +14189,7 @@ FFFFFFFFFFFFFDFDFDF8F8F8EAEAEA949FAD264F812B5B952E5F9B2F619E3163A03265A33467A6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFEFEFE FAFAFAF1F1F1DCDCDC9DADB22479912A8EA92D95B12E97B5309AB8329DBB339FBE339FBE339FBE 339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE 339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE339FBE diff --git a/doc/DataFlow.png b/doc/DataFlow.png index 613b89efb9ef2e54daad520ff478ebbd5816d995..a499f45e42375a80aaf79c85a50a5274152f7a06 100644 GIT binary patch literal 48451 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 As{jB1 literal 48494 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 tHTRI`4ts&;dGW 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

^+&-p^$b=Mai@67wcV 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 Date: Tue, 29 Jan 2019 18:50:17 +0200 Subject: [PATCH 13/16] call ENnextH before ENnextQ --- ReleaseNotes2_1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes2_1.md b/ReleaseNotes2_1.md index 3cf4445..2ffd6fe 100644 --- a/ReleaseNotes2_1.md +++ b/ReleaseNotes2_1.md @@ -87,8 +87,8 @@ Contributors to this version (listed in order of first contribution): ENrunH(&t); ENrunQ(&qt); // collect results - ENnextQ(&qstep); ENnextH(&tstep); + ENnextQ(&qstep); } while (tstep > 0); ENcloseQ(); ENcloseH(); From 8dd917dfe5ad82096eb2547caa83690341dbd516 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Wed, 30 Jan 2019 13:35:24 -0500 Subject: [PATCH 14/16] Adding *.orig to .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 3c617e0..a20656a 100755 --- a/.gitignore +++ b/.gitignore @@ -227,3 +227,7 @@ tests/data/ #Cmake stuff buildprod*/ *_export.h + + +# git merge +*.orig From d62d606b3038d02543e50b75ed21fe843e9c9a8e Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Wed, 30 Jan 2019 13:36:04 -0500 Subject: [PATCH 15/16] Removing *.orig file --- include/epanet2_2.h.orig | 1613 -------------------------------------- 1 file changed, 1613 deletions(-) delete mode 100644 include/epanet2_2.h.orig diff --git a/include/epanet2_2.h.orig b/include/epanet2_2.h.orig deleted file mode 100644 index 4fae1ce..0000000 --- a/include/epanet2_2.h.orig +++ /dev/null @@ -1,1613 +0,0 @@ -/** @file epanet2_2.h - @see http://github.com/openwateranalytics/epanet - */ - -/* - ****************************************************************************** - Project: OWA EPANET - Version: 2.2 - Module: epanet2.h - Description: API function declarations - Authors: see AUTHORS - Copyright: see AUTHORS - License: see LICENSE - Last Updated: 01/08/2019 - ****************************************************************************** - */ - -#ifndef EPANET2_2_H -#define EPANET2_2_H - -#ifdef WITH_GENX - #include "epanet2_export.h" -#else - // --- define WINDOWS - #undef WINDOWS - #ifdef _WIN32 - #define WINDOWS - #endif - #ifdef __WIN32__ - #define WINDOWS - #endif - - // --- define DLLEXPORT - #ifndef DLLEXPORT - #ifdef WINDOWS - #ifdef __cplusplus - #define DLLEXPORT __declspec(dllexport) - #else - #define DLLEXPORT __declspec(dllexport) __stdcall - #endif // __cplusplus - #elif defined(CYGWIN) - #define DLLEXPORT __stdcall - #else - #define DLLEXPORT - #endif - #endif -#endif - -#include "epanet2_enums.h" - -// --- Declare the EPANET toolkit functions -#if defined(__cplusplus) -extern "C" { -#endif - -/** - @brief The EPANET Project wrapper object -*/ -typedef struct Project *EN_Project; - -/******************************************************************** - - System Functions - -********************************************************************/ - - /** - @brief Creates an EPANET project. - @param[out] ph an EPANET project handle that is passed into all other API functions. - @return an error code. - - EN_createproject must be called before any other API functions are used. - */ - int DLLEXPORT EN_createproject(EN_Project *ph); - - /** - @brief Deletes a currently opened EPANET project. - @param[in,out] ph an EPANET project handle which is returned as NULL. - @return an error code. - - EN_deleteproject should be called after all network analysis has been completed. - */ - int DLLEXPORT EN_deleteproject(EN_Project *ph); - -<<<<<<< HEAD - int DLLEXPORT EN_runproject(EN_Project ph, const char *f1, const char *f2, const char *f3, - void (*pviewprog)(char *)); -======= - /** - @brief Runs a complete EPANET simulation. - @param ph an EPANET project handle. - @param inpFile the name of an existing EPANET-formatted input file. - @param rptFile the name of a report file to be created (or "" if not needed) - @param outFile the name of a binary output file to be created (or "" if not needed) - @param pviewprog a callback function that takes a character string (char *) as its only parameter. - @return an error code - - The callback function should reside in and be used by the calling code to display - the progress messages that EPANET generates as it carries out its computations. Here is - an example of a such a function that displays progress messages to stdout: - \code {.c} - void writeConsole(char *s) - { - fprintf(stdout, "\n%s", s); - } - \endcode - It would be passed into EN_runproject as `&writeConsole`. If this feature is not needed then - the pviewprog argument should be NULL. - */ - int DLLEXPORT EN_runproject(EN_Project ph, const char *inpFile, const char *rptFile, - const char *outFile, void (*pviewprog)(char *)); - - /** - @brief Initializes an EPANET project. - @param ph an EPANET project handle. - @param rptFile the name of a report file to be created (or "" if not needed). - @param outFile the name of a binary output file to be created (or "" if not needed). - @param unitsType the choice of flow units (see @ref EN_FlowUnits). - @param headLossType the choice of head loss formula (see @ref EN_HeadLossType). - @return an error code. - - This function should be called immediately after ::EN_createproject if an EPANET-formatted input - file will not be used to supply network data. If the project receives it's network data - from an input file then there is no need to call this function. - */ ->>>>>>> dev - int DLLEXPORT EN_init(EN_Project ph, const char *rptFile, const char *outFile, - int unitsType, int headLossType); - - /** - @brief Opens an EPANET input file & reads in network data. - @param ph an EPANET project handle. - @param inpFile the name of an existing EPANET-formatted input file. - @param rptFile the name of a report file to be created (or "" if not needed). - @param outFile the name of a binary output file to be created (or "" if not needed). - @return an error code. - - This function should be called immediately after ::EN_createproject if an EPANET-formatted - input file will be used to supply network data. - */ - int DLLEXPORT EN_open(EN_Project ph, const char *inpFile, const char *rptFile, - const char *outFile); - - /** - @brief Saves a project's data to an EPANET-formatted text file. - @param ph an EPANET project handle. - @param filename the name of the file to create. - @return Error code - */ - int DLLEXPORT EN_saveinpfile(EN_Project ph, const char *filename); - - /** - @brief Closes a project and frees all of its memory. - @param ph an EPANET project handle. - @return Error code - - This function clears all existing data from a project but does not delete the - project, so it can be re-used with another set of network data. Use ::EN_deleteproject - to actually delete a project from memory. - */ - int DLLEXPORT EN_close(EN_Project ph); - - /******************************************************************** - - Hydraulic Analysis Functions - - ********************************************************************/ - - /** - @brief Runs a complete hydraulic simulation with results for all time periods - written to a temporary hydraulics file. - @param ph an EPANET project handle. - @return an error code. - - Use ::EN_solveH to generate a complete hydraulic solution which can stand alone - or be used as input to a water quality analysis. This function will not allow one to - examine intermediate hydraulic results as they are generated. It can also be followed by calls - to ::EN_saveH and ::EN_report to write hydraulic results to the report file. - - The sequence ::EN_openH - ::EN_initH - ::EN_runH - ::EN_nextH - ::EN_closeH - can be used instead to gain access to results at intermediate time periods and - directly adjust link status and control settings as a simulation proceeds. - - Example: - \code {.c} - EN_Project ph; - EN_createproject(&ph); - EN_open(ph, "net1.inp", "net1.rpt", ""); - EN_solveH(ph); - EN_solveQ(ph); - EN_report(ph); - EN_deleteproject(&ph); - \endcode - */ - int DLLEXPORT EN_solveH(EN_Project ph); - - /** - @brief Uses a previously saved binary hydraulics file to supply a project's hydraulics. - @param ph an EPANET project handle. - @param filename the name of the binary file containing hydraulic results. - @return an error code. - - Call this function to re-use a set of hydraulic analysis results saved previously. This - can save computational time if water quality analyses are being made under the same set - of hydraulic conditions. - - Do not call this function while the hydraulics solver is open. - */ - int DLLEXPORT EN_usehydfile(EN_Project ph, char *filename); - - /** - @brief Opens a project's hydraulic solver. - @param ph an EPANET project handle. - @return an error code. - - Call ::EN_openH prior to running the first hydraulic analysis using the - ::EN_initH - ::EN_runH - ::EN_nextH sequence. Multiple analyses can be made before - calling ::EN_closeH to close the hydraulic solver. - - Do not call this function if ::EN_solveH is being used to run a complete hydraulic - analysis or if hydraulics are being supplied by a previously saved hydraulics file - using ::EN_usehydfile. - */ - int DLLEXPORT EN_openH(EN_Project ph); - - /** - @brief Initializes a network prior to running a hydraulic analysis. - @param ph an EPANET project handle. - @param initFlag a 2-digit initialization flag (see @ref EN_InitHydOption). - @return an error code. - - This function initializes storage tank levels, link status and settings, and - the simulation time clock prior to running a hydraulic analysis. - - The initialization flag is a two digit number where the 1st (left) digit - indicates if link flows should be re-initialized (1) or not (0), and the - 2nd digit indicates if hydraulic results should be saved to a temporary - binary hydraulics file (1) or not (0). - - Be sure to call ::EN_initH prior to running a hydraulic analysis using a - ::EN_runH - ::EN_nextH loop. - - Choose to save hydraulics results if you will be: - - making a subsequent water quality run, - - using ::EN_report to generate a report - - using ::EN_savehydfile to save the binary hydraulics file. - - There is no need to save hydraulics if you will be writing custom code to - process hydraulic results as they are generated using the functions ::EN_getnodevalue - and ::EN_getlinkvalue. - */ - int DLLEXPORT EN_initH(EN_Project ph, int initFlag); - - /** - @brief Computes a hydraulic solution for the current point in time. - @param ph an EPANET project handle. - @param[out] currentTime the current simulation time in seconds. - @return an error or warning code. - - This function is used in a loop with ::EN_nextH to run an extended period hydraulic - simulation. This process automatically updates the simulation clock time so currentTime - should be treated as a read-only variable. - - ::EN_initH must have been called prior to running the ::EN_runH - ::EN_nextH loop. - - See ::EN_nextH for an example of using this function. - */ - int DLLEXPORT EN_runH(EN_Project ph, long *currentTime); - - /** - @brief Determines the length of time until the next hydraulic event occurs in an - extended period simulation. - @param ph an EPANET project handle. - @param[out] tStep the time (in seconds) until the next hydraulic event or 0 if at - the end of the full simulation duration. - @return an error code. - - This function is used in a loop with ::EN_runH to run an extended period hydraulic - simulation. - - The value of tstep should be treated as a read-only variable. It is automatically - computed as the smaller of: - - the time interval until the next hydraulic time step begins - - the time interval until the next reporting time step begins - - the time interval until the next change in demands occurs - - the time interval until a tank becomes full or empty - - the time interval until a control or rule fires. - - Example: - \code {.c} - long t, tstep; - EN_openH(ph); - EN_initH(ph, EN_NOSAVE); - do { - EN_runH(ph, &t); - // Retrieve hydraulic results for time t - EN_nextH(ph, &tstep); - } while (tstep > 0); - EN_closeH(ph); - \endcode - */ - int DLLEXPORT EN_nextH(EN_Project ph, long *tStep); - - /** - @brief Transfers a project's hydraulics results from its temporary hydraulics file - to its binary output file, where results are only reported at uniform reporting intervals. - @param ph an EPANET project handle. - @return an error code. - - ::EN_saveH is used when only a hydraulic analysis is run and results at uniform reporting - intervals need to be transferred to a project's binary output file. Such would be the case - when results are to be written in formatted fashion to the project's report file using ::EN_report. - */ - int DLLEXPORT EN_saveH(EN_Project ph); - - /** - @brief Saves a project's temporary hydraulics file to disk. - @param ph an EPANET project handle. - @param filename the name of the file to be created. - @return an error code. - - Use this function to save the current set of hydraulics results to a file, either for - post-processing or to be used at a later time by calling the ::EN_usehydfile function. - - The hydraulics file contains nodal demands and heads and link flows, status, and settings - for all hydraulic time steps, even intermediate ones. - - Before calling this function hydraulic results must have been generated and saved by having - called ::EN_solveH or the ::EN_initH - ::EN_runH - ::EN_nextH sequence with the initflag - argument of ::EN_initH set to `EN_SAVE` or `EN_SAVE_AND_INIT`. - */ - int DLLEXPORT EN_savehydfile(EN_Project ph, char *filename); - - /** - @brief Closes the hydraulic solver freeing all of its allocated memory. - @return an error code. - - Call ::EN_closeH after all hydraulics analyses have been made using - ::EN_initH - ::EN_runH - ::EN_nextH. Do not call this function if ::EN_solveH is being used. - */ - int DLLEXPORT EN_closeH(EN_Project ph); - - /******************************************************************** - - Water Quality Analysis Functions - - ********************************************************************/ - - /** - @brief Runs a complete water quality simulation with results at uniform - reporting intervals written to the project's binary output file. - @param ph an EPANET project handle. - @return an error code. - - A hydraulic analysis must have been run and saved to a hydraulics file before - calling ::EN_solveQ. This function will not allow one to examine intermediate water - quality results as they are generated. It can be followed by a call to ::EN_report - to write all hydraulic and water quality results to a formatted report file. - - One can instead use the ::EN_openQ - ::EN_initQ - ::EN_runQ - ::EN_nextQ - ::EN_closeQ - sequence to gain access to gain access to water quality results at intermediate time - periods. - - Example: see ::EN_solveH. - */ - int DLLEXPORT EN_solveQ(EN_Project ph); - - /** - @brief Opens a project's water quality solver. - @param ph n EPANET project handle. - @return an error code. - - Call ::EN_openQ prior to running the first water quality analysis using an - ::EN_initQ - ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) sequence. Multiple water - quality analyses can be made before calling ::EN_closeQ to close the water - quality solver. - - Do not call this function if a complete water quality analysis will be made - using ::EN_solveQ. - */ - int DLLEXPORT EN_openQ(EN_Project ph); - - /** - @brief Initializes a network prior to running a water quality analysis. - @param ph n EPANET project handle. - @param saveFlag set to `EN_SAVE` (1) if results are to be saved to the project's - binary output file, or to `EN_NOSAVE` (0) if not. - @return an error code. - - Call ::EN_initQ prior to running a water quality analysis using ::EN_runQ in - conjunction with either ::EN_nextQ or ::EN_stepQ. - - ::EN_openQ must have been called prior to calling EN_initQ. - - Do not call ::EN_initQ if a complete water quality analysis will be made using ::EN_solveQ. - */ - int DLLEXPORT EN_initQ(EN_Project ph, int saveFlag); - - /** - @brief Makes hydraulic and water quality results at the start of the current time - period available to a project's water quality solver. - @param ph an EPANET project handle. - @param[out] currentTime current simulation time in seconds. - @return an error code. - - Use ::EN_runQ along with ::EN_nextQ in a loop to access water quality results at the - start of each hydraulic period in an extended period simulation. Or use it in a loop - with ::EN_stepQ to access results at the start of each water quality time step. See - each of these functions for examples of how to code such loops. - - ::EN_initQ must have been called prior to running an ::EN_runQ - ::EN_nextQ - (or ::EN_stepQ) loop. - - The current time of the simulation is determined from information saved with the - hydraulic analysis that preceded the water quality analysis. Treat it as a read-only - variable. - */ - int DLLEXPORT EN_runQ(EN_Project ph, long *currentTime); - - /** - @brief Advances a water quality simulation over the time until the next hydraulic event. - @param ph an EPANET project handle. - @param[out] tStep time (in seconds) until the next hydraulic event or 0 if at the end - of the full simulation duration. - @return an error code. - - This function is used in a loop with ::EN_runQ to perform an extended period water - quality analysis. It reacts and routes a project's water quality constituent over a - time step determined by when the next hydraulic event occurs. Use ::EN_stepQ instead - if you wish to generate results over each water quality time step. - - The value of `tStep` is determined from information produced by the hydraulic analysis - that preceded the water quality analysis. Treat it as a read-only variable. - - Example: - \code {.c} - long t, tStep; - EN_solveH(ph); // Generate & save hydraulics - EN_openQ(ph); - EN_initQ(ph, EN_NOSAVE); - do { - EN_runQ(ph, &t); - // Monitor results at time t, which - // begins a new hydraulic time period - EN_nextQ(ph, &tStep); - } while (tStep > 0); - EN_closeQ(ph); - \endcode - */ - int DLLEXPORT EN_nextQ(EN_Project ph, long *tStep); - - /** - @brief Advances a water quality simulation by a single water quality time step. - @param ph an EPANET project handle. - @param[out] timeLeft time left (in seconds) to the overall simulation duration. - @return an error code. - - This function is used in a loop with ::EN_runQ to perform an extended period water - quality simulation. It allows one to generate water quality results at each water - quality time step of the simulation, rather than over each hydraulic event period - as with ::EN_nextQ. - - Use the argument `timeLeft` to determine when no more calls to ::EN_runQ are needed - because the end of the simulation period has been reached (i.e., when `timeLeft = 0`). - */ - int DLLEXPORT EN_stepQ(EN_Project ph, long *timeLeft); - - /** - @brief Closes the water quality solver, freeing all of its allocated memory. - @param ph an EPANET project handle. - @return an error code. - - Call ::EN_closeQ after all water quality analyses have been made using the - ::EN_initQ - ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) sequence of function calls. - - Do not call this function if ::EN_solveQ is being used. - */ - int DLLEXPORT EN_closeQ(EN_Project ph); - - /******************************************************************** - - Reporting Functions - - ********************************************************************/ - - /** - @brief Writes a line of text to a project's report file. - @param ph an EPANET project handle. - @param line a text string to write. - @return an error code. - */ - int DLLEXPORT EN_writeline(EN_Project ph, char *line); - - /** - @brief Writes simulation results in a tabular format to a project's report file. - @param ph an EPANET project handle. - @return an error code - - Either a full hydraulic analysis or full hydraulic and water quality analysis must - have been run, with results saved to file, before ::EN_report is called. In the - former case, ::EN_saveH must also be called first to transfer results from the - project's intermediate hydraulics file to its output file. - - The format of the report is controlled by commands issued with ::EN_setreport. - */ - int DLLEXPORT EN_report(EN_Project ph); - - /** - @brief Resets a project's report options to their default values. - @param ph an EPANET project handle. - @return an error code - - After calling this function the default reporting options are in effect. These are: - - no status report - - no energy report - - no nodes reported on - - no links reported on - - node variables reported to 2 decimal places - - link variables reported to 2 decimal places (3 for friction factor) - - node variables reported are elevation, head, pressure, and quality - - link variables reported are flow, velocity, and head loss. - */ - int DLLEXPORT EN_resetreport(EN_Project ph); - - /** - @brief Processes a reporting format command. - @param ph an EPANET project handle. - @param format a report formatting command. - @return an error code - - Acceptable report formatting commands are described in Appendix C of the - EPANET 2 Users Manual. - - Formatted results of a simulation can be written to a project's report file - using the ::EN_report function. - */ - int DLLEXPORT EN_setreport(EN_Project ph, char *format); - - /** - @brief Sets the level of hydraulic status reporting. - @param ph an EPANET project handle. - @param level a status reporting level code (see @ref EN_StatusReport). - @return an error code. - - Status reporting writes changes in the hydraulics status of network elements to a - project's report file as a hydraulic simulation unfolds. There are three levels - of reporting: `EN_NO_REPORT` (no status reporting), `EN_NORMAL_REPORT` (normal - reporting) `EN_FULL_REPORT` (full status reporting). - - The full status report contains information at each trial of the solution to the - system hydraulic equations at each time step of a simulation. It is useful mainly - for debugging purposes. - - If many hydraulic analyses will be run in the application it is recommended that - status reporting be turned off (`level = EN_NO_REPORT`). - */ - int DLLEXPORT EN_setstatusreport(EN_Project ph, int level); - - /** - @brief Retrieves the toolkit API version number. - @param[out] version the version of the OWA-EPANET toolkit. - @return an error code. - - The version number is to be interpreted with implied decimals, i.e., - "20100" == "2(.)01(.)00" - */ - int DLLEXPORT EN_getversion(int *version); - - /** - @brief Retrieves the number of objects of a given type in a project. - @param ph an EPANET project handle. - @param object a type of object to count (see @ref EN_CountType) - @param[out] count number of objects of the specified type - @return an error code - */ - int DLLEXPORT EN_getcount(EN_Project ph, int object, int *count); - - /** - @brief Returns the text of an error message generated by an error code. - @param errcode an error code. - @param[out] errmsg the error message generated by the error code - @param maxLen maximum number of characters that errmsg can hold - @return an error code - - Error message strings should be at least @ref EN_MAXMSG characters in length. - */ - int DLLEXPORT EN_geterror(int errcode, char *errmsg, int maxLen); - - /** - @brief Retrieves a particular simulation statistic. - @param ph an EPANET project handle. - @param type the type of statistic to retrieve (see @ref EN_AnalysisStatistic). - @param[out] value the value of the statistic. - @return an error code - */ - int DLLEXPORT EN_getstatistic(EN_Project ph, int type, double* value); - - /******************************************************************** - - Analysis Options Functions - - ********************************************************************/ - - /** - @brief Retrieves the value of an analysis option. - @param ph an EPANET project handle. - @param option a type of analysis option (see @ref EN_Option). - @param[out] value the current value of the option. - @return an error code - */ - int DLLEXPORT EN_getoption(EN_Project ph, int option, double *value); - - /** - @brief Sets the value for an anlysis option. - @param ph an EPANET project handle. - @param option a type of analysis option (see @ref EN_Option). - @param value the new value assigned to the option. - @return an error code. - @see EN_Option - */ - int DLLEXPORT EN_setoption(EN_Project ph, int option, double value); - - /** - @brief Retrieves a project's flow units. - @param ph an EPANET project handle. - @param[out] units a flow units code (see @ref EN_FlowUnits) - @return an error code. - - Flow units in liters or cubic meters implies that SI metric units are used for all - other quantities in addition to flow. Otherwise US Customary units are employed. - */ - int DLLEXPORT EN_getflowunits(EN_Project ph, int *units); - - /** - @brief Sets a project's flow units. - @param ph an EPANET project handle. - @param units a flow units code (see @ref EN_FlowUnits) - @return an error code. - - Flow units in liters or cubic meters implies that SI metric units are used for all - other quantities in addition to flow. Otherwise US Customary units are employed. - */ - int DLLEXPORT EN_setflowunits(EN_Project ph, int units); - - /** - @brief Retrieves the value of a time parameter. - @param ph an EPANET project handle. - @param param a time parameter code (see @ref EN_TimeParameter). - @param[out] value the current value of the time parameter (in seconds). - @return an error code. - */ - int DLLEXPORT EN_gettimeparam(EN_Project ph, int param, long *value); - - /** - @brief Sets the value of a time parameter. - @param ph an EPANET project handle. - @param param a time parameter code (see @ref EN_TimeParameter). - @param value the new value of the time parameter (in seconds) - @return an error code. - */ - int DLLEXPORT EN_settimeparam(EN_Project ph, int param, long value); - - /** - @brief Gets information about the type of water quality analysis requested. - @param ph an EPANET project handle. - @param[out] qualType type of analysis to run (see @ref EN_QualityType). - @param[out] chemName name of chemical constituent. - @param[out] chemUnits concentration units of the constituent. - @param[out] traceNode index of the node being traced (if applicable). - @return an error code. - */ - int DLLEXPORT EN_getqualinfo(EN_Project ph, int *qualType, char *chemName, - char *chemUnits, int *traceNode); - - /** - @brief Retrieves the type of water quality analysis to be run. - @param ph an EPANET project handle. - @param[out] qualType the type of analysis to run (see @ref EN_QualityType). - @param[out] traceNode the index of node being traced, if `qualType = EN_TRACE`. - @return an error code. - */ - int DLLEXPORT EN_getqualtype(EN_Project ph, int *qualType, int *traceNode); - - /** - @brief Sets the type of water quality analysis to run. - @param ph an EPANET project handle. - @param qualType the type of analysis to run (see @ref EN_QualityType). - @param chemName the name of the quality constituent. - @param chemUnits the concentration units of the constituent. - @param traceNode the ID name of the node being traced if `qualType = EN_TRACE`. - @return an error code. - - Chemical name and units can be an empty string if the analysis is not for a chemical. - The same holds for the trace node if the analysis is not for source tracing. - - Note that the trace node is specified by ID name and not by index. - */ - int DLLEXPORT EN_setqualtype(EN_Project ph, int qualType, char *chemName, - char *chemUnits, char *traceNode); - - /******************************************************************** - - Node Functions - - ********************************************************************/ - - /** - @brief Adds a new node to a project. - @param ph an EPANET project handle. - @param id the ID name of the node to be added. - @param nodeType the type of node being added (see @ref EN_NodeType) - @return an error code. - - When a new node is created all of it's properties (see @ref EN_NodeProperty) are set to 0. - */ - int DLLEXPORT EN_addnode(EN_Project ph, char *id, int nodeType); - - /** - @brief Deletes a node from a project. - @param ph an EPANET project handle. - @param index the index of the node to be deleted. - @param actionCode the action taken if any control contains the node and its links. - @return an error code. - - If `actionCode` is `EN_UNCONDITIONAL` then the node, its incident links and all - simple and rule-based controls that contain them are deleted. If set to - `EN_CONDITIONAL` then the node is not deleted if it or its incident links appear - in any controls and error code 261 is returned. - - */ - int DLLEXPORT EN_deletenode(EN_Project ph, int index, int actionCode); - - /** - @brief Gets the index of a node given its ID name. - @param ph an EPANET project handle. - @param id a node ID name. - @param[out] index the node's index (starting from 1). - @return an error code - */ - int DLLEXPORT EN_getnodeindex(EN_Project ph, char *id, int *index); - - /** - @brief Gets the ID name of a node given its index. - @param ph an EPANET project handle. - @param index a node's index (starting from 1). - @param[out] id the node's ID name. - @return an error code - - The ID name must be sized to hold at least @ref EN_MAXID characters. - */ - int DLLEXPORT EN_getnodeid(EN_Project ph, int index, char *id); - - /** - @brief Changes the ID name of a node. - @param ph an EPANET project handle. - @param index a node's index (starting from 1). - @param newid the new ID name for the node. - @return an error code. - - The ID name must not be longer than @ref EN_MAXID characters. - */ - int DLLEXPORT EN_setnodeid(EN_Project ph, int index, char *newid); - - /** - @brief Retrieves a node's type given its index. - @param ph an EPANET project handle. - @param index a node's index (starting from 1). - @param[out] nodeType the node's type (see @ref EN_NodeType). - @return an error code. - */ - int DLLEXPORT EN_getnodetype(EN_Project ph, int index, int *nodeType); - - /** - @brief Retrieves a property value for a node. - @param ph an EPANET project handle. - @param index a node's index. - @param property the property to retrieve (see @ref EN_NodeProperty). - @param[out] value the current value of the property. - @return an error code. - - Values are returned in units that depend on the units used for flow rate - (see @ref Units). - */ - int DLLEXPORT EN_getnodevalue(EN_Project ph, int index, int property, double *value); - - /** - @brief Sets a property value for a node. - @param ph an EPANET project handle. - @param index a node's index (starting from 1). - @param property the property to set (see @ref EN_NodeProperty). - @param value the new value for the property. - @return an error code. - - Values are in units that depend on the units used for flow rate (see @ref Units). - */ - int DLLEXPORT EN_setnodevalue(EN_Project ph, int index, int property, double value); - - /** - @brief Sets a group of properties for a junction node. - @param ph an EPANET project handle. - @param index a junction node's index (starting from 1). - @param elev the value of the junction's elevation. - @param dmnd the value of the junction's primary base demand. - @param dmndpat the ID name of the demand's time pattern ("" for no pattern) - @return an error code. - - These properties have units that depend on the units used for flow rate (see @ref Units). - */ - int DLLEXPORT EN_setjuncdata(EN_Project ph, int index, double elev, double dmnd, - char *dmndpat); - - /** - @brief Sets a group of properties for a tank node. - @param ph an EPANET project handle. - @param index a tank node's index (starting from 1). - @param elev the tank's bottom elevation. - @param initlvl the initial water level in the tank. - @param minlvl the minimum water level for the tank. - @param maxlvl the maximum water level for the tank. - @param diam the tank's diameter (0 if a volume curve is supplied). - @param minvol the volume of the tank at its minimum water level. - @param volcurve the name of the tank's volume curve ("" for no curve) - @return an error code. - - These properties have units that depend on the units used for flow rate (see @ref Units). - */ - int DLLEXPORT EN_settankdata(EN_Project ph, int index, double elev, double initlvl, - double minlvl, double maxlvl, double diam, double minvol, char *volcurve); - - /** - @brief Gets the (x,y) coordinates of a node. - @param ph an EPANET project handle. - @param index a node index (starting from 1). - @param[out] x the node's X-coordinate value. - @param[out] y the node's Y-coordinate value. - @return an error code. - */ - int DLLEXPORT EN_getcoord(EN_Project ph, int index, double *x, double *y); - - /** - @brief Sets the (x,y) coordinates of a node. - @param ph an EPANET project handle. - @param index a node index (starting from 1). - @param x the node's X-coordinate value. - @param y the node's Y-coordinate value. - @return an error code. - */ - int DLLEXPORT EN_setcoord(EN_Project ph, int index, double x, double y); - - /******************************************************************** - - Nodal Demand Functions - - ********************************************************************/ - - /** - @brief Retrieves the type of demand model in use and its parameters. - @param ph an EPANET project handle. - @param[out] type Type of demand model (see @ref EN_DemandModel). - @param[out] pmin Pressure below which there is no demand. - @param[out] preq Pressure required to deliver full demand. - @param[out] pexp Pressure exponent in demand function. - @return an error code. - - Parameters `pmin`, `preq`, and `pexp` are only used when the demand model is `EN_PDA`. - */ - int DLLEXPORT EN_getdemandmodel(EN_Project ph, int *type, double *pmin, - double *preq, double *pexp); - - /** - @brief Sets the type of demand model to use and its parameters. - @param ph an EPANET project handle. - @param type Type of demand model (see @ref EN_DemandModel). - @param pmin Pressure below which there is no demand. - @param preq Pressure required to deliver full demand. - @param pexp Pressure exponent in demand function. - @return an error code. - - Set `type` to `EN_DDA` for a traditional demand driven analysis (in which case the - remaining three parameter values are ignored) or to `EN_PDA` for a pressure driven - analysis. In the latter case a node's demand is computed as: - > `Dfull * [ (P - pmin) / (preq - pmin) ] ^ pexp` - where `Dfull` is the full demand and `P` is the current pressure. - - Setting `preq` equal to `pmin` will result in a solution with the smallest amount of - demand reductions needed to insure that no node delivers positive demand at a pressure - below `pmin`. - */ - int DLLEXPORT EN_setdemandmodel(EN_Project ph, int type, double pmin, - double preq, double pexp); - - /** - @brief Retrieves the number of demand categories for a junction node. - @param ph an EPANET project handle. - @param nodeIndex the index of a node (starting from 1). - @param[out] numDemands the number of demand categories assigned to the node. - @return an error code. - */ - int DLLEXPORT EN_getnumdemands(EN_Project ph, int nodeIndex, int *numDemands); - - /** - @brief Gets the base demand for one of a node's demand categories. - @param ph an EPANET project handle. - @param nodeIndex a node's index (starting from 1). - @param demandIndex the index of a demand category for the node (starting from 1). - @param[out] baseDemand the category's base demand. - @return an error code. - */ - int DLLEXPORT EN_getbasedemand(EN_Project ph, int nodeIndex, int demandIndex, - double *baseDemand); - - /** - @brief Sets the base demand for one of a node's demand categories. - @param ph an EPANET project handle. - @param nodeIndex a node's index (starting from 1). - @param demandIndex the index of a demand category for the node (starting from 1). - @param baseDemand the new base demand for the category. - @return an error code. - */ - int DLLEXPORT EN_setbasedemand(EN_Project ph, int nodeIndex, int demandIndex, - double baseDemand); - - /** - @brief Retrieves the index of a time pattern assigned to one of a node's demand categories. - @param ph an EPANET project handle. - @param nodeIndex the node's index (starting from 1). - @param demandIndex the index of a demand category for the node (starting from 1). - @param[out] patIndex the index of the category's time pattern. - @return an error code. - - A returned pattern index of 0 indicates that no time pattern has been assigned to the - demand category. - */ - int DLLEXPORT EN_getdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, - int *patIndex); - - /** - @brief Sets the index of a time pattern used for one of a node's demand categories. - @param ph an EPANET project handle. - @param nodeIndex a node's index (starting from 1). - @param demandIndex the index of one of the node's demand categories (starting from 1). - @param patIndex the index of the time pattern assigned to the category. - @return an error code. - - Specifying a pattern index of 0 indicates that no time pattern is assigned to the - demand category. - */ - int DLLEXPORT EN_setdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, int patIndex); - - /** - @brief Retrieves the name of a node's demand category. - @param ph an EPANET project handle. - @param nodeIndex a node's index (starting from 1). - @param demandIndex the index of one of the node's demand categories (starting from 1). - @param[out] demandName The name of the selected category. - @return an error code. - - `demandName` must be sized to contain at least @ref EN_MAXID characters. - */ - int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIndex, char *demandName); - - /** - @brief Assigns a name to a node's demand category. - @param ph an EPANET project handle. - @param nodeIndex a node's index (starting from 1). - @param demandIdx the index of one of the node's demand categories (starting from 1). - @param demandName the new name assigned to the category. - @return Error code. - - The category name must contain no more than @ref EN_MAXID characters. - */ - int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, char *demandName); - - /******************************************************************** - - Link Functions - - ********************************************************************/ - - /** - @brief Adds a new link to a project. - @param ph an EPANET project handle. - @param id the ID name of the link to be added. - @param linkType The type of link being added (see @ref EN_LinkType) - @param fromNode The ID name of the link's starting node. - @param toNode The ID name of the link's ending node. - @return an error code. - - A new pipe is assigned a diameter of 10 inches (or 254 mm), a length of 100 - feet (or meters), a roughness coefficient of 100 and 0 for all other properties. - - A new pump has a status of `EN_OPEN`, a speed setting of 1, and has no pump - curve or power rating assigned to it. - - A new valve has a diameter of 10 inches (or 254 mm) and all other properties set to 0. - - See @ref EN_LinkProperty. - */ - int DLLEXPORT EN_addlink(EN_Project ph, char *id, int linkType, char *fromNode, char *toNode); - - /** - @brief Deletes a link from the project. - @param ph an EPANET project handle. - @param index the index of the link to be deleted. - @param actionCode The action taken if any control contains the link. - @return an error code. - - If `actionCode` is `EN_UNCONDITIONAL` then the link and all simple and rule-based - controls that contain it are deleted. If set to `EN_CONDITIONAL` then the link - is not deleted if it appears in any control and error 261 is returned. - */ - int DLLEXPORT EN_deletelink(EN_Project ph, int index, int actionCode); - - /** - @brief Gets the index of a link given its ID name. - @param ph an EPANET project handle. - @param id a link's ID name. - @param[out] index the link's index (starting from 1). - @return an error code. - */ - int DLLEXPORT EN_getlinkindex(EN_Project ph, char *id, int *index); - - /** - @brief Gets the ID name of a link given its index. - @param ph an EPANET project handle. - @param index a link's index (starting from 1). - @param[out] id The link's ID name. - @return an error code. - - The ID name must be sized to hold at least @ref EN_MAXID characters. - */ - int DLLEXPORT EN_getlinkid(EN_Project ph, int index, char *id); - - /** - @brief Changes the ID name of a link. - @param ph an EPANET project handle. - @param index a link's index (starting from 1). - @param newid the new ID name for the link. - @return Error code. - - The ID name must not be longer than @ref EN_MAXID characters. - */ - int DLLEXPORT EN_setlinkid(EN_Project ph, int index, char *newid); - - /** - @brief Retrieves a link's type. - @param ph an EPANET project handle. - @param index a link's index (starting from 1). - @param[out] linkType the link's type (see @ref EN_LinkType). - @return an error code. - */ - int DLLEXPORT EN_getlinktype(EN_Project ph, int index, int *linkType); - - /** - @brief Changes a link's type. - @param ph an EPANET project handle. - @param[in,out] index the link's index before [in] and after [out] the type change. - @param linkType the new type to change the link to (see @ref EN_LinkType). - @param actionCode the action taken if any controls contain the link. - @return an error code. - - If `actionCode` is `EN_UNCONDITIONAL` then all simple and rule-based controls that - contain the link are deleted when the link's type is changed. If set to - `EN_CONDITIONAL` then the type change is cancelled if the link appears in any - control and error 261 is returned. - */ - int DLLEXPORT EN_setlinktype(EN_Project ph, int *index, int linkType, int actionCode); - - /** - @brief Gets the indexes of a link's start- and end-nodes. - @param ph an EPANET project handle. - @param index a link's index (starting from 1). - @param[out] node1 the index of the link's start node (starting from 1). - @param[out] node2 the index of the link's end node (starting from 1). - @return an error code. - */ - int DLLEXPORT EN_getlinknodes(EN_Project ph, int index, int *node1, int *node2); - - /** - @brief Sets the indexes of a link's start- and end-nodes. - @param ph an EPANET project handle. - @param index a link's index (starting from 1). - @param node1 The index of the link's start node (starting from 1). - @param node2 The index of the link's end node (starting from 1). - @return an error code. - */ - int DLLEXPORT EN_setlinknodes(EN_Project ph, int index, int node1, int node2); - - /** - @brief Retrieves a property value for a link. - @param ph an EPANET project handle. - @param index a link's index (starting from 1). - @param property the property to retrieve (see @ref EN_LinkProperty). - @param[out] value the current value of the property. - @return an error code. - - Values are returned in units that depend on the units used for flow rate (see @ref Units). - */ - int DLLEXPORT EN_getlinkvalue(EN_Project ph, int index, int property, double *value); - - /** - @brief Sets a property value for a link. - @param ph an EPANET project handle. - @param index a link's index. - @param property the property to set (see @ref EN_LinkProperty). - @param value the new value for the property. - @return an error code. - - Values are in units that depend on the units used for flow rate (see @ref Units). - */ - int DLLEXPORT EN_setlinkvalue(EN_Project ph, int index, int property, double value); - - /** - @brief Sets a group of properties for a pipe link. - @param ph an EPANET project handle. - @param index the index of a pipe link (starting from 1). - @param length the pipe's length. - @param diam the pipe's diameter. - @param rough the pipe's roughness coefficient. - @param mloss the pipe's minor loss coefficient. - @return an error code. - - These properties have units that depend on the units used for flow rate (see @ref Units). - */ - int DLLEXPORT EN_setpipedata(EN_Project ph, int index, double length, double diam, - double rough, double mloss); - - - /******************************************************************** - - Pump Functions - - ********************************************************************/ - - /** - @brief Retrieves the type of head curve used by a pump. - @param ph an EPANET project handle. - @param linkIndex the index of a pump link (starting from 1). - @param[out] pumpType the type of head curve used by the pump (see @ref EN_PumpType). - @return an error code. - */ - int DLLEXPORT EN_getpumptype(EN_Project ph, int linkIndex, int *pumpType); - - /** - @brief Retrieves the curve assigned to a pump's head curve. - @param ph an EPANET project handle. - @param linkIndex the index of a pump link (starting from 1). - @param[out] curveIndex the index of the curve assigned to the pump's head curve. - @return an error code. - */ - int DLLEXPORT EN_getheadcurveindex(EN_Project ph, int linkIndex, int *curveIndex); - - /** - @brief Assigns a curve to a pump's head curve. - @param ph an EPANET project handle. - @param linkIndex the index of a pump link (starting from 1). - @param curveIndex the index of a curve to be assigned as the pump's head curve. - @return an error code. - */ - int DLLEXPORT EN_setheadcurveindex(EN_Project ph, int linkIndex, int curveIndex); - - /******************************************************************** - - Time Pattern Functions - - ********************************************************************/ - - /** - @brief Adds a new time pattern to a project. - @param ph an EPANET project handle. - @param id the ID name of the pattern to add. - @return an error code. - - The new pattern contains a single time period whose factor is 1.0. - */ - int DLLEXPORT EN_addpattern(EN_Project ph, char *id); - - /** - @brief Retrieves the index of a time pattern given its ID name. - @param ph an EPANET project handle. - @param id the ID name of a time pattern. - @param[out] index the time pattern's index (starting from 1). - @return an error code. - */ - int DLLEXPORT EN_getpatternindex(EN_Project ph, char *id, int *index); - - /** - @brief Retrieves the ID name of a time pattern given its index. - @param ph an EPANET project handle. - @param index a time pattern index (starting from 1). - @param[out] id the time pattern's ID name. - @return an error code. - - The ID name must be sized to hold at least @ref EN_MAXID characters. - */ - int DLLEXPORT EN_getpatternid(EN_Project ph, int index, char *id); - - /** - @brief Retrieves the number of time periods in a time pattern. - @param ph an EPANET project handle. - @param index a time pattern index (starting from 1). - @param[out] len the number of time periods in the pattern. - @return an error code. - */ - int DLLEXPORT EN_getpatternlen(EN_Project ph, int index, int *len); - - /** - @brief Retrieves a time pattern's factor for a given time period. - @param ph an EPANET project handle. - @param index a time pattern index (starting from 1). - @param period a time period in the pattern (starting from 1). - @param[out] value the pattern factor for the given time period. - @return an error code. - */ - int DLLEXPORT EN_getpatternvalue(EN_Project ph, int index, int period, double *value); - - /** - @brief Sets a time pattern's factor for a given time period. - @param ph an EPANET project handle. - @param index a time pattern index (starting from 1). - @param period a time period in the pattern (starting from 1). - @param value the new value of the pattern factor for the given time period. - @return an error code. - */ - int DLLEXPORT EN_setpatternvalue(EN_Project ph, int index, int period, double value); - - /** - @brief Retrieves the average of all pattern factors in a time pattern. - @param ph an EPANET project handle. - @param index a time pattern index (starting from 1). - @param[out] value The average of all of the time pattern's factors. - @return an error code. - */ - int DLLEXPORT EN_getaveragepatternvalue(EN_Project ph, int index, double *value); - - /** - @brief Sets the pattern factors for a given time pattern. - @param ph an EPANET project handle. - @param index a time pattern index (starting from 1). - @param values an array of new pattern factor values. - @param len the number of factor values supplied. - @return an error code. - - `values` is a zero-based array that contains `len` elements. - - Use this function to redefine (and resize) a time pattern all at once; - 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); - - /******************************************************************** - - Data Curve Functions - - ********************************************************************/ - - /** - @brief Adds a new data curve to a project. - @param ph an EPANET project handle. - @param id The ID name of the curve to be added. - @return an error code. - - The new curve contains a single data point (1.0, 1.0). - */ - int DLLEXPORT EN_addcurve(EN_Project ph, char *id); - - /** - @brief Retrieves the index of a curve given its ID name. - @param ph an EPANET project handle. - @param id the ID name of a curve. - @param[out] index The curve's index (starting from 1). - @return an error code. - */ - int DLLEXPORT EN_getcurveindex(EN_Project ph, char *id, int *index); - - /** - @brief Retrieves the ID name of a curve given its index. - @param ph an EPANET project handle. - @param index a curve's index (starting from 1). - @param[out] id the curve's ID name. - @return an error code. - - The ID name must be sized to hold at least @ref EN_MAXID characters. - */ - int DLLEXPORT EN_getcurveid(EN_Project ph, int index, char *id); - - /** - @brief Retrieves the number of points in a curve. - @param ph an EPANET project handle. - @param index a curve's index (starting from 1). - @param[out] len The number of data points assigned to the curve. - @return an error code. - */ - int DLLEXPORT EN_getcurvelen(EN_Project ph, int index, int *len); - - /** - @brief Retrieves a curve's type. - @param ph an EPANET project handle. - @param index a curve's index (starting from 1). - @param[out] type the curve's type (see @ref EN_CurveType). - @return an error code. - */ - int DLLEXPORT EN_getcurvetype(EN_Project ph, int index, int *type); - - /** - @brief Retrieves the value of a single data point for a curve. - @param ph an EPANET project handle. - @param curveIndex a curve's index (starting from 1). - @param pointIndex the index of a point on the curve (starting from 1). - @param[out] x the point's x-value. - @param[out] y the point's y-value. - @return an error code. - */ - int DLLEXPORT EN_getcurvevalue(EN_Project ph, int curveIndex, int pointIndex, - double *x, double *y); - - /** - @brief Sets the value of a single data point for a curve. - @param ph an EPANET project handle. - @param curveIndex a curve's index (starting from 1). - @param pointIndex the index of a point on the curve (starting from 1). - @param x the point's new x-value. - @param y the point's new y-value. - @return an error code. - */ - int DLLEXPORT EN_setcurvevalue(EN_Project ph, int curveIndex, int pointIndex, - double x, double y); - - /** - @brief Retrieves all of a curve's data. - @param ph an EPANET project handle. - @param index a curve's index (starting from 1). - @param[out] id the curve's ID name. - @param[out] nPoints the number of data points on the curve. - @param[out] xValues the curve's x-values. - @param[out] yValues the curve's y-values. - @return an error code. - - The calling program is responsible for making `xValues` and `yValues` large enough - to hold `nPoints` number of data points and for sizing `id` to hold at least - @ref EN_MAXID characters. - */ - int DLLEXPORT EN_getcurve(EN_Project ph, int index, char* id, int *nPoints, - double **xValues, double **yValues); - - /** - @brief assigns a set of data points to a curve. - @param ph an EPANET project handle. - @param index a curve's index (starting from 1). - @param xValues an array of new x-values for the curve. - @param yValues an array of new y-values for the curve. - @param nPoints the new number of data points for the curve. - @return an error code. - - `xValues` and `yValues` are zero-based arrays that contains `nPoints` elements. - - Use this function to redefine (and resize) a curve all at once; - use @ref EN_setcurvevalue to revise a curve's data points one at a time. - */ - int DLLEXPORT EN_setcurve(EN_Project ph, int index, double *xValues, - double *yValues, int nPoints); - - /******************************************************************** - - Simple Controls Functions - - ********************************************************************/ - - /** - @brief Adds a new simple control to a project. - @param ph an EPANET project handle. - @param type the type of control to add (see @ref EN_ControlType). - @param linkIndex the index of a link to control (starting from 1). - @param setting control setting applied to the link. - @param nodeIndex index of the node used to control the link - (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). - @param level action level (tank level, junction pressure, or time in seconds) - that triggers the control. - @param[out] index index of the new control. - @return an error code. - */ - int DLLEXPORT EN_addcontrol(EN_Project ph, int type, int linkIndex, - double setting, int nodeIndex, double level, int *index); - - /** - @brief Deletes an existing simple control. - @param ph an EPANET project handle. - @param index the index of the control to delete (starting from 1). - @return an error code. - */ - int DLLEXPORT EN_deletecontrol(EN_Project ph, int index); - - /** - @brief Retrieves the properties of a simple control. - @param ph an EPANET project handle. - @param index the control's index (starting from 1). - @param[out] type the type of control (see @ref EN_ControlType). - @param[out] linkIndex the index of the link being controlled. - @param[out] setting the control setting applied to the link. - @param[out] nodeIndex the index of the node used to trigger the control - (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). - @param[out] level the action level (tank level, junction pressure, or time in seconds) - that triggers the control. - @return an error code. - */ - int DLLEXPORT EN_getcontrol(EN_Project ph, int index, int *type, int *linkIndex, - double *setting, int *nodeIndex, double *level); - - /** - @brief Sets the properties of an existing simple control. - @param ph an EPANET project handle. - @param index the control's index (starting from 1). - @param type the type of control (see @ref EN_ControlType). - @param linkIndex the index of the link being controlled. - @param setting the control setting applied to the link. - @param nodeIndex the index of the node used to trigger the control - (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). - @param level the action level (tank level, junction pressure, or time in seconds) - that triggers the control. - @return an error code. - */ - int DLLEXPORT EN_setcontrol(EN_Project ph, int index, int type, int linkIndex, - double setting, int nodeIndex, double level); - - - /******************************************************************** - - Rule-Based Controls Functions - - ********************************************************************/ - - /** - @brief Adds a new rule-based control to a project. - @param ph an EPANET project handle. - @param rule text of the rule following the format used in an EPANET input file. - @return an error code. - - Consult Appendix C of the EPANET 2 Users Manual - to learn about a rule's format. Each clause of the rule must end with a newline character `\n`. - */ - int DLLEXPORT EN_addrule(EN_Project ph, char *rule); - - /** - @brief Deletes an existing rule-based control. - @param ph an EPANET project handle. - @param index the index of the rule to be deleted (starting from 1). - @return an error code. - */ - int DLLEXPORT EN_deleterule(EN_Project ph, int index); - - /** - @brief Retrieves summary information about a rule-based control. - @param ph an EPANET project handle. - @param index the rule's index (starting from 1). - @param[out] nPremises number of premises in the rule's IF section. - @param[out] nThenActions number of actions in the rule's THEN section. - @param[out] nElseActions number of actions in the rule's ELSE section. - @param[out] priority the rule's priority value. - @return an error code. - */ - int DLLEXPORT EN_getrule(EN_Project ph, int index, int *nPremises, - int *nThenActions, int *nElseActions, double *priority); - - /** - @brief Gets the ID name of a rule-based control given its index. - @param ph an EPANET project handle. - @param index the rule's index (starting from 1). - @param[out] id the rule's ID name. - @return Error code. - - The ID name must be sized to hold at least @ref EN_MAXID characters. - */ - int DLLEXPORT EN_getruleID(EN_Project ph, int index, char* id); - - /** - @brief Gets the properties of a premise in a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param premiseIndex the position of the premise in the rule's list of premises - (starting from 1). - @param[out] logop the premise's logical operator (`IF` = 1, `AND` = 2, `OR` = 3). - @param[out] object the type of object the premise refers to (see @ref EN_RuleObject). - @param[out] objIndex the index of the object (e.g. the index of a tank). - @param[out] variable the object's variable being compared (see @ref EN_RuleVariable). - @param[out] relop the premise's comparison operator (see @ref EN_RuleOperator). - @param[out] status the status that the object's status is compared to - (see @ref EN_RuleStatus). - @param[out] value the value that the object's variable is compared to. - @return an error code. - */ - int DLLEXPORT EN_getpremise(EN_Project ph, int ruleIndex, int premiseIndex, - int *logop, int *object, int *objIndex, int *variable, - int *relop, int *status, double *value); - - /** - @brief Sets the properties of a premise in a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param premiseIndex the position of the premise in the rule's list of premises. - @param logop the premise's logical operator (`IF` = 1, `AND` = 2, `OR` = 3). - @param object the type of object the premise refers to (see @ref EN_RuleObject). - @param objIndex the index of the object (e.g. the index of a tank). - @param variable the object's variable being compared (see @ref EN_RuleVariable). - @param relop the premise's comparison operator (see @ref EN_RuleOperator). - @param status the status that the object's status is compared to - (see @ref EN_RuleStatus). - @param value the value that the object's variable is compared to. - @return an error code. - */ - int DLLEXPORT EN_setpremise(EN_Project ph, int ruleIndex, int premiseIndex, - int logop, int object, int objIndex, int variable, int relop, - int status, double value); - - /** - @brief Sets the index of an object in a premise of a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param premiseIndex the premise's index (starting from 1). - @param objIndex the index of the premise's object (e.g. the index of a tank). - @return an error code. - */ - int DLLEXPORT EN_setpremiseindex(EN_Project ph, int ruleIndex, int premiseIndex, - int objIndex); - - /** - @brief Sets the status being compared to in a premise of a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param premiseIndex the premise's index (starting from 1). - @param status the status that the premise's object status is compared to - (see @ref EN_RuleStatus). - @return an error code. - */ - int DLLEXPORT EN_setpremisestatus(EN_Project ph, int ruleIndex, int premiseIndex, - int status); - - /** - @brief Sets the value in a premise of a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (staring from 1). - @param premiseIndex the premise's index (starting from 1). - @param value The value that the premise's variable is compared to. - @return an error code. - */ - int DLLEXPORT EN_setpremisevalue(EN_Project ph, int ruleIndex, int premiseIndex, - double value); - - /** - @brief Gets the properties of a THEN action in a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param actionIndex the index of the THEN action to retrieve (starting from 1). - @param[out] linkIndex the index of the link in the action (starting from 1). - @param[out] status the status assigned to the link (see @ref EN_RuleStatus) - @param[out] setting the value assigned to the link's setting. - @return an error code. - */ - int DLLEXPORT EN_getthenaction(EN_Project ph, int ruleIndex, int actionIndex, - int *linkIndex, int *status, double *setting); - - /** - @brief Sets the properties of a THEN action in a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param actionIndex the index of the THEN action to modify (starting from 1). - @param linkIndex the index of the link in the action. - @param status the new status assigned to the link (see @ref EN_RuleStatus). - @param setting the new value assigned to the link's setting. - @return an error code. - */ - int DLLEXPORT EN_setthenaction(EN_Project ph, int ruleIndex, int actionIndex, - int linkIndex, int status, double setting); - - /** - @brief Gets the properties of an ELSE action in a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param actionIndex the index of the ELSE action to retrieve (starting from 1). - @param[out] linkIndex the index of the link in the action. - @param[out] status the status assigned to the link (see @ref EN_RuleStatus). - @param[out] setting the value assigned to the link's setting. - @return an error code. - */ - int DLLEXPORT EN_getelseaction(EN_Project ph, int ruleIndex, int actionIndex, - int *linkIndex, int *status, double *setting); - - /** - @brief Sets the properties of an ELSE action in a rule-based control. - @param ph an EPANET project handle. - @param ruleIndex the rule's index (starting from 1). - @param actionIndex the index of the ELSE action being modified (starting from 1). - @param linkIndex the index of the link in the action (starting from 1). - @param status the new status assigned to the link (see @ref EN_RuleStatus) - @param setting the new value assigned to the link's setting. - @return an error code. - */ - int DLLEXPORT EN_setelseaction(EN_Project ph, int ruleIndex, int actionIndex, - int linkIndex, int status, double setting); - - /** - @brief Sets the priority of a rule-based control. - @param ph an EPANET project handle. - @param index the rule's index (starting from 1). - @param priority the priority value assigned to the rule. - @return an error code. - */ - int DLLEXPORT EN_setrulepriority(EN_Project ph, int index, double priority); - -#if defined(__cplusplus) -} -#endif - -#endif //EPANET2_2_H From cba9dda5cf6dd242d990acf1863d692f07ddf30d Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Wed, 30 Jan 2019 14:30:44 -0500 Subject: [PATCH 16/16] Fixing build error gcc / Travis --- include/epanet2_2.h | 216 ++++++++++++++++++++++---------------------- include/epanet_py.h | 8 +- src/epanet_py.c | 8 +- 3 files changed, 116 insertions(+), 116 deletions(-) diff --git a/include/epanet2_2.h b/include/epanet2_2.h index ae21a60..161f122 100644 --- a/include/epanet2_2.h +++ b/include/epanet2_2.h @@ -68,7 +68,7 @@ typedef struct Project *EN_Project; @brief Creates an EPANET project. @param[out] ph an EPANET project handle that is passed into all other API functions. @return an error code. - + EN_createproject must be called before any other API functions are used. */ int DLLEXPORT EN_createproject(EN_Project *ph); @@ -129,9 +129,9 @@ typedef struct Project *EN_Project; @param rptFile the name of a report file to be created (or "" if not needed). @param outFile the name of a binary output file to be created (or "" if not needed). @return an error code. - + This function should be called immediately after ::EN_createproject if an EPANET-formatted - input file will be used to supply network data. + input file will be used to supply network data. */ int DLLEXPORT EN_open(EN_Project ph, const char *inpFile, const char *rptFile, const char *outFile); @@ -163,19 +163,19 @@ typedef struct Project *EN_Project; /** @brief Runs a complete hydraulic simulation with results for all time periods - written to a temporary hydraulics file. + written to a temporary hydraulics file. @param ph an EPANET project handle. @return an error code. Use ::EN_solveH to generate a complete hydraulic solution which can stand alone - or be used as input to a water quality analysis. This function will not allow one to + or be used as input to a water quality analysis. This function will not allow one to examine intermediate hydraulic results as they are generated. It can also be followed by calls to ::EN_saveH and ::EN_report to write hydraulic results to the report file. - - The sequence ::EN_openH - ::EN_initH - ::EN_runH - ::EN_nextH - ::EN_closeH + + The sequence ::EN_openH - ::EN_initH - ::EN_runH - ::EN_nextH - ::EN_closeH can be used instead to gain access to results at intermediate time periods and directly adjust link status and control settings as a simulation proceeds. - + Example: \code {.c} EN_Project ph; @@ -211,7 +211,7 @@ typedef struct Project *EN_Project; Call ::EN_openH prior to running the first hydraulic analysis using the ::EN_initH - ::EN_runH - ::EN_nextH sequence. Multiple analyses can be made before calling ::EN_closeH to close the hydraulic solver. - + Do not call this function if ::EN_solveH is being used to run a complete hydraulic analysis or if hydraulics are being supplied by a previously saved hydraulics file using ::EN_usehydfile. @@ -219,14 +219,14 @@ typedef struct Project *EN_Project; int DLLEXPORT EN_openH(EN_Project ph); /** - @brief Initializes a network prior to running a hydraulic analysis. + @brief Initializes a network prior to running a hydraulic analysis. @param ph an EPANET project handle. @param initFlag a 2-digit initialization flag (see @ref EN_InitHydOption). @return an error code. This function initializes storage tank levels, link status and settings, and the simulation time clock prior to running a hydraulic analysis. - + The initialization flag is a two digit number where the 1st (left) digit indicates if link flows should be re-initialized (1) or not (0), and the 2nd digit indicates if hydraulic results should be saved to a temporary @@ -239,7 +239,7 @@ typedef struct Project *EN_Project; - making a subsequent water quality run, - using ::EN_report to generate a report - using ::EN_savehydfile to save the binary hydraulics file. - + There is no need to save hydraulics if you will be writing custom code to process hydraulic results as they are generated using the functions ::EN_getnodevalue and ::EN_getlinkvalue. @@ -257,7 +257,7 @@ typedef struct Project *EN_Project; should be treated as a read-only variable. ::EN_initH must have been called prior to running the ::EN_runH - ::EN_nextH loop. - + See ::EN_nextH for an example of using this function. */ int DLLEXPORT EN_runH(EN_Project ph, long *currentTime); @@ -280,25 +280,25 @@ typedef struct Project *EN_Project; - the time interval until the next change in demands occurs - the time interval until a tank becomes full or empty - the time interval until a control or rule fires. - + Example: \code {.c} long t, tstep; - EN_openH(ph); - EN_initH(ph, EN_NOSAVE); - do { - EN_runH(ph, &t); + EN_openH(ph); + EN_initH(ph, EN_NOSAVE); + do { + EN_runH(ph, &t); // Retrieve hydraulic results for time t - EN_nextH(ph, &tstep); - } while (tstep > 0); - EN_closeH(ph); + EN_nextH(ph, &tstep); + } while (tstep > 0); + EN_closeH(ph); \endcode */ int DLLEXPORT EN_nextH(EN_Project ph, long *tStep); /** @brief Transfers a project's hydraulics results from its temporary hydraulics file - to its binary output file, where results are only reported at uniform reporting intervals. + to its binary output file, where results are only reported at uniform reporting intervals. @param ph an EPANET project handle. @return an error code. @@ -316,20 +316,20 @@ typedef struct Project *EN_Project; Use this function to save the current set of hydraulics results to a file, either for post-processing or to be used at a later time by calling the ::EN_usehydfile function. - + The hydraulics file contains nodal demands and heads and link flows, status, and settings for all hydraulic time steps, even intermediate ones. - + Before calling this function hydraulic results must have been generated and saved by having called ::EN_solveH or the ::EN_initH - ::EN_runH - ::EN_nextH sequence with the initflag - argument of ::EN_initH set to `EN_SAVE` or `EN_SAVE_AND_INIT`. + argument of ::EN_initH set to `EN_SAVE` or `EN_SAVE_AND_INIT`. */ int DLLEXPORT EN_savehydfile(EN_Project ph, char *filename); /** @brief Closes the hydraulic solver freeing all of its allocated memory. @return an error code. - + Call ::EN_closeH after all hydraulics analyses have been made using ::EN_initH - ::EN_runH - ::EN_nextH. Do not call this function if ::EN_solveH is being used. */ @@ -343,10 +343,10 @@ typedef struct Project *EN_Project; /** @brief Runs a complete water quality simulation with results at uniform - reporting intervals written to the project's binary output file. + reporting intervals written to the project's binary output file. @param ph an EPANET project handle. @return an error code. - + A hydraulic analysis must have been run and saved to a hydraulics file before calling ::EN_solveQ. This function will not allow one to examine intermediate water quality results as they are generated. It can be followed by a call to ::EN_report @@ -355,7 +355,7 @@ typedef struct Project *EN_Project; One can instead use the ::EN_openQ - ::EN_initQ - ::EN_runQ - ::EN_nextQ - ::EN_closeQ sequence to gain access to gain access to water quality results at intermediate time periods. - + Example: see ::EN_solveH. */ int DLLEXPORT EN_solveQ(EN_Project ph); @@ -376,7 +376,7 @@ typedef struct Project *EN_Project; int DLLEXPORT EN_openQ(EN_Project ph); /** - @brief Initializes a network prior to running a water quality analysis. + @brief Initializes a network prior to running a water quality analysis. @param ph n EPANET project handle. @param saveFlag set to `EN_SAVE` (1) if results are to be saved to the project's binary output file, or to `EN_NOSAVE` (0) if not. @@ -384,16 +384,16 @@ typedef struct Project *EN_Project; Call ::EN_initQ prior to running a water quality analysis using ::EN_runQ in conjunction with either ::EN_nextQ or ::EN_stepQ. - + ::EN_openQ must have been called prior to calling EN_initQ. - + Do not call ::EN_initQ if a complete water quality analysis will be made using ::EN_solveQ. */ int DLLEXPORT EN_initQ(EN_Project ph, int saveFlag); /** @brief Makes hydraulic and water quality results at the start of the current time - period available to a project's water quality solver. + period available to a project's water quality solver. @param ph an EPANET project handle. @param[out] currentTime current simulation time in seconds. @return an error code. @@ -402,10 +402,10 @@ typedef struct Project *EN_Project; start of each hydraulic period in an extended period simulation. Or use it in a loop with ::EN_stepQ to access results at the start of each water quality time step. See each of these functions for examples of how to code such loops. - + ::EN_initQ must have been called prior to running an ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) loop. - + The current time of the simulation is determined from information saved with the hydraulic analysis that preceded the water quality analysis. Treat it as a read-only variable. @@ -415,7 +415,7 @@ typedef struct Project *EN_Project; /** @brief Advances a water quality simulation over the time until the next hydraulic event. @param ph an EPANET project handle. - @param[out] tStep time (in seconds) until the next hydraulic event or 0 if at the end + @param[out] tStep time (in seconds) until the next hydraulic event or 0 if at the end of the full simulation duration. @return an error code. @@ -426,20 +426,20 @@ typedef struct Project *EN_Project; The value of `tStep` is determined from information produced by the hydraulic analysis that preceded the water quality analysis. Treat it as a read-only variable. - + Example: \code {.c} long t, tStep; EN_solveH(ph); // Generate & save hydraulics EN_openQ(ph); - EN_initQ(ph, EN_NOSAVE); - do { - EN_runQ(ph, &t); + EN_initQ(ph, EN_NOSAVE); + do { + EN_runQ(ph, &t); // Monitor results at time t, which // begins a new hydraulic time period - EN_nextQ(ph, &tStep); - } while (tStep > 0); - EN_closeQ(ph); + EN_nextQ(ph, &tStep); + } while (tStep > 0); + EN_closeQ(ph); \endcode */ int DLLEXPORT EN_nextQ(EN_Project ph, long *tStep); @@ -454,7 +454,7 @@ typedef struct Project *EN_Project; quality simulation. It allows one to generate water quality results at each water quality time step of the simulation, rather than over each hydraulic event period as with ::EN_nextQ. - + Use the argument `timeLeft` to determine when no more calls to ::EN_runQ are needed because the end of the simulation period has been reached (i.e., when `timeLeft = 0`). */ @@ -464,11 +464,11 @@ typedef struct Project *EN_Project; @brief Closes the water quality solver, freeing all of its allocated memory. @param ph an EPANET project handle. @return an error code. - + Call ::EN_closeQ after all water quality analyses have been made using the ::EN_initQ - ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) sequence of function calls. - - Do not call this function if ::EN_solveQ is being used. + + Do not call this function if ::EN_solveQ is being used. */ int DLLEXPORT EN_closeQ(EN_Project ph); @@ -490,12 +490,12 @@ typedef struct Project *EN_Project; @brief Writes simulation results in a tabular format to a project's report file. @param ph an EPANET project handle. @return an error code - + Either a full hydraulic analysis or full hydraulic and water quality analysis must have been run, with results saved to file, before ::EN_report is called. In the former case, ::EN_saveH must also be called first to transfer results from the - project's intermediate hydraulics file to its output file. - + project's intermediate hydraulics file to its output file. + The format of the report is controlled by commands issued with ::EN_setreport. */ int DLLEXPORT EN_report(EN_Project ph); @@ -504,15 +504,15 @@ typedef struct Project *EN_Project; @brief Resets a project's report options to their default values. @param ph an EPANET project handle. @return an error code - - After calling this function the default reporting options are in effect. These are: - - no status report - - no energy report - - no nodes reported on - - no links reported on - - node variables reported to 2 decimal places - - link variables reported to 2 decimal places (3 for friction factor) - - node variables reported are elevation, head, pressure, and quality + + After calling this function the default reporting options are in effect. These are: + - no status report + - no energy report + - no nodes reported on + - no links reported on + - node variables reported to 2 decimal places + - link variables reported to 2 decimal places (3 for friction factor) + - node variables reported are elevation, head, pressure, and quality - link variables reported are flow, velocity, and head loss. */ int DLLEXPORT EN_resetreport(EN_Project ph); @@ -522,10 +522,10 @@ typedef struct Project *EN_Project; @param ph an EPANET project handle. @param format a report formatting command. @return an error code - + Acceptable report formatting commands are described in Appendix C of the EPANET 2 Users Manual. - + Formatted results of a simulation can be written to a project's report file using the ::EN_report function. */ @@ -536,18 +536,18 @@ typedef struct Project *EN_Project; @param ph an EPANET project handle. @param level a status reporting level code (see @ref EN_StatusReport). @return an error code. - + Status reporting writes changes in the hydraulics status of network elements to a project's report file as a hydraulic simulation unfolds. There are three levels of reporting: `EN_NO_REPORT` (no status reporting), `EN_NORMAL_REPORT` (normal reporting) `EN_FULL_REPORT` (full status reporting). - + The full status report contains information at each trial of the solution to the system hydraulic equations at each time step of a simulation. It is useful mainly - for debugging purposes. - + for debugging purposes. + If many hydraulic analyses will be run in the application it is recommended that - status reporting be turned off (`level = EN_NO_REPORT`). + status reporting be turned off (`level = EN_NO_REPORT`). */ int DLLEXPORT EN_setstatusreport(EN_Project ph, int level); @@ -576,7 +576,7 @@ typedef struct Project *EN_Project; @param[out] errmsg the error message generated by the error code @param maxLen maximum number of characters that errmsg can hold @return an error code - + Error message strings should be at least @ref EN_MAXMSG characters in length. */ int DLLEXPORT EN_geterror(int errcode, char *errmsg, int maxLen); @@ -620,9 +620,9 @@ typedef struct Project *EN_Project; @param ph an EPANET project handle. @param[out] units a flow units code (see @ref EN_FlowUnits) @return an error code. - + Flow units in liters or cubic meters implies that SI metric units are used for all - other quantities in addition to flow. Otherwise US Customary units are employed. + other quantities in addition to flow. Otherwise US Customary units are employed. */ int DLLEXPORT EN_getflowunits(EN_Project ph, int *units); @@ -631,9 +631,9 @@ typedef struct Project *EN_Project; @param ph an EPANET project handle. @param units a flow units code (see @ref EN_FlowUnits) @return an error code. - + Flow units in liters or cubic meters implies that SI metric units are used for all - other quantities in addition to flow. Otherwise US Customary units are employed. + other quantities in addition to flow. Otherwise US Customary units are employed. */ int DLLEXPORT EN_setflowunits(EN_Project ph, int units); @@ -684,11 +684,11 @@ typedef struct Project *EN_Project; @param chemUnits the concentration units of the constituent. @param traceNode the ID name of the node being traced if `qualType = EN_TRACE`. @return an error code. - + Chemical name and units can be an empty string if the analysis is not for a chemical. - The same holds for the trace node if the analysis is not for source tracing. - - Note that the trace node is specified by ID name and not by index. + The same holds for the trace node if the analysis is not for source tracing. + + Note that the trace node is specified by ID name and not by index. */ int DLLEXPORT EN_setqualtype(EN_Project ph, int qualType, char *chemName, char *chemUnits, char *traceNode); @@ -705,7 +705,7 @@ typedef struct Project *EN_Project; @param id the ID name of the node to be added. @param nodeType the type of node being added (see @ref EN_NodeType) @return an error code. - + When a new node is created all of it's properties (see @ref EN_NodeProperty) are set to 0. */ int DLLEXPORT EN_addnode(EN_Project ph, char *id, int nodeType); @@ -769,10 +769,10 @@ typedef struct Project *EN_Project; @brief Retrieves a property value for a node. @param ph an EPANET project handle. @param index a node's index. - @param property the property to retrieve (see @ref EN_NodeProperty). + @param property the property to retrieve (see @ref EN_NodeProperty). @param[out] value the current value of the property. @return an error code. - + Values are returned in units that depend on the units used for flow rate (see @ref Units). */ @@ -785,7 +785,7 @@ typedef struct Project *EN_Project; @param property the property to set (see @ref EN_NodeProperty). @param value the new value for the property. @return an error code. - + Values are in units that depend on the units used for flow rate (see @ref Units). */ int DLLEXPORT EN_setnodevalue(EN_Project ph, int index, int property, double value); @@ -798,7 +798,7 @@ typedef struct Project *EN_Project; @param dmnd the value of the junction's primary base demand. @param dmndpat the ID name of the demand's time pattern ("" for no pattern) @return an error code. - + These properties have units that depend on the units used for flow rate (see @ref Units). */ int DLLEXPORT EN_setjuncdata(EN_Project ph, int index, double elev, double dmnd, @@ -816,7 +816,7 @@ typedef struct Project *EN_Project; @param minvol the volume of the tank at its minimum water level. @param volcurve the name of the tank's volume curve ("" for no curve) @return an error code. - + These properties have units that depend on the units used for flow rate (see @ref Units). */ int DLLEXPORT EN_settankdata(EN_Project ph, int index, double elev, double initlvl, @@ -856,7 +856,7 @@ typedef struct Project *EN_Project; @param[out] preq Pressure required to deliver full demand. @param[out] pexp Pressure exponent in demand function. @return an error code. - + Parameters `pmin`, `preq`, and `pexp` are only used when the demand model is `EN_PDA`. */ int DLLEXPORT EN_getdemandmodel(EN_Project ph, int *type, double *pmin, @@ -870,13 +870,13 @@ typedef struct Project *EN_Project; @param preq Pressure required to deliver full demand. @param pexp Pressure exponent in demand function. @return an error code. - + Set `type` to `EN_DDA` for a traditional demand driven analysis (in which case the remaining three parameter values are ignored) or to `EN_PDA` for a pressure driven analysis. In the latter case a node's demand is computed as: > `Dfull * [ (P - pmin) / (preq - pmin) ] ^ pexp` where `Dfull` is the full demand and `P` is the current pressure. - + Setting `preq` equal to `pmin` will result in a solution with the smallest amount of demand reductions needed to insure that no node delivers positive demand at a pressure below `pmin`. @@ -922,7 +922,7 @@ typedef struct Project *EN_Project; @param demandIndex the index of a demand category for the node (starting from 1). @param[out] patIndex the index of the category's time pattern. @return an error code. - + A returned pattern index of 0 indicates that no time pattern has been assigned to the demand category. */ @@ -936,7 +936,7 @@ typedef struct Project *EN_Project; @param demandIndex the index of one of the node's demand categories (starting from 1). @param patIndex the index of the time pattern assigned to the category. @return an error code. - + Specifying a pattern index of 0 indicates that no time pattern is assigned to the demand category. */ @@ -949,7 +949,7 @@ typedef struct Project *EN_Project; @param demandIndex the index of one of the node's demand categories (starting from 1). @param[out] demandName The name of the selected category. @return an error code. - + `demandName` must be sized to contain at least @ref EN_MAXID characters. */ int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIndex, char *demandName); @@ -961,7 +961,7 @@ typedef struct Project *EN_Project; @param demandIdx the index of one of the node's demand categories (starting from 1). @param demandName the new name assigned to the category. @return Error code. - + The category name must contain no more than @ref EN_MAXID characters. */ int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, char *demandName); @@ -980,15 +980,15 @@ typedef struct Project *EN_Project; @param fromNode The ID name of the link's starting node. @param toNode The ID name of the link's ending node. @return an error code. - + A new pipe is assigned a diameter of 10 inches (or 254 mm), a length of 100 feet (or meters), a roughness coefficient of 100 and 0 for all other properties. - + A new pump has a status of `EN_OPEN`, a speed setting of 1, and has no pump curve or power rating assigned to it. - + A new valve has a diameter of 10 inches (or 254 mm) and all other properties set to 0. - + See @ref EN_LinkProperty. */ int DLLEXPORT EN_addlink(EN_Project ph, char *id, int linkType, char *fromNode, char *toNode); @@ -1088,7 +1088,7 @@ typedef struct Project *EN_Project; @param property the property to retrieve (see @ref EN_LinkProperty). @param[out] value the current value of the property. @return an error code. - + Values are returned in units that depend on the units used for flow rate (see @ref Units). */ int DLLEXPORT EN_getlinkvalue(EN_Project ph, int index, int property, double *value); @@ -1100,7 +1100,7 @@ typedef struct Project *EN_Project; @param property the property to set (see @ref EN_LinkProperty). @param value the new value for the property. @return an error code. - + Values are in units that depend on the units used for flow rate (see @ref Units). */ int DLLEXPORT EN_setlinkvalue(EN_Project ph, int index, int property, double value); @@ -1114,7 +1114,7 @@ typedef struct Project *EN_Project; @param rough the pipe's roughness coefficient. @param mloss the pipe's minor loss coefficient. @return an error code. - + These properties have units that depend on the units used for flow rate (see @ref Units). */ int DLLEXPORT EN_setpipedata(EN_Project ph, int index, double length, double diam, @@ -1165,7 +1165,7 @@ typedef struct Project *EN_Project; @param ph an EPANET project handle. @param id the ID name of the pattern to add. @return an error code. - + The new pattern contains a single time period whose factor is 1.0. */ int DLLEXPORT EN_addpattern(EN_Project ph, char *id); @@ -1235,11 +1235,11 @@ typedef struct Project *EN_Project; @param values an array of new pattern factor values. @param len the number of factor values supplied. @return an error code. - - `values` is a zero-based array that contains `len` elements. - + + `values` is a zero-based array that contains `len` elements. + Use this function to redefine (and resize) a time pattern all at once; - use @ref EN_setpatternvalue to revise pattern factors one at a time. + 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); @@ -1254,7 +1254,7 @@ typedef struct Project *EN_Project; @param ph an EPANET project handle. @param id The ID name of the curve to be added. @return an error code. - + The new curve contains a single data point (1.0, 1.0). */ int DLLEXPORT EN_addcurve(EN_Project ph, char *id); @@ -1346,11 +1346,11 @@ typedef struct Project *EN_Project; @param yValues an array of new y-values for the curve. @param nPoints the new number of data points for the curve. @return an error code. - - `xValues` and `yValues` are zero-based arrays that contains `nPoints` elements. - + + `xValues` and `yValues` are zero-based arrays that contains `nPoints` elements. + Use this function to redefine (and resize) a curve all at once; - use @ref EN_setcurvevalue to revise a curve's data points one at a time. + use @ref EN_setcurvevalue to revise a curve's data points one at a time. */ int DLLEXPORT EN_setcurve(EN_Project ph, int index, double *xValues, double *yValues, int nPoints); @@ -1429,7 +1429,7 @@ typedef struct Project *EN_Project; @param ph an EPANET project handle. @param rule text of the rule following the format used in an EPANET input file. @return an error code. - + Consult Appendix C of the EPANET 2 Users Manual to learn about a rule's format. Each clause of the rule must end with a newline character `\n`. */ @@ -1462,8 +1462,8 @@ typedef struct Project *EN_Project; @param index the rule's index (starting from 1). @param[out] id the rule's ID name. @return Error code. - - The ID name must be sized to hold at least @ref EN_MAXID characters. + + The ID name must be sized to hold at least @ref EN_MAXID characters. */ int DLLEXPORT EN_getruleID(EN_Project ph, int index, char* id); diff --git a/include/epanet_py.h b/include/epanet_py.h index 251cb6a..f63e472 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -67,8 +67,8 @@ int DLLEXPORT rprt_getcount(Handle ph, EN_CountType code, int *count); int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* value); -int DLLEXPORT anlys_getoption(Handle ph, EN_Option opt, double *value); -int DLLEXPORT anlys_setoption(Handle ph, int code, double value); +int DLLEXPORT anlys_getoption(Handle ph, EN_Option code, double *value); +int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, double value); int DLLEXPORT anlys_getflowunits(Handle ph, int *code); int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code); int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value); @@ -84,8 +84,8 @@ int DLLEXPORT node_getindex(Handle ph, char *id, int *index); int DLLEXPORT node_getid(Handle ph, int index, char *id); int DLLEXPORT node_setid(Handle ph, int index, char *newid); int DLLEXPORT node_gettype(Handle ph, int index, int *code); -int DLLEXPORT node_getvalue(Handle ph, int index, int code, double *value); -int DLLEXPORT node_setvalue(Handle ph, int index, int code, double value); +int DLLEXPORT node_getvalue(Handle ph, int index, EN_NodeProperty code, double *value); +int DLLEXPORT node_setvalue(Handle ph, int index, EN_NodeProperty code, double value); int DLLEXPORT node_getcoord(Handle ph, int index, double *x, double *y); int DLLEXPORT node_setcoord(Handle ph, int index, double x, double y); diff --git a/src/epanet_py.c b/src/epanet_py.c index fad6501..a5d2ff2 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -249,13 +249,13 @@ int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* valu int DLLEXPORT anlys_getoption(Handle ph, EN_Option code, double *value) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_getoption(pr->project, code, value)); + return error_set(pr->error, EN_getoption(pr->project, (int)code, value)); } int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, double value) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_setoption(pr->project, code, value)); + return error_set(pr->error, EN_setoption(pr->project, (int)code, value)); } int DLLEXPORT anlys_getflowunits(Handle ph, int *code) @@ -342,13 +342,13 @@ int DLLEXPORT node_gettype(Handle ph, int index, int *code) int DLLEXPORT node_getvalue(Handle ph, int index, EN_NodeProperty code, double *value) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_getnodevalue(pr->project, index, code, value)); + return error_set(pr->error, EN_getnodevalue(pr->project, index, (int)code, value)); } int DLLEXPORT node_setvalue(Handle ph, int index, EN_NodeProperty code, double value) { handle_t *pr = (handle_t *)ph; - return error_set(pr->error, EN_setnodevalue(pr->project, index, code, value)); + return error_set(pr->error, EN_setnodevalue(pr->project, index, (int)code, value)); } int DLLEXPORT node_getcoord(Handle ph, int index, double *x, double *y)