Merge pull request #353 from michaeltryby/dev

epanet toolkit api versioning
This commit is contained in:
Michael Tryby
2018-11-30 09:38:04 -05:00
committed by GitHub
17 changed files with 1378 additions and 1236 deletions

View File

@@ -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)

View File

@@ -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

246
include/epanet2_2.h Normal file
View File

@@ -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

305
include/epanet2_enums.h Normal file
View File

@@ -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

View File

@@ -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)

View File

@@ -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 <stdio.h>
#include <string.h>
#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 <input_filename> <report_filename> [<binary_filename>]\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]);

View File

@@ -17,647 +17,16 @@
#ifndef __APPLE__
#include <malloc.h>
#endif
#include <float.h>
#include <float.h>
#include <math.h>
#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;

654
src/epanet2.c Normal file
View File

@@ -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);
}

View File

@@ -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)

View File

@@ -16,7 +16,7 @@ node or link appearing in any simple or rule-based controls.
#include <iostream>
#include <string>
#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);

View File

@@ -11,7 +11,7 @@ A demand category name is set, the network is saved, reopened and the new demand
#include <boost/test/included/unit_test.hpp>
#include <string>
#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()
BOOST_AUTO_TEST_SUITE_END()

View File

@@ -17,7 +17,7 @@ The test ends with a check that the three head values are equal.
#include <boost/test/included/unit_test.hpp>
#include <string>
#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()
BOOST_AUTO_TEST_SUITE_END()

View File

@@ -14,7 +14,7 @@
#include <boost/thread.hpp>
#include "epanet2.h"
#include "epanet2_2.h"
#define NUM_THREADS 2

View File

@@ -14,7 +14,7 @@ A node and link name are changed, the network is saved, reopened and the new nam
#include <iostream>
#include <string>
#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);

View File

@@ -13,7 +13,7 @@ of the PRV 121 should be 100.
#include <boost/test/included/unit_test.hpp>
#include <string>
#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);

View File

@@ -21,7 +21,7 @@
#include <boost/test/included/unit_test.hpp>
#include <string>
#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
}

View File

@@ -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