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..646f103 100644 --- a/include/epanet2.h +++ b/include/epanet2.h @@ -1,23 +1,21 @@ -/** @file epanet2.h - @see http://github.com/openwateranalytics/epanet - */ - /* ****************************************************************************** Project: OWA EPANET Version: 2.2 Module: epanet2.h - Description: symbolic constants and function declarations for the EPANET API + Description: declarations for the legacy EPANET 2 API functions Authors: see AUTHORS Copyright: see AUTHORS License: see LICENSE - Last Updated: 11/27/2018 + Last Updated: 11/29/2018 ****************************************************************************** */ + #ifndef EPANET2_H #define EPANET2_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 @@ -25,8 +23,8 @@ #endif #ifdef WITH_GENX - #include "epanet_export.h" -#else + #include "epanet2_export.h" +#else // --- define WINDOWS #undef WINDOWS #ifdef _WIN32 @@ -58,301 +56,14 @@ #endif #endif +#include "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; // --- Declare the EPANET toolkit functions #if defined(__cplusplus) extern "C" { #endif - -/** - @brief The EPANET Project wrapper object -*/ -typedef struct Project *EN_Project; + /******************************************************************** @@ -367,15 +78,15 @@ typedef struct Project *EN_Project; 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, + 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) @@ -384,9 +95,9 @@ typedef struct Project *EN_Project; @param HeadlossFormula headloss formula flag @return error code */ - int DLLEXPORT ENinit(const char *rptFile, const char *binOutFile, + 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) @@ -396,14 +107,14 @@ typedef struct Project *EN_Project; */ 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 @@ -421,22 +132,22 @@ typedef struct Project *EN_Project; @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 @@ -447,43 +158,43 @@ typedef struct Project *EN_Project; 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 @@ -496,64 +207,64 @@ typedef struct Project *EN_Project; 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 @@ -566,19 +277,19 @@ typedef struct Project *EN_Project; @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 @@ -1343,7 +1054,7 @@ typedef struct Project *EN_Project; @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) + @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, @@ -1360,7 +1071,7 @@ typedef struct Project *EN_Project; @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) + @param value Setting of the variable being checked (e.g. 5.5) @return Error code. */ int DLLEXPORT ENsetpremise(int ruleIndex, int premiseIndex, int logop, @@ -1389,12 +1100,12 @@ typedef struct Project *EN_Project; @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) + @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. @@ -1418,7 +1129,7 @@ typedef struct Project *EN_Project; */ 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. @@ -1450,175 +1161,10 @@ typedef struct Project *EN_Project; @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); - int DLLEXPORT EN_deleteproject(EN_Project *ph); - int DLLEXPORT EN_runproject(EN_Project ph, const char *f1, const char *f2, const char *f3, - void (*pviewprog)(char *)); - int DLLEXPORT EN_init(EN_Project ph, const char *rptFile, const char *outFile, - EN_FlowUnits unitsType, EN_HeadLossType headLossType); - int DLLEXPORT EN_open(EN_Project ph, const char *inpFile, - const char *rptFile, const char *binOutFile); - int DLLEXPORT EN_saveinpfile(EN_Project ph, const char *filename); - int DLLEXPORT EN_close(EN_Project ph); - int DLLEXPORT EN_solveH(EN_Project ph); - int DLLEXPORT EN_saveH(EN_Project ph); - int DLLEXPORT EN_openH(EN_Project ph); - int DLLEXPORT EN_initH(EN_Project ph, int saveFlag); - int DLLEXPORT EN_runH(EN_Project ph, long *currentTime); - int DLLEXPORT EN_nextH(EN_Project ph, long *tStep); - int DLLEXPORT EN_closeH(EN_Project ph); - int DLLEXPORT EN_savehydfile(EN_Project ph, char *filename); - int DLLEXPORT EN_usehydfile(EN_Project ph, char *filename); - - int DLLEXPORT EN_solveQ(EN_Project ph); - int DLLEXPORT EN_openQ(EN_Project ph); - int DLLEXPORT EN_initQ(EN_Project ph, int saveFlag); - int DLLEXPORT EN_runQ(EN_Project ph, long *currentTime); - int DLLEXPORT EN_nextQ(EN_Project ph, long *tStep); - int DLLEXPORT EN_stepQ(EN_Project ph, long *timeLeft); - int DLLEXPORT EN_closeQ(EN_Project ph); - - int DLLEXPORT EN_writeline(EN_Project ph, char *line); - int DLLEXPORT EN_report(EN_Project ph); - int DLLEXPORT EN_resetreport(EN_Project ph); - int DLLEXPORT EN_setreport(EN_Project ph, char *reportCommand); - int DLLEXPORT EN_setstatusreport(EN_Project ph, int code); - int DLLEXPORT EN_getversion(int *version); - int DLLEXPORT EN_getcount(EN_Project ph, EN_CountType code, int *count); - int DLLEXPORT EN_geterror(int errcode, char *errmsg, int maxLen); - int DLLEXPORT EN_getstatistic(EN_Project ph, int code, EN_API_FLOAT_TYPE* value); - - int DLLEXPORT EN_getoption(EN_Project ph, EN_Option opt, EN_API_FLOAT_TYPE *value); - int DLLEXPORT EN_setoption(EN_Project ph, int code, EN_API_FLOAT_TYPE v); - int DLLEXPORT EN_getflowunits(EN_Project ph, int *code); - int DLLEXPORT EN_setflowunits(EN_Project ph, int code); - int DLLEXPORT EN_gettimeparam(EN_Project ph, int code, long *value); - int DLLEXPORT EN_settimeparam(EN_Project ph, int code, long value); - int DLLEXPORT EN_getqualinfo(EN_Project ph, int *qualcode, char *chemname, - char *chemunits, int *tracenode); - int DLLEXPORT EN_getqualtype(EN_Project ph, int *qualcode, int *tracenode); - int DLLEXPORT EN_setqualtype(EN_Project ph, int qualcode, char *chemname, - char *chemunits, char *tracenode); - - int DLLEXPORT EN_addnode(EN_Project ph, char *id, EN_NodeType nodeType); - int DLLEXPORT EN_deletenode(EN_Project ph, int index, int actionCode); - int DLLEXPORT EN_getnodeindex(EN_Project ph, char *id, int *index); - int DLLEXPORT EN_getnodeid(EN_Project ph, int index, char *id); - int DLLEXPORT EN_setnodeid(EN_Project ph, int index, char *newid); - int DLLEXPORT EN_getnodetype(EN_Project ph, int index, int *code); - int DLLEXPORT EN_getnodevalue(EN_Project ph, int index, int code, EN_API_FLOAT_TYPE *value); - int DLLEXPORT EN_setnodevalue(EN_Project ph, int index, int code, EN_API_FLOAT_TYPE v); - int DLLEXPORT EN_getcoord(EN_Project ph, int index, EN_API_FLOAT_TYPE *x, - EN_API_FLOAT_TYPE *y); - int DLLEXPORT EN_setcoord(EN_Project ph, int index, EN_API_FLOAT_TYPE x, - EN_API_FLOAT_TYPE y); - - int DLLEXPORT EN_getdemandmodel(EN_Project ph, int *type, EN_API_FLOAT_TYPE *pmin, - EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); - int DLLEXPORT EN_setdemandmodel(EN_Project ph, int type, EN_API_FLOAT_TYPE pmin, - EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); - int DLLEXPORT EN_getnumdemands(EN_Project ph, int nodeIndex, int *numDemands); - int DLLEXPORT EN_getbasedemand(EN_Project ph, int nodeIndex, - int demandIndex, EN_API_FLOAT_TYPE *baseDemand); - int DLLEXPORT EN_setbasedemand(EN_Project ph, int nodeIndex, - int demandIndex, EN_API_FLOAT_TYPE baseDemand); - int DLLEXPORT EN_getdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, - int *pattIndex); - int DLLEXPORT EN_setdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, - int patIndex); - int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIdx, - char *demandName); - int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, - char *demandName); - - int DLLEXPORT EN_addlink(EN_Project ph, char *id, EN_LinkType linkType, - char *fromNode, char *toNode); - int DLLEXPORT EN_deletelink(EN_Project ph, int index, int actionCode); - int DLLEXPORT EN_getlinkindex(EN_Project ph, char *id, int *index); - int DLLEXPORT EN_getlinkid(EN_Project ph, int index, char *id); - int DLLEXPORT EN_setlinkid(EN_Project ph, int index, char *newid); - int DLLEXPORT EN_getlinktype(EN_Project ph, int index, EN_LinkType *code); - int DLLEXPORT EN_setlinktype(EN_Project ph, int *index, EN_LinkType type, int actionCode); - int DLLEXPORT EN_getlinknodes(EN_Project ph, int index, int *node1, int *node2); - int DLLEXPORT EN_setlinknodes(EN_Project ph, int index, int node1, int node2); - int DLLEXPORT EN_getlinkvalue(EN_Project ph, int index, EN_LinkProperty code, - EN_API_FLOAT_TYPE *value); - int DLLEXPORT EN_setlinkvalue(EN_Project ph, int index, int code, EN_API_FLOAT_TYPE v); - - int DLLEXPORT EN_getpumptype(EN_Project ph, int linkIndex, int *outType); - int DLLEXPORT EN_getheadcurveindex(EN_Project ph, int pumpIndex, int *curveIndex); - int DLLEXPORT EN_setheadcurveindex(EN_Project ph, int pumpIndex, int curveIndex); - - int DLLEXPORT EN_addpattern(EN_Project ph, char *id); - int DLLEXPORT EN_getpatternindex(EN_Project ph, char *id, int *index); - int DLLEXPORT EN_getpatternid(EN_Project ph, int index, char *id); - int DLLEXPORT EN_getpatternlen(EN_Project ph, int index, int *len); - int DLLEXPORT EN_getpatternvalue(EN_Project ph, int index, int period, EN_API_FLOAT_TYPE *value); - int DLLEXPORT EN_setpatternvalue(EN_Project ph, int index, int period, EN_API_FLOAT_TYPE value); - int DLLEXPORT EN_getaveragepatternvalue(EN_Project ph, int index, EN_API_FLOAT_TYPE *value); - int DLLEXPORT EN_setpattern(EN_Project ph, int index, EN_API_FLOAT_TYPE *f, int len); - - int DLLEXPORT EN_addcurve(EN_Project ph, char *id); - int DLLEXPORT EN_getcurveindex(EN_Project ph, char *id, int *index); - int DLLEXPORT EN_getcurveid(EN_Project ph, int index, char *id); - int DLLEXPORT EN_getcurvelen(EN_Project ph, int index, int *len); - int DLLEXPORT EN_getcurvetype(EN_Project ph, int curveIndex, int *outType); - int DLLEXPORT EN_getcurvevalue(EN_Project ph, int curveIndex, int pointIndex, - EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); - int DLLEXPORT EN_setcurvevalue(EN_Project ph, int curveIndex, int pointIndex, - EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); - int DLLEXPORT EN_getcurve(EN_Project ph, int curveIndex, char* id, - int *nValues, EN_API_FLOAT_TYPE **xValues, - EN_API_FLOAT_TYPE **yValues); - int DLLEXPORT EN_setcurve(EN_Project ph, int index, EN_API_FLOAT_TYPE *x, - EN_API_FLOAT_TYPE *y, int len); - - int DLLEXPORT EN_addcontrol(EN_Project ph, int *cindex, int ctype, int lindex, - EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); - int DLLEXPORT EN_deletecontrol(EN_Project ph, int index); - int DLLEXPORT EN_getcontrol(EN_Project ph, int controlIndex, - int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, - int *nodeIndex, EN_API_FLOAT_TYPE *level); - int DLLEXPORT EN_setcontrol(EN_Project ph, int cindex, int ctype, int lindex, - EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); - - int DLLEXPORT EN_addrule(EN_Project ph, char *rule); - int DLLEXPORT EN_deleterule(EN_Project ph, int index); - int DLLEXPORT EN_getrule(EN_Project ph, int index, int *nPremises, - int *nThenActions, int *nElseActions, EN_API_FLOAT_TYPE *priority); - int DLLEXPORT EN_getruleID(EN_Project ph, int index, char* id); - int DLLEXPORT EN_getpremise(EN_Project ph, int ruleIndex, int premiseIndex, - int *logop, int *object, int *objIndex, int *variable, int *relop, - int *status, EN_API_FLOAT_TYPE *value); - int DLLEXPORT EN_setpremise(EN_Project ph, int ruleIndex, int premiseIndex, - int logop, int object, int objIndex, int variable, int relop, - int status, EN_API_FLOAT_TYPE value); - int DLLEXPORT EN_setpremiseindex(EN_Project ph, int ruleIndex, - int premiseIndex, int objIndex); - int DLLEXPORT EN_setpremisestatus(EN_Project ph, int ruleIndex, - int premiseIndex, int status); - int DLLEXPORT EN_setpremisevalue(EN_Project ph, int ruleIndex, - int premiseIndex, EN_API_FLOAT_TYPE value); - int DLLEXPORT EN_getthenaction(EN_Project ph, int ruleIndex, int actionIndex, - int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); - int DLLEXPORT EN_setthenaction(EN_Project ph, int ruleIndex, int actionIndex, - int linkIndex, int status, EN_API_FLOAT_TYPE setting); - int DLLEXPORT EN_getelseaction(EN_Project ph, int ruleIndex, int actionIndex, - int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); - 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 + #if defined(__cplusplus) + } + #endif #endif //EPANET2_H diff --git a/include/epanet2_2.h b/include/epanet2_2.h new file mode 100644 index 0000000..66fbe49 --- /dev/null +++ b/include/epanet2_2.h @@ -0,0 +1,246 @@ +/** @file epanet2.h + @see http://github.com/openwateranalytics/epanet + */ + +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet2.h + Description: symbolic constants and function declarations for the EPANET API + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 11/29/2018 + ****************************************************************************** + */ + +#ifndef EPANET2_2_H +#define EPANET2_2_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 + +/** + @brief The EPANET Project wrapper object +*/ +typedef struct Project *EN_Project; + +/******************************************************************** + + Threadsafe versions of all EPANET functions + +********************************************************************/ + + int DLLEXPORT EN_createproject(EN_Project *ph); + int DLLEXPORT EN_deleteproject(EN_Project *ph); + int DLLEXPORT EN_runproject(EN_Project ph, const char *f1, const char *f2, const char *f3, + void (*pviewprog)(char *)); + int DLLEXPORT EN_init(EN_Project ph, const char *rptFile, const char *outFile, + EN_FlowUnits unitsType, EN_HeadLossType headLossType); + int DLLEXPORT EN_open(EN_Project ph, const char *inpFile, + const char *rptFile, const char *binOutFile); + int DLLEXPORT EN_saveinpfile(EN_Project ph, const char *filename); + int DLLEXPORT EN_close(EN_Project ph); + + int DLLEXPORT EN_solveH(EN_Project ph); + int DLLEXPORT EN_saveH(EN_Project ph); + int DLLEXPORT EN_openH(EN_Project ph); + int DLLEXPORT EN_initH(EN_Project ph, int saveFlag); + int DLLEXPORT EN_runH(EN_Project ph, long *currentTime); + int DLLEXPORT EN_nextH(EN_Project ph, long *tStep); + int DLLEXPORT EN_closeH(EN_Project ph); + int DLLEXPORT EN_savehydfile(EN_Project ph, char *filename); + int DLLEXPORT EN_usehydfile(EN_Project ph, char *filename); + + int DLLEXPORT EN_solveQ(EN_Project ph); + int DLLEXPORT EN_openQ(EN_Project ph); + int DLLEXPORT EN_initQ(EN_Project ph, int saveFlag); + int DLLEXPORT EN_runQ(EN_Project ph, long *currentTime); + int DLLEXPORT EN_nextQ(EN_Project ph, long *tStep); + int DLLEXPORT EN_stepQ(EN_Project ph, long *timeLeft); + int DLLEXPORT EN_closeQ(EN_Project ph); + + int DLLEXPORT EN_writeline(EN_Project ph, char *line); + int DLLEXPORT EN_report(EN_Project ph); + int DLLEXPORT EN_resetreport(EN_Project ph); + int DLLEXPORT EN_setreport(EN_Project ph, char *reportCommand); + int DLLEXPORT EN_setstatusreport(EN_Project ph, int code); + int DLLEXPORT EN_getversion(int *version); + int DLLEXPORT EN_getcount(EN_Project ph, EN_CountType code, int *count); + int DLLEXPORT EN_geterror(int errcode, char *errmsg, int maxLen); + int DLLEXPORT EN_getstatistic(EN_Project ph, int code, EN_API_FLOAT_TYPE* value); + + int DLLEXPORT EN_getoption(EN_Project ph, EN_Option opt, EN_API_FLOAT_TYPE *value); + int DLLEXPORT EN_setoption(EN_Project ph, int code, EN_API_FLOAT_TYPE v); + int DLLEXPORT EN_getflowunits(EN_Project ph, int *code); + int DLLEXPORT EN_setflowunits(EN_Project ph, int code); + int DLLEXPORT EN_gettimeparam(EN_Project ph, int code, long *value); + int DLLEXPORT EN_settimeparam(EN_Project ph, int code, long value); + int DLLEXPORT EN_getqualinfo(EN_Project ph, int *qualcode, char *chemname, + char *chemunits, int *tracenode); + int DLLEXPORT EN_getqualtype(EN_Project ph, int *qualcode, int *tracenode); + int DLLEXPORT EN_setqualtype(EN_Project ph, int qualcode, char *chemname, + char *chemunits, char *tracenode); + + int DLLEXPORT EN_addnode(EN_Project ph, char *id, EN_NodeType nodeType); + int DLLEXPORT EN_deletenode(EN_Project ph, int index, int actionCode); + int DLLEXPORT EN_getnodeindex(EN_Project ph, char *id, int *index); + int DLLEXPORT EN_getnodeid(EN_Project ph, int index, char *id); + int DLLEXPORT EN_setnodeid(EN_Project ph, int index, char *newid); + int DLLEXPORT EN_getnodetype(EN_Project ph, int index, int *code); + int DLLEXPORT EN_getnodevalue(EN_Project ph, int index, int code, EN_API_FLOAT_TYPE *value); + int DLLEXPORT EN_setnodevalue(EN_Project ph, int index, int code, EN_API_FLOAT_TYPE v); + int DLLEXPORT EN_getcoord(EN_Project ph, int index, EN_API_FLOAT_TYPE *x, + EN_API_FLOAT_TYPE *y); + int DLLEXPORT EN_setcoord(EN_Project ph, int index, EN_API_FLOAT_TYPE x, + EN_API_FLOAT_TYPE y); + + int DLLEXPORT EN_getdemandmodel(EN_Project ph, int *type, EN_API_FLOAT_TYPE *pmin, + EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); + int DLLEXPORT EN_setdemandmodel(EN_Project ph, int type, EN_API_FLOAT_TYPE pmin, + EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); + int DLLEXPORT EN_getnumdemands(EN_Project ph, int nodeIndex, int *numDemands); + int DLLEXPORT EN_getbasedemand(EN_Project ph, int nodeIndex, + int demandIndex, EN_API_FLOAT_TYPE *baseDemand); + int DLLEXPORT EN_setbasedemand(EN_Project ph, int nodeIndex, + int demandIndex, EN_API_FLOAT_TYPE baseDemand); + int DLLEXPORT EN_getdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, + int *pattIndex); + int DLLEXPORT EN_setdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, + int patIndex); + int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIdx, + char *demandName); + int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, + char *demandName); + + int DLLEXPORT EN_addlink(EN_Project ph, char *id, EN_LinkType linkType, + char *fromNode, char *toNode); + int DLLEXPORT EN_deletelink(EN_Project ph, int index, int actionCode); + int DLLEXPORT EN_getlinkindex(EN_Project ph, char *id, int *index); + int DLLEXPORT EN_getlinkid(EN_Project ph, int index, char *id); + int DLLEXPORT EN_setlinkid(EN_Project ph, int index, char *newid); + int DLLEXPORT EN_getlinktype(EN_Project ph, int index, EN_LinkType *code); + int DLLEXPORT EN_setlinktype(EN_Project ph, int *index, EN_LinkType type, int actionCode); + int DLLEXPORT EN_getlinknodes(EN_Project ph, int index, int *node1, int *node2); + int DLLEXPORT EN_setlinknodes(EN_Project ph, int index, int node1, int node2); + int DLLEXPORT EN_getlinkvalue(EN_Project ph, int index, EN_LinkProperty code, + EN_API_FLOAT_TYPE *value); + int DLLEXPORT EN_setlinkvalue(EN_Project ph, int index, int code, EN_API_FLOAT_TYPE v); + + int DLLEXPORT EN_getpumptype(EN_Project ph, int linkIndex, int *outType); + int DLLEXPORT EN_getheadcurveindex(EN_Project ph, int pumpIndex, int *curveIndex); + int DLLEXPORT EN_setheadcurveindex(EN_Project ph, int pumpIndex, int curveIndex); + + int DLLEXPORT EN_addpattern(EN_Project ph, char *id); + int DLLEXPORT EN_getpatternindex(EN_Project ph, char *id, int *index); + int DLLEXPORT EN_getpatternid(EN_Project ph, int index, char *id); + int DLLEXPORT EN_getpatternlen(EN_Project ph, int index, int *len); + int DLLEXPORT EN_getpatternvalue(EN_Project ph, int index, int period, EN_API_FLOAT_TYPE *value); + int DLLEXPORT EN_setpatternvalue(EN_Project ph, int index, int period, EN_API_FLOAT_TYPE value); + int DLLEXPORT EN_getaveragepatternvalue(EN_Project ph, int index, EN_API_FLOAT_TYPE *value); + int DLLEXPORT EN_setpattern(EN_Project ph, int index, EN_API_FLOAT_TYPE *f, int len); + + int DLLEXPORT EN_addcurve(EN_Project ph, char *id); + int DLLEXPORT EN_getcurveindex(EN_Project ph, char *id, int *index); + int DLLEXPORT EN_getcurveid(EN_Project ph, int index, char *id); + int DLLEXPORT EN_getcurvelen(EN_Project ph, int index, int *len); + int DLLEXPORT EN_getcurvetype(EN_Project ph, int curveIndex, int *outType); + int DLLEXPORT EN_getcurvevalue(EN_Project ph, int curveIndex, int pointIndex, + EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); + int DLLEXPORT EN_setcurvevalue(EN_Project ph, int curveIndex, int pointIndex, + EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); + int DLLEXPORT EN_getcurve(EN_Project ph, int curveIndex, char* id, + int *nValues, EN_API_FLOAT_TYPE **xValues, + EN_API_FLOAT_TYPE **yValues); + int DLLEXPORT EN_setcurve(EN_Project ph, int index, EN_API_FLOAT_TYPE *x, + EN_API_FLOAT_TYPE *y, int len); + + int DLLEXPORT EN_addcontrol(EN_Project ph, int *cindex, int ctype, int lindex, + EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); + int DLLEXPORT EN_deletecontrol(EN_Project ph, int index); + int DLLEXPORT EN_getcontrol(EN_Project ph, int controlIndex, + int *controlType, int *linkIndex, EN_API_FLOAT_TYPE *setting, + int *nodeIndex, EN_API_FLOAT_TYPE *level); + int DLLEXPORT EN_setcontrol(EN_Project ph, int cindex, int ctype, int lindex, + EN_API_FLOAT_TYPE setting, int nindex, EN_API_FLOAT_TYPE level); + + int DLLEXPORT EN_addrule(EN_Project ph, char *rule); + int DLLEXPORT EN_deleterule(EN_Project ph, int index); + int DLLEXPORT EN_getrule(EN_Project ph, int index, int *nPremises, + int *nThenActions, int *nElseActions, EN_API_FLOAT_TYPE *priority); + int DLLEXPORT EN_getruleID(EN_Project ph, int index, char* id); + int DLLEXPORT EN_getpremise(EN_Project ph, int ruleIndex, int premiseIndex, + int *logop, int *object, int *objIndex, int *variable, int *relop, + int *status, EN_API_FLOAT_TYPE *value); + int DLLEXPORT EN_setpremise(EN_Project ph, int ruleIndex, int premiseIndex, + int logop, int object, int objIndex, int variable, int relop, + int status, EN_API_FLOAT_TYPE value); + int DLLEXPORT EN_setpremiseindex(EN_Project ph, int ruleIndex, + int premiseIndex, int objIndex); + int DLLEXPORT EN_setpremisestatus(EN_Project ph, int ruleIndex, + int premiseIndex, int status); + int DLLEXPORT EN_setpremisevalue(EN_Project ph, int ruleIndex, + int premiseIndex, EN_API_FLOAT_TYPE value); + int DLLEXPORT EN_getthenaction(EN_Project ph, int ruleIndex, int actionIndex, + int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); + int DLLEXPORT EN_setthenaction(EN_Project ph, int ruleIndex, int actionIndex, + int linkIndex, int status, EN_API_FLOAT_TYPE setting); + int DLLEXPORT EN_getelseaction(EN_Project ph, int ruleIndex, int actionIndex, + int *linkIndex, int *status, EN_API_FLOAT_TYPE *setting); + 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 + +#endif //EPANET2_2_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..3b7ba4e 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" #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..9540a7b 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -17,647 +17,16 @@ #ifndef __APPLE__ #include #endif -#include +#include #include -#include "epanet2.h" +#include "epanet2_2.h" #include "types.h" #include "funcs.h" #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.c b/src/epanet2.c new file mode 100644 index 0000000..ef0f0ce --- /dev/null +++ b/src/epanet2.c @@ -0,0 +1,654 @@ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.2 + Module: epanet2.c + Description: implementation of the legacy EPANET API functions + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 11/29/2018 + ****************************************************************************** +*/ + + +#include "types.h" +#include "funcs.h" + +#include "epanet2.h" +#include "epanet2_2.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) diff --git a/tests/test_addrule.cpp b/tests/test_addrule.cpp index 851d821..6fc67d7 100644 --- a/tests/test_addrule.cpp +++ b/tests/test_addrule.cpp @@ -16,7 +16,7 @@ node or link appearing in any simple or rule-based controls. #include #include -#include "epanet2.h" +#include "epanet2_2.h" #define DATA_PATH_INP "./net1.inp" #define DATA_PATH_RPT "./test.rpt" @@ -30,7 +30,7 @@ using namespace std; char R1[] = "RULE 1 \n IF NODE 2 LEVEL < 100 \n THEN LINK 9 STATUS = OPEN"; char R2[] = "RULE 2\nIF SYSTEM TIME = 4\nTHEN LINK 9 STATUS = CLOSED\nAND LINK 31 STATUS = CLOSED"; -char R3[] = "RULE 3\nIF NODE 23 PRESSURE ABOVE 140\nAND NODE 2 LEVEL > 120\n" +char R3[] = "RULE 3\nIF NODE 23 PRESSURE ABOVE 140\nAND NODE 2 LEVEL > 120\n" "THEN LINK 113 STATUS = CLOSED\nELSE LINK 22 STATUS = CLOSED"; #ifndef NO_BOOST @@ -47,11 +47,11 @@ int main(int argc, char *argv[]) EN_Project ph = NULL; EN_createproject(&ph); - + std::string path_inp = std::string(DATA_PATH_INP); std::string path_rpt = std::string(DATA_PATH_RPT); std::string path_out = std::string(DATA_PATH_OUT); - + error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), ""); BOOST_REQUIRE(error == 0); @@ -66,7 +66,7 @@ int main(int argc, char *argv[]) // Check that rules were added error = EN_getcount(ph, EN_RULECOUNT, &ruleCount); BOOST_REQUIRE(ruleCount == 3); - + // Check the number of clauses in rule 3 error = EN_getrule(ph, 3, &nP, &nTA, &nEA, &priority); BOOST_REQUIRE(nP == 2); diff --git a/tests/test_demand_categories.cpp b/tests/test_demand_categories.cpp index efc8d8a..0d0af0b 100644 --- a/tests/test_demand_categories.cpp +++ b/tests/test_demand_categories.cpp @@ -11,7 +11,7 @@ A demand category name is set, the network is saved, reopened and the new demand #include #include -#include "epanet2.h" +#include "epanet2_2.h" // NOTE: Project Home needs to be updated to run unit test #define DATA_PATH_INP "./net1.inp" @@ -41,12 +41,12 @@ BOOST_AUTO_TEST_CASE(test_demand_categories) char demand_category[] = "Demand category name"; char demname[80]; - + int error = 0; int Nindex, ndem; EN_Project ph = NULL; - + error = EN_createproject(&ph); error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), path_out.c_str()); @@ -55,7 +55,7 @@ BOOST_AUTO_TEST_CASE(test_demand_categories) error = EN_getnumdemands(ph, Nindex, &ndem); BOOST_REQUIRE(error == 0); BOOST_CHECK(ndem == 1); - + error = EN_setdemandname(ph, Nindex, ndem, demand_category); BOOST_REQUIRE(error == 0); error = EN_saveinpfile(ph, inp_save.c_str()); @@ -68,7 +68,7 @@ BOOST_AUTO_TEST_CASE(test_demand_categories) BOOST_TEST_CHECKPOINT("Reopening saved input file"); error = EN_createproject(&ph); - BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(error == 0); error = EN_open(ph, inp_save.c_str(), path_rpt.c_str(), path_out.c_str()); BOOST_REQUIRE(error == 0); @@ -81,11 +81,11 @@ BOOST_AUTO_TEST_CASE(test_demand_categories) error = EN_getdemandname(ph, Nindex, ndem, demname); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(demname, demand_category)); - + error = EN_close(ph); - BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(error == 0); error = EN_deleteproject(&ph); BOOST_REQUIRE(error == 0); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/test_net_builder.cpp b/tests/test_net_builder.cpp index ee95341..e6528c0 100644 --- a/tests/test_net_builder.cpp +++ b/tests/test_net_builder.cpp @@ -17,7 +17,7 @@ The test ends with a check that the three head values are equal. #include #include -#include "epanet2.h" +#include "epanet2_2.h" // NOTE: Project Home needs to be updated to run unit test #define DATA_PATH_INP "./net1.inp" @@ -35,11 +35,11 @@ BOOST_AUTO_TEST_CASE(test_net_builder) long t, tstep; int i, ind, Lindex, Nindex, Cindex; float h_orig, h_build, h_build_loaded; - + // first we load Net1.inp, run it and record the head in Tank 2 at the end of the simulation (h_orig) EN_Project ph = NULL; EN_createproject(&ph); - + std::string path_inp = std::string(DATA_PATH_INP); std::string path_rpt = std::string(DATA_PATH_RPT); std::string path_out = std::string(DATA_PATH_OUT); @@ -59,19 +59,19 @@ BOOST_AUTO_TEST_CASE(test_net_builder) do { error = EN_runH(ph, &t); BOOST_REQUIRE(error == 0); - + // this is the head at the end of the simulation after loading the original Net1.inp error = EN_getnodevalue(ph, Nindex, EN_HEAD, &h_orig); BOOST_REQUIRE(error == 0); - + error = EN_nextH(ph, &tstep); BOOST_REQUIRE(error == 0); - } while (tstep > 0); + } while (tstep > 0); error = EN_closeH(ph); BOOST_REQUIRE(error == 0); - + error = EN_close(ph); BOOST_REQUIRE(error == 0); @@ -200,17 +200,17 @@ BOOST_AUTO_TEST_CASE(test_net_builder) error = EN_runH(ph, &t); BOOST_REQUIRE(error == 0); // this is the head at the end of the simulation after building the network *without* saving it to file - error = EN_getnodevalue(ph, Nindex, EN_HEAD, &h_build); + error = EN_getnodevalue(ph, Nindex, EN_HEAD, &h_build); BOOST_REQUIRE(error == 0); error = EN_nextH(ph, &tstep); BOOST_REQUIRE(error == 0); } while (tstep > 0); error = EN_closeH(ph); BOOST_REQUIRE(error == 0); - + error = EN_saveinpfile(ph, "net_builder.inp"); BOOST_REQUIRE(error == 0); - + error = EN_close(ph); BOOST_REQUIRE(error == 0); error = EN_deleteproject(&ph); @@ -238,17 +238,17 @@ BOOST_AUTO_TEST_CASE(test_net_builder) BOOST_REQUIRE(error == 0); } while (tstep > 0); - + error = EN_closeH(ph); BOOST_REQUIRE(error == 0); - + error = EN_close(ph); BOOST_REQUIRE(error == 0); - EN_deleteproject(&ph); + EN_deleteproject(&ph); //--------------------------------------------------------------------- // if we got this far we can compare results - + // compare the original to the build & saved network BOOST_REQUIRE(h_orig == h_build_loaded); @@ -257,4 +257,4 @@ BOOST_AUTO_TEST_CASE(test_net_builder) } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/test_reent.cpp b/tests/test_reent.cpp index 99f896f..3a59425 100644 --- a/tests/test_reent.cpp +++ b/tests/test_reent.cpp @@ -14,7 +14,7 @@ #include -#include "epanet2.h" +#include "epanet2_2.h" #define NUM_THREADS 2 diff --git a/tests/test_setid.cpp b/tests/test_setid.cpp index 70f0579..ea6ef94 100644 --- a/tests/test_setid.cpp +++ b/tests/test_setid.cpp @@ -14,7 +14,7 @@ A node and link name are changed, the network is saved, reopened and the new nam #include #include -#include "epanet2.h" +#include "epanet2_2.h" #define DATA_PATH_INP "./net1.inp" #define DATA_PATH_RPT "./test.rpt" @@ -37,13 +37,13 @@ int main(int argc, char *argv[]) string path_rpt(DATA_PATH_RPT); string path_out(DATA_PATH_OUT); string inp_save("net1_setid.inp"); - + int error = 0; int index; EN_Project ph = NULL; EN_createproject(&ph); - + error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), ""); BOOST_REQUIRE(error == 0); @@ -74,17 +74,17 @@ int main(int argc, char *argv[]) error = EN_close(ph); BOOST_REQUIRE(error == 0); EN_deleteproject(&ph); - + // Re-open the saved project EN_createproject(&ph); error = EN_open(ph, inp_save.c_str(), path_rpt.c_str(), ""); BOOST_REQUIRE(error == 0); - + // Check that 3rd node has its new name error = EN_getnodeindex(ph, newid_2, &index); BOOST_REQUIRE(error == 0); BOOST_REQUIRE(index == 3); - + // Check that 3rd link has its new name error = EN_getlinkindex(ph, newid_4, &index); BOOST_REQUIRE(error == 0); diff --git a/tests/test_setlinktype.cpp b/tests/test_setlinktype.cpp index b9efb6f..32c3987 100644 --- a/tests/test_setlinktype.cpp +++ b/tests/test_setlinktype.cpp @@ -13,7 +13,7 @@ of the PRV 121 should be 100. #include #include -#include "epanet2.h" +#include "epanet2_2.h" #define DATA_PATH_INP "./net1.inp" #define DATA_PATH_RPT "./test.rpt" @@ -31,11 +31,11 @@ BOOST_AUTO_TEST_CASE(test_setlinktype) EN_Project ph = NULL; EN_createproject(&ph); - + std::string path_inp = std::string(DATA_PATH_INP); std::string path_rpt = std::string(DATA_PATH_RPT); std::string path_out = std::string(DATA_PATH_OUT); - + error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), ""); BOOST_REQUIRE(error == 0); diff --git a/tests/test_toolkit.cpp b/tests/test_toolkit.cpp index 618fc1c..1bcd613 100644 --- a/tests/test_toolkit.cpp +++ b/tests/test_toolkit.cpp @@ -21,7 +21,7 @@ #include #include -#include "epanet2.h" +#include "epanet2_2.h" // NOTE: Project Home needs to be updated to run unit test #define DATA_PATH_INP "./net1.inp" @@ -81,16 +81,16 @@ BOOST_AUTO_TEST_CASE(test_save_reopen) EN_open(ph_save, path_inp.c_str(), path_rpt.c_str(), path_out.c_str()); EN_saveinpfile(ph_save, inp_save.c_str()); - EN_close(ph_save); - + EN_close(ph_save); + EN_deleteproject(&ph_save); BOOST_TEST_CHECKPOINT("Saved input file"); EN_createproject(&ph_reopen); - + EN_open(ph_reopen, inp_save.c_str(), path_rpt.c_str(), path_out.c_str()); EN_close(ph_reopen); - + EN_deleteproject(&ph_reopen); } @@ -100,8 +100,14 @@ BOOST_AUTO_TEST_CASE(test_epanet) string path_rpt(DATA_PATH_RPT); string path_out(DATA_PATH_OUT); - int error = ENepanet(path_inp.c_str(), path_rpt.c_str(), path_out.c_str(), NULL); + EN_Project ph; + + EN_createproject(&ph); + + int error = EN_runproject(ph, path_inp.c_str(), path_rpt.c_str(), path_out.c_str(), NULL); BOOST_REQUIRE(error == 0); + + EN_deleteproject(&ph); } BOOST_AUTO_TEST_SUITE_END() @@ -163,7 +169,7 @@ BOOST_FIXTURE_TEST_CASE(test_hyd_step, Fixture) BOOST_REQUIRE(error == 0); } while (tstep > 0); - + error = EN_closeH(ph); BOOST_REQUIRE(error == 0); } @@ -190,7 +196,7 @@ BOOST_FIXTURE_TEST_CASE(test_qual_step, Fixture) BOOST_REQUIRE(error == 0); } while (tstep > 0); - + error = EN_closeQ(ph); BOOST_REQUIRE(error == 0); } @@ -243,7 +249,7 @@ BOOST_FIXTURE_TEST_CASE(test_setdemandpattern, Fixture) // get the number of nodes error = EN_getcount(ph, EN_NODECOUNT, &nnodes); BOOST_REQUIRE(error == 0); - + // add a new pattern error = EN_addpattern(ph, newpat); BOOST_REQUIRE(error == 0); @@ -251,18 +257,18 @@ BOOST_FIXTURE_TEST_CASE(test_setdemandpattern, Fixture) // get the new patterns index, should be as the number of patterns error = EN_getpatternindex(ph, newpat, &pat_index); BOOST_REQUIRE(error == 0); - + for (i = 1; i <= nnodes; i++) { // get the number of demand categories error = EN_getnumdemands(ph, i, &numDemands); BOOST_REQUIRE(error == 0); - + for (j = 1; j <= numDemands; j++) { // set demand patterns - error = EN_setdemandpattern(ph, i, j, pat_index); + error = EN_setdemandpattern(ph, i, j, pat_index); BOOST_REQUIRE(error == 0); // get demand patterns should be the same with set - error = EN_getdemandpattern(ph, i, j, &pat_index_2); + error = EN_getdemandpattern(ph, i, j, &pat_index_2); BOOST_REQUIRE(error == 0); BOOST_CHECK(pat_index == pat_index_2); } @@ -272,11 +278,11 @@ BOOST_FIXTURE_TEST_CASE(test_addpattern, Fixture) { int pat_index, n_patterns_1, n_patterns_2; char newpat[] = "new_pattern"; - + // get the number of current patterns error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_1); BOOST_REQUIRE(error == 0); - + // add a new pattern error = EN_addpattern(ph, newpat); BOOST_REQUIRE(error == 0); @@ -285,7 +291,7 @@ BOOST_FIXTURE_TEST_CASE(test_addpattern, Fixture) error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_2); BOOST_REQUIRE(error == 0); BOOST_CHECK(n_patterns_1 + 1 == n_patterns_2); - + // gwt the new patterns index, should be as the number of patterns error = EN_getpatternindex(ph, newpat, &pat_index); BOOST_CHECK(pat_index == n_patterns_2); @@ -311,16 +317,16 @@ BOOST_FIXTURE_TEST_CASE(test_add_control, Fixture) error = EN_nextH(ph, &tstep); BOOST_REQUIRE(error == 0); } while (tstep > 0); - + error = EN_closeH(ph); BOOST_REQUIRE(error == 0); - - // disable current controls + + // disable current controls error = EN_setcontrol(ph, 1, 0, 0, 0, 0, 0); BOOST_REQUIRE(error == 0); error = EN_setcontrol(ph, 2, 1, 0, 0, 0, 0); BOOST_REQUIRE(error == 0); - + // add new controls error = EN_addcontrol(ph, &Cindex, 0, 13, 1, 11, 110); BOOST_REQUIRE(error == 0); @@ -342,10 +348,10 @@ BOOST_FIXTURE_TEST_CASE(test_add_control, Fixture) error = EN_nextH(ph, &tstep); BOOST_REQUIRE(error == 0); } while (tstep > 0); - + error = EN_closeH(ph); BOOST_REQUIRE(error == 0); - + BOOST_CHECK(h1 == h2); // end head should be the same with new controls } diff --git a/win_build/WinSDK/Makefile.bat b/win_build/WinSDK/Makefile.bat index 4206ecb..f96afcd 100644 --- a/win_build/WinSDK/Makefile.bat +++ b/win_build/WinSDK/Makefile.bat @@ -21,9 +21,9 @@ Find /i "x86" < checkOS.tmp > StringCheck.tmp If %ERRORLEVEL% == 1 ( CALL "%SDK_PATH%bin\"SetEnv.cmd /x64 /release rem : create EPANET2.DLL - cl -o epanet2.dll epanet.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL + cl -o epanet2.dll epanet.c epanet2.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL rem : create EPANET2.EXE - cl -o epanet2.exe epanet.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link + cl -o epanet2.exe epanet.c epanet2.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link md "%Build_PATH%"\64bit move /y "%SRC_PATH%"\*.dll "%Build_PATH%"\64bit move /y "%SRC_PATH%"\*.exe "%Build_PATH%"\64bit @@ -35,9 +35,9 @@ rem : 32 bit with DEF CALL "%SDK_PATH%bin\"SetEnv.cmd /x86 /release echo "32 bit with epanet2.def mapping" rem : create EPANET2.DLL -cl -o epanet2.dll epanet.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL /def:..\win_build\WinSDK\epanet2.def /MAP +cl -o epanet2.dll epanet.c epanet2.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL /def:..\win_build\WinSDK\epanet2.def /MAP rem : create EPANET2.EXE -cl -o epanet2.exe epanet.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link +cl -o epanet2.exe epanet.c epanet2.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c project.c quality.c qualroute.c qualreact.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link md "%Build_PATH%"\32bit move /y "%SRC_PATH%"\*.dll "%Build_PATH%"\32bit move /y "%SRC_PATH%"\*.exe "%Build_PATH%"\32bit