this quite sizable commit does several things, but is primarily focussed on building a toolkit that can run simultaneous simulations/analyses within a shared memory space. Versions <=2.1 use a long list of global variables that prevent multiple instantiations on linux systems without resorting to compilation tricks (like duplicate binaries or similar via static linkage). This version uses a single "Project" pointer to encapsulate the network and analysis data. There are no changes to existing algo implementations other than to accomodate dereferencing of the passed-in pointers. A more detailed list of major changes below: - mirrors all “ENxxxx” function calls with “EN_xxxx” versions (note the underscore) that take an extra first parameter: a pointer to an EN_Project struct, which contains all network, hydraulic, quality, and associated data. - tweaks some code formatting to make it more readable - removes some deprecated/commented code that was sufficiently old - fixes implicit type-cast warnings * Added ENaddnode and ENaddlink functions * More memory reallocations * Added ENInit, ENsetheadcurveindex * Added ENdeletelink and ENdeletenode * restored default behavior for float types * fixed type * Added docstrings for ENinit * cleanup change * moves global rule variables to vars.h * migrates rule structs to typedefs for better readability * char types to proper enums fixes #93 * Change some variable declarations for compatibility Changes to keep compatibility with C89 compilers: variables must be declared at the top of the functions. Remove the use of EN_LinkType in function call as it is not compatible with ENgetnodetype. * Moved declaration of idstodelete to top of function * Updated ENinit function and headers Updated header files with new functions Updated def file with new functions For ENinit changes names of parameters #98 Added enum for headloss formula * Missed these files in 1a033fc * migrates char types to enums fixes #93, supports unified link/node type enums, rather than public/private redefinitions * removing links in reverse-index order maintains proper indexing fixes #96 * style * clarifies curve getter units issue (dox) closes #95 * fixes link/node confusion in ENsetlinktype partially reverts a3bce95dc330a5a297634a303d438e2e1bc41cc9 * partial compilation fix * fixes dox issue * fixes allocation issues with enums - updates style in various places - introduces FlowDirection enum - use snprintf to prevent overflow * fixes enum type cast * updated mac project settings * Use of _snprintf on Windows and remove DLLEXPORT from mempool.h snprintf it not compatible on Windows so we use _snprintf mempool gave starnge compilation errors while removing DLLEXPORT worked. Not sure why these functions needed to be exposed in the DLL? * Revert "Use of _snprintf on Windows and remove DLLEXPORT from mempool.h" This reverts commit 6238f77d47fa0feaabe5836043c006937de433a2. * use of _snprintf instead of snprintf on Windows and removed DLLEXPORT from mempool.h Had compilation errors on mempool.h. Removed DLLEXPORT so solve it. Not sure why there was a need to expose these functions? * Shift indices for Links in ENaddnode Need to shift indices for Links not just Pipes since a pump could be connected directly to a reservoir. Also set the defult base demand to zero (was 5). * Set defualts for madatory link properties in ENaddlink and small fix for ENsetheadcurveindex Relates to #102 and closes #103 * wraps globals into structs, duplicates api functions with objective versions * parse and serialize Comment field for network elements related to #47 * adds getter for head/efficiency curve in EN_getlinkvalue * adds getter for event node index … to return the index of the junction (tank) that triggered the event. * fixes edge case in parsing … where inp files without demands in [JUNCTIONS] and without any [DEMAND] categories will fail. * adds freeing function for project pointer * removes redundant string literals, fixes overrun issue in error message getter function * check for hydraulics already closed * moving error definitions to data file * deprecates ENR err message getter (unused) * updates location of errors data file also begins to expose blind structs to curves and patterns, anticipating buildout of APIs for those. * updates CLI output to reflect executable name as invoked relates to #109 * Feature nrtest (#131) * Initial commit EPANET testing tools. * Initial commit for epanet-nrtestsuite * SWIG wrapper for EPANET outputapi (#118) * Removed pervious version of outputapi and wrapper * SWIG wrapper for EPANET outputapi * Patching cmake build script fixed target for outputapi * Build failing on deprecated test script * Minor changes. Responding to review comments. * Feature nrtest (#121) * Configured python setup to automatically build nrtest tools. * Working on build / testing automation * Adding EPANET 2.0.12 benchmark * Updated Travis yml to run nrtest * Fixing InsecurePlatformWarning * Fixing InsecurePlatformWarning again * Fixing InsecurePlatformWarning * Fixing InsecurePlatformWarning * Fixing InsecurePlatformWarning * Update .travis.yml * Update .travis.yml * Update .travis.yml * Update .travis.yml * Working on configuring python environment and building test tools under Travis CI. * Making gen-config.sh and run-nrtest.sh executable * Debugging .travis.yml * Debugging .travis.yml * Debugging .travis.yml again * Debugging .travis.yml again * debugging travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * debugging Travis setup * Fixing bug with __strncpy_chk destlen < len * nrtesting clean up * re-implements fixes from:5eead5ae403c788567a4* removes extraneous build files, moves cmake and updates travis * mirror of 9b37035560f9683f1514b439f7586a5c17bca5bf * Move some variable declarations * More variable declarations * Fix TmpDir * Allocate _defaultModel * Fix EN_addcurve funcrion * Fix for inpfile * Fix writeRuleinInp call * Set MAXMSG to 79 chars * Fix for flow direction * Refactoring testing related python packages and SWIG wrapper bug fix (#139) * Eliminated epanet-reader package. Removed numpy dependency from epanet-output. Fixed reference counting bug in SWIG wrapper. Added error checking to run_nrtest.sh. Added nrtest package to requirements file. * changing buildhome directory * Fixing bug related to preprocessor definition of PI
255 lines
6.5 KiB
OpenEdge ABL
255 lines
6.5 KiB
OpenEdge ABL
/*
|
|
* epanet_output.i - SWIG interface description file for EPANET Output API
|
|
*
|
|
* Created: 9/20/2017
|
|
*
|
|
* Author: Michael E. Tryby
|
|
* US EPA - ORD/NRMRL
|
|
*
|
|
*/
|
|
%module epanet_output
|
|
%{
|
|
#include "errormanager.h"
|
|
#include "messages.h"
|
|
#include "epanet_output.h"
|
|
|
|
#define SWIG_FILE_WITH_INIT
|
|
%}
|
|
|
|
%include "typemaps.i"
|
|
|
|
/* DEFINE AND TYPEDEF MUST BE INCLUDED */
|
|
#define MAXMSG 53
|
|
|
|
typedef void* ENR_Handle;
|
|
|
|
typedef enum {
|
|
ENR_node = 1,
|
|
ENR_link = 2
|
|
} ENR_ElementType;
|
|
|
|
/*
|
|
typedef enum {
|
|
ENR_nodeCount = 1,
|
|
ENR_tankCount = 2,
|
|
ENR_linkCount = 3,
|
|
ENR_pumpCount = 4,
|
|
ENR_valveCount = 5
|
|
} ENR_ElementCount;
|
|
*/
|
|
|
|
typedef enum {
|
|
ENR_flowUnits = 1,
|
|
ENR_pressUnits = 2
|
|
} ENR_Units;
|
|
|
|
typedef enum {
|
|
ENR_reportStart = 1,
|
|
ENR_reportStep = 2,
|
|
ENR_simDuration = 3,
|
|
ENR_numPeriods = 4
|
|
}ENR_Time;
|
|
|
|
typedef enum {
|
|
ENR_demand = 1,
|
|
ENR_head = 2,
|
|
ENR_pressure = 3,
|
|
ENR_quality = 4
|
|
} ENR_NodeAttribute;
|
|
|
|
typedef enum {
|
|
ENR_flow = 1,
|
|
ENR_velocity = 2,
|
|
ENR_headloss = 3,
|
|
ENR_avgQuality = 4,
|
|
ENR_status = 5,
|
|
ENR_setting = 6,
|
|
ENR_rxRate = 7,
|
|
ENR_frctnFctr = 8
|
|
} ENR_LinkAttribute;
|
|
|
|
#ifdef WINDOWS
|
|
#ifdef __cplusplus
|
|
#define DLLEXPORT __declspec(dllexport) __cdecl
|
|
#else
|
|
#define DLLEXPORT __declspec(dllexport) __stdcall
|
|
#endif
|
|
#else
|
|
#define DLLEXPORT
|
|
#endif
|
|
|
|
/* TYPEMAPS FOR OPAQUE POINTER */
|
|
/* Used for functions that output a new opaque pointer */
|
|
%typemap(in, numinputs=0) ENR_Handle* p_handle_out (ENR_Handle retval)
|
|
{
|
|
/* OUTPUT in */
|
|
retval = NULL;
|
|
$1 = &retval;
|
|
}
|
|
/* used for functions that take in an opaque pointer (or NULL)
|
|
and return a (possibly) different pointer */
|
|
%typemap(argout) ENR_Handle* p_handle_out
|
|
{
|
|
/* OUTPUT argout */
|
|
%append_output(SWIG_NewPointerObj(SWIG_as_voidptr(retval$argnum), $1_descriptor, 0));
|
|
}
|
|
/* No need for special IN typemap for opaque pointers, it works anyway */
|
|
|
|
|
|
/* TYPEMAP FOR IGNORING INT ERROR CODE RETURN VALUE */
|
|
%typemap(out) int {
|
|
$result = Py_None;
|
|
Py_INCREF($result);
|
|
}
|
|
|
|
/* TYPEMAPS FOR INT ARGUMENT AS RETURN VALUE */
|
|
%typemap(in, numinputs=0) int* int_out (int temp) {
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout) int* int_out {
|
|
%append_output(PyInt_FromLong(*$1));
|
|
}
|
|
|
|
/* TYPEMAP FOR MEMORY MANAGEMENT AND ENCODING OF STRINGS */
|
|
%typemap(in, numinputs=0)char** string_out (char* temp), int* slen (int temp){
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout)(char** string_out, int* slen) {
|
|
if (*$1) {
|
|
PyObject* o;
|
|
o = PyUnicode_FromStringAndSize(*$1, *$2);
|
|
|
|
$result = SWIG_Python_AppendOutput($result, o);
|
|
free(*$1);
|
|
}
|
|
}
|
|
|
|
/* TYPEMAPS FOR MEMORY MANAGEMNET OF FLOAT ARRAYS */
|
|
%typemap(in, numinputs=0)float** float_out (float* temp), int* int_dim (int temp){
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout) (float** float_out, int* int_dim) {
|
|
if (*$1) {
|
|
PyObject *o = PyList_New(*$2);
|
|
int i;
|
|
float* temp = *$1;
|
|
for(i=0; i<*$2; i++) {
|
|
PyList_SetItem(o, i, PyFloat_FromDouble((double)temp[i]));
|
|
}
|
|
$result = SWIG_Python_AppendOutput($result, o);
|
|
free(*$1);
|
|
}
|
|
}
|
|
|
|
/* TYPEMAPS FOR MEMORY MANAGEMENT OF INT ARRAYS */
|
|
%typemap(in, numinputs=0)int** int_out (long* temp), int* int_dim (int temp){
|
|
$1 = &temp;
|
|
}
|
|
%typemap(argout) (int** int_out, int* int_dim) {
|
|
if (*$1) {
|
|
PyObject *o = PyList_New(*$2);
|
|
int i;
|
|
long* temp = *$1;
|
|
for(i=0; i<*$2; i++) {
|
|
PyList_SetItem(o, i, PyInt_FromLong(temp[i]));
|
|
}
|
|
$result = SWIG_Python_AppendOutput($result, o);
|
|
free(*$1);
|
|
}
|
|
}
|
|
|
|
/* TYPEMAP FOR ENUMERATED TYPES */
|
|
%typemap(in) EnumeratedType (int val, int ecode = 0) {
|
|
if (PyObject_HasAttrString($input,"value")) {
|
|
PyObject* o;
|
|
o = PyObject_GetAttrString($input, "value");
|
|
ecode = SWIG_AsVal_int(o, &val);
|
|
}
|
|
else {
|
|
SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "$symname" "', argument " "$argnum"" of type '" "$ltype""'");
|
|
}
|
|
|
|
$1 = ($1_type)(val);
|
|
}
|
|
%apply EnumeratedType {ENR_ElementType, ENR_Units, ENR_Time, ENR_NodeAttribute, ENR_LinkAttribute}
|
|
|
|
|
|
/* RENAME FUNCTIONS PYTHON STYLE */
|
|
%rename("%(undercase)s") "";
|
|
|
|
/* INSERTS CUSTOM EXCEPTION HANDLING IN WRAPPER */
|
|
%exception
|
|
{
|
|
char* err_msg;
|
|
ENR_clearError(arg1);
|
|
$function
|
|
if (ENR_checkError(arg1, &err_msg))
|
|
{
|
|
PyErr_SetString(PyExc_Exception, err_msg);
|
|
SWIG_fail;
|
|
}
|
|
}
|
|
/* INSERT EXCEPTION HANDLING FOR THESE FUNCTIONS */
|
|
int DLLEXPORT ENR_open(ENR_Handle p_handle, const char* path);
|
|
|
|
int DLLEXPORT ENR_getVersion(ENR_Handle p_handle, int* int_out);
|
|
int DLLEXPORT ENR_getNetSize(ENR_Handle p_handle, int** int_out, int* int_dim);
|
|
int DLLEXPORT ENR_getUnits(ENR_Handle p_handle, ENR_Units t_enum, int* int_out);
|
|
int DLLEXPORT ENR_getTimes(ENR_Handle p_handle, ENR_Time t_enum, int* int_out);
|
|
int DLLEXPORT ENR_getElementName(ENR_Handle p_handle, ENR_ElementType t_enum,
|
|
int elementIndex, char** string_out, int* slen);
|
|
int DLLEXPORT ENR_getEnergyUsage(ENR_Handle p_handle, int pumpIndex,
|
|
int* int_out, float** float_out, int* int_dim);
|
|
int DLLEXPORT ENR_getNetReacts(ENR_Handle p_handle, float** float_out, int* int_dim);
|
|
|
|
|
|
int DLLEXPORT ENR_getNodeAttribute(ENR_Handle p_handle, int periodIndex,
|
|
ENR_NodeAttribute t_enum, float** float_out, int* int_dim);
|
|
int DLLEXPORT ENR_getLinkAttribute(ENR_Handle p_handle, int periodIndex,
|
|
ENR_LinkAttribute t_enum, float** float_out, int* int_dim);
|
|
%exception;
|
|
|
|
/* NO EXCEPTION HANDLING FOR THESE FUNCTIONS */
|
|
int DLLEXPORT ENR_init(ENR_Handle* p_handle_out);
|
|
int DLLEXPORT ENR_close(ENR_Handle* p_handle_out);
|
|
void DLLEXPORT ENR_free(void** array);
|
|
|
|
void DLLEXPORT ENR_clearError(ENR_Handle p_handle);
|
|
int DLLEXPORT ENR_checkError(ENR_Handle p_handle, char** msg_buffer);
|
|
|
|
|
|
/* CODE ADDED DIRECTLY TO SWIGGED INTERFACE MODULE */
|
|
%pythoncode%{
|
|
import enum
|
|
|
|
class ElementType(enum.Enum):
|
|
NODE = ENR_node
|
|
LINK = ENR_link
|
|
|
|
class Units(enum.Enum):
|
|
FLOW_UNIT = ENR_flowUnits
|
|
PRESS_UNIT = ENR_pressUnits
|
|
|
|
class Time(enum.Enum):
|
|
REPORT_START = ENR_reportStart
|
|
REPORT_STEP = ENR_reportStep
|
|
SIM_DURATION = ENR_simDuration
|
|
NUM_PERIODS = ENR_numPeriods
|
|
|
|
class NodeAttribute(enum.Enum):
|
|
DEMAND = ENR_demand
|
|
HEAD = ENR_head
|
|
PRESSURE = ENR_pressure
|
|
QUALITY = ENR_quality
|
|
|
|
class LinkAttribute(enum.Enum):
|
|
FLOW = ENR_flow
|
|
VELOCITY = ENR_velocity
|
|
HEADLOSS = ENR_headloss
|
|
AVG_QUALITY = ENR_avgQuality
|
|
STATUS = ENR_status
|
|
SETTING = ENR_setting
|
|
RX_RATE = ENR_rxRate
|
|
FRCTN_FCTR = ENR_frctnFctr
|
|
%}
|