diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d8813a..2756b71 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,18 +75,18 @@ source_group("Library" FILES ${EPANET_LIB_ALL}) # the shared library -add_library(epanet SHARED ${EPANET_LIB_ALL}) -target_include_directories(epanet PUBLIC ${PROJECT_SOURCE_DIR}/include) +add_library(epanet2 SHARED ${EPANET_LIB_ALL}) +target_include_directories(epanet2 PUBLIC ${PROJECT_SOURCE_DIR}/include) # create export lib so we can link against dll using Visual Studio add_definitions(-DWITH_GENX) include(GenerateExportHeader) -GENERATE_EXPORT_HEADER(epanet - BASE_NAME epanet +GENERATE_EXPORT_HEADER(epanet2 + BASE_NAME epanet2 EXPORT_MACRO_NAME DLLEXPORT - EXPORT_FILE_NAME epanet_export.h + EXPORT_FILE_NAME epanet2_export.h STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC) -file(COPY ${CMAKE_CURRENT_BINARY_DIR}/epanet_export.h +file(COPY ${CMAKE_CURRENT_BINARY_DIR}/epanet2_export.h DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/include/epanet2.h b/include/epanet2.h index 80b0e57..400cdb7 100644 --- a/include/epanet2.h +++ b/include/epanet2.h @@ -7,7 +7,7 @@ Project: OWA EPANET Version: 2.2 Module: epanet2.h - Description: symbolic constants and function declarations for the EPANET API + Description: symbolic constants and function declarations for the EPANET API Authors: see AUTHORS Copyright: see AUTHORS License: see LICENSE @@ -25,8 +25,8 @@ #endif #ifdef WITH_GENX - #include "epanet_export.h" -#else + #include "epanet2_export.h" +#else // --- define WINDOWS #undef WINDOWS #ifdef _WIN32 @@ -59,296 +59,14 @@ #endif -// --- Define the EPANET toolkit constants +#include "epanet2_enums.h" -#define EN_MAXID 31 //!< Max. # characters in ID name -#define EN_MAXMSG 255 //!< Max. # characters in message text - -/// Node property codes -typedef enum { - EN_ELEVATION = 0, //!< Elevation - EN_BASEDEMAND = 1, //!< Junction baseline demand, from last demand category - EN_PATTERN = 2, //!< Junction baseline demand pattern - EN_EMITTER = 3, //!< Junction emitter coefficient - EN_INITQUAL = 4, //!< Initial quality - EN_SOURCEQUAL = 5, //!< Quality source strength - EN_SOURCEPAT = 6, //!< Quality source pattern - EN_SOURCETYPE = 7, //!< Qualiy source type - EN_TANKLEVEL = 8, //!< Tank water level - EN_DEMAND = 9, //!< Current simulated demand - EN_HEAD = 10, //!< Current hydraulic head - EN_PRESSURE = 11, //!< Current pressure - EN_QUALITY = 12, //!< Current quality - EN_SOURCEMASS = 13, //!< Current source mass inflow - EN_INITVOLUME = 14, //!< Tank initial volume - EN_MIXMODEL = 15, //!< Tank mixing model - EN_MIXZONEVOL = 16, //!< Tank mixing zone volume - EN_TANKDIAM = 17, //!< Tank diameter - EN_MINVOLUME = 18, //!< Tank minimum volume - EN_VOLCURVE = 19, //!< Tank volume curve - EN_MINLEVEL = 20, //!< Tank minimum level - EN_MAXLEVEL = 21, //!< Tank maximum level - EN_MIXFRACTION = 22, //!< Tank mixing fraction - EN_TANK_KBULK = 23, //!< Tank bulk decay coefficient - EN_TANKVOLUME = 24, //!< Tank current volume - EN_MAXVOLUME = 25 //!< Tank maximum volume -} EN_NodeProperty; - -/// Link property codes -typedef enum { - EN_DIAMETER = 0, //!< Pipe/valve diameter - EN_LENGTH = 1, //!> Pipe length - EN_ROUGHNESS = 2, //!> Pipe roughness coefficient - EN_MINORLOSS = 3, //!> Pipe/valve minor loss coefficient - EN_INITSTATUS = 4, //!> Initial status (e.g., OPEN/CLOSED) - EN_INITSETTING = 5, //!> Initial pump speed or valve setting - EN_KBULK = 6, //!> Bulk chemical reaction coefficient - EN_KWALL = 7, //!> Pipe wall chemical reaction coefficient - EN_FLOW = 8, //!> Current link flow rate - EN_VELOCITY = 9, //!> Current link flow velocity - EN_HEADLOSS = 10, //!> Current head loss across link - EN_STATUS = 11, //!> Current link status - EN_SETTING = 12, //!> Current link setting - EN_ENERGY = 13, //!> Current pump energy usage - EN_LINKQUAL = 14, //!> Current link quality - EN_LINKPATTERN = 15, //!> Pump speed time pattern - EN_EFFICIENCY = 16, //!> Current pump efficiency - EN_HEADCURVE = 17, //!> Pump head v. flow curve - EN_EFFICIENCYCURVE = 18, //!> Pump efficiency v. flow curve - EN_PRICEPATTERN = 19, //!> Pump energy price time pattern - EN_STATE = 20, //!> Current pump status - EN_CONST_POWER = 21, //!> Horsepower of constant horsepower pump - EN_SPEED = 22 //!> Current pump speed setting -} EN_LinkProperty; - -/// Time parameter codes -typedef enum { - EN_DURATION = 0, //!> Total simulation duration - EN_HYDSTEP = 1, //!> Hydraulic time step - EN_QUALSTEP = 2, //!> Water quality time step - EN_PATTERNSTEP = 3, //!> Time pattern period - EN_PATTERNSTART = 4, //!> Time when time patterns begin - EN_REPORTSTEP = 5, //!> Reporting time step - EN_REPORTSTART = 6, //!> Time when reporting starts - EN_RULESTEP = 7, //!> Rule evaluation time step - EN_STATISTIC = 8, //!> Reporting statistic code - EN_PERIODS = 9, //!> Number of reporting time periods - EN_STARTTIME = 10, //!> Simulation starting time of day - EN_HTIME = 11, //!> Elapsed time of current hydraulic solution - EN_QTIME = 12, //!> Elapsed time of current quality solution - EN_HALTFLAG = 13, //!> Flag indicating if simulation halted - EN_NEXTEVENT = 14, //!> Next time until a tank becomes empty or full - EN_NEXTEVENTIDX = 15 //!> Index of next tank that becomes empty or full -} EN_TimeProperty; - -/// Analysis statistic codes -typedef enum { - EN_ITERATIONS = 0, //!< Number of hydraulic iterations - EN_RELATIVEERROR = 1, //!< Sum of all flow changes / total flow - EN_MAXHEADERROR = 2, //!< Largest head loss error for links - EN_MAXFLOWCHANGE = 3, //!< Largest flow change in links - EN_MASSBALANCE = 4 //!< Water quality mass balance ratio -} EN_AnalysisStatistic; - -/// Object count codes -typedef enum { - EN_NODECOUNT = 0, //!< Number of nodes (Juntions + Tanks + Reservoirs) - EN_TANKCOUNT = 1, //!< Number of tanks and Reservoirs - EN_LINKCOUNT = 2, //!< Number of links (Pipes + Pumps + Valves) - EN_PATCOUNT = 3, //!< Number of time patterns - EN_CURVECOUNT = 4, //!< Number of curves - EN_CONTROLCOUNT = 5, //!< Number of simple controls - EN_RULECOUNT = 6 //!< Number of rule-based controls -} EN_CountType; - -/// Node type codes -typedef enum { - EN_JUNCTION = 0, //!< Junction node - EN_RESERVOIR = 1, //!< Reservoir node - EN_TANK = 2 //!< Storage tank node -} EN_NodeType; - -/// Link type codes -typedef enum { - EN_CVPIPE = 0, //!< Pipe with check valve - EN_PIPE = 1, //!< Pipe - EN_PUMP = 2, //!< Pump - EN_PRV = 3, //!< Pressure reducing valve - EN_PSV = 4, //!< Pressure sustaining valve - EN_PBV = 5, //!< Pressure breaker valve - EN_FCV = 6, //!< Flow control valve - EN_TCV = 7, //!< Throttle control valve - EN_GPV = 8 //!< General purpose valve -} EN_LinkType; - -/// Water quality analysis types -typedef enum { - EN_NONE = 0, //!< No quality analysis - EN_CHEM = 1, //!< Chemical fate and transport - EN_AGE = 2, //!< Water age analysis - EN_TRACE = 3 //!< Source tracing analysis -} EN_QualityType; - -/// Water quality source types -typedef enum { - EN_CONCEN = 0, //!< Concentration inflow source - EN_MASS = 1, //!< Mass inflow source - EN_SETPOINT = 2, //!< Concentration setpoint source - EN_FLOWPACED = 3 //!< Concentration flow paced source -} EN_SourceType; - -/// Head loss formulas -typedef enum { - EN_HW = 0, //!< Hazen-Williams - EN_DW = 1, //!< Darcy-Weisbach - EN_CM = 2 //!< Chezy-Manning -} EN_HeadLossType; - -/// Flow units types -typedef enum { - EN_CFS = 0, - EN_GPM = 1, - EN_MGD = 2, - EN_IMGD = 3, - EN_AFD = 4, - EN_LPS = 5, - EN_LPM = 6, - EN_MLD = 7, - EN_CMH = 8, - EN_CMD = 9 -} EN_FlowUnits; - -/// Demand model types -typedef enum { - EN_DDA = 0, //!< Demand driven analysis - EN_PDA = 1 //!< Pressure driven analysis -} EN_DemandModel; - -/// Simulation Option codes -typedef enum { - EN_TRIALS = 0, //!> Maximum hydraulic trials allowed - EN_ACCURACY = 1, //!> Hydraulic convergence accuracy - EN_TOLERANCE = 2, //!> Water quality tolerance - EN_EMITEXPON = 3, //!> Exponent for emitter head loss formula - EN_DEMANDMULT = 4, //!> Global demand multiplier - EN_HEADERROR = 5, //!> Maximum allowable head loss error - EN_FLOWCHANGE = 6, //!> Maximum allowable flow change - EN_DEMANDDEFPAT = 7, //!> Default demand time pattern - EN_HEADLOSSFORM = 8 //!> Head loss formula code -} EN_Option; - -/// Simple control types -typedef enum { - EN_LOWLEVEL = 0, - EN_HILEVEL = 1, - EN_TIMER = 2, - EN_TIMEOFDAY = 3 -} EN_ControlType; - -/// Reporting statistic types -typedef enum { - EN_AVERAGE = 1, //!> Report average value over simulation period - EN_MINIMUM = 2, //!> Report minimum value over simulation period - EN_MAXIMUM = 3, //!> Report maximum value over simulation period - EN_RANGE = 4 //!> Report maximum - minimum over simulation period -} EN_StatisticType; - -/// Tank mixing models -typedef enum { - EN_MIX1 = 0, //!< Complete mix model - EN_MIX2 = 1, //!< 2-compartment model - EN_FIFO = 2, //!< First in, first out model - EN_LIFO = 3 //!< Last in, first out model -} EN_MixingModel; - -/// Hydraulic initialization options -typedef enum { - EN_NOSAVE = 0, //!> Don't save hydraulics; don't re-initialize flows - EN_SAVE = 1, //!> Save hydraulics to file, don't re-initialize flows - EN_INITFLOW = 10, //!> Don't save hydraulics; re-initialize flows - EN_SAVE_AND_INIT = 11 //!> Save hydraulics; re-initialize flows -} EN_SaveOption; - -/// Pump curve types -typedef enum { - EN_CONST_HP = 0, //!< Constant horsepower - EN_POWER_FUNC = 1, //!< Power function - EN_CUSTOM = 2, //!< User-defined custom curve - EN_NOCURVE = 3 //!< No curve -} EN_PumpType; - -/// Data curve types -typedef enum { - EN_V_CURVE = 0, //!< Tank volume curve - EN_P_CURVE = 1, //!< Pump characteristic curve - EN_E_CURVE = 2, //!< Pump efficiency curve - EN_H_CURVE = 3, //!< Valve head loss curve - EN_G_CURVE = 4 //!< General\default curve -} EN_CurveType; - -/// Deletion action types -typedef enum { - EN_UNCONDITIONAL = 0, //!> Delete all controls that contain object - EN_CONDITIONAL = 1 //!> Cancel object deletion if contained in controls -} EN_ActionCodeType; - -/// Rule object codes -typedef enum { - EN_R_NODE = 6, - EN_R_LINK = 7, - EN_R_SYSTEM = 8 -} EN_RuleObject; - -/// Rule variable codes -typedef enum { - EN_R_DEMAND = 0, - EN_R_HEAD = 1, - EN_R_GRADE = 2, - EN_R_LEVEL = 3, - EN_R_PRESSURE = 4, - EN_R_FLOW = 5, - EN_R_STATUS = 6, - EN_R_SETTING = 7, - EN_R_POWER = 8, - EN_R_TIME = 9, - EN_R_CLOCKTIME = 10, - EN_R_FILLTIME = 11, - EN_R_DRAINTIME = 12 -} EN_RuleVariable; - -/// Rule operator types -typedef enum { - EN_R_EQ = 0, - EN_R_NE = 1, - EN_R_LE = 2, - EN_R_GE = 3, - EN_R_LT = 4, - EN_R_GT = 5, - EN_R_IS = 6, - EN_R_NOT = 7, - EN_R_BELOW = 8, - EN_R_ABOVE = 9 -} EN_RuleOperator; - -/// Rule status types -typedef enum { - EN_R_IS_OPEN = 1, - EN_R_IS_CLOSED = 2, - EN_R_IS_ACTIVE = 3 -} EN_RuleStatus; - -/// Status report types -typedef enum { - EN_NO_REPORT = 0, - EN_NORMAL_REPORT = 1, - EN_FULL_REPORT = 2 -} EN_StatusReport; // --- Declare the EPANET toolkit functions #if defined(__cplusplus) extern "C" { #endif - + /** @brief The EPANET Project wrapper object */ @@ -356,1105 +74,8 @@ typedef struct Project *EN_Project; /******************************************************************** - System Functions - -********************************************************************/ - - /** - brief runs a complete EPANET simulation - param inpFile pointer to name of input file (must exist) - param rptFile pointer to name of report file (to be created) - param binOutFile pointer to name of binary output file (to be created) - param callback a callback function that takes a character string (char *) as its only parameter. - return 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. If this feature is not - needed then the argument should be NULL. - */ - int DLLEXPORT ENepanet(const char *inpFile, const char *rptFile, - const char *binOutFile, void (*callback) (char *)); - - /** - @brief Initializes an EPANET session - @param rptFile pointer to name of report file (to be created) - @param binOutFile pointer to name of binary output file (to be created) - @param UnitsType flow units flag - @param HeadlossFormula headloss formula flag - @return error code - */ - int DLLEXPORT ENinit(const char *rptFile, const char *binOutFile, - int UnitsType, int HeadlossFormula); - - /** - @brief Opens EPANET input file & reads in network data - @param inpFile pointer to name of input file (must exist) - @param rptFile pointer to name of report file (to be created) - @param binOutFile pointer to name of binary output file (to be created) - @return error code - */ - int DLLEXPORT ENopen(const char *inpFile, const char *rptFile, - const char *binOutFile); - - /** - @brief Saves current data to "INP" formatted text file. - @param filename The file path to create - @return Error code - */ - int DLLEXPORT ENsaveinpfile(const char *filename); - - /** - @brief Frees all memory and files used by EPANET - @return Error code - */ - int DLLEXPORT ENclose(); - -/******************************************************************** - - Hydraulic Analysis Functions - -********************************************************************/ - - /** - @brief Solves the network hydraulics for all time periods - @return Error code - */ - int DLLEXPORT ENsolveH(); - - /** - @brief Saves hydraulic results to binary file - @return Error code - - Must be called before ENreport() if no WQ simulation has been made. - Should not be called if ENsolveQ() will be used. - */ - int DLLEXPORT ENsaveH(); - - /** - @brief Sets up data structures for hydraulic analysis - @return Error code - */ - int DLLEXPORT ENopenH(); - - /** - @brief Initializes hydraulic analysis - @param initFlag 2-digit initialization flag - @return Error code - - 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 file (1) or not (0). - */ - int DLLEXPORT ENinitH(int initFlag); - - /** - @brief Run a hydraulic solution period - @param[out] currentTime The current simulation time in seconds - @return Error or warning code - @see ENsolveH - - This function is used in a loop with ENnextH() to run - an extended period hydraulic simulation. - See ENsolveH() for an example. - */ - int DLLEXPORT ENrunH(long *currentTime); - - /** - @brief Determine time (in seconds) until next hydraulic event - @param[out] tStep Time (seconds) until next hydraulic event. 0 marks end of simulation period. - @return Error code - - This function is used in a loop with ENrunH() to run an extended period hydraulic simulation. - See ENsolveH() for an example. - */ - int DLLEXPORT ENnextH(long *tStep); - - - /** - @brief Frees data allocated by hydraulics solver - @return Error code - */ - int DLLEXPORT ENcloseH(); - - /** - @brief Copies binary hydraulics file to disk - @param filename Name of file to be created - @return Error code - */ - int DLLEXPORT ENsavehydfile(char *filename); - - /** - @brief Opens previously saved binary hydraulics file - @param filename Name of file to be used - @return Error code - */ - int DLLEXPORT ENusehydfile(char *filename); - -/******************************************************************** - - Water Quality Analysis Functions - -********************************************************************/ - - /** - @brief Solves for network water quality in all time periods - @return Error code - */ - int DLLEXPORT ENsolveQ(); - - /** - @brief Sets up data structures for WQ analysis - @return Error code - */ - int DLLEXPORT ENopenQ(); - - /** - @brief Initializes water quality analysis - @param saveFlag EN_SAVE (1) if results saved to file, EN_NOSAVE (0) if not - @return Error code - */ - int DLLEXPORT ENinitQ(int saveFlag); - - /** - @brief Retrieves hydraulic & WQ results at time t. - @param[out] currentTime Current simulation time, in seconds. - @return Error code - - This function is used in a loop with ENnextQ() to run - an extended period WQ simulation. See ENsolveQ() for - an example. - */ - int DLLEXPORT ENrunQ(long *currentTime); - - /** - @brief Advances WQ simulation to next hydraulic event. - @param[out] tStep Time in seconds until next hydraulic event. 0 marks end of simulation period. - @return Error code - - This function is used in a loop with ENrunQ() to run - an extended period WQ simulation. See ENsolveQ() for - an example. - */ - int DLLEXPORT ENnextQ(long *tStep); - - /** - @brief Advances WQ simulation by a single WQ time step - @param[out] timeLeft Time left in overall simulation (in seconds) - @return Error code - - This function is used in a loop with ENrunQ() to run - an extended period WQ simulation. - */ - int DLLEXPORT ENstepQ(long *timeLeft); - - /** - @brief Frees data allocated by water quality solver. - @return Error code. - */ - int DLLEXPORT ENcloseQ(); - -/******************************************************************** - - Reporting Functions - -********************************************************************/ - - /** - @brief Writes line of text to the report file. - @param line Text string to write - @return Error code. - */ - int DLLEXPORT ENwriteline(char *line); - - /** - @brief Writes simulation report to the report file - @return Error code - */ - int DLLEXPORT ENreport(); - - /** - @brief Resets report options to default values - @return Error code - */ - int DLLEXPORT ENresetreport(); - - /** - @brief Processes a reporting format command - @return Error code - */ - int DLLEXPORT ENsetreport(char *reportFormat); - - /** - @brief Set the level of hydraulic status reporting. - @param code Status reporting code (see EN_StatusReport). - @return Error code. - */ - int DLLEXPORT ENsetstatusreport(int code); - - /** - @brief Get the API version number. - @param[out] version The version of EPANET - @return Error code. - - The version number is to be interpreted with implied decimals, i.e., - "20100" == "2(.)01(.)00" - */ - int DLLEXPORT ENgetversion(int *version); - - /** - @brief Retrieves the number of components of a given type in the network. - @param code Component code (see EPANET2.H) - @param[out] count Number of components in network - @return Error code - */ - int DLLEXPORT ENgetcount(int code, int *count); - - /** - @brief Get the text of an error code. - @param errcode The error code - @param[out] errmsg The error string represented by the code - @param maxLen The maximum number of characters to copy into the char pointer errmsg - @return Error code - */ - int DLLEXPORT ENgeterror(int errcode, char *errmsg, int maxLen); - - /** - @brief Get hydraulic simulation statistic - @param code The type of statistic to get - @param[out] value The value of the statistic - @return Error code - */ - int DLLEXPORT ENgetstatistic(int code, EN_API_FLOAT_TYPE* value); - -/******************************************************************** - - Analysis Options Functions - -********************************************************************/ - - /** - @brief Gets value for an analysis option - @param code Option code (see EPANET2.H) - @param[out] value Option value - @return Error code - */ - int DLLEXPORT ENgetoption(int code, EN_API_FLOAT_TYPE *value); - - /** - @brief Set a value for an anlysis option. - @param code The code for the desired option. - @param v The desired value for the option specified. - @return Error code. - @see EN_Option - */ - int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v); - - /** - @brief Retrieves the flow units code - @param[out] code Code of flow units in use - @return Error code - */ - int DLLEXPORT ENgetflowunits(int *code); - - /** - @brief Sets the flow units - @param code Code of flow units to use - @return Error code - */ - int DLLEXPORT ENsetflowunits(int code); - - /** - @brief Retrieves value of specific time parameter. - @param code Time parameter code - @param[out] value Value of time parameter. - @return Error code - */ - int DLLEXPORT ENgettimeparam(int code, long *value); - - /** - @brief Set the value for a time parameter. - @param code The code for the parameter to set. - @param value The desired value of the parameter. - @return Error code. - @see EN_TimeProperty - */ - int DLLEXPORT ENsettimeparam(int code, long value); - - /** - @brief Get information about the type of water quality analysis requested. - @param[out] qualcode Type of analysis to be made (see EN_QualityType). - @param[out] chemname Name of the quality constituent. - @param[out] chemunits Concentration units of the constituent. - @param[out] tracenode ID of node being traced (if applicable). - @return Error code. - */ - int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, - int *tracenode); - - /** - @brief Retrieve the type of quality analytis to be run. - @param[out] qualcode The quality analysis code number. - @param[out] tracenode The index of node being traced, if qualcode == trace - @return Error code - @see ENsetqualtype - */ - int DLLEXPORT ENgetqualtype(int *qualcode, int *tracenode); - - /** - @brief Set the type of quality analysis called for. - @param qualcode Type of analysis to be made (see EN_QualityType). - @param chemname Name of the quality constituent. - @param chemunits Concentration units of the constituent. - @param tracenode ID of node being traced (if applicable). - @return Error code. - - Note: "chemname" and "chemunits" only apply when "qualcode" is EN_CHEM. - "tracenode" only applies when 'qualcode" is EN_TRACE. - */ - int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, - char *tracenode); - -/******************************************************************** - - Node Functions - -********************************************************************/ - - /** - @brief Add a new node to the project. - @param id The name of the node to be added. - @param nodeType The type of node being added (see EN_NodeType) - @return Error code. - */ - int DLLEXPORT ENaddnode(char *id, EN_NodeType nodeType); - - /** - @brief Delete a node from the project. - @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 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 an error code is returned. - - */ - int DLLEXPORT ENdeletenode(int index, int actionCode); - - /** - @brief Get index of node with specified ID - @param id The string ID of the node - @param[out] index The node's index (first node is index 1) - @return Error code - @see ENgetnodeid - */ - int DLLEXPORT ENgetnodeindex(char *id, int *index); - - /** - @brief Get the string ID of the specified node. - @param index The index of the node (first node is index 1) - @param[out] id The string ID of the specified node. - @return Error code - @see ENgetnodeindex - - The ID string must be sized to hold at least MAXID characters. - */ - int DLLEXPORT ENgetnodeid(int index, char *id); - - /** - @brief Change the ID name for a node. - @param index The index of a node. First node is index 1. - @param newid A string containing the node's new ID name. - @return Error code. - */ - int DLLEXPORT ENsetnodeid(int index, char *newid); - - /** - @brief Get the type of node with specified index. - @param index The index of a node (first node is index 1) - @param[out] code The type code for the node (see the EN_NodeType enumeration) - @return Error code - */ - int DLLEXPORT ENgetnodetype(int index, int *code); - - /** - @brief Get a property value for specified node - @param index The index of a node (first node is index 1). - @param code The property type code - @param[out] value The value of the node's property. - @return Error code - @see EN_NodeProperty - */ - int DLLEXPORT ENgetnodevalue(int index, int code, EN_API_FLOAT_TYPE *value); - - /** - @brief Set a property value for a node. - @param index The index of a node. First node is index 1. - @param code The code for the proprty to set. - @param v The value to set for this node and property. - @return Error code. - @see EN_NodeProperty - */ - int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v); - - /** - @brief Get coordinates (x,y) for a node. - @param index The index of a node (first node is index 1). - @param[out] x X-value of node's coordinate - @param[out] y Y-value of node's coordinate - @return Error code - @see ENsetcoord - */ - int DLLEXPORT ENgetcoord(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); - - /** - @brief Set coordinates (x,y) for a node. - @param index The index of a node (first node is index 1) - @param x X-value of node's coordinate - @param y Y-value of node's coordinate - @return Error code - @see ENgetcoord - */ - int DLLEXPORT ENsetcoord(int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); - -/******************************************************************** - - Nodal Demand Functions - -********************************************************************/ - - /** - @brief Retrieves the type of demand model in use and its parameters - @param[out] type Type of demand model (EN_DDA or EN_PDA) - @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 Error code - */ - int DLLEXPORT ENgetdemandmodel(int *type, EN_API_FLOAT_TYPE *pmin, - EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); - - /** - @brief Sets the type of demand model to use and its parameters - @param type Type of demand model (EN_DDA or EN_PDA) - @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 Error code - */ - int DLLEXPORT ENsetdemandmodel(int type, EN_API_FLOAT_TYPE pmin, - EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); - - /** - @brief Get the number of demand categories for a node. - @param nodeIndex The index of a node (first node is index 1) - @param[out] numDemands The number of demand categories - @return Error code - */ - int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands); - - /** - @brief Get a node's base demand for a specified category. - @param nodeIndex The index of a node (first node is index 1) - @param demandIndex The index of the demand category (starting at 1) - @return Error code - */ - int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIndex, - EN_API_FLOAT_TYPE *baseDemand); - - /** - @brief Set a node's base demand for a demand category. - @param nodeIndex The node's index. - @param demandIndex The index of one of the node's demand categories. - @param baseDemand The base demand for the selected category. - @return Error code. - @see ENgetbasedemand - */ - int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIndex, - EN_API_FLOAT_TYPE baseDemand); - - /** - @brief Get the index of the demand pattern assigned to a node for a category index. - @param nodeIndex The index of a node (first node is index 1). - @param demandIndex The index of a category (first category is index 1). - @param[out] pattIndex The index of the pattern for this node and category. - @return Error code - */ - int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIndex, int *pattIndex); - - /** - @brief Set the time pattern assigned to a node's demand category. - @param nodeIndex The node's index. - @param demandIndex The index of one of the node's demand categories. - @param pattIndex The index of a time pattern applied to this demand category. - @return Error code - */ - int DLLEXPORT ENsetdemandpattern(int nodeIndex, int demandIndex, int patIndex); - - /** - @brief Retrieve the name of a node's demand category. - @param nodeIndex The node's index. - @param demandIdx Index of the node's demand. - @param demandName[out] Name of the category the demand belongs to. - @return Error code. - */ - int DLLEXPORT ENgetdemandname(int nodeIndex, int demandIdx, char *demandName); - - /** - @brief Set the name of a node's demand category. - @param nodeIndex The node's index. - @param demandIdx Index of the node's demand. - @param demandName Name for the category the demand belongs to. - @return Error code. - */ - int DLLEXPORT ENsetdemandname(int nodeIndex, int demandIdx, char *demandName); - -/******************************************************************** - - Link Functions - -********************************************************************/ - - /** - @brief Add a new link to the project. - @param id The name of the link to be added. - @param linkType The type of link being added (see EN_LinkType) - @param fromNode The id of the link's starting node - @param toNode The id of the link's ending node - @return Error code. - */ - int DLLEXPORT ENaddlink(char *id, EN_LinkType linkType, char *fromNode, char *toNode); - - /** - @brief Delete a link from the project. - @param index The index of the link to be deleted. - @param ctrlsCode The action taken if any control contains the link. - @return Error code. - - If 'actionCode' is EN_UNCONDITIONAL then the link an 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 an error code is returned. - - */ - int DLLEXPORT ENdeletelink(int index, int actionCode); - - /** - @brief Get the index of a Link with specified ID. - @param id The string ID of a link. - @param[out] index The index of the named link (first link is index 1) - @return Error code - @see ENgetlinkid - */ - int DLLEXPORT ENgetlinkindex(char *id, int *index); - - /** - @brief Get the string ID of a link with specified index - @param index The index of a link (first link is index 1) - @param[out] id The ID of the link. - @return Error code - @see ENgetlinkindex - - The ID string must be sized to hold at least MAXID characters. - */ - int DLLEXPORT ENgetlinkid(int index, char *id); - - /** - @brief Change the ID name for a link. - @param index The index of a link. First link is index 1. - @param newid A string containing the link's new ID name. - @return Error code. - */ - int DLLEXPORT ENsetlinkid(int index, char *newid); - - /** - @brief Get the link type code for a specified link - @param index The index of a link (first link is index 1) - @param[out] code The type code of the link (see the EN_LinkType enumeration) - @return Error code - @see EN_LinkType - */ - int DLLEXPORT ENgetlinktype(int index, EN_LinkType *code); - - /** - @brief Set the link type code for a specified link - @param[in,out] index The index of a link before [in] and after [out] the type change - @param code The new type code of the link (see EN_LinkType). - @param actionCode Action taken if any controls contain the link. - @return Error code - @see the EN_LinkType enumeration - - 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 an error code is returned. - */ - int DLLEXPORT ENsetlinktype(int *index, EN_LinkType Code, int actionCode); - - /** - @brief Get the indexes of a link's start- and end-nodes. - @param index The index of a link (first link is index 1) - @param[out] node1 The index of the link's start node (first node is index 1). - @param[out] node2 The index of the link's end node (first node is index 1). - @return Error code - @see ENgetnodeid, ENgetlinkid - */ - int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2); - - /** - @brief Set the indexes of a link's start- and end-nodes. - @param index The index of a link (first link is index 1) - @param node1 The index of the link's start node (first node is index 1). - @param node2 The index of the link's end node (first node is index 1). - @return Error code - @see ENsetnodeid, ENsetlinkid - */ - int DLLEXPORT ENsetlinknodes(int index, int node1, int node2); - - /** - @brief Get a property value for specified link. - @param index The index of a node (first node is index 1). - @param code The parameter desired. - @param[out] value The value of the link's specified property. - @return Error code - @see ENgetnodevalue, EN_LinkProperty - */ - int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value); - - /** - @brief Set a property value for a link. - @param index The index of a link. First link is index 1. - @param code The code for the property to set. - @param v The value to set for this link and property. - @return Error code. - @see EN_LinkProperty - */ - int DLLEXPORT ENsetlinkvalue(int index, int code, EN_API_FLOAT_TYPE v); - -/******************************************************************** - - Pump Functions - -********************************************************************/ - - /** - @brief Get the type of pump - @param linkIndex The index of the pump element - @param[out] outType The integer-typed pump curve type signifier (output parameter) - @return Error code - @see EN_PumpType - */ - int DLLEXPORT ENgetpumptype(int linkIndex, int *outType); - - /** - @brief Retrieves the curve index for a specified pump index. - @param pumpIndex The index of a pump - @param[out] curveIndex The index of the curve used by the pump. - @return Error code. - */ - int DLLEXPORT ENgetheadcurveindex(int pumpIndex, int *curveIndex); - - /** - @brief Sets the curve id for a specified pump index. - @param pumpIndex The index of the pump - @param curveIndex The index of the curve used by the pump - @return Error code. - */ - int DLLEXPORT ENsetheadcurveindex(int pumpIndex, int curveIndex); - -/******************************************************************** - - Time Pattern Functions - -********************************************************************/ - - /** - @brief Add a new time pattern. - @param id The string ID of the pattern to add. - @return Error code. - @see ENgetpatternindex - */ - int DLLEXPORT ENaddpattern(char *id); - - /** - @brief Retrieves the index of the time pattern with specified ID - @param id String ID of the time pattern - @param[out] index Index of the specified time pattern - @return Error code - @see ENgetpatternid - */ - int DLLEXPORT ENgetpatternindex(char *id, int *index); - - /** - @brief Retrieves ID of a time pattern with specific index. - @param index The index of a time pattern. - @param[out] id The string ID of the time pattern. - @return Error code - @see ENgetpatternindex - */ - int DLLEXPORT ENgetpatternid(int index, char *id); - - /** - @brief Retrieves the number of multipliers in a time pattern. - @param index The index of a time pattern. - @param[out] len The length of the time pattern. - @return Error code - */ - int DLLEXPORT ENgetpatternlen(int index, int *len); - - /** - @brief Retrive a multiplier from a pattern for a specific time period. - @param index The index of a time pattern - @param period The pattern time period. First time period is 1. - @param[out] value Pattern multiplier - @return Error code - */ - int DLLEXPORT ENgetpatternvalue(int index, int period, EN_API_FLOAT_TYPE *value); - - /** - @brief Set the multiplier for a specific pattern at a specific period. - @param index The index of a pattern. First pattern is index 1. - @param period The period of the pattern to set. - @param value The value of the multiplier to set. - @return Error code. - */ - int DLLEXPORT ENsetpatternvalue(int index, int period, EN_API_FLOAT_TYPE value); - - /** - @brief Retrieve the average multiplier value in a time pattern - @param index The index of a time pattern - @param[out] value The average of all of this time pattern's values - @return Error code - */ - int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value); - - /** - @brief Set multipliers for a specific pattern - @param index The index of a pattern. First pattern is index 1. - @param f An array of multipliers - @param len The length of array f. - @return Error code. - @see ENgetpatternindex - */ - int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *f, int len); - -/******************************************************************** - - Data Curve Functions - -********************************************************************/ - - /** - @brief Add a new curve to the project. - @param id The name of the curve to be added. - @return Error code. - @see ENgetcurveindex ENsetcurve - */ - int DLLEXPORT ENaddcurve(char *id); - - /** - @brief Retrieve the index of a curve given its name. - @param id The ID name of a curve. - @param[out] index The index of the named curve. - @return Error code. - @see ENgetcurveid - */ - int DLLEXPORT ENgetcurveindex(char *id, int *index); - - /** - @brief Retrieve the ID name of a curve given its index. - @param index The index of a curve. - @param[out] id The ID of the specified curve. - @return Error code. - @see ENsetcurveindex - - NOTE: 'id' must be sized to hold MAXID characters. - */ - int DLLEXPORT ENgetcurveid(int index, char *id); - - /** - @brief Retrieve the number of points in a curve. - @param index The index of a curve. - @param[out] len The number of data points assigned to the curve. - @return Error code. - @see ENgetcurvevalue - */ - int DLLEXPORT ENgetcurvelen(int index, int *len); - - /** - @brief Get the type of a curve - @param curveIndex The index of the curve element - @param[out] outType The integer-typed curve curve type signifier (output parameter) - @return Error code - @see EN_CurveType - */ - int DLLEXPORT ENgetcurvetype(int curveIndex, int *outType); - - /** - @brief Retrieve an x,y data point for a curve. - @param curveIndex The index of a curve. - @param pointIndex The index of a point in the curve. - @param[out] x The x-value of the specified point. - @param[out] y The y-value of the specified point. - @return Error code. - @see ENgetcurvelen ENsetcurvevalue - */ - int DLLEXPORT ENgetcurvevalue(int curveIndex, int pointIndex, - EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); - - /** - @brief Set the x and y values for a curve's data point. - @param curveIndex The index of a curve. - @param pointIndex The index of a point in the curve. - @param x The x-value of the point. - @param y The y-value of the point. - @return Error code. - */ - int DLLEXPORT ENsetcurvevalue(int curveIndex, int pointIndex, - EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); - - /** - @brief Get a curve's properties. - @param curveIndex The index of a curve (first curve is index 1). - @param[out] id The curve's string ID. Client code must preallocate at least MAXID characters. - @param[out] nValues The number of values in the curve's (x,y) list. - @param[out] xValues The curve's x-values. Pointer must be freed by client. - @param[out] yValues The curve's y-values. Pointer must be freed by client. - @return Error code. - - The calling program is responsible for making xValues and yValues large enough - to hold nValues number of data points. - */ - int DLLEXPORT ENgetcurve(int curveIndex, char* id, int *nValues, - EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues); - - /** - @brief Set the x,y values for all points on a curve. - @param index The index of a curve. - @param x An array of x-values for the curve. - @param y An array of y-values for the curve. - @param len The length of the arrays for x and y. - @return Error code. - */ - int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, - EN_API_FLOAT_TYPE *y, int len); - -/******************************************************************** - - Simple Controls Functions - -********************************************************************/ - - /** - @brief Add a new simple control to the project. - @param[out] index The index of the new control. First control is index 1. - @param ctype The type of control to add (see EN_ControlType). - @param lindex The index of a link to control. - @param setting The control setting applied to the link. - @param nindex The index of a node used to control the link, or 0 for TIMER / TIMEOFDAY control. - @param level control point (tank level, junction pressure, or time in seconds). - @return Error code. - */ - int DLLEXPORT ENaddcontrol(int *index, int ctype, int lindex, EN_API_FLOAT_TYPE setting, - int nindex, EN_API_FLOAT_TYPE level); - - /** - @brief Delete an existing simple control - @param index The index of the control. First control is index 1. - @return Error code. - */ - int DLLEXPORT ENdeletecontrol(int index); - - /** - @brief Retrieves properties that define a simple control - @param index Position of control in list of controls added to the project - @param[out] ctype Control type code (see EN_ControlType enumeration) - @param[out] lindex Index of controlled link - @param[out] setting Control setting on link - @param[out] nindex Index of controlling node (0 for TIMER or TIMEOFDAY control) - @param[out] level Control level (tank level, junction pressure, or time (seconds)) - @return Error code - */ - int DLLEXPORT ENgetcontrol(int index, int *ctype, int *lindex, EN_API_FLOAT_TYPE *setting, - int *nindex, EN_API_FLOAT_TYPE *level); - - /** - @brief Set the properties of an existing simple control. - @param cindex The index of the control. First control is index 1. - @param ctype The type of control to use (see EN_ControlType). - @param lindex The index of a link to control. - @param setting The control setting applied to the link. - @param nindex The index of a node used to control the link, or 0 for TIMER / TIMEOFDAY control. - @param level control point (tank level, junction pressure, or time in seconds). - @return Error code. - */ - int DLLEXPORT ENsetcontrol(int cindex, int ctype, int lindex, - EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); - - -/******************************************************************** - - Rule-Based Controls Functions - -********************************************************************/ - - /** - @brief Add a new control rule to the project. - @param rule Text of the rule following the format used in an EPANET input file. - @return Error code. - */ - int DLLEXPORT ENaddrule(char *rule); - - /** - @brief Delete a rule-based control. - @param index The rule's index. - @return Error code. - */ - int DLLEXPORT ENdeleterule(int index); - - /** - @brief Get summary information for a rule-based control. - @param index The rule's index. - @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 nElseActions[out] Number of actions in the rule's ELSE section. - @param priority[out] Rule's priority. - @return Error code. - */ - int DLLEXPORT ENgetrule(int index, int *nPremises, int *nTrueActions, - int *nFalseActions, EN_API_FLOAT_TYPE *priority); - - /** - @brief Get the ID name of a rule-based control. - @param index The rule's index. - @param id[out] The rule's ID name. - @return Error code. - */ - int DLLEXPORT ENgetruleID(int index, char* id); - - /** - @brief Get the properties of a premise in a rule-based control. - @param ruleIndex The rule's index. - @param premiseIndex The premise's index. - @param logop[out] Logical operator (IF = 1, AND = 2, OR = 3) of the premise. - @param object[out] Type of object the premise is looking at (see EN_RuleObject). - @param objIndex[out] Index of the object (e.g. the index of the tank). - @param variable[out] Index of the variable to be checked (see EN_RuleVariable). - @param relop[out] Relationship operator in the premise (see EN_RuleOperator). - @param status[out] Status of the object being checked (see EN_RuleStatus). - @param value[out] Setting of the variable being checked (e.g. 5.5) - @return Error code. - */ - int DLLEXPORT ENgetpremise(int ruleIndex, int premiseIndex, int *logop, - int *object, int *objIndex, int *variable, - int *relop, int *status, EN_API_FLOAT_TYPE *value); - - /** - @brief Set the properties of a premise in a rule-based control. - @param ruleIndex The rule's index. - @param premiseIndex The premise's index. - @param logop Logical operator (IF = 1, AND = 2, OR = 3) of the premise. - @param object Type of object the premise is looking at (see EN_RuleObject). - @param objIndex Index of the object (e.g. the index of the tank). - @param variable Index of the variable to be checked (see EN_RuleVariable). - @param relop Relationship operator in the premise (see EN_RuleOperator). - @param status Status of the object being checked (see EN_RuleStatus). - @param value Setting of the variable being checked (e.g. 5.5) - @return Error code. - */ - int DLLEXPORT ENsetpremise(int ruleIndex, int premiseIndex, int logop, - int object, int objIndex, int variable, int relop, - int status, EN_API_FLOAT_TYPE value); - - /** - @brief Set the index of an object in a premise of a rule-based control. - @param ruleIndex The rule's index. - @param premiseIndex The premise's index. - @param objIndex The index of the premise's object (e.g. the index of the tank). - @return Error code. - */ - int DLLEXPORT ENsetpremiseindex(int ruleIndex, int premiseIndex, int objIndex); - - /** - @brief Set the status in a premise of a rule-based control. - @param ruleIndex The rule's index. - @param premiseIndex The premise's index. - @param status The status of the object being checked (see EN_RuleStatus) - @return Error code. - */ - int DLLEXPORT ENsetpremisestatus(int ruleIndex, int premiseIndex, int status); - - /** - @brief Set the value in a premise of a rule-based control. - @param ruleIndex The rule's index. - @param premiseIndex The premise's index. - @param value The value of the premise's variable being checked (e.g. 5.5) - @return Error code. - */ - int DLLEXPORT ENsetpremisevalue(int ruleIndex, int premiseIndex, - EN_API_FLOAT_TYPE value); - - /** - @brief Get the properties of a THEN action in a rule-based control. - @param ruleIndex The rule's index. - @param actionIndex Index of the THEN action to retrieve. - @param linkIndex[out] Index of the link in the action (e.g. index of Pump 1) - @param status[out] Status of the link (see EN_RuleStatus) - @param setting[out] Value of the link's setting (e.g. pump speed 0.9) - @return Error code. - */ - int DLLEXPORT ENgetthenaction(int ruleIndex, int actionIndex, int *linkIndex, - int *status, EN_API_FLOAT_TYPE *setting); - - /** - @brief Set the properties of a THEN action in a rule-based control. - @param ruleIndex The rule's index. - @param actionIndex Index of the THEN action to modify. - @param linkIndex Index of the link in the action (e.g. index of Pump 1) - @param status Status assigned to the link (e.g. CLOSED) - @param setting Setting value assigned to the link (e.g. pump speed 0.9) - @return Error code. - */ - int DLLEXPORT ENsetthenaction(int ruleIndex, int actionIndex, int linkIndex, - int status, EN_API_FLOAT_TYPE setting); - - /** - @brief Get the properties of an ELSE action in a rule-based control. - @param ruleIndex The rule's index. - @param actionIndex Index of the ELSE action to retrieve. - @param linkIndex[out] Index of the link in the action (e.g. index of Pump 1). - @param status[out] Status of the link (see EN_RuleStatus). - @param setting[out] Value of the link's setting (e.g. pump speed 0.9) - @return Error code. - */ - int DLLEXPORT ENgetelseaction(int ruleIndex, int actionIndex, int *linkIndex, - int *status, EN_API_FLOAT_TYPE *setting); - - /** - @brief Set the properties of an ELSE action in a rule-based control. - @param ruleIndex The rule's index. - @param actionIndex Index of the ELSE action being modified. - @param linkIndex Index of the link in the action (e.g. index of Pump 1) - @param status Status assigned to the link (see EN_RuleStatus) - @param setting Setting value assigned to the link (e.g. pump speed 0.9) - @return Error code. - */ - int DLLEXPORT ENsetelseaction(int ruleIndex, int actionIndex, int linkIndex, - int status, EN_API_FLOAT_TYPE setting); - - /** - @brief Set the priority of a rule-based control. - @param index The rule's index. - @param priority The priority assigned to the rule. - @return Error code. - */ - int DLLEXPORT ENsetrulepriority(int index, EN_API_FLOAT_TYPE priority); - -/******************************************************************** - Threadsafe versions of all EPANET functions - + ********************************************************************/ int DLLEXPORT EN_createproject(EN_Project *ph); @@ -1616,7 +237,8 @@ typedef struct Project *EN_Project; int DLLEXPORT EN_setelseaction(EN_Project ph, int ruleIndex, int actionIndex, int linkIndex, int status, EN_API_FLOAT_TYPE setting); int DLLEXPORT EN_setrulepriority(EN_Project ph, int index, EN_API_FLOAT_TYPE priority); - + + #if defined(__cplusplus) } #endif diff --git a/include/epanet2_1.h b/include/epanet2_1.h new file mode 100644 index 0000000..d37def0 --- /dev/null +++ b/include/epanet2_1.h @@ -0,0 +1,1170 @@ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet2_1.h + Description: declarations for the EPANET 2.1 API functions + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 11/29/2018 + ****************************************************************************** + */ + + +#ifndef EPANET2_1_H +#define EPANET2_1_H + + +// the toolkit can be compiled with support for double-precision as well. +// just make sure that you use the correct #define in your client code. +#ifndef EN_API_FLOAT_TYPE + #define EN_API_FLOAT_TYPE float +#endif + +#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 + #elif defined(__APPLE__) + #ifdef __cplusplus + #define DLLEXPORT + #else + #define DLLEXPORT + #endif + #else + #define DLLEXPORT + #endif + #endif +#endif + +#include "epanet2_enums.h" + + +// --- Declare the EPANET toolkit functions +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************** + + System Functions + +********************************************************************/ + + /** + brief runs a complete EPANET simulation + param inpFile pointer to name of input file (must exist) + param rptFile pointer to name of report file (to be created) + param binOutFile pointer to name of binary output file (to be created) + param callback a callback function that takes a character string (char *) as its only parameter. + return 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. If this feature is not + needed then the argument should be NULL. + */ + int DLLEXPORT ENepanet(const char *inpFile, const char *rptFile, + const char *binOutFile, void (*callback) (char *)); + + /** + @brief Initializes an EPANET session + @param rptFile pointer to name of report file (to be created) + @param binOutFile pointer to name of binary output file (to be created) + @param UnitsType flow units flag + @param HeadlossFormula headloss formula flag + @return error code + */ + int DLLEXPORT ENinit(const char *rptFile, const char *binOutFile, + int UnitsType, int HeadlossFormula); + + /** + @brief Opens EPANET input file & reads in network data + @param inpFile pointer to name of input file (must exist) + @param rptFile pointer to name of report file (to be created) + @param binOutFile pointer to name of binary output file (to be created) + @return error code + */ + int DLLEXPORT ENopen(const char *inpFile, const char *rptFile, + const char *binOutFile); + + /** + @brief Saves current data to "INP" formatted text file. + @param filename The file path to create + @return Error code + */ + int DLLEXPORT ENsaveinpfile(const char *filename); + + /** + @brief Frees all memory and files used by EPANET + @return Error code + */ + int DLLEXPORT ENclose(); + +/******************************************************************** + + Hydraulic Analysis Functions + +********************************************************************/ + + /** + @brief Solves the network hydraulics for all time periods + @return Error code + */ + int DLLEXPORT ENsolveH(); + + /** + @brief Saves hydraulic results to binary file + @return Error code + + Must be called before ENreport() if no WQ simulation has been made. + Should not be called if ENsolveQ() will be used. + */ + int DLLEXPORT ENsaveH(); + + /** + @brief Sets up data structures for hydraulic analysis + @return Error code + */ + int DLLEXPORT ENopenH(); + + /** + @brief Initializes hydraulic analysis + @param initFlag 2-digit initialization flag + @return Error code + + 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 file (1) or not (0). + */ + int DLLEXPORT ENinitH(int initFlag); + + /** + @brief Run a hydraulic solution period + @param[out] currentTime The current simulation time in seconds + @return Error or warning code + @see ENsolveH + + This function is used in a loop with ENnextH() to run + an extended period hydraulic simulation. + See ENsolveH() for an example. + */ + int DLLEXPORT ENrunH(long *currentTime); + + /** + @brief Determine time (in seconds) until next hydraulic event + @param[out] tStep Time (seconds) until next hydraulic event. 0 marks end of simulation period. + @return Error code + + This function is used in a loop with ENrunH() to run an extended period hydraulic simulation. + See ENsolveH() for an example. + */ + int DLLEXPORT ENnextH(long *tStep); + + + /** + @brief Frees data allocated by hydraulics solver + @return Error code + */ + int DLLEXPORT ENcloseH(); + + /** + @brief Copies binary hydraulics file to disk + @param filename Name of file to be created + @return Error code + */ + int DLLEXPORT ENsavehydfile(char *filename); + + /** + @brief Opens previously saved binary hydraulics file + @param filename Name of file to be used + @return Error code + */ + int DLLEXPORT ENusehydfile(char *filename); + +/******************************************************************** + + Water Quality Analysis Functions + +********************************************************************/ + + /** + @brief Solves for network water quality in all time periods + @return Error code + */ + int DLLEXPORT ENsolveQ(); + + /** + @brief Sets up data structures for WQ analysis + @return Error code + */ + int DLLEXPORT ENopenQ(); + + /** + @brief Initializes water quality analysis + @param saveFlag EN_SAVE (1) if results saved to file, EN_NOSAVE (0) if not + @return Error code + */ + int DLLEXPORT ENinitQ(int saveFlag); + + /** + @brief Retrieves hydraulic & WQ results at time t. + @param[out] currentTime Current simulation time, in seconds. + @return Error code + + This function is used in a loop with ENnextQ() to run + an extended period WQ simulation. See ENsolveQ() for + an example. + */ + int DLLEXPORT ENrunQ(long *currentTime); + + /** + @brief Advances WQ simulation to next hydraulic event. + @param[out] tStep Time in seconds until next hydraulic event. 0 marks end of simulation period. + @return Error code + + This function is used in a loop with ENrunQ() to run + an extended period WQ simulation. See ENsolveQ() for + an example. + */ + int DLLEXPORT ENnextQ(long *tStep); + + /** + @brief Advances WQ simulation by a single WQ time step + @param[out] timeLeft Time left in overall simulation (in seconds) + @return Error code + + This function is used in a loop with ENrunQ() to run + an extended period WQ simulation. + */ + int DLLEXPORT ENstepQ(long *timeLeft); + + /** + @brief Frees data allocated by water quality solver. + @return Error code. + */ + int DLLEXPORT ENcloseQ(); + +/******************************************************************** + + Reporting Functions + +********************************************************************/ + + /** + @brief Writes line of text to the report file. + @param line Text string to write + @return Error code. + */ + int DLLEXPORT ENwriteline(char *line); + + /** + @brief Writes simulation report to the report file + @return Error code + */ + int DLLEXPORT ENreport(); + + /** + @brief Resets report options to default values + @return Error code + */ + int DLLEXPORT ENresetreport(); + + /** + @brief Processes a reporting format command + @return Error code + */ + int DLLEXPORT ENsetreport(char *reportFormat); + + /** + @brief Set the level of hydraulic status reporting. + @param code Status reporting code (see EN_StatusReport). + @return Error code. + */ + int DLLEXPORT ENsetstatusreport(int code); + + /** + @brief Get the API version number. + @param[out] version The version of EPANET + @return Error code. + + The version number is to be interpreted with implied decimals, i.e., + "20100" == "2(.)01(.)00" + */ + int DLLEXPORT ENgetversion(int *version); + + /** + @brief Retrieves the number of components of a given type in the network. + @param code Component code (see EPANET2.H) + @param[out] count Number of components in network + @return Error code + */ + int DLLEXPORT ENgetcount(int code, int *count); + + /** + @brief Get the text of an error code. + @param errcode The error code + @param[out] errmsg The error string represented by the code + @param maxLen The maximum number of characters to copy into the char pointer errmsg + @return Error code + */ + int DLLEXPORT ENgeterror(int errcode, char *errmsg, int maxLen); + + /** + @brief Get hydraulic simulation statistic + @param code The type of statistic to get + @param[out] value The value of the statistic + @return Error code + */ + int DLLEXPORT ENgetstatistic(int code, EN_API_FLOAT_TYPE* value); + +/******************************************************************** + + Analysis Options Functions + +********************************************************************/ + + /** + @brief Gets value for an analysis option + @param code Option code (see EPANET2.H) + @param[out] value Option value + @return Error code + */ + int DLLEXPORT ENgetoption(int code, EN_API_FLOAT_TYPE *value); + + /** + @brief Set a value for an anlysis option. + @param code The code for the desired option. + @param v The desired value for the option specified. + @return Error code. + @see EN_Option + */ + int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v); + + /** + @brief Retrieves the flow units code + @param[out] code Code of flow units in use + @return Error code + */ + int DLLEXPORT ENgetflowunits(int *code); + + /** + @brief Sets the flow units + @param code Code of flow units to use + @return Error code + */ + int DLLEXPORT ENsetflowunits(int code); + + /** + @brief Retrieves value of specific time parameter. + @param code Time parameter code + @param[out] value Value of time parameter. + @return Error code + */ + int DLLEXPORT ENgettimeparam(int code, long *value); + + /** + @brief Set the value for a time parameter. + @param code The code for the parameter to set. + @param value The desired value of the parameter. + @return Error code. + @see EN_TimeProperty + */ + int DLLEXPORT ENsettimeparam(int code, long value); + + /** + @brief Get information about the type of water quality analysis requested. + @param[out] qualcode Type of analysis to be made (see EN_QualityType). + @param[out] chemname Name of the quality constituent. + @param[out] chemunits Concentration units of the constituent. + @param[out] tracenode ID of node being traced (if applicable). + @return Error code. + */ + int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, + int *tracenode); + + /** + @brief Retrieve the type of quality analytis to be run. + @param[out] qualcode The quality analysis code number. + @param[out] tracenode The index of node being traced, if qualcode == trace + @return Error code + @see ENsetqualtype + */ + int DLLEXPORT ENgetqualtype(int *qualcode, int *tracenode); + + /** + @brief Set the type of quality analysis called for. + @param qualcode Type of analysis to be made (see EN_QualityType). + @param chemname Name of the quality constituent. + @param chemunits Concentration units of the constituent. + @param tracenode ID of node being traced (if applicable). + @return Error code. + + Note: "chemname" and "chemunits" only apply when "qualcode" is EN_CHEM. + "tracenode" only applies when 'qualcode" is EN_TRACE. + */ + int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, + char *tracenode); + +/******************************************************************** + + Node Functions + +********************************************************************/ + + /** + @brief Add a new node to the project. + @param id The name of the node to be added. + @param nodeType The type of node being added (see EN_NodeType) + @return Error code. + */ + int DLLEXPORT ENaddnode(char *id, EN_NodeType nodeType); + + /** + @brief Delete a node from the project. + @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 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 an error code is returned. + + */ + int DLLEXPORT ENdeletenode(int index, int actionCode); + + /** + @brief Get index of node with specified ID + @param id The string ID of the node + @param[out] index The node's index (first node is index 1) + @return Error code + @see ENgetnodeid + */ + int DLLEXPORT ENgetnodeindex(char *id, int *index); + + /** + @brief Get the string ID of the specified node. + @param index The index of the node (first node is index 1) + @param[out] id The string ID of the specified node. + @return Error code + @see ENgetnodeindex + + The ID string must be sized to hold at least MAXID characters. + */ + int DLLEXPORT ENgetnodeid(int index, char *id); + + /** + @brief Change the ID name for a node. + @param index The index of a node. First node is index 1. + @param newid A string containing the node's new ID name. + @return Error code. + */ + int DLLEXPORT ENsetnodeid(int index, char *newid); + + /** + @brief Get the type of node with specified index. + @param index The index of a node (first node is index 1) + @param[out] code The type code for the node (see the EN_NodeType enumeration) + @return Error code + */ + int DLLEXPORT ENgetnodetype(int index, int *code); + + /** + @brief Get a property value for specified node + @param index The index of a node (first node is index 1). + @param code The property type code + @param[out] value The value of the node's property. + @return Error code + @see EN_NodeProperty + */ + int DLLEXPORT ENgetnodevalue(int index, int code, EN_API_FLOAT_TYPE *value); + + /** + @brief Set a property value for a node. + @param index The index of a node. First node is index 1. + @param code The code for the proprty to set. + @param v The value to set for this node and property. + @return Error code. + @see EN_NodeProperty + */ + int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v); + + /** + @brief Get coordinates (x,y) for a node. + @param index The index of a node (first node is index 1). + @param[out] x X-value of node's coordinate + @param[out] y Y-value of node's coordinate + @return Error code + @see ENsetcoord + */ + int DLLEXPORT ENgetcoord(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); + + /** + @brief Set coordinates (x,y) for a node. + @param index The index of a node (first node is index 1) + @param x X-value of node's coordinate + @param y Y-value of node's coordinate + @return Error code + @see ENgetcoord + */ + int DLLEXPORT ENsetcoord(int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); + +/******************************************************************** + + Nodal Demand Functions + +********************************************************************/ + + /** + @brief Retrieves the type of demand model in use and its parameters + @param[out] type Type of demand model (EN_DDA or EN_PDA) + @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 Error code + */ + int DLLEXPORT ENgetdemandmodel(int *type, EN_API_FLOAT_TYPE *pmin, + EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); + + /** + @brief Sets the type of demand model to use and its parameters + @param type Type of demand model (EN_DDA or EN_PDA) + @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 Error code + */ + int DLLEXPORT ENsetdemandmodel(int type, EN_API_FLOAT_TYPE pmin, + EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); + + /** + @brief Get the number of demand categories for a node. + @param nodeIndex The index of a node (first node is index 1) + @param[out] numDemands The number of demand categories + @return Error code + */ + int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands); + + /** + @brief Get a node's base demand for a specified category. + @param nodeIndex The index of a node (first node is index 1) + @param demandIndex The index of the demand category (starting at 1) + @return Error code + */ + int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIndex, + EN_API_FLOAT_TYPE *baseDemand); + + /** + @brief Set a node's base demand for a demand category. + @param nodeIndex The node's index. + @param demandIndex The index of one of the node's demand categories. + @param baseDemand The base demand for the selected category. + @return Error code. + @see ENgetbasedemand + */ + int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIndex, + EN_API_FLOAT_TYPE baseDemand); + + /** + @brief Get the index of the demand pattern assigned to a node for a category index. + @param nodeIndex The index of a node (first node is index 1). + @param demandIndex The index of a category (first category is index 1). + @param[out] pattIndex The index of the pattern for this node and category. + @return Error code + */ + int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIndex, int *pattIndex); + + /** + @brief Set the time pattern assigned to a node's demand category. + @param nodeIndex The node's index. + @param demandIndex The index of one of the node's demand categories. + @param pattIndex The index of a time pattern applied to this demand category. + @return Error code + */ + int DLLEXPORT ENsetdemandpattern(int nodeIndex, int demandIndex, int patIndex); + + /** + @brief Retrieve the name of a node's demand category. + @param nodeIndex The node's index. + @param demandIdx Index of the node's demand. + @param demandName[out] Name of the category the demand belongs to. + @return Error code. + */ + int DLLEXPORT ENgetdemandname(int nodeIndex, int demandIdx, char *demandName); + + /** + @brief Set the name of a node's demand category. + @param nodeIndex The node's index. + @param demandIdx Index of the node's demand. + @param demandName Name for the category the demand belongs to. + @return Error code. + */ + int DLLEXPORT ENsetdemandname(int nodeIndex, int demandIdx, char *demandName); + +/******************************************************************** + + Link Functions + +********************************************************************/ + + /** + @brief Add a new link to the project. + @param id The name of the link to be added. + @param linkType The type of link being added (see EN_LinkType) + @param fromNode The id of the link's starting node + @param toNode The id of the link's ending node + @return Error code. + */ + int DLLEXPORT ENaddlink(char *id, EN_LinkType linkType, char *fromNode, char *toNode); + + /** + @brief Delete a link from the project. + @param index The index of the link to be deleted. + @param ctrlsCode The action taken if any control contains the link. + @return Error code. + + If 'actionCode' is EN_UNCONDITIONAL then the link an 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 an error code is returned. + + */ + int DLLEXPORT ENdeletelink(int index, int actionCode); + + /** + @brief Get the index of a Link with specified ID. + @param id The string ID of a link. + @param[out] index The index of the named link (first link is index 1) + @return Error code + @see ENgetlinkid + */ + int DLLEXPORT ENgetlinkindex(char *id, int *index); + + /** + @brief Get the string ID of a link with specified index + @param index The index of a link (first link is index 1) + @param[out] id The ID of the link. + @return Error code + @see ENgetlinkindex + + The ID string must be sized to hold at least MAXID characters. + */ + int DLLEXPORT ENgetlinkid(int index, char *id); + + /** + @brief Change the ID name for a link. + @param index The index of a link. First link is index 1. + @param newid A string containing the link's new ID name. + @return Error code. + */ + int DLLEXPORT ENsetlinkid(int index, char *newid); + + /** + @brief Get the link type code for a specified link + @param index The index of a link (first link is index 1) + @param[out] code The type code of the link (see the EN_LinkType enumeration) + @return Error code + @see EN_LinkType + */ + int DLLEXPORT ENgetlinktype(int index, EN_LinkType *code); + + /** + @brief Set the link type code for a specified link + @param[in,out] index The index of a link before [in] and after [out] the type change + @param code The new type code of the link (see EN_LinkType). + @param actionCode Action taken if any controls contain the link. + @return Error code + @see the EN_LinkType enumeration + + 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 an error code is returned. + */ + int DLLEXPORT ENsetlinktype(int *index, EN_LinkType Code, int actionCode); + + /** + @brief Get the indexes of a link's start- and end-nodes. + @param index The index of a link (first link is index 1) + @param[out] node1 The index of the link's start node (first node is index 1). + @param[out] node2 The index of the link's end node (first node is index 1). + @return Error code + @see ENgetnodeid, ENgetlinkid + */ + int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2); + + /** + @brief Set the indexes of a link's start- and end-nodes. + @param index The index of a link (first link is index 1) + @param node1 The index of the link's start node (first node is index 1). + @param node2 The index of the link's end node (first node is index 1). + @return Error code + @see ENsetnodeid, ENsetlinkid + */ + int DLLEXPORT ENsetlinknodes(int index, int node1, int node2); + + /** + @brief Get a property value for specified link. + @param index The index of a node (first node is index 1). + @param code The parameter desired. + @param[out] value The value of the link's specified property. + @return Error code + @see ENgetnodevalue, EN_LinkProperty + */ + int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value); + + /** + @brief Set a property value for a link. + @param index The index of a link. First link is index 1. + @param code The code for the property to set. + @param v The value to set for this link and property. + @return Error code. + @see EN_LinkProperty + */ + int DLLEXPORT ENsetlinkvalue(int index, int code, EN_API_FLOAT_TYPE v); + +/******************************************************************** + + Pump Functions + +********************************************************************/ + + /** + @brief Get the type of pump + @param linkIndex The index of the pump element + @param[out] outType The integer-typed pump curve type signifier (output parameter) + @return Error code + @see EN_PumpType + */ + int DLLEXPORT ENgetpumptype(int linkIndex, int *outType); + + /** + @brief Retrieves the curve index for a specified pump index. + @param pumpIndex The index of a pump + @param[out] curveIndex The index of the curve used by the pump. + @return Error code. + */ + int DLLEXPORT ENgetheadcurveindex(int pumpIndex, int *curveIndex); + + /** + @brief Sets the curve id for a specified pump index. + @param pumpIndex The index of the pump + @param curveIndex The index of the curve used by the pump + @return Error code. + */ + int DLLEXPORT ENsetheadcurveindex(int pumpIndex, int curveIndex); + +/******************************************************************** + + Time Pattern Functions + +********************************************************************/ + + /** + @brief Add a new time pattern. + @param id The string ID of the pattern to add. + @return Error code. + @see ENgetpatternindex + */ + int DLLEXPORT ENaddpattern(char *id); + + /** + @brief Retrieves the index of the time pattern with specified ID + @param id String ID of the time pattern + @param[out] index Index of the specified time pattern + @return Error code + @see ENgetpatternid + */ + int DLLEXPORT ENgetpatternindex(char *id, int *index); + + /** + @brief Retrieves ID of a time pattern with specific index. + @param index The index of a time pattern. + @param[out] id The string ID of the time pattern. + @return Error code + @see ENgetpatternindex + */ + int DLLEXPORT ENgetpatternid(int index, char *id); + + /** + @brief Retrieves the number of multipliers in a time pattern. + @param index The index of a time pattern. + @param[out] len The length of the time pattern. + @return Error code + */ + int DLLEXPORT ENgetpatternlen(int index, int *len); + + /** + @brief Retrive a multiplier from a pattern for a specific time period. + @param index The index of a time pattern + @param period The pattern time period. First time period is 1. + @param[out] value Pattern multiplier + @return Error code + */ + int DLLEXPORT ENgetpatternvalue(int index, int period, EN_API_FLOAT_TYPE *value); + + /** + @brief Set the multiplier for a specific pattern at a specific period. + @param index The index of a pattern. First pattern is index 1. + @param period The period of the pattern to set. + @param value The value of the multiplier to set. + @return Error code. + */ + int DLLEXPORT ENsetpatternvalue(int index, int period, EN_API_FLOAT_TYPE value); + + /** + @brief Retrieve the average multiplier value in a time pattern + @param index The index of a time pattern + @param[out] value The average of all of this time pattern's values + @return Error code + */ + int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value); + + /** + @brief Set multipliers for a specific pattern + @param index The index of a pattern. First pattern is index 1. + @param f An array of multipliers + @param len The length of array f. + @return Error code. + @see ENgetpatternindex + */ + int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *f, int len); + +/******************************************************************** + + Data Curve Functions + +********************************************************************/ + + /** + @brief Add a new curve to the project. + @param id The name of the curve to be added. + @return Error code. + @see ENgetcurveindex ENsetcurve + */ + int DLLEXPORT ENaddcurve(char *id); + + /** + @brief Retrieve the index of a curve given its name. + @param id The ID name of a curve. + @param[out] index The index of the named curve. + @return Error code. + @see ENgetcurveid + */ + int DLLEXPORT ENgetcurveindex(char *id, int *index); + + /** + @brief Retrieve the ID name of a curve given its index. + @param index The index of a curve. + @param[out] id The ID of the specified curve. + @return Error code. + @see ENsetcurveindex + + NOTE: 'id' must be sized to hold MAXID characters. + */ + int DLLEXPORT ENgetcurveid(int index, char *id); + + /** + @brief Retrieve the number of points in a curve. + @param index The index of a curve. + @param[out] len The number of data points assigned to the curve. + @return Error code. + @see ENgetcurvevalue + */ + int DLLEXPORT ENgetcurvelen(int index, int *len); + + /** + @brief Get the type of a curve + @param curveIndex The index of the curve element + @param[out] outType The integer-typed curve curve type signifier (output parameter) + @return Error code + @see EN_CurveType + */ + int DLLEXPORT ENgetcurvetype(int curveIndex, int *outType); + + /** + @brief Retrieve an x,y data point for a curve. + @param curveIndex The index of a curve. + @param pointIndex The index of a point in the curve. + @param[out] x The x-value of the specified point. + @param[out] y The y-value of the specified point. + @return Error code. + @see ENgetcurvelen ENsetcurvevalue + */ + int DLLEXPORT ENgetcurvevalue(int curveIndex, int pointIndex, + EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); + + /** + @brief Set the x and y values for a curve's data point. + @param curveIndex The index of a curve. + @param pointIndex The index of a point in the curve. + @param x The x-value of the point. + @param y The y-value of the point. + @return Error code. + */ + int DLLEXPORT ENsetcurvevalue(int curveIndex, int pointIndex, + EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); + + /** + @brief Get a curve's properties. + @param curveIndex The index of a curve (first curve is index 1). + @param[out] id The curve's string ID. Client code must preallocate at least MAXID characters. + @param[out] nValues The number of values in the curve's (x,y) list. + @param[out] xValues The curve's x-values. Pointer must be freed by client. + @param[out] yValues The curve's y-values. Pointer must be freed by client. + @return Error code. + + The calling program is responsible for making xValues and yValues large enough + to hold nValues number of data points. + */ + int DLLEXPORT ENgetcurve(int curveIndex, char* id, int *nValues, + EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues); + + /** + @brief Set the x,y values for all points on a curve. + @param index The index of a curve. + @param x An array of x-values for the curve. + @param y An array of y-values for the curve. + @param len The length of the arrays for x and y. + @return Error code. + */ + int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, + EN_API_FLOAT_TYPE *y, int len); + +/******************************************************************** + + Simple Controls Functions + +********************************************************************/ + + /** + @brief Add a new simple control to the project. + @param[out] index The index of the new control. First control is index 1. + @param ctype The type of control to add (see EN_ControlType). + @param lindex The index of a link to control. + @param setting The control setting applied to the link. + @param nindex The index of a node used to control the link, or 0 for TIMER / TIMEOFDAY control. + @param level control point (tank level, junction pressure, or time in seconds). + @return Error code. + */ + int DLLEXPORT ENaddcontrol(int *index, int ctype, int lindex, EN_API_FLOAT_TYPE setting, + int nindex, EN_API_FLOAT_TYPE level); + + /** + @brief Delete an existing simple control + @param index The index of the control. First control is index 1. + @return Error code. + */ + int DLLEXPORT ENdeletecontrol(int index); + + /** + @brief Retrieves properties that define a simple control + @param index Position of control in list of controls added to the project + @param[out] ctype Control type code (see EN_ControlType enumeration) + @param[out] lindex Index of controlled link + @param[out] setting Control setting on link + @param[out] nindex Index of controlling node (0 for TIMER or TIMEOFDAY control) + @param[out] level Control level (tank level, junction pressure, or time (seconds)) + @return Error code + */ + int DLLEXPORT ENgetcontrol(int index, int *ctype, int *lindex, EN_API_FLOAT_TYPE *setting, + int *nindex, EN_API_FLOAT_TYPE *level); + + /** + @brief Set the properties of an existing simple control. + @param cindex The index of the control. First control is index 1. + @param ctype The type of control to use (see EN_ControlType). + @param lindex The index of a link to control. + @param setting The control setting applied to the link. + @param nindex The index of a node used to control the link, or 0 for TIMER / TIMEOFDAY control. + @param level control point (tank level, junction pressure, or time in seconds). + @return Error code. + */ + int DLLEXPORT ENsetcontrol(int cindex, int ctype, int lindex, + EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); + + +/******************************************************************** + + Rule-Based Controls Functions + +********************************************************************/ + + /** + @brief Add a new control rule to the project. + @param rule Text of the rule following the format used in an EPANET input file. + @return Error code. + */ + int DLLEXPORT ENaddrule(char *rule); + + /** + @brief Delete a rule-based control. + @param index The rule's index. + @return Error code. + */ + int DLLEXPORT ENdeleterule(int index); + + /** + @brief Get summary information for a rule-based control. + @param index The rule's index. + @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 nElseActions[out] Number of actions in the rule's ELSE section. + @param priority[out] Rule's priority. + @return Error code. + */ + int DLLEXPORT ENgetrule(int index, int *nPremises, int *nTrueActions, + int *nFalseActions, EN_API_FLOAT_TYPE *priority); + + /** + @brief Get the ID name of a rule-based control. + @param index The rule's index. + @param id[out] The rule's ID name. + @return Error code. + */ + int DLLEXPORT ENgetruleID(int index, char* id); + + /** + @brief Get the properties of a premise in a rule-based control. + @param ruleIndex The rule's index. + @param premiseIndex The premise's index. + @param logop[out] Logical operator (IF = 1, AND = 2, OR = 3) of the premise. + @param object[out] Type of object the premise is looking at (see EN_RuleObject). + @param objIndex[out] Index of the object (e.g. the index of the tank). + @param variable[out] Index of the variable to be checked (see EN_RuleVariable). + @param relop[out] Relationship operator in the premise (see EN_RuleOperator). + @param status[out] Status of the object being checked (see EN_RuleStatus). + @param value[out] Setting of the variable being checked (e.g. 5.5) + @return Error code. + */ + int DLLEXPORT ENgetpremise(int ruleIndex, int premiseIndex, int *logop, + int *object, int *objIndex, int *variable, + int *relop, int *status, EN_API_FLOAT_TYPE *value); + + /** + @brief Set the properties of a premise in a rule-based control. + @param ruleIndex The rule's index. + @param premiseIndex The premise's index. + @param logop Logical operator (IF = 1, AND = 2, OR = 3) of the premise. + @param object Type of object the premise is looking at (see EN_RuleObject). + @param objIndex Index of the object (e.g. the index of the tank). + @param variable Index of the variable to be checked (see EN_RuleVariable). + @param relop Relationship operator in the premise (see EN_RuleOperator). + @param status Status of the object being checked (see EN_RuleStatus). + @param value Setting of the variable being checked (e.g. 5.5) + @return Error code. + */ + int DLLEXPORT ENsetpremise(int ruleIndex, int premiseIndex, int logop, + int object, int objIndex, int variable, int relop, + int status, EN_API_FLOAT_TYPE value); + + /** + @brief Set the index of an object in a premise of a rule-based control. + @param ruleIndex The rule's index. + @param premiseIndex The premise's index. + @param objIndex The index of the premise's object (e.g. the index of the tank). + @return Error code. + */ + int DLLEXPORT ENsetpremiseindex(int ruleIndex, int premiseIndex, int objIndex); + + /** + @brief Set the status in a premise of a rule-based control. + @param ruleIndex The rule's index. + @param premiseIndex The premise's index. + @param status The status of the object being checked (see EN_RuleStatus) + @return Error code. + */ + int DLLEXPORT ENsetpremisestatus(int ruleIndex, int premiseIndex, int status); + + /** + @brief Set the value in a premise of a rule-based control. + @param ruleIndex The rule's index. + @param premiseIndex The premise's index. + @param value The value of the premise's variable being checked (e.g. 5.5) + @return Error code. + */ + int DLLEXPORT ENsetpremisevalue(int ruleIndex, int premiseIndex, + EN_API_FLOAT_TYPE value); + + /** + @brief Get the properties of a THEN action in a rule-based control. + @param ruleIndex The rule's index. + @param actionIndex Index of the THEN action to retrieve. + @param linkIndex[out] Index of the link in the action (e.g. index of Pump 1) + @param status[out] Status of the link (see EN_RuleStatus) + @param setting[out] Value of the link's setting (e.g. pump speed 0.9) + @return Error code. + */ + int DLLEXPORT ENgetthenaction(int ruleIndex, int actionIndex, int *linkIndex, + int *status, EN_API_FLOAT_TYPE *setting); + + /** + @brief Set the properties of a THEN action in a rule-based control. + @param ruleIndex The rule's index. + @param actionIndex Index of the THEN action to modify. + @param linkIndex Index of the link in the action (e.g. index of Pump 1) + @param status Status assigned to the link (e.g. CLOSED) + @param setting Setting value assigned to the link (e.g. pump speed 0.9) + @return Error code. + */ + int DLLEXPORT ENsetthenaction(int ruleIndex, int actionIndex, int linkIndex, + int status, EN_API_FLOAT_TYPE setting); + + /** + @brief Get the properties of an ELSE action in a rule-based control. + @param ruleIndex The rule's index. + @param actionIndex Index of the ELSE action to retrieve. + @param linkIndex[out] Index of the link in the action (e.g. index of Pump 1). + @param status[out] Status of the link (see EN_RuleStatus). + @param setting[out] Value of the link's setting (e.g. pump speed 0.9) + @return Error code. + */ + int DLLEXPORT ENgetelseaction(int ruleIndex, int actionIndex, int *linkIndex, + int *status, EN_API_FLOAT_TYPE *setting); + + /** + @brief Set the properties of an ELSE action in a rule-based control. + @param ruleIndex The rule's index. + @param actionIndex Index of the ELSE action being modified. + @param linkIndex Index of the link in the action (e.g. index of Pump 1) + @param status Status assigned to the link (see EN_RuleStatus) + @param setting Setting value assigned to the link (e.g. pump speed 0.9) + @return Error code. + */ + int DLLEXPORT ENsetelseaction(int ruleIndex, int actionIndex, int linkIndex, + int status, EN_API_FLOAT_TYPE setting); + + /** + @brief Set the priority of a rule-based control. + @param index The rule's index. + @param priority The priority assigned to the rule. + @return Error code. + */ + int DLLEXPORT ENsetrulepriority(int index, EN_API_FLOAT_TYPE priority); + + + #if defined(__cplusplus) + } + #endif + +#endif //EPANET2_1_H diff --git a/include/epanet2_enums.h b/include/epanet2_enums.h new file mode 100644 index 0000000..d507ceb --- /dev/null +++ b/include/epanet2_enums.h @@ -0,0 +1,305 @@ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet2_enums.h + Description: enums shared between API versions + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 11/29/2018 + ****************************************************************************** +*/ + + +#ifndef EPANET2_ENUMS_H +#define EPANET2_ENUMS_H + + +// --- Define the EPANET toolkit constants + +#define EN_MAXID 31 //!< Max. # characters in ID name +#define EN_MAXMSG 255 //!< Max. # characters in message text + +/// Node property codes +typedef enum { + EN_ELEVATION = 0, //!< Elevation + EN_BASEDEMAND = 1, //!< Junction baseline demand, from last demand category + EN_PATTERN = 2, //!< Junction baseline demand pattern + EN_EMITTER = 3, //!< Junction emitter coefficient + EN_INITQUAL = 4, //!< Initial quality + EN_SOURCEQUAL = 5, //!< Quality source strength + EN_SOURCEPAT = 6, //!< Quality source pattern + EN_SOURCETYPE = 7, //!< Qualiy source type + EN_TANKLEVEL = 8, //!< Tank water level + EN_DEMAND = 9, //!< Current simulated demand + EN_HEAD = 10, //!< Current hydraulic head + EN_PRESSURE = 11, //!< Current pressure + EN_QUALITY = 12, //!< Current quality + EN_SOURCEMASS = 13, //!< Current source mass inflow + EN_INITVOLUME = 14, //!< Tank initial volume + EN_MIXMODEL = 15, //!< Tank mixing model + EN_MIXZONEVOL = 16, //!< Tank mixing zone volume + EN_TANKDIAM = 17, //!< Tank diameter + EN_MINVOLUME = 18, //!< Tank minimum volume + EN_VOLCURVE = 19, //!< Tank volume curve + EN_MINLEVEL = 20, //!< Tank minimum level + EN_MAXLEVEL = 21, //!< Tank maximum level + EN_MIXFRACTION = 22, //!< Tank mixing fraction + EN_TANK_KBULK = 23, //!< Tank bulk decay coefficient + EN_TANKVOLUME = 24, //!< Tank current volume + EN_MAXVOLUME = 25 //!< Tank maximum volume +} EN_NodeProperty; + +/// Link property codes +typedef enum { + EN_DIAMETER = 0, //!< Pipe/valve diameter + EN_LENGTH = 1, //!> Pipe length + EN_ROUGHNESS = 2, //!> Pipe roughness coefficient + EN_MINORLOSS = 3, //!> Pipe/valve minor loss coefficient + EN_INITSTATUS = 4, //!> Initial status (e.g., OPEN/CLOSED) + EN_INITSETTING = 5, //!> Initial pump speed or valve setting + EN_KBULK = 6, //!> Bulk chemical reaction coefficient + EN_KWALL = 7, //!> Pipe wall chemical reaction coefficient + EN_FLOW = 8, //!> Current link flow rate + EN_VELOCITY = 9, //!> Current link flow velocity + EN_HEADLOSS = 10, //!> Current head loss across link + EN_STATUS = 11, //!> Current link status + EN_SETTING = 12, //!> Current link setting + EN_ENERGY = 13, //!> Current pump energy usage + EN_LINKQUAL = 14, //!> Current link quality + EN_LINKPATTERN = 15, //!> Pump speed time pattern + EN_EFFICIENCY = 16, //!> Current pump efficiency + EN_HEADCURVE = 17, //!> Pump head v. flow curve + EN_EFFICIENCYCURVE = 18, //!> Pump efficiency v. flow curve + EN_PRICEPATTERN = 19, //!> Pump energy price time pattern + EN_STATE = 20, //!> Current pump status + EN_CONST_POWER = 21, //!> Horsepower of constant horsepower pump + EN_SPEED = 22 //!> Current pump speed setting +} EN_LinkProperty; + +/// Time parameter codes +typedef enum { + EN_DURATION = 0, //!> Total simulation duration + EN_HYDSTEP = 1, //!> Hydraulic time step + EN_QUALSTEP = 2, //!> Water quality time step + EN_PATTERNSTEP = 3, //!> Time pattern period + EN_PATTERNSTART = 4, //!> Time when time patterns begin + EN_REPORTSTEP = 5, //!> Reporting time step + EN_REPORTSTART = 6, //!> Time when reporting starts + EN_RULESTEP = 7, //!> Rule evaluation time step + EN_STATISTIC = 8, //!> Reporting statistic code + EN_PERIODS = 9, //!> Number of reporting time periods + EN_STARTTIME = 10, //!> Simulation starting time of day + EN_HTIME = 11, //!> Elapsed time of current hydraulic solution + EN_QTIME = 12, //!> Elapsed time of current quality solution + EN_HALTFLAG = 13, //!> Flag indicating if simulation halted + EN_NEXTEVENT = 14, //!> Next time until a tank becomes empty or full + EN_NEXTEVENTIDX = 15 //!> Index of next tank that becomes empty or full +} EN_TimeProperty; + +/// Analysis statistic codes +typedef enum { + EN_ITERATIONS = 0, //!< Number of hydraulic iterations + EN_RELATIVEERROR = 1, //!< Sum of all flow changes / total flow + EN_MAXHEADERROR = 2, //!< Largest head loss error for links + EN_MAXFLOWCHANGE = 3, //!< Largest flow change in links + EN_MASSBALANCE = 4 //!< Water quality mass balance ratio +} EN_AnalysisStatistic; + +/// Object count codes +typedef enum { + EN_NODECOUNT = 0, //!< Number of nodes (Juntions + Tanks + Reservoirs) + EN_TANKCOUNT = 1, //!< Number of tanks and Reservoirs + EN_LINKCOUNT = 2, //!< Number of links (Pipes + Pumps + Valves) + EN_PATCOUNT = 3, //!< Number of time patterns + EN_CURVECOUNT = 4, //!< Number of curves + EN_CONTROLCOUNT = 5, //!< Number of simple controls + EN_RULECOUNT = 6 //!< Number of rule-based controls +} EN_CountType; + +/// Node type codes +typedef enum { + EN_JUNCTION = 0, //!< Junction node + EN_RESERVOIR = 1, //!< Reservoir node + EN_TANK = 2 //!< Storage tank node +} EN_NodeType; + +/// Link type codes +typedef enum { + EN_CVPIPE = 0, //!< Pipe with check valve + EN_PIPE = 1, //!< Pipe + EN_PUMP = 2, //!< Pump + EN_PRV = 3, //!< Pressure reducing valve + EN_PSV = 4, //!< Pressure sustaining valve + EN_PBV = 5, //!< Pressure breaker valve + EN_FCV = 6, //!< Flow control valve + EN_TCV = 7, //!< Throttle control valve + EN_GPV = 8 //!< General purpose valve +} EN_LinkType; + +/// Water quality analysis types +typedef enum { + EN_NONE = 0, //!< No quality analysis + EN_CHEM = 1, //!< Chemical fate and transport + EN_AGE = 2, //!< Water age analysis + EN_TRACE = 3 //!< Source tracing analysis +} EN_QualityType; + +/// Water quality source types +typedef enum { + EN_CONCEN = 0, //!< Concentration inflow source + EN_MASS = 1, //!< Mass inflow source + EN_SETPOINT = 2, //!< Concentration setpoint source + EN_FLOWPACED = 3 //!< Concentration flow paced source +} EN_SourceType; + +/// Head loss formulas +typedef enum { + EN_HW = 0, //!< Hazen-Williams + EN_DW = 1, //!< Darcy-Weisbach + EN_CM = 2 //!< Chezy-Manning +} EN_HeadLossType; + +/// Flow units types +typedef enum { + EN_CFS = 0, + EN_GPM = 1, + EN_MGD = 2, + EN_IMGD = 3, + EN_AFD = 4, + EN_LPS = 5, + EN_LPM = 6, + EN_MLD = 7, + EN_CMH = 8, + EN_CMD = 9 +} EN_FlowUnits; + +/// Demand model types +typedef enum { + EN_DDA = 0, //!< Demand driven analysis + EN_PDA = 1 //!< Pressure driven analysis +} EN_DemandModel; + +/// Simulation Option codes +typedef enum { + EN_TRIALS = 0, //!> Maximum hydraulic trials allowed + EN_ACCURACY = 1, //!> Hydraulic convergence accuracy + EN_TOLERANCE = 2, //!> Water quality tolerance + EN_EMITEXPON = 3, //!> Exponent for emitter head loss formula + EN_DEMANDMULT = 4, //!> Global demand multiplier + EN_HEADERROR = 5, //!> Maximum allowable head loss error + EN_FLOWCHANGE = 6, //!> Maximum allowable flow change + EN_DEMANDDEFPAT = 7, //!> Default demand time pattern + EN_HEADLOSSFORM = 8 //!> Head loss formula code +} EN_Option; + +/// Simple control types +typedef enum { + EN_LOWLEVEL = 0, + EN_HILEVEL = 1, + EN_TIMER = 2, + EN_TIMEOFDAY = 3 +} EN_ControlType; + +/// Reporting statistic types +typedef enum { + EN_AVERAGE = 1, //!> Report average value over simulation period + EN_MINIMUM = 2, //!> Report minimum value over simulation period + EN_MAXIMUM = 3, //!> Report maximum value over simulation period + EN_RANGE = 4 //!> Report maximum - minimum over simulation period +} EN_StatisticType; + +/// Tank mixing models +typedef enum { + EN_MIX1 = 0, //!< Complete mix model + EN_MIX2 = 1, //!< 2-compartment model + EN_FIFO = 2, //!< First in, first out model + EN_LIFO = 3 //!< Last in, first out model +} EN_MixingModel; + +/// Hydraulic initialization options +typedef enum { + EN_NOSAVE = 0, //!> Don't save hydraulics; don't re-initialize flows + EN_SAVE = 1, //!> Save hydraulics to file, don't re-initialize flows + EN_INITFLOW = 10, //!> Don't save hydraulics; re-initialize flows + EN_SAVE_AND_INIT = 11 //!> Save hydraulics; re-initialize flows +} EN_SaveOption; + +/// Pump curve types +typedef enum { + EN_CONST_HP = 0, //!< Constant horsepower + EN_POWER_FUNC = 1, //!< Power function + EN_CUSTOM = 2, //!< User-defined custom curve + EN_NOCURVE = 3 //!< No curve +} EN_PumpType; + +/// Data curve types +typedef enum { + EN_V_CURVE = 0, //!< Tank volume curve + EN_P_CURVE = 1, //!< Pump characteristic curve + EN_E_CURVE = 2, //!< Pump efficiency curve + EN_H_CURVE = 3, //!< Valve head loss curve + EN_G_CURVE = 4 //!< General\default curve +} EN_CurveType; + +/// Deletion action types +typedef enum { + EN_UNCONDITIONAL = 0, //!> Delete all controls that contain object + EN_CONDITIONAL = 1 //!> Cancel object deletion if contained in controls +} EN_ActionCodeType; + +/// Rule object codes +typedef enum { + EN_R_NODE = 6, + EN_R_LINK = 7, + EN_R_SYSTEM = 8 +} EN_RuleObject; + +/// Rule variable codes +typedef enum { + EN_R_DEMAND = 0, + EN_R_HEAD = 1, + EN_R_GRADE = 2, + EN_R_LEVEL = 3, + EN_R_PRESSURE = 4, + EN_R_FLOW = 5, + EN_R_STATUS = 6, + EN_R_SETTING = 7, + EN_R_POWER = 8, + EN_R_TIME = 9, + EN_R_CLOCKTIME = 10, + EN_R_FILLTIME = 11, + EN_R_DRAINTIME = 12 +} EN_RuleVariable; + +/// Rule operator types +typedef enum { + EN_R_EQ = 0, + EN_R_NE = 1, + EN_R_LE = 2, + EN_R_GE = 3, + EN_R_LT = 4, + EN_R_GT = 5, + EN_R_IS = 6, + EN_R_NOT = 7, + EN_R_BELOW = 8, + EN_R_ABOVE = 9 +} EN_RuleOperator; + +/// Rule status types +typedef enum { + EN_R_IS_OPEN = 1, + EN_R_IS_CLOSED = 2, + EN_R_IS_ACTIVE = 3 +} EN_RuleStatus; + +/// Status report types +typedef enum { + EN_NO_REPORT = 0, + EN_NORMAL_REPORT = 1, + EN_FULL_REPORT = 2 +} EN_StatusReport; + + +#endif //EPANET2_ENUMS_H diff --git a/run/CMakeLists.txt b/run/CMakeLists.txt index 18b28aa..1e5c3b7 100644 --- a/run/CMakeLists.txt +++ b/run/CMakeLists.txt @@ -2,12 +2,12 @@ cmake_minimum_required (VERSION 3.0.2) -# Sets for output directory for executables and libraries. +# Sets for output directory for executables and libraries. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -# Sets the position independent code property for all targets. +# Sets the position independent code property for all targets. set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -22,7 +22,7 @@ add_definitions(-DWITH_GENX) # Creates the EPANET command line executable add_executable(runepanet ${EPANET_CLI_SOURCES}) if(NOT WIN32) - target_link_libraries(runepanet LINK_PUBLIC epanet m) + target_link_libraries(runepanet LINK_PUBLIC epanet2 m) else(NOT WIN32) - target_link_libraries(runepanet LINK_PUBLIC epanet) + target_link_libraries(runepanet LINK_PUBLIC epanet2) endif(NOT WIN32) diff --git a/run/main.c b/run/main.c index 5d811ee..9f68abd 100644 --- a/run/main.c +++ b/run/main.c @@ -1,9 +1,25 @@ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: main.c + Description: implementation of the CLI for EPANET + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 11/27/2018 + ****************************************************************************** +*/ + + + #include #include -#include "epanet2.h" + +#include "epanet2_1.h" #define MAXMSG 255 /* Max. # characters in message text */ -#define MAXWARNCODE 99 +#define MAXWARNCODE 99 /* text copied here, no more need of include "text.h" */ #define FMT01 "\nEPANET Version %d.%d.%d\n" #define FMT03 "\nUsage:\n %s []\n" @@ -54,7 +70,7 @@ int main(int argc, char *argv[]) minor= (version%10000)/100; patch= version%100; printf(FMT01, major, minor, patch); - + /* Check for proper number of command line arguments */ if (argc < 2) { printf(FMT03, argv[0]); diff --git a/src/epanet.c b/src/epanet.c index 8bd45e9..9503226 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -17,7 +17,7 @@ #ifndef __APPLE__ #include #endif -#include +#include #include #include "epanet2.h" @@ -26,638 +26,7 @@ #include "text.h" #include "enumstxt.h" -// This single global variable is used only when the library is called -// in "legacy mode" with the 2.1-style API. -Project __defaultProject; -Project *_defaultProject = &__defaultProject; -// Functions for creating and removing default temporary files -void createtmpfiles() -{ - getTmpName(_defaultProject->TmpHydFname); - getTmpName(_defaultProject->TmpOutFname); - getTmpName(_defaultProject->TmpStatFname); -} -void removetmpfiles() -{ - remove(_defaultProject->TmpHydFname); - remove(_defaultProject->TmpOutFname); - remove(_defaultProject->TmpStatFname); -} - - -/******************************************************************** - - System Functions - -********************************************************************/ - -int DLLEXPORT ENepanet(const char *f1, const char *f2, const char *f3, - void (*pviewprog)(char *)) -{ -/*------------------------------------------------------------------------ - ** Input: f1 = name of EPANET formatted input file - ** f2 = name of report file - ** f3 = name of binary output file - ** pviewprog = see note below - ** Output: none - ** Returns: error code - ** Purpose: runs a complete EPANET simulation - ** - ** The pviewprog() argument is a pointer to a callback function - ** that takes a character string (char *) as its only parameter. - ** The function would reside in and be used by the calling - ** program to display the progress messages that EPANET generates - ** as it carries out its computations. If this feature is not - ** needed then the argument should be NULL. - **------------------------------------------------------------------------- - */ - int errcode = 0; - int warncode = 0; - - // Run the project and record any warning - createtmpfiles(); - errcode = EN_runproject(_defaultProject, f1, f2, f3, pviewprog); - if (errcode < 100) warncode = errcode; - removetmpfiles(); - - // Return the warning code if the run had no errors - if (warncode) errcode = MAX(errcode, warncode); - return errcode; -} - -int DLLEXPORT ENinit(const char *f2, const char *f3, int UnitsType, - int HeadlossFormula) -{ - int errcode = 0; - createtmpfiles(); - errcode = EN_init(_defaultProject, f2, f3, UnitsType, HeadlossFormula); - return errcode; -} - -int DLLEXPORT ENopen(const char *f1, const char *f2, const char *f3) -{ - int errcode = 0; - createtmpfiles(); - errcode = EN_open(_defaultProject, f1, f2, f3); - return errcode; -} - -int DLLEXPORT ENsaveinpfile(const char *filename) -{ - return EN_saveinpfile(_defaultProject, filename); -} - -int DLLEXPORT ENclose() -{ - EN_close(_defaultProject); - removetmpfiles(); - return 0; -} - -/******************************************************************** - - Hydraulic Analysis Functions - -********************************************************************/ - -int DLLEXPORT ENsolveH() { return EN_solveH(_defaultProject); } - -int DLLEXPORT ENsaveH() { return EN_saveH(_defaultProject); } - -int DLLEXPORT ENopenH() { return EN_openH(_defaultProject); } - -int DLLEXPORT ENinitH(int flag) { return EN_initH(_defaultProject, flag); } - -int DLLEXPORT ENrunH(long *t) { return EN_runH(_defaultProject, t); } - -int DLLEXPORT ENnextH(long *tstep) { return EN_nextH(_defaultProject, tstep); } - -int DLLEXPORT ENcloseH() { return EN_closeH(_defaultProject); } - -int DLLEXPORT ENsavehydfile(char *filename) -{ - return EN_savehydfile(_defaultProject, filename); -} - -int DLLEXPORT ENusehydfile(char *filename) -{ - return EN_usehydfile(_defaultProject, filename); -} - -/******************************************************************** - - Water Quality Analysis Functions - -********************************************************************/ - -int DLLEXPORT ENsolveQ() { return EN_solveQ(_defaultProject); } - -int DLLEXPORT ENopenQ() { return EN_openQ(_defaultProject); } - -int DLLEXPORT ENinitQ(int saveflag) { return EN_initQ(_defaultProject, saveflag); } - -int DLLEXPORT ENrunQ(long *t) { return EN_runQ(_defaultProject, t); } - -int DLLEXPORT ENnextQ(long *tstep) { return EN_nextQ(_defaultProject, tstep); } - -int DLLEXPORT ENstepQ(long *tleft) { return EN_stepQ(_defaultProject, tleft); } - -int DLLEXPORT ENcloseQ() { return EN_closeQ(_defaultProject); } - -/******************************************************************** - - Reporting Functions - -********************************************************************/ - -int DLLEXPORT ENwriteline(char *line) { return EN_writeline(_defaultProject, line); } - -int DLLEXPORT ENreport() { return EN_report(_defaultProject); } - -int DLLEXPORT ENresetreport() { return EN_resetreport(_defaultProject); } - -int DLLEXPORT ENsetreport(char *s) { return EN_setreport(_defaultProject, s); } - -int DLLEXPORT ENsetstatusreport(int code) -{ - return EN_setstatusreport(_defaultProject, code); -} - -int DLLEXPORT ENgetversion(int *v) { return EN_getversion(v); } - -int DLLEXPORT ENgetcount(int code, int *count) -{ - return EN_getcount(_defaultProject, (EN_CountType)code, count); -} - -int DLLEXPORT ENgeterror(int errcode, char *errmsg, int n) -{ - return EN_geterror(errcode, errmsg, n); -} - -int DLLEXPORT ENgetstatistic(int code, EN_API_FLOAT_TYPE *value) -{ - return EN_getstatistic(_defaultProject, code, value); -} - -/******************************************************************** - - Analysis Options Functions - -********************************************************************/ - -int DLLEXPORT ENgetoption(int code, EN_API_FLOAT_TYPE *value) -{ - return EN_getoption(_defaultProject, (EN_Option)code, value); -} - -int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v) -{ - return EN_setoption(_defaultProject, code, v); -} - -int DLLEXPORT ENgetflowunits(int *code) { return EN_getflowunits(_defaultProject, code); } - -int DLLEXPORT ENsetflowunits(int code) { return EN_setflowunits(_defaultProject, code); } - -int DLLEXPORT ENgettimeparam(int code, long *value) -{ - return EN_gettimeparam(_defaultProject, code, value); -} - -int DLLEXPORT ENsettimeparam(int code, long value) -{ - return EN_settimeparam(_defaultProject, code, value); -} - -int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, - int *tracenode) -{ - return EN_getqualinfo(_defaultProject, qualcode, chemname, chemunits, tracenode); -} - -int DLLEXPORT ENgetqualtype(int *qualcode, int *tracenode) -{ - return EN_getqualtype(_defaultProject, qualcode, tracenode); -} - -int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, - char *tracenode) -{ - return EN_setqualtype(_defaultProject, qualcode, chemname, chemunits, tracenode); -} - -/******************************************************************** - - Node Functions - -********************************************************************/ - -int DLLEXPORT ENaddnode(char *id, EN_NodeType nodeType) -{ - return EN_addnode(_defaultProject, id, nodeType); -} - -int DLLEXPORT ENdeletenode(int index, int actionCode) -{ - return EN_deletenode(_defaultProject, index, actionCode); -} - -int DLLEXPORT ENgetnodeindex(char *id, int *index) -{ - return EN_getnodeindex(_defaultProject, id, index); -} - -int DLLEXPORT ENgetnodeid(int index, char *id) -{ - return EN_getnodeid(_defaultProject, index, id); -} - -int DLLEXPORT ENsetnodeid(int index, char *newid) -{ - return EN_setnodeid(_defaultProject, index, newid); -} - -int DLLEXPORT ENgetnodetype(int index, int *code) -{ - return EN_getnodetype(_defaultProject, index, code); -} - -int DLLEXPORT ENgetnodevalue(int index, int code, EN_API_FLOAT_TYPE *value) -{ - return EN_getnodevalue(_defaultProject, index, code, value); -} - -int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v) -{ - return EN_setnodevalue(_defaultProject, index, code, v); -} - -int DLLEXPORT ENgetcoord(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) -{ - return EN_getcoord(_defaultProject, index, x, y); -} - -int DLLEXPORT ENsetcoord(int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) -{ - return EN_setcoord(_defaultProject, index, x, y); -} - -/******************************************************************** - - Nodal Demand Functions - -********************************************************************/ - -int DLLEXPORT ENgetdemandmodel(int *type, EN_API_FLOAT_TYPE *pmin, - EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp) -{ - return EN_getdemandmodel(_defaultProject, type, pmin, preq, pexp); -} - -int DLLEXPORT ENsetdemandmodel(int type, EN_API_FLOAT_TYPE pmin, - EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp) -{ - return EN_setdemandmodel(_defaultProject, type, pmin, preq, pexp); -} - -int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands) -{ - return EN_getnumdemands(_defaultProject, nodeIndex, numDemands); -} - -int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE *baseDemand) -{ - return EN_getbasedemand(_defaultProject, nodeIndex, demandIdx, baseDemand); -} - -int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand) -{ - return EN_setbasedemand(_defaultProject, nodeIndex, demandIdx, baseDemand); -} - -int DLLEXPORT ENsetdemandpattern(int nodeIndex, int demandIdx, int patIndex) -{ - return EN_setdemandpattern(_defaultProject, nodeIndex, demandIdx, patIndex); -} - -int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIdx, int *pattIdx) -{ - return EN_getdemandpattern(_defaultProject, nodeIndex, demandIdx, pattIdx); -} - -int DLLEXPORT ENgetdemandname(int nodeIndex, int demandIdx, char *demandName) -{ - return EN_getdemandname(_defaultProject, nodeIndex, demandIdx, demandName); -} - -int DLLEXPORT ENsetdemandname(int nodeIndex, int demandIdx, char *demandName) -{ - return EN_setdemandname(_defaultProject, nodeIndex, demandIdx, demandName); -} - -/******************************************************************** - - Link Functions - -********************************************************************/ - -int DLLEXPORT ENaddlink(char *id, EN_LinkType linkType, char *fromNode, char *toNode) -{ - return EN_addlink(_defaultProject, id, linkType, fromNode, toNode); -} - -int DLLEXPORT ENdeletelink(int index, int actionCode) -{ - return EN_deletelink(_defaultProject, index, actionCode); -} - -int DLLEXPORT ENgetlinkindex(char *id, int *index) -{ - return EN_getlinkindex(_defaultProject, id, index); -} - -int DLLEXPORT ENgetlinkid(int index, char *id) -{ - return EN_getlinkid(_defaultProject, index, id); -} - -int DLLEXPORT ENsetlinkid(int index, char *newid) -{ - return EN_setlinkid(_defaultProject, index, newid); -} - -int DLLEXPORT ENgetlinktype(int index, EN_LinkType *code) -{ - return EN_getlinktype(_defaultProject, index, code); -} - -int DLLEXPORT ENsetlinktype(int *index, EN_LinkType type, int actionCode) -{ - return EN_setlinktype(_defaultProject, index, type, actionCode); -} - -int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2) -{ - return EN_getlinknodes(_defaultProject, index, node1, node2); -} - -int DLLEXPORT ENsetlinknodes(int index, int node1, int node2) -{ - return EN_setlinknodes(_defaultProject, index, node1, node2); -} - -int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value) -{ - return EN_getlinkvalue(_defaultProject, index, (EN_LinkProperty)code, value); -} - -int DLLEXPORT ENsetlinkvalue(int index, int code, EN_API_FLOAT_TYPE v) -{ - return EN_setlinkvalue(_defaultProject, index, code, v); -} - -/******************************************************************** - - Pump Functions - -********************************************************************/ - -int DLLEXPORT ENgetpumptype(int index, int *type) -{ - return EN_getpumptype(_defaultProject, index, type); -} - -int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex) -{ - return EN_getheadcurveindex(_defaultProject, index, curveindex); -} - -int DLLEXPORT ENsetheadcurveindex(int index, int curveindex) -{ - return EN_setheadcurveindex(_defaultProject, index, curveindex); -} - -/******************************************************************** - - Time Pattern Functions - -********************************************************************/ - -int DLLEXPORT ENaddpattern(char *id) -{ - return EN_addpattern(_defaultProject, id); -} - -int DLLEXPORT ENgetpatternindex(char *id, int *index) -{ - return EN_getpatternindex(_defaultProject, id, index); -} - -int DLLEXPORT ENgetpatternid(int index, char *id) -{ - return EN_getpatternid(_defaultProject, index, id); -} - -int DLLEXPORT ENgetpatternlen(int index, int *len) -{ - return EN_getpatternlen(_defaultProject, index, len); -} - -int DLLEXPORT ENgetpatternvalue(int index, int period, EN_API_FLOAT_TYPE *value) -{ - return EN_getpatternvalue(_defaultProject, index, period, value); -} - -int DLLEXPORT ENsetpatternvalue(int index, int period, EN_API_FLOAT_TYPE value) -{ - return EN_setpatternvalue(_defaultProject, index, period, value); -} - -int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value) -{ - return EN_getaveragepatternvalue(_defaultProject, index, value); -} - -int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *f, int n) -{ - return EN_setpattern(_defaultProject, index, f, n); -} - -/******************************************************************** - - Data Curve Functions - -********************************************************************/ - -int DLLEXPORT ENaddcurve(char *id) -{ - return EN_addcurve(_defaultProject, id); -} - -int DLLEXPORT ENgetcurveindex(char *id, int *index) -{ - return EN_getcurveindex(_defaultProject, id, index); -} - -int DLLEXPORT ENgetcurveid(int index, char *id) -{ - return EN_getcurveid(_defaultProject, index, id); -} - -int DLLEXPORT ENgetcurvelen(int index, int *len) -{ - return EN_getcurvelen(_defaultProject, index, len); -} - -int DLLEXPORT ENgetcurvetype(int curveindex, int *type) -{ - return EN_getcurvetype(_defaultProject, curveindex, type); -} - -int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x, - EN_API_FLOAT_TYPE *y) -{ - return EN_getcurvevalue(_defaultProject, index, pnt, x, y); -} - -int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x, - EN_API_FLOAT_TYPE y) -{ - return EN_setcurvevalue(_defaultProject, index, pnt, x, y); -} - -int DLLEXPORT ENgetcurve(int curveIndex, char *id, int *nValues, - EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues) -{ - return EN_getcurve(_defaultProject, curveIndex, id, nValues, xValues, yValues); -} - -int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int n) -{ - return EN_setcurve(_defaultProject, index, x, y, n); -} - -/******************************************************************** - - Simple Controls Functions - -********************************************************************/ - -int DLLEXPORT ENaddcontrol(int *cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, - int nindex, EN_API_FLOAT_TYPE level) -{ - return EN_addcontrol(_defaultProject, cindex, ctype, lindex, setting, nindex, level); -} - -int DLLEXPORT ENdeletecontrol(int cindex) -{ - return EN_deletecontrol(_defaultProject, cindex); -} - -int DLLEXPORT ENgetcontrol(int cindex, int *ctype, int *lindex, EN_API_FLOAT_TYPE *setting, - int *nindex, EN_API_FLOAT_TYPE *level) -{ - return EN_getcontrol(_defaultProject, cindex, ctype, lindex, setting, nindex, level); -} - -int DLLEXPORT ENsetcontrol(int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, - int nindex, EN_API_FLOAT_TYPE level) -{ - return EN_setcontrol(_defaultProject, cindex, ctype, lindex, setting, nindex, level); -} - -/******************************************************************** - - Rule-Based Controls Functions - -********************************************************************/ - -int DLLEXPORT ENaddrule(char *rule) -{ - return EN_addrule(_defaultProject, rule); -} - -int DLLEXPORT ENdeleterule(int index) -{ - return EN_deleterule(_defaultProject, index); -} - -int DLLEXPORT ENgetrule(int index, int *nPremises, int *nThenActions, int *nElseActions, - EN_API_FLOAT_TYPE *priority) -{ - return EN_getrule(_defaultProject, index, nPremises, nThenActions, nElseActions, priority); -} - -int DLLEXPORT ENgetruleID(int index, char* id) -{ - return EN_getruleID(_defaultProject, index, id); -} - -int DLLEXPORT ENgetpremise(int ruleIndex, int premiseIndex, int *logop, - int *object, int *objIndex, int *variable, - int *relop, int *status, EN_API_FLOAT_TYPE *value) -{ - return EN_getpremise(_defaultProject, ruleIndex, premiseIndex, logop, object, - objIndex, variable, relop, status, value); -} - -int DLLEXPORT ENsetpremise(int ruleIndex, int premiseIndex, int logop, - int object, int objIndex, int variable, int relop, - int status, EN_API_FLOAT_TYPE value) -{ - return EN_setpremise(_defaultProject, ruleIndex, premiseIndex, logop, object, - objIndex, variable, relop, status, value); -} - -int DLLEXPORT ENsetpremiseindex(int ruleIndex, int premiseIndex, int objIndex) -{ - return EN_setpremiseindex(_defaultProject, ruleIndex, premiseIndex, objIndex); -} - -int DLLEXPORT ENsetpremisestatus(int ruleIndex, int premiseIndex, int status) -{ - return EN_setpremisestatus(_defaultProject, ruleIndex, premiseIndex, status); -} - -int DLLEXPORT ENsetpremisevalue(int ruleIndex, int premiseIndex, EN_API_FLOAT_TYPE value) -{ - return EN_setpremisevalue(_defaultProject, ruleIndex, premiseIndex, value); -} - -int DLLEXPORT ENgetthenaction(int ruleIndex, int actionIndex, int *linkIndex, - int *status, EN_API_FLOAT_TYPE *setting) -{ - return EN_getthenaction(_defaultProject, ruleIndex, actionIndex, linkIndex, - status, setting); -} - -int DLLEXPORT ENsetthenaction(int ruleIndex, int actionIndex, int linkIndex, - int status, EN_API_FLOAT_TYPE setting) -{ - return EN_setthenaction(_defaultProject, ruleIndex, actionIndex, linkIndex, - status, setting); -} - -int DLLEXPORT ENgetelseaction(int ruleIndex, int actionIndex, int *linkIndex, - int *status, EN_API_FLOAT_TYPE *setting) -{ - return EN_getelseaction(_defaultProject, ruleIndex, actionIndex, linkIndex, - status, setting); -} - -int DLLEXPORT ENsetelseaction(int ruleIndex, int actionIndex, int linkIndex, - int status, EN_API_FLOAT_TYPE setting) -{ - return EN_setelseaction(_defaultProject, ruleIndex, actionIndex, linkIndex, - status, setting); -} - -int DLLEXPORT ENsetrulepriority(int index, EN_API_FLOAT_TYPE priority) -{ - return EN_setrulepriority(_defaultProject, index, priority); -} /******************************************************************** @@ -702,7 +71,7 @@ int DLLEXPORT EN_deleteproject(EN_Project *p) return 0; } -int DLLEXPORT EN_runproject(EN_Project p, const char *f1, const char *f2, +int DLLEXPORT EN_runproject(EN_Project p, const char *f1, const char *f2, const char *f3, void (*pviewprog)(char *)) /*------------------------------------------------------------------------ ** Input: f1 = name of EPANET formatted input file @@ -774,7 +143,7 @@ int DLLEXPORT EN_init(EN_Project p, const char *f2, const char *f3, // Open files errcode = openfiles(p, "", f2, f3); - + // Initialize memory used for project's data objects initpointers(p); ERRCODE(netsize(p)); @@ -887,7 +256,7 @@ int DLLEXPORT EN_close(EN_Project p) // Free all project data if (p->Openflag) writetime(p, FMT105); freedata(p); - + // Close output file out = &p->outfile; if (out->TmpOutFile != out->OutFile) @@ -965,7 +334,7 @@ int DLLEXPORT EN_solveH(EN_Project p) sprintf(p->Msg, FMT101, p->report.Atime); writewin(p->viewprog, p->Msg); - // Solve for hydraulics & advance to next time period + // Solve for hydraulics & advance to next time period tstep = 0; ERRCODE(EN_runH(p, &t)); ERRCODE(EN_nextH(p, &tstep)); @@ -1146,11 +515,11 @@ int DLLEXPORT EN_savehydfile(EN_Project p, char *filename) FILE *f; FILE *HydFile; int c; - + // Check that hydraulics results exist if (p->outfile.HydFile == NULL || !p->outfile.SaveHflag) return 104; - // Open the permanent hydraulics file + // Open the permanent hydraulics file if ((f = fopen(filename, "w+b")) == NULL) return 305; // Copy from the scratch file to f @@ -1880,7 +1249,7 @@ int DLLEXPORT EN_gettimeparam(EN_Project p, int code, long *value) Times *time = &p->times; int i; - + *value = 0; if (!p->Openflag) return 102; if (code < EN_DURATION || code > EN_NEXTEVENTIDX) return 251; @@ -3089,7 +2458,7 @@ int DLLEXPORT EN_getdemandname(EN_Project p, int nodeIndex, int demandIdx, char strcpy(demandName, ""); - // Check for valid arguments + // Check for valid arguments if (!p->Openflag) return 102; if (nodeIndex <= 0 || nodeIndex > p->network.Njuncs) return 203; @@ -4276,7 +3645,7 @@ int DLLEXPORT EN_setpattern(EN_Project p, int index, EN_API_FLOAT_TYPE *f, int n int j; Spattern *Pattern = net->Pattern; - + // Check for valid arguments if (!p->Openflag) return 102; if (index <= 0 || index > net->Npats) return 205; @@ -4312,14 +3681,14 @@ int DLLEXPORT EN_addcurve(EN_Project p, char *id) int i, n, err = 0; Scurve *curve; - // Check if a curve with same id already exists + // Check if a curve with same id already exists if (!p->Openflag) return 102; if (EN_getcurveindex(p, id, &i) == 0) return 215; // Check that id name is not too long if (strlen(id) > MAXID) return 250; - // Expand the array of curves + // Expand the array of curves n = net->Ncurves + 1; net->Curve = (Scurve *) realloc(net->Curve, (n + 1) * sizeof(Scurve)); @@ -4338,7 +3707,7 @@ int DLLEXPORT EN_addcurve(EN_Project p, char *id) curve->Y[0] = 1.0; } - // Abort if memory allocation error + // Abort if memory allocation error if (err) { free(curve->X); @@ -4888,12 +4257,12 @@ int DLLEXPORT EN_addrule(EN_Project p, char *rule) // Find where current line ends and next one begins nextline = strchr(line, '\n'); if (nextline) *nextline = '\0'; - + // Copy and tokenize the current line strcpy(line2, line); strcat(line2, "\n"); // Tokenizer won't work without this parser->Ntokens = gettokens(line2, parser->Tok, MAXTOKS, parser->Comment); - + // Process the line to build up the rule's contents if (parser->Ntokens > 0 && *parser->Tok[0] != ';') { @@ -4950,7 +4319,7 @@ int DLLEXPORT EN_getrule(EN_Project p, int index, int *nPremises, if (index < 1 || index > net->Nrules) return 257; *priority = (EN_API_FLOAT_TYPE)p->network.Rule[index].priority; - + count = 1; premise = net->Rule[index].Premises; while (premise->next != NULL) @@ -4959,7 +4328,7 @@ int DLLEXPORT EN_getrule(EN_Project p, int index, int *nPremises, premise = premise->next; } *nPremises = count; - + count = 1; action = net->Rule[index].ThenActions; while (action->next != NULL) @@ -5020,7 +4389,7 @@ int DLLEXPORT EN_getpremise(EN_Project p, int ruleIndex, int premiseIndex, { Spremise *premises; Spremise *premise; - + if (ruleIndex < 1 || ruleIndex > p->network.Nrules) return 257; premises = p->network.Rule[ruleIndex].Premises; @@ -5059,7 +4428,7 @@ int DLLEXPORT EN_setpremise(EN_Project p, int ruleIndex, int premiseIndex, { Spremise *premises; Spremise *premise; - + if (ruleIndex < 1 || ruleIndex > p->network.Nrules) return 257; premises = p->network.Rule[ruleIndex].Premises; @@ -5173,7 +4542,7 @@ int DLLEXPORT EN_getthenaction(EN_Project p, int ruleIndex, int actionIndex, actions = p->network.Rule[ruleIndex].ThenActions; action = getaction(actions, actionIndex); if (action == NULL) return 258; - + *linkIndex = action->link; *status = action->status; *setting = (EN_API_FLOAT_TYPE)action->setting; diff --git a/src/epanet2_1.c b/src/epanet2_1.c new file mode 100644 index 0000000..7151134 --- /dev/null +++ b/src/epanet2_1.c @@ -0,0 +1,654 @@ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet.c + Description: implementation of the EPANET 2.1 API functions + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 11/29/2018 + ****************************************************************************** +*/ + + +#include "types.h" +#include "funcs.h" + +#include "epanet2_1.h" +#include "epanet2.h" + + +// This single global variable is used only when the library is called +// in "legacy mode" with the 2.1-style API. +Project __defaultProject; +Project *_defaultProject = &__defaultProject; + +// Functions for creating and removing default temporary files +void createtmpfiles() +{ + getTmpName(_defaultProject->TmpHydFname); + getTmpName(_defaultProject->TmpOutFname); + getTmpName(_defaultProject->TmpStatFname); +} + +void removetmpfiles() +{ + remove(_defaultProject->TmpHydFname); + remove(_defaultProject->TmpOutFname); + remove(_defaultProject->TmpStatFname); +} + + +/******************************************************************** + + System Functions + +********************************************************************/ + +int DLLEXPORT ENepanet(const char *f1, const char *f2, const char *f3, + void (*pviewprog)(char *)) +{ +/*------------------------------------------------------------------------ + ** Input: f1 = name of EPANET formatted input file + ** f2 = name of report file + ** f3 = name of binary output file + ** pviewprog = see note below + ** Output: none + ** Returns: error code + ** Purpose: runs a complete EPANET simulation + ** + ** The pviewprog() argument is a pointer to a callback function + ** that takes a character string (char *) as its only parameter. + ** The function would reside in and be used by the calling + ** program to display the progress messages that EPANET generates + ** as it carries out its computations. If this feature is not + ** needed then the argument should be NULL. + **------------------------------------------------------------------------- + */ + int errcode = 0; + int warncode = 0; + + // Run the project and record any warning + createtmpfiles(); + errcode = EN_runproject(_defaultProject, f1, f2, f3, pviewprog); + if (errcode < 100) warncode = errcode; + removetmpfiles(); + + // Return the warning code if the run had no errors + if (warncode) errcode = MAX(errcode, warncode); + return errcode; +} + +int DLLEXPORT ENinit(const char *f2, const char *f3, int UnitsType, + int HeadlossFormula) +{ + int errcode = 0; + createtmpfiles(); + errcode = EN_init(_defaultProject, f2, f3, UnitsType, HeadlossFormula); + return errcode; +} + +int DLLEXPORT ENopen(const char *f1, const char *f2, const char *f3) +{ + int errcode = 0; + createtmpfiles(); + errcode = EN_open(_defaultProject, f1, f2, f3); + return errcode; +} + +int DLLEXPORT ENsaveinpfile(const char *filename) +{ + return EN_saveinpfile(_defaultProject, filename); +} + +int DLLEXPORT ENclose() +{ + EN_close(_defaultProject); + removetmpfiles(); + return 0; +} + +/******************************************************************** + + Hydraulic Analysis Functions + +********************************************************************/ + +int DLLEXPORT ENsolveH() { return EN_solveH(_defaultProject); } + +int DLLEXPORT ENsaveH() { return EN_saveH(_defaultProject); } + +int DLLEXPORT ENopenH() { return EN_openH(_defaultProject); } + +int DLLEXPORT ENinitH(int flag) { return EN_initH(_defaultProject, flag); } + +int DLLEXPORT ENrunH(long *t) { return EN_runH(_defaultProject, t); } + +int DLLEXPORT ENnextH(long *tstep) { return EN_nextH(_defaultProject, tstep); } + +int DLLEXPORT ENcloseH() { return EN_closeH(_defaultProject); } + +int DLLEXPORT ENsavehydfile(char *filename) +{ + return EN_savehydfile(_defaultProject, filename); +} + +int DLLEXPORT ENusehydfile(char *filename) +{ + return EN_usehydfile(_defaultProject, filename); +} + +/******************************************************************** + + Water Quality Analysis Functions + +********************************************************************/ + +int DLLEXPORT ENsolveQ() { return EN_solveQ(_defaultProject); } + +int DLLEXPORT ENopenQ() { return EN_openQ(_defaultProject); } + +int DLLEXPORT ENinitQ(int saveflag) { return EN_initQ(_defaultProject, saveflag); } + +int DLLEXPORT ENrunQ(long *t) { return EN_runQ(_defaultProject, t); } + +int DLLEXPORT ENnextQ(long *tstep) { return EN_nextQ(_defaultProject, tstep); } + +int DLLEXPORT ENstepQ(long *tleft) { return EN_stepQ(_defaultProject, tleft); } + +int DLLEXPORT ENcloseQ() { return EN_closeQ(_defaultProject); } + +/******************************************************************** + + Reporting Functions + +********************************************************************/ + +int DLLEXPORT ENwriteline(char *line) { return EN_writeline(_defaultProject, line); } + +int DLLEXPORT ENreport() { return EN_report(_defaultProject); } + +int DLLEXPORT ENresetreport() { return EN_resetreport(_defaultProject); } + +int DLLEXPORT ENsetreport(char *s) { return EN_setreport(_defaultProject, s); } + +int DLLEXPORT ENsetstatusreport(int code) +{ + return EN_setstatusreport(_defaultProject, code); +} + +int DLLEXPORT ENgetversion(int *v) { return EN_getversion(v); } + +int DLLEXPORT ENgetcount(int code, int *count) +{ + return EN_getcount(_defaultProject, (EN_CountType)code, count); +} + +int DLLEXPORT ENgeterror(int errcode, char *errmsg, int n) +{ + return EN_geterror(errcode, errmsg, n); +} + +int DLLEXPORT ENgetstatistic(int code, EN_API_FLOAT_TYPE *value) +{ + return EN_getstatistic(_defaultProject, code, value); +} + +/******************************************************************** + + Analysis Options Functions + +********************************************************************/ + +int DLLEXPORT ENgetoption(int code, EN_API_FLOAT_TYPE *value) +{ + return EN_getoption(_defaultProject, (EN_Option)code, value); +} + +int DLLEXPORT ENsetoption(int code, EN_API_FLOAT_TYPE v) +{ + return EN_setoption(_defaultProject, code, v); +} + +int DLLEXPORT ENgetflowunits(int *code) { return EN_getflowunits(_defaultProject, code); } + +int DLLEXPORT ENsetflowunits(int code) { return EN_setflowunits(_defaultProject, code); } + +int DLLEXPORT ENgettimeparam(int code, long *value) +{ + return EN_gettimeparam(_defaultProject, code, value); +} + +int DLLEXPORT ENsettimeparam(int code, long value) +{ + return EN_settimeparam(_defaultProject, code, value); +} + +int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, + int *tracenode) +{ + return EN_getqualinfo(_defaultProject, qualcode, chemname, chemunits, tracenode); +} + +int DLLEXPORT ENgetqualtype(int *qualcode, int *tracenode) +{ + return EN_getqualtype(_defaultProject, qualcode, tracenode); +} + +int DLLEXPORT ENsetqualtype(int qualcode, char *chemname, char *chemunits, + char *tracenode) +{ + return EN_setqualtype(_defaultProject, qualcode, chemname, chemunits, tracenode); +} + +/******************************************************************** + + Node Functions + +********************************************************************/ + +int DLLEXPORT ENaddnode(char *id, EN_NodeType nodeType) +{ + return EN_addnode(_defaultProject, id, nodeType); +} + +int DLLEXPORT ENdeletenode(int index, int actionCode) +{ + return EN_deletenode(_defaultProject, index, actionCode); +} + +int DLLEXPORT ENgetnodeindex(char *id, int *index) +{ + return EN_getnodeindex(_defaultProject, id, index); +} + +int DLLEXPORT ENgetnodeid(int index, char *id) +{ + return EN_getnodeid(_defaultProject, index, id); +} + +int DLLEXPORT ENsetnodeid(int index, char *newid) +{ + return EN_setnodeid(_defaultProject, index, newid); +} + +int DLLEXPORT ENgetnodetype(int index, int *code) +{ + return EN_getnodetype(_defaultProject, index, code); +} + +int DLLEXPORT ENgetnodevalue(int index, int code, EN_API_FLOAT_TYPE *value) +{ + return EN_getnodevalue(_defaultProject, index, code, value); +} + +int DLLEXPORT ENsetnodevalue(int index, int code, EN_API_FLOAT_TYPE v) +{ + return EN_setnodevalue(_defaultProject, index, code, v); +} + +int DLLEXPORT ENgetcoord(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y) +{ + return EN_getcoord(_defaultProject, index, x, y); +} + +int DLLEXPORT ENsetcoord(int index, EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y) +{ + return EN_setcoord(_defaultProject, index, x, y); +} + +/******************************************************************** + + Nodal Demand Functions + +********************************************************************/ + +int DLLEXPORT ENgetdemandmodel(int *type, EN_API_FLOAT_TYPE *pmin, + EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp) +{ + return EN_getdemandmodel(_defaultProject, type, pmin, preq, pexp); +} + +int DLLEXPORT ENsetdemandmodel(int type, EN_API_FLOAT_TYPE pmin, + EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp) +{ + return EN_setdemandmodel(_defaultProject, type, pmin, preq, pexp); +} + +int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands) +{ + return EN_getnumdemands(_defaultProject, nodeIndex, numDemands); +} + +int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE *baseDemand) +{ + return EN_getbasedemand(_defaultProject, nodeIndex, demandIdx, baseDemand); +} + +int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand) +{ + return EN_setbasedemand(_defaultProject, nodeIndex, demandIdx, baseDemand); +} + +int DLLEXPORT ENsetdemandpattern(int nodeIndex, int demandIdx, int patIndex) +{ + return EN_setdemandpattern(_defaultProject, nodeIndex, demandIdx, patIndex); +} + +int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIdx, int *pattIdx) +{ + return EN_getdemandpattern(_defaultProject, nodeIndex, demandIdx, pattIdx); +} + +int DLLEXPORT ENgetdemandname(int nodeIndex, int demandIdx, char *demandName) +{ + return EN_getdemandname(_defaultProject, nodeIndex, demandIdx, demandName); +} + +int DLLEXPORT ENsetdemandname(int nodeIndex, int demandIdx, char *demandName) +{ + return EN_setdemandname(_defaultProject, nodeIndex, demandIdx, demandName); +} + +/******************************************************************** + + Link Functions + +********************************************************************/ + +int DLLEXPORT ENaddlink(char *id, EN_LinkType linkType, char *fromNode, char *toNode) +{ + return EN_addlink(_defaultProject, id, linkType, fromNode, toNode); +} + +int DLLEXPORT ENdeletelink(int index, int actionCode) +{ + return EN_deletelink(_defaultProject, index, actionCode); +} + +int DLLEXPORT ENgetlinkindex(char *id, int *index) +{ + return EN_getlinkindex(_defaultProject, id, index); +} + +int DLLEXPORT ENgetlinkid(int index, char *id) +{ + return EN_getlinkid(_defaultProject, index, id); +} + +int DLLEXPORT ENsetlinkid(int index, char *newid) +{ + return EN_setlinkid(_defaultProject, index, newid); +} + +int DLLEXPORT ENgetlinktype(int index, EN_LinkType *code) +{ + return EN_getlinktype(_defaultProject, index, code); +} + +int DLLEXPORT ENsetlinktype(int *index, EN_LinkType type, int actionCode) +{ + return EN_setlinktype(_defaultProject, index, type, actionCode); +} + +int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2) +{ + return EN_getlinknodes(_defaultProject, index, node1, node2); +} + +int DLLEXPORT ENsetlinknodes(int index, int node1, int node2) +{ + return EN_setlinknodes(_defaultProject, index, node1, node2); +} + +int DLLEXPORT ENgetlinkvalue(int index, int code, EN_API_FLOAT_TYPE *value) +{ + return EN_getlinkvalue(_defaultProject, index, (EN_LinkProperty)code, value); +} + +int DLLEXPORT ENsetlinkvalue(int index, int code, EN_API_FLOAT_TYPE v) +{ + return EN_setlinkvalue(_defaultProject, index, code, v); +} + +/******************************************************************** + + Pump Functions + +********************************************************************/ + +int DLLEXPORT ENgetpumptype(int index, int *type) +{ + return EN_getpumptype(_defaultProject, index, type); +} + +int DLLEXPORT ENgetheadcurveindex(int index, int *curveindex) +{ + return EN_getheadcurveindex(_defaultProject, index, curveindex); +} + +int DLLEXPORT ENsetheadcurveindex(int index, int curveindex) +{ + return EN_setheadcurveindex(_defaultProject, index, curveindex); +} + +/******************************************************************** + + Time Pattern Functions + +********************************************************************/ + +int DLLEXPORT ENaddpattern(char *id) +{ + return EN_addpattern(_defaultProject, id); +} + +int DLLEXPORT ENgetpatternindex(char *id, int *index) +{ + return EN_getpatternindex(_defaultProject, id, index); +} + +int DLLEXPORT ENgetpatternid(int index, char *id) +{ + return EN_getpatternid(_defaultProject, index, id); +} + +int DLLEXPORT ENgetpatternlen(int index, int *len) +{ + return EN_getpatternlen(_defaultProject, index, len); +} + +int DLLEXPORT ENgetpatternvalue(int index, int period, EN_API_FLOAT_TYPE *value) +{ + return EN_getpatternvalue(_defaultProject, index, period, value); +} + +int DLLEXPORT ENsetpatternvalue(int index, int period, EN_API_FLOAT_TYPE value) +{ + return EN_setpatternvalue(_defaultProject, index, period, value); +} + +int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value) +{ + return EN_getaveragepatternvalue(_defaultProject, index, value); +} + +int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *f, int n) +{ + return EN_setpattern(_defaultProject, index, f, n); +} + +/******************************************************************** + + Data Curve Functions + +********************************************************************/ + +int DLLEXPORT ENaddcurve(char *id) +{ + return EN_addcurve(_defaultProject, id); +} + +int DLLEXPORT ENgetcurveindex(char *id, int *index) +{ + return EN_getcurveindex(_defaultProject, id, index); +} + +int DLLEXPORT ENgetcurveid(int index, char *id) +{ + return EN_getcurveid(_defaultProject, index, id); +} + +int DLLEXPORT ENgetcurvelen(int index, int *len) +{ + return EN_getcurvelen(_defaultProject, index, len); +} + +int DLLEXPORT ENgetcurvetype(int curveindex, int *type) +{ + return EN_getcurvetype(_defaultProject, curveindex, type); +} + +int DLLEXPORT ENgetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE *x, + EN_API_FLOAT_TYPE *y) +{ + return EN_getcurvevalue(_defaultProject, index, pnt, x, y); +} + +int DLLEXPORT ENsetcurvevalue(int index, int pnt, EN_API_FLOAT_TYPE x, + EN_API_FLOAT_TYPE y) +{ + return EN_setcurvevalue(_defaultProject, index, pnt, x, y); +} + +int DLLEXPORT ENgetcurve(int curveIndex, char *id, int *nValues, + EN_API_FLOAT_TYPE **xValues, EN_API_FLOAT_TYPE **yValues) +{ + return EN_getcurve(_defaultProject, curveIndex, id, nValues, xValues, yValues); +} + +int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y, int n) +{ + return EN_setcurve(_defaultProject, index, x, y, n); +} + +/******************************************************************** + + Simple Controls Functions + +********************************************************************/ + +int DLLEXPORT ENaddcontrol(int *cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, + int nindex, EN_API_FLOAT_TYPE level) +{ + return EN_addcontrol(_defaultProject, cindex, ctype, lindex, setting, nindex, level); +} + +int DLLEXPORT ENdeletecontrol(int cindex) +{ + return EN_deletecontrol(_defaultProject, cindex); +} + +int DLLEXPORT ENgetcontrol(int cindex, int *ctype, int *lindex, EN_API_FLOAT_TYPE *setting, + int *nindex, EN_API_FLOAT_TYPE *level) +{ + return EN_getcontrol(_defaultProject, cindex, ctype, lindex, setting, nindex, level); +} + +int DLLEXPORT ENsetcontrol(int cindex, int ctype, int lindex, EN_API_FLOAT_TYPE setting, + int nindex, EN_API_FLOAT_TYPE level) +{ + return EN_setcontrol(_defaultProject, cindex, ctype, lindex, setting, nindex, level); +} + +/******************************************************************** + + Rule-Based Controls Functions + +********************************************************************/ + +int DLLEXPORT ENaddrule(char *rule) +{ + return EN_addrule(_defaultProject, rule); +} + +int DLLEXPORT ENdeleterule(int index) +{ + return EN_deleterule(_defaultProject, index); +} + +int DLLEXPORT ENgetrule(int index, int *nPremises, int *nThenActions, int *nElseActions, + EN_API_FLOAT_TYPE *priority) +{ + return EN_getrule(_defaultProject, index, nPremises, nThenActions, nElseActions, priority); +} + +int DLLEXPORT ENgetruleID(int index, char* id) +{ + return EN_getruleID(_defaultProject, index, id); +} + +int DLLEXPORT ENgetpremise(int ruleIndex, int premiseIndex, int *logop, + int *object, int *objIndex, int *variable, + int *relop, int *status, EN_API_FLOAT_TYPE *value) +{ + return EN_getpremise(_defaultProject, ruleIndex, premiseIndex, logop, object, + objIndex, variable, relop, status, value); +} + +int DLLEXPORT ENsetpremise(int ruleIndex, int premiseIndex, int logop, + int object, int objIndex, int variable, int relop, + int status, EN_API_FLOAT_TYPE value) +{ + return EN_setpremise(_defaultProject, ruleIndex, premiseIndex, logop, object, + objIndex, variable, relop, status, value); +} + +int DLLEXPORT ENsetpremiseindex(int ruleIndex, int premiseIndex, int objIndex) +{ + return EN_setpremiseindex(_defaultProject, ruleIndex, premiseIndex, objIndex); +} + +int DLLEXPORT ENsetpremisestatus(int ruleIndex, int premiseIndex, int status) +{ + return EN_setpremisestatus(_defaultProject, ruleIndex, premiseIndex, status); +} + +int DLLEXPORT ENsetpremisevalue(int ruleIndex, int premiseIndex, EN_API_FLOAT_TYPE value) +{ + return EN_setpremisevalue(_defaultProject, ruleIndex, premiseIndex, value); +} + +int DLLEXPORT ENgetthenaction(int ruleIndex, int actionIndex, int *linkIndex, + int *status, EN_API_FLOAT_TYPE *setting) +{ + return EN_getthenaction(_defaultProject, ruleIndex, actionIndex, linkIndex, + status, setting); +} + +int DLLEXPORT ENsetthenaction(int ruleIndex, int actionIndex, int linkIndex, + int status, EN_API_FLOAT_TYPE setting) +{ + return EN_setthenaction(_defaultProject, ruleIndex, actionIndex, linkIndex, + status, setting); +} + +int DLLEXPORT ENgetelseaction(int ruleIndex, int actionIndex, int *linkIndex, + int *status, EN_API_FLOAT_TYPE *setting) +{ + return EN_getelseaction(_defaultProject, ruleIndex, actionIndex, linkIndex, + status, setting); +} + +int DLLEXPORT ENsetelseaction(int ruleIndex, int actionIndex, int linkIndex, + int status, EN_API_FLOAT_TYPE setting) +{ + return EN_setelseaction(_defaultProject, ruleIndex, actionIndex, linkIndex, + status, setting); +} + +int DLLEXPORT ENsetrulepriority(int index, EN_API_FLOAT_TYPE priority) +{ + return EN_setrulepriority(_defaultProject, index, priority); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 38e5328..1e203b5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -7,13 +7,13 @@ # # Modified by: Michael E. Tryby # US EPA ORD/NRMRL -# +# #Setup CMake to run tests enable_testing() -# Sets for output directory for executables and libraries. +# Sets for output directory for executables and libraries. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) if(UNIX) @@ -26,7 +26,7 @@ if(MSVC) set(Boost_DETAILED_FAILURE_MSG OFF) set(Boost_USE_STATIC_LIBS ON) endif(MSVC) -set(Boost_THREAD_FOUND OFF) +set(Boost_THREAD_FOUND OFF) find_package(Boost COMPONENTS thread) include_directories (${Boost_INCLUDE_DIRS}) @@ -44,11 +44,11 @@ foreach(testSrc ${TEST_SRCS}) add_executable(${testName} ${testSrc}) #link to Boost libraries AND your targets and dependencies - target_link_libraries(${testName} ${Boost_LIBRARIES} epanet epanet-output) + target_link_libraries(${testName} ${Boost_LIBRARIES} epanet2 epanet-output) #Finally add it to test execution #Notice the WORKING_DIRECTORY and COMMAND add_test(NAME ${testName} - COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${testName} + COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${testName} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data) endforeach(testSrc)