From 79c2bf811ee9552f15964840cd80e140cd064e74 Mon Sep 17 00:00:00 2001 From: JIANG Date: Tue, 30 Dec 2025 18:21:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20epanet=20Linux=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=9B=E4=B8=BA=20epanet.py=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?Linux=20=E7=9A=84=E7=8E=AF=E5=A2=83=E8=BF=90=E8=A1=8C=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- epanet/epanet.py | 309 +++-- epanet/linux/epanet2.h | 464 +++++++ epanet/linux/epanet2.pas | 486 ++++++++ epanet/linux/epanet2_2.h | 1960 ++++++++++++++++++++++++++++++ epanet/linux/epanet2_enums.h | 518 ++++++++ epanet/linux/libepanet-output.so | Bin 0 -> 22528 bytes epanet/linux/libepanet2.so | Bin 0 -> 430008 bytes epanet/linux/runepanet | Bin 0 -> 16952 bytes 8 files changed, 3624 insertions(+), 113 deletions(-) create mode 100644 epanet/linux/epanet2.h create mode 100644 epanet/linux/epanet2.pas create mode 100644 epanet/linux/epanet2_2.h create mode 100644 epanet/linux/epanet2_enums.h create mode 100644 epanet/linux/libepanet-output.so create mode 100644 epanet/linux/libepanet2.so create mode 100644 epanet/linux/runepanet diff --git a/epanet/epanet.py b/epanet/epanet.py index 82863d5..eefd3f6 100644 --- a/epanet/epanet.py +++ b/epanet/epanet.py @@ -8,18 +8,19 @@ from datetime import datetime import subprocess import logging from typing import Any -sys.path.append("..") + +sys.path.append("..") from api import project from api import inp_out def _verify_platform(): _platform = platform.system() - if _platform != "Windows": - raise Exception(f'Platform {_platform} unsupported (not yet)') + if _platform not in ["Windows", "Linux"]: + raise Exception(f"Platform {_platform} unsupported (not yet)") - -if __name__ == '__main__': + +if __name__ == "__main__": _verify_platform() @@ -27,201 +28,260 @@ class Output: def __init__(self, path: str) -> None: self._path = path - self._lib = ctypes.CDLL(os.path.join(os.getcwd(), 'epanet', 'epanet-output.dll')) + if platform.system() == "Windows": + self._lib = ctypes.CDLL( + os.path.join(os.getcwd(), "epanet", "epanet-output.dll") + ) + else: + self._lib = ctypes.CDLL( + os.path.join(os.getcwd(), "epanet", "linux", "libepanet-output.so") + ) self._handle = ctypes.c_void_p() self._check(self._lib.ENR_init(ctypes.byref(self._handle))) - self._check(self._lib.ENR_open(self._handle, ctypes.c_char_p(self._path.encode()))) - + self._check( + self._lib.ENR_open(self._handle, ctypes.c_char_p(self._path.encode())) + ) def __del__(self): # throw exception in destructor ? :) self._check(self._lib.ENR_close(ctypes.byref(self._handle))) - def _check(self, result): if result != 0 and result != 10: msg = ctypes.c_char_p() code = self._lib.ENR_checkError(self._handle, ctypes.byref(msg)) assert code == result - error = f'Failed to read project [{self._path}] output, message [{msg.value.decode()}]' + error = f"Failed to read project [{self._path}] output, message [{msg.value.decode()}]" self._lib.ENR_free(ctypes.byref(msg)) raise Exception(error) - def version(self) -> int: v = ctypes.c_int() self._check(self._lib.ENR_getVersion(self._handle, ctypes.byref(v))) return v.value - def net_size(self) -> dict[str, int]: element_count = ctypes.POINTER(ctypes.c_int)() length = ctypes.c_int() - self._check(self._lib.ENR_getNetSize(self._handle, ctypes.byref(element_count), ctypes.byref(length))) + self._check( + self._lib.ENR_getNetSize( + self._handle, ctypes.byref(element_count), ctypes.byref(length) + ) + ) assert length.value == 5 - category = ['node', 'tank', 'link', 'pump', 'valve'] + category = ["node", "tank", "link", "pump", "valve"] sizes = {} for i in range(length.value): sizes[category[i]] = element_count[i] self._lib.ENR_free(ctypes.byref(element_count)) return sizes - def units(self) -> dict[str, str]: - f_us = ['CFS', 'GPM', 'MGD', 'IMGD', 'AFD', 'LPS', 'LPM', 'MLD', 'CMH', 'CMD'] - p_us = ['PSI', 'MTR', 'KPA'] - q_us = ['NONE', 'MGL', 'UGL', 'HOURS', 'PRCNT'] + f_us = ["CFS", "GPM", "MGD", "IMGD", "AFD", "LPS", "LPM", "MLD", "CMH", "CMD"] + p_us = ["PSI", "MTR", "KPA"] + q_us = ["NONE", "MGL", "UGL", "HOURS", "PRCNT"] f, p, q = ctypes.c_int(1), ctypes.c_int(2), ctypes.c_int(3) f_u, p_u, q_u = ctypes.c_int(), ctypes.c_int(), ctypes.c_int() self._check(self._lib.ENR_getUnits(self._handle, f, ctypes.byref(f_u))) self._check(self._lib.ENR_getUnits(self._handle, p, ctypes.byref(p_u))) self._check(self._lib.ENR_getUnits(self._handle, q, ctypes.byref(q_u))) - return { 'flow': f_us[f_u.value], 'pressure': p_us[p_u.value], 'quality': q_us[q_u.value] } - + return { + "flow": f_us[f_u.value], + "pressure": p_us[p_u.value], + "quality": q_us[q_u.value], + } def times(self) -> dict[str, int]: ts = [] for i in range(1, 5): t = ctypes.c_int(1) - self._check(self._lib.ENR_getTimes(self._handle, ctypes.c_int(i), ctypes.byref(t))) + self._check( + self._lib.ENR_getTimes(self._handle, ctypes.c_int(i), ctypes.byref(t)) + ) ts.append(t.value) d = {} - category = ['report_start', 'report_step', 'sim_duration', 'num_periods'] + category = ["report_start", "report_step", "sim_duration", "num_periods"] for i in range(4): d[category[i]] = ts[i] return d - def element_name(self) -> dict[str, list[str]]: sizes = self.net_size() node_type = ctypes.c_int(1) nodes = [] - for i in range(1, sizes['node'] + 1): + for i in range(1, sizes["node"] + 1): name = ctypes.c_char_p() name_len = ctypes.c_int() - self._check(self._lib.ENR_getElementName(self._handle, node_type, ctypes.c_int(i), ctypes.byref(name), ctypes.byref(name_len))) + self._check( + self._lib.ENR_getElementName( + self._handle, + node_type, + ctypes.c_int(i), + ctypes.byref(name), + ctypes.byref(name_len), + ) + ) nodes.append(name.value.decode()) self._lib.ENR_free(ctypes.byref(name)) - + link_type = ctypes.c_int(2) links = [] - for i in range(1, sizes['link'] + 1): + for i in range(1, sizes["link"] + 1): name = ctypes.c_char_p() name_len = ctypes.c_int() - self._check(self._lib.ENR_getElementName(self._handle, link_type, ctypes.c_int(i), ctypes.byref(name), ctypes.byref(name_len))) + self._check( + self._lib.ENR_getElementName( + self._handle, + link_type, + ctypes.c_int(i), + ctypes.byref(name), + ctypes.byref(name_len), + ) + ) links.append(name.value.decode()) self._lib.ENR_free(ctypes.byref(name)) - return { 'nodes' : nodes, 'links': links } - + return {"nodes": nodes, "links": links} def energy_usage(self) -> list[dict[str, Any]]: - size = self.net_size()['pump'] + size = self.net_size()["pump"] usages = [] - category = ['utilization', 'avg.efficiency', 'avg.kW/flow', 'avg.kwatts', 'max.kwatts', 'cost/day' ] - links = self.element_name()['links'] + category = [ + "utilization", + "avg.efficiency", + "avg.kW/flow", + "avg.kwatts", + "max.kwatts", + "cost/day", + ] + links = self.element_name()["links"] for i in range(1, size + 1): index = ctypes.c_int() values = ctypes.POINTER(ctypes.c_float)() length = ctypes.c_int() - self._check(self._lib.ENR_getEnergyUsage(self._handle, ctypes.c_int(i), ctypes.byref(index), ctypes.byref(values), ctypes.byref(length))) + self._check( + self._lib.ENR_getEnergyUsage( + self._handle, + ctypes.c_int(i), + ctypes.byref(index), + ctypes.byref(values), + ctypes.byref(length), + ) + ) assert length.value == 6 - d = { 'pump' : links[index.value - 1] } + d = {"pump": links[index.value - 1]} for j in range(length.value): - d |= { category[j] : values[j] } + d |= {category[j]: values[j]} usages.append(d) self._lib.ENR_free(ctypes.byref(values)) return usages - def reactions(self) -> dict[str, float]: values = ctypes.POINTER(ctypes.c_float)() length = ctypes.c_int() - self._check(self._lib.ENR_getNetReacts(self._handle, ctypes.byref(values), ctypes.byref(length))) + self._check( + self._lib.ENR_getNetReacts( + self._handle, ctypes.byref(values), ctypes.byref(length) + ) + ) assert length.value == 4 - category = ['bulk', 'wall', 'tank', 'source'] + category = ["bulk", "wall", "tank", "source"] d = {} for i in range(4): d[category[i]] = values[i] self._lib.ENR_free(ctypes.byref(values)) return d - def node_results(self) -> list[dict[str, Any]]: - size = self.net_size()['node'] - num_periods = self.times()['num_periods'] - nodes = self.element_name()['nodes'] - category = ['demand', 'head', 'pressure', 'quality'] + size = self.net_size()["node"] + num_periods = self.times()["num_periods"] + nodes = self.element_name()["nodes"] + category = ["demand", "head", "pressure", "quality"] ds = [] for i in range(1, size + 1): - d = { 'node' : nodes[i - 1], 'result' : [] } + d = {"node": nodes[i - 1], "result": []} for j in range(num_periods): values = ctypes.POINTER(ctypes.c_float)() length = ctypes.c_int() - self._check(self._lib.ENR_getNodeResult(self._handle, j, i, ctypes.byref(values), ctypes.byref(length))) + self._check( + self._lib.ENR_getNodeResult( + self._handle, j, i, ctypes.byref(values), ctypes.byref(length) + ) + ) assert length.value == len(category) attributes = {} for k in range(length.value): attributes[category[k]] = values[k] - d['result'].append(attributes) + d["result"].append(attributes) self._lib.ENR_free(ctypes.byref(values)) ds.append(d) return ds - def link_results(self) -> list[dict[str, Any]]: - size = self.net_size()['link'] - num_periods = self.times()['num_periods'] - links = self.element_name()['links'] - category = ['flow', 'velocity', 'headloss', 'quality', 'status', 'setting', 'reaction', 'friction'] + size = self.net_size()["link"] + num_periods = self.times()["num_periods"] + links = self.element_name()["links"] + category = [ + "flow", + "velocity", + "headloss", + "quality", + "status", + "setting", + "reaction", + "friction", + ] ds = [] for i in range(1, size + 1): - d = { 'link' : links[i - 1], 'result' : [] } + d = {"link": links[i - 1], "result": []} for j in range(num_periods): values = ctypes.POINTER(ctypes.c_float)() length = ctypes.c_int() - self._check(self._lib.ENR_getLinkResult(self._handle, j, i, ctypes.byref(values), ctypes.byref(length))) + self._check( + self._lib.ENR_getLinkResult( + self._handle, j, i, ctypes.byref(values), ctypes.byref(length) + ) + ) assert length.value == len(category) attributes = {} for k in range(length.value): - if category[k] == 'status': + if category[k] == "status": if values[k] == 2.0: - attributes[category[k]] = 'CLOSED' + attributes[category[k]] = "CLOSED" else: - attributes[category[k]] = 'OPEN' + attributes[category[k]] = "OPEN" continue attributes[category[k]] = values[k] - d['result'].append(attributes) + d["result"].append(attributes) self._lib.ENR_free(ctypes.byref(values)) ds.append(d) return ds - def dump(self) -> dict[str, Any]: data = {} - data |= { 'version' : self.version() } - data |= { 'net_size' : self.net_size() } - data |= { 'units' : self.units() } - data |= { 'times' : self.times() } - data |= { 'element_name' : self.element_name() } - data |= { 'energy_usage' : self.energy_usage() } - data |= { 'reactions' : self.reactions() } - data |= { 'node_results' : self.node_results() } - data |= { 'link_results' : self.link_results() } + data |= {"version": self.version()} + data |= {"net_size": self.net_size()} + data |= {"units": self.units()} + data |= {"times": self.times()} + data |= {"element_name": self.element_name()} + data |= {"energy_usage": self.energy_usage()} + data |= {"reactions": self.reactions()} + data |= {"node_results": self.node_results()} + data |= {"link_results": self.link_results()} return data def _dump_output(path: str) -> dict[str, Any]: opt = Output(path) data = opt.dump() - with open(path + '.json', 'w') as f: + with open(path + ".json", "w") as f: json.dump(data, f) return data @@ -232,90 +292,106 @@ def dump_output(path: str) -> str: def dump_report(path: str) -> str: - return open(path, 'r').read() + return open(path, "r").read() def dump_output_binary(path: str) -> str: - with open(path, 'rb') as f: + with open(path, "rb") as f: data = f.read() bast64_data = base64.b64encode(data) - return str(bast64_data, 'utf-8') + return str(bast64_data, "utf-8") -#DingZQ, 2025-02-04, 返回dict[str, Any] + +# DingZQ, 2025-02-04, 返回dict[str, Any] def run_project_return_dict(name: str, readable_output: bool = False) -> dict[str, Any]: if not project.have_project(name): - raise Exception(f'Not found project [{name}]') + raise Exception(f"Not found project [{name}]") dir = os.path.abspath(os.getcwd()) - db_inp = os.path.join(os.path.join(dir, 'db_inp'), name + '.db.inp') - inp_out.dump_inp(name, db_inp, '2') + db_inp = os.path.join(os.path.join(dir, "db_inp"), name + ".db.inp") + inp_out.dump_inp(name, db_inp, "2") - input = name + '.db' - exe = os.path.join(os.path.join(dir, 'epanet'), 'runepanet.exe') - inp = os.path.join(os.path.join(dir, 'db_inp'), input + '.inp') - rpt = os.path.join(os.path.join(dir, 'temp'), input + '.rpt') - opt = os.path.join(os.path.join(dir, 'temp'), input + '.opt') - command = f'{exe} {inp} {rpt} {opt}' + input = name + ".db" + if platform.system() == "Windows": + exe = os.path.join(os.path.join(dir, "epanet"), "runepanet.exe") + else: + exe = os.path.join(os.path.join(dir, "epanet"), "linux", "runepanet") + inp = os.path.join(os.path.join(dir, "db_inp"), input + ".inp") + rpt = os.path.join(os.path.join(dir, "temp"), input + ".rpt") + opt = os.path.join(os.path.join(dir, "temp"), input + ".opt") + command = f"{exe} {inp} {rpt} {opt}" + + if platform.system() != "Windows": + if not os.access(exe, os.X_OK): + os.chmod(exe, 0o755) data = {} result = os.system(command) if result != 0: - data['simulation_result'] = 'failed' + data["simulation_result"] = "failed" else: - data['simulation_result'] = 'successful' + data["simulation_result"] = "successful" if readable_output: - data ['output'] = _dump_output(opt) + data["output"] = _dump_output(opt) else: - data['output'] = dump_output_binary(opt) + data["output"] = dump_output_binary(opt) - data['report'] = dump_report(rpt) + data["report"] = dump_report(rpt) return data + # original code def run_project(name: str, readable_output: bool = False) -> str: if not project.have_project(name): - raise Exception(f'Not found project [{name}]') + raise Exception(f"Not found project [{name}]") dir = os.path.abspath(os.getcwd()) - db_inp = os.path.join(os.path.join(dir, 'db_inp'), name + '.db.inp') - inp_out.dump_inp(name, db_inp, '2') + db_inp = os.path.join(os.path.join(dir, "db_inp"), name + ".db.inp") + inp_out.dump_inp(name, db_inp, "2") - input = name + '.db' - exe = os.path.join(os.path.join(dir, 'epanet'), 'runepanet.exe') - inp = os.path.join(os.path.join(dir, 'db_inp'), input + '.inp') - rpt = os.path.join(os.path.join(dir, 'temp'), input + '.rpt') - opt = os.path.join(os.path.join(dir, 'temp'), input + '.opt') + input = name + ".db" + if platform.system() == "Windows": + exe = os.path.join(os.path.join(dir, "epanet"), "runepanet.exe") + else: + exe = os.path.join(os.path.join(dir, "epanet"), "linux", "runepanet") + inp = os.path.join(os.path.join(dir, "db_inp"), input + ".inp") + rpt = os.path.join(os.path.join(dir, "temp"), input + ".rpt") + opt = os.path.join(os.path.join(dir, "temp"), input + ".opt") - command = f'{exe} {inp} {rpt} {opt}' + command = f"{exe} {inp} {rpt} {opt}" logging.info(f"Run simulation at {datetime.now()}") logging.info(command) + if platform.system() != "Windows": + if not os.access(exe, os.X_OK): + os.chmod(exe, 0o755) + data = {} # DingZQ, 2025-06-02, 使用subprocess.Popen捕获输出到全局日志, 原来的代码是这么写的 result = os.system(command) - #logging.info(f"Simulation result: {result}") + # logging.info(f"Simulation result: {result}") if result != 0: - data['simulation_result'] = 'failed' + data["simulation_result"] = "failed" - logging.error('simulation failed') + logging.error("simulation failed") else: - data['simulation_result'] = 'successful' - logging.info('simulation successful') + data["simulation_result"] = "successful" + logging.info("simulation successful") if readable_output: data |= _dump_output(opt) else: - data['output'] = dump_output_binary(opt) + data["output"] = dump_output_binary(opt) - data['report'] = dump_report(rpt) - #logging.info(f"Report: {data['report']}") + data["report"] = dump_report(rpt) + # logging.info(f"Report: {data['report']}") return json.dumps(data) @@ -323,22 +399,29 @@ def run_project(name: str, readable_output: bool = False) -> str: def run_inp(name: str) -> str: dir = os.path.abspath(os.getcwd()) - exe = os.path.join(os.path.join(dir, 'epanet'), 'runepanet.exe') - inp = os.path.join(os.path.join(dir, 'inp'), name + '.inp') - rpt = os.path.join(os.path.join(dir, 'temp'), name + '.rpt') - opt = os.path.join(os.path.join(dir, 'temp'), name + '.opt') - command = f'{exe} {inp} {rpt} {opt}' + if platform.system() == "Windows": + exe = os.path.join(os.path.join(dir, "epanet"), "runepanet.exe") + else: + exe = os.path.join(os.path.join(dir, "epanet"), "linux", "runepanet") + inp = os.path.join(os.path.join(dir, "inp"), name + ".inp") + rpt = os.path.join(os.path.join(dir, "temp"), name + ".rpt") + opt = os.path.join(os.path.join(dir, "temp"), name + ".opt") + command = f"{exe} {inp} {rpt} {opt}" + + if platform.system() != "Windows": + if not os.access(exe, os.X_OK): + os.chmod(exe, 0o755) data = {} result = os.system(command) if result != 0: - data['simulation_result'] = 'failed' + data["simulation_result"] = "failed" else: - data['simulation_result'] = 'successful' + data["simulation_result"] = "successful" # data |= _dump_output(opt) - data['output'] = dump_output_binary(opt) + data["output"] = dump_output_binary(opt) - data['report'] = dump_report(rpt) + data["report"] = dump_report(rpt) return json.dumps(data) diff --git a/epanet/linux/epanet2.h b/epanet/linux/epanet2.h new file mode 100644 index 0000000..042d6c6 --- /dev/null +++ b/epanet/linux/epanet2.h @@ -0,0 +1,464 @@ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.3 + Module: epanet2.h + Description: declarations of the legacy style EPANET 2 API functions + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 02/14/2025 + ****************************************************************************** + */ + +/* +This module contains declarations of the legacy style EPANET API functions, with +version 2.2 updates, that apply only to single threaded applications. A second +set of thread safe API functions that allows one to run concurrent analyses on +multiple EPANET projects can be found in the epanet2_2.h header file. The two +APIs share the same function names and arguments with the difference being that +the thread safe functions use the prefix "EN_" and include an extra argument that +represents the EPANET project being analyzed. To avoid unnecessary repetition, +only the thread safe API functions have been documented. To see a description of +a legacy style API function declared here please refer to its complementary named +function in epanet2_2.h. +*/ + +#ifndef EPANET2_H +#define EPANET2_H + +// The legacy style EPANET API can be compiled with support for either single +// precision or double precision floating point arguments, with the default +// being single precision. To compile for double precision one must #define +// EN_API_FLOAT_TYPE as double both here and in any client code that uses the +// API. +#ifndef EN_API_FLOAT_TYPE + #define EN_API_FLOAT_TYPE float +#endif + +#ifndef DLLEXPORT + #ifdef _WIN32 + #ifdef epanet2_EXPORTS + #define DLLEXPORT __declspec(dllexport) __stdcall + #else + #define DLLEXPORT __declspec(dllimport) __stdcall + #endif + #elif defined(__CYGWIN__) + #define DLLEXPORT __stdcall + #else + #define DLLEXPORT + #endif +#endif + +#include "epanet2_enums.h" + +// --- Declare the EPANET toolkit functions +#if defined(__cplusplus) +extern "C" { +#endif + + +/******************************************************************** + + Project Functions + +********************************************************************/ + + int DLLEXPORT ENepanet(const char *inpFile, const char *rptFile, + const char *outFile, void (*pviewprog) (char *)); + + int DLLEXPORT ENinit(const char *rptFile, const char *outFile, + int unitsType, int headlossType); + + int DLLEXPORT ENopen(const char *inpFile, const char *rptFile, + const char *outFile); + + int DLLEXPORT ENopenX(const char *inpFile, const char *rptFile, + const char *outFile); + + int DLLEXPORT ENgettitle(char *line1, char *line2, char *line3); + + int DLLEXPORT ENsettitle(const char *line1, const char *line2, const char *line3); + + int DLLEXPORT ENgetcomment(int object, int index, char *comment); + + int DLLEXPORT ENsetcomment(int object, int index, const char *comment); + + int DLLEXPORT ENgettag(int object, int index, char *tag); + + int DLLEXPORT ENsettag(int object, int index, const char *tag); + + int DLLEXPORT ENgetcount(int object, int *count); + + int DLLEXPORT ENsaveinpfile(const char *filename); + + int DLLEXPORT ENclose(); + +/******************************************************************** + + Hydraulic Analysis Functions + +********************************************************************/ + + int DLLEXPORT ENsolveH(); + + int DLLEXPORT ENsaveH(); + + int DLLEXPORT ENopenH(); + + int DLLEXPORT ENinitH(int initFlag); + + int DLLEXPORT ENrunH(long *currentTime); + + int DLLEXPORT ENnextH(long *tStep); + + int DLLEXPORT ENcloseH(); + + int DLLEXPORT ENsavehydfile(const char *filename); + + int DLLEXPORT ENusehydfile(const char *filename); + +/******************************************************************** + + Water Quality Analysis Functions + +********************************************************************/ + + int DLLEXPORT ENsolveQ(); + + int DLLEXPORT ENopenQ(); + + int DLLEXPORT ENinitQ(int saveFlag); + + int DLLEXPORT ENrunQ(long *currentTime); + + int DLLEXPORT ENnextQ(long *tStep); + + int DLLEXPORT ENstepQ(long *timeLeft); + + int DLLEXPORT ENcloseQ(); + +/******************************************************************** + + Reporting Functions + +********************************************************************/ + + int DLLEXPORT ENwriteline(const char *line); + + int DLLEXPORT ENreport(); + + int DLLEXPORT ENcopyreport(const char *filename); + + int DLLEXPORT ENclearreport(); + + int DLLEXPORT ENresetreport(); + + int DLLEXPORT ENsetreport(const char *format); + + int DLLEXPORT ENsetstatusreport(int level); + + int DLLEXPORT ENgetversion(int *version); + + int DLLEXPORT ENgeterror(int errcode, char *errmsg, int maxLen); + + int DLLEXPORT ENgetstatistic(int type, EN_API_FLOAT_TYPE* value); + + int DLLEXPORT ENgetresultindex(int type, int index, int *value); + + int DLLEXPORT ENtimetonextevent(int *eventType, long *duration, int *elementIndex); + + int DLLEXPORT ENsetreportcallback(void (*callback)(void *userData, void *EN_projectHandle, const char*)); + + int DLLEXPORT ENsetreportcallbackuserdata(void *userData); + + +/******************************************************************** + + Analysis Options Functions + +********************************************************************/ + + int DLLEXPORT ENgetoption(int option, EN_API_FLOAT_TYPE *value); + + int DLLEXPORT ENsetoption(int option, EN_API_FLOAT_TYPE value); + + int DLLEXPORT ENgetflowunits(int *units); + + int DLLEXPORT ENsetflowunits(int units); + + int DLLEXPORT ENgettimeparam(int param, long *value); + + int DLLEXPORT ENsettimeparam(int param, long value); + + int DLLEXPORT ENgetqualinfo(int *qualType, char *chemName, char *chemUnits, + int *traceNode); + + int DLLEXPORT ENgetqualtype(int *qualType, int *traceNode); + + int DLLEXPORT ENsetqualtype(int qualType, const char *chemName, + const char *chemUnits, const char *traceNode); + +/******************************************************************** + + Node Functions + +********************************************************************/ + + int DLLEXPORT ENaddnode(const char *id, int nodeType, int *index); + + int DLLEXPORT ENdeletenode(int index, int actionCode); + + int DLLEXPORT ENgetnodeindex(const char *id, int *index); + + int DLLEXPORT ENgetnodeid(int index, char *id); + + int DLLEXPORT ENsetnodeid(int index, const char *newid); + + int DLLEXPORT ENgetnodetype(int index, int *nodeType); + + int DLLEXPORT ENgetnodevalue(int index, int property, EN_API_FLOAT_TYPE *value); + + int DLLEXPORT ENgetnodevalues(int property, EN_API_FLOAT_TYPE *value); + + int DLLEXPORT ENsetnodevalue(int index, int property, EN_API_FLOAT_TYPE value); + + int DLLEXPORT ENsetjuncdata(int index, EN_API_FLOAT_TYPE elev, + EN_API_FLOAT_TYPE dmnd, const char *dmndpat); + + int DLLEXPORT ENsettankdata(int index, EN_API_FLOAT_TYPE elev, + EN_API_FLOAT_TYPE initlvl, EN_API_FLOAT_TYPE minlvl, + EN_API_FLOAT_TYPE maxlvl, EN_API_FLOAT_TYPE diam, + EN_API_FLOAT_TYPE minvol, const char *volcurve); + + int DLLEXPORT ENgetcoord(int index, double *x, double *y); + + int DLLEXPORT ENsetcoord(int index, double x, double y); + +/******************************************************************** + + Nodal Demand Functions + +********************************************************************/ + + int DLLEXPORT ENgetdemandmodel(int *model, EN_API_FLOAT_TYPE *pmin, + EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); + + int DLLEXPORT ENsetdemandmodel(int model, EN_API_FLOAT_TYPE pmin, + EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); + + int DLLEXPORT ENadddemand(int nodeIndex, EN_API_FLOAT_TYPE baseDemand, + const char *demandPattern, const char *demandName); + + int DLLEXPORT ENdeletedemand(int nodeIndex, int demandIndex); + + int DLLEXPORT ENgetnumdemands(int nodeIndex, int *numDemands); + + int DLLEXPORT ENgetdemandindex(int nodeIndex, const char *demandName, + int *demandIndex); + + int DLLEXPORT ENgetbasedemand(int nodeIndex, int demandIndex, + EN_API_FLOAT_TYPE *baseDemand); + + int DLLEXPORT ENsetbasedemand(int nodeIndex, int demandIndex, + EN_API_FLOAT_TYPE baseDemand); + + int DLLEXPORT ENgetdemandpattern(int nodeIndex, int demandIndex, int *patIndex); + + int DLLEXPORT ENsetdemandpattern(int nodeIndex, int demandIndex, int patIndex); + + int DLLEXPORT ENgetdemandname(int nodeIndex, int demandIndex, char *demandName); + + int DLLEXPORT ENsetdemandname(int nodeIndex, int demandIndex, const char *demandName); + +/******************************************************************** + + Link Functions + +********************************************************************/ + + int DLLEXPORT ENaddlink(const char *id, int linkType, const char *fromNode, + const char *toNode, int *index); + + int DLLEXPORT ENdeletelink(int index, int actionCode); + + int DLLEXPORT ENgetlinkindex(const char *id, int *index); + + int DLLEXPORT ENgetlinkid(int index, char *id); + + int DLLEXPORT ENsetlinkid(int index, const char *newid); + + int DLLEXPORT ENgetlinktype(int index, int *linkType); + + int DLLEXPORT ENsetlinktype(int *index, int linkType, int actionCode); + + int DLLEXPORT ENgetlinknodes(int index, int *node1, int *node2); + + int DLLEXPORT ENsetlinknodes(int index, int node1, int node2); + + int DLLEXPORT ENgetlinkvalue(int index, int property, EN_API_FLOAT_TYPE *value); + + int DLLEXPORT ENgetlinkvalues(int property, EN_API_FLOAT_TYPE *value); + + int DLLEXPORT ENsetlinkvalue(int index, int property, EN_API_FLOAT_TYPE value); + + int DLLEXPORT ENsetpipedata(int index, EN_API_FLOAT_TYPE length, + EN_API_FLOAT_TYPE diam, EN_API_FLOAT_TYPE rough, + EN_API_FLOAT_TYPE mloss); + + int DLLEXPORT ENgetvertexcount(int index, int *count); + + int DLLEXPORT ENgetvertex(int index, int vertex, double *x, double *y); + + int DLLEXPORT ENsetvertex(int index, int vertex, double x, double y); + + int DLLEXPORT ENsetvertices(int index, double *x, double *y, int count); + +/******************************************************************** + + Pump Functions + +********************************************************************/ + + int DLLEXPORT ENgetpumptype(int linkIndex, int *pumpType); + + int DLLEXPORT ENgetheadcurveindex(int linkIndex, int *curveIndex); + + int DLLEXPORT ENsetheadcurveindex(int linkIndex, int curveIndex); + +/******************************************************************** + + Time Pattern Functions + +********************************************************************/ + + int DLLEXPORT ENaddpattern(const char *id); + + int DLLEXPORT ENdeletepattern(int index); + + int DLLEXPORT ENgetpatternindex(const char *id, int *index); + + int DLLEXPORT ENgetpatternid(int index, char *id); + + int DLLEXPORT ENsetpatternid(int index, const char *id); + + int DLLEXPORT ENgetpatternlen(int index, int *len); + + int DLLEXPORT ENgetpatternvalue(int index, int period, EN_API_FLOAT_TYPE *value); + + int DLLEXPORT ENsetpatternvalue(int index, int period, EN_API_FLOAT_TYPE value); + + int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value); + + int DLLEXPORT ENsetpattern(int index, EN_API_FLOAT_TYPE *values, int len); + + int DLLEXPORT ENloadpatternfile(const char *filename, const char *id); + +/******************************************************************** + + Data Curve Functions + +********************************************************************/ + + int DLLEXPORT ENaddcurve(const char *id); + + int DLLEXPORT ENdeletecurve(int index); + + int DLLEXPORT ENgetcurveindex(const char *id, int *index); + + int DLLEXPORT ENgetcurveid(int index, char *id); + + int DLLEXPORT ENsetcurveid(int index, const char *id); + + int DLLEXPORT ENgetcurvelen(int index, int *len); + + int DLLEXPORT ENgetcurvetype(int index, int *type); + + int DLLEXPORT ENsetcurvetype(int index, int type); + + int DLLEXPORT ENgetcurvevalue(int curveIndex, int pointIndex, + EN_API_FLOAT_TYPE *x, EN_API_FLOAT_TYPE *y); + + int DLLEXPORT ENsetcurvevalue(int curveIndex, int pointIndex, + EN_API_FLOAT_TYPE x, EN_API_FLOAT_TYPE y); + + int DLLEXPORT ENgetcurve(int index, char* id, int *nPoints, + EN_API_FLOAT_TYPE *xValues, EN_API_FLOAT_TYPE *yValues); + + int DLLEXPORT ENsetcurve(int index, EN_API_FLOAT_TYPE *xValues, + EN_API_FLOAT_TYPE *yValues, int nPoints); + +/******************************************************************** + + Simple Controls Functions + +********************************************************************/ + + int DLLEXPORT ENaddcontrol(int type, int linkIndex, EN_API_FLOAT_TYPE setting, + int nodeIndex, EN_API_FLOAT_TYPE level, int *index); + + int DLLEXPORT ENdeletecontrol(int index); + + int DLLEXPORT ENgetcontrol(int index, int *type, int *linkIndex, + EN_API_FLOAT_TYPE *setting, int *nodeIndex, EN_API_FLOAT_TYPE *level); + + int DLLEXPORT ENsetcontrol(int index, int type, int linkIndex, + EN_API_FLOAT_TYPE setting, int nodeIndex, EN_API_FLOAT_TYPE level); + + int DLLEXPORT ENgetcontrolenabled(int index, int *out_enabled); + + int DLLEXPORT ENsetcontrolenabled(int index, int enabled); + +/******************************************************************** + + Rule-Based Controls Functions + +********************************************************************/ + + int DLLEXPORT ENaddrule(char *rule); + + int DLLEXPORT ENdeleterule(int index); + + int DLLEXPORT ENgetrule(int index, int *nPremises, int *nThenActions, + int *nElseActions, EN_API_FLOAT_TYPE *priority); + + int DLLEXPORT ENgetruleID(int index, char* 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); + + int DLLEXPORT ENsetpremise(int ruleIndex, int premiseIndex, int logop, + int object, int objIndex, int variable, int relop, + int status, EN_API_FLOAT_TYPE value); + + int DLLEXPORT ENsetpremiseindex(int ruleIndex, int premiseIndex, int objIndex); + + int DLLEXPORT ENsetpremisestatus(int ruleIndex, int premiseIndex, int status); + + int DLLEXPORT ENsetpremisevalue(int ruleIndex, int premiseIndex, + EN_API_FLOAT_TYPE value); + + int DLLEXPORT ENgetthenaction(int ruleIndex, int actionIndex, int *linkIndex, + int *status, EN_API_FLOAT_TYPE *setting); + + int DLLEXPORT ENsetthenaction(int ruleIndex, int actionIndex, int linkIndex, + int status, EN_API_FLOAT_TYPE setting); + + int DLLEXPORT ENgetelseaction(int ruleIndex, int actionIndex, int *linkIndex, + int *status, EN_API_FLOAT_TYPE *setting); + + int DLLEXPORT ENsetelseaction(int ruleIndex, int actionIndex, int linkIndex, + int status, EN_API_FLOAT_TYPE setting); + + int DLLEXPORT ENsetrulepriority(int index, EN_API_FLOAT_TYPE priority); + + int DLLEXPORT ENgetruleenabled(int index, int *out_enabled); + + int DLLEXPORT ENsetruleenabled(int index, int enabled); + + #if defined(__cplusplus) + } + #endif + +#endif //EPANET2_H diff --git a/epanet/linux/epanet2.pas b/epanet/linux/epanet2.pas new file mode 100644 index 0000000..0e7ba66 --- /dev/null +++ b/epanet/linux/epanet2.pas @@ -0,0 +1,486 @@ +unit epanet2; + +{ Declarations of imported procedures from the EPANET PROGRAMMERs TOOLKIT } +{ (EPANET2.DLL) } + +{Last updated on 04/23/2025} + +interface + +const + +{ These are codes used by the DLL functions } + EN_MAXID = 31; { Max. # characters in ID name } + EN_MAXMSG = 255; { Max. # characters in strings } + EN_MISSING = -1.0E10; + EN_SET_CLOSED = -1.0E10; + EN_SET_OPEN = 1.0E10; + + EN_ELEVATION = 0; { Node parameters } + EN_BASEDEMAND = 1; + EN_PATTERN = 2; + EN_EMITTER = 3; + EN_INITQUAL = 4; + EN_SOURCEQUAL = 5; + EN_SOURCEPAT = 6; + EN_SOURCETYPE = 7; + EN_TANKLEVEL = 8; + EN_DEMAND = 9; + EN_HEAD = 10; + EN_PRESSURE = 11; + EN_QUALITY = 12; + EN_SOURCEMASS = 13; + EN_INITVOLUME = 14; + EN_MIXMODEL = 15; + EN_MIXZONEVOL = 16; + EN_TANKDIAM = 17; + EN_MINVOLUME = 18; + EN_VOLCURVE = 19; + EN_MINLEVEL = 20; + EN_MAXLEVEL = 21; + EN_MIXFRACTION = 22; + EN_TANK_KBULK = 23; + EN_TANKVOLUME = 24; + EN_MAXVOLUME = 25; + EN_CANOVERFLOW = 26; + EN_DEMANDDEFICIT = 27; + EN_NODE_INCONTROL = 28; + EN_EMITTERFLOW = 29; + EN_LEAKAGEFLOW = 30; + EN_DEMANDFLOW = 31; + EN_FULLDEMAND = 32; + + EN_DIAMETER = 0; { Link parameters } + EN_LENGTH = 1; + EN_ROUGHNESS = 2; + EN_MINORLOSS = 3; + EN_INITSTATUS = 4; + EN_INITSETTING = 5; + EN_KBULK = 6; + EN_KWALL = 7; + EN_FLOW = 8; + EN_VELOCITY = 9; + EN_HEADLOSS = 10; + EN_STATUS = 11; + EN_SETTING = 12; + EN_ENERGY = 13; + EN_LINKQUAL = 14; + EN_LINKPATTERN = 15; + EN_PUMP_STATE = 16; + EN_PUMP_EFFIC = 17; + EN_PUMP_POWER = 18; + EN_PUMP_HCURVE = 19; + EN_PUMP_ECURVE = 20; + EN_PUMP_ECOST = 21; + EN_PUMP_EPAT = 22; + EN_LINK_INCONTROL = 23; + EN_GPV_CURVE = 24; + EN_PCV_CURVE = 25; + EN_LEAK_AREA = 26; + EN_LEAK_EXPAN = 27; + EN_LINK_LEAKAGE = 28; + EN_VALVE_TYPE = 29; + + EN_DURATION = 0; { Time parameters } + EN_HYDSTEP = 1; + EN_QUALSTEP = 2; + EN_PATTERNSTEP = 3; + EN_PATTERNSTART = 4; + EN_REPORTSTEP = 5; + EN_REPORTSTART = 6; + EN_RULESTEP = 7; + EN_STATISTIC = 8; + EN_PERIODS = 9; + EN_STARTTIME = 10; + EN_HTIME = 11; + EN_QTIME = 12; + EN_HALTFLAG = 13; + EN_NEXTEVENT = 14; + EN_NEXTEVENTTANK = 15; + + EN_ITERATIONS = 0; { Analysis statistics } + EN_RELATIVEERROR = 1; + EN_MAXHEADERROR = 2; + EN_MAXFLOWCHANGE = 3; + EN_MASSBALANCE = 4; + EN_DEFICIENTNODES = 5; + EN_DEMANDREDUCTION = 6; + EN_LEAKAGELOSS = 7; + + EN_NODE = 0; { Component Types } + EN_LINK = 1; + EN_TIMEPAT = 2; + EN_CURVE = 3; + EN_CONTROL = 4; + EN_RULE = 5; + + EN_NODECOUNT = 0; { Component counts } + EN_TANKCOUNT = 1; + EN_LINKCOUNT = 2; + EN_PATCOUNT = 3; + EN_CURVECOUNT = 4; + EN_CONTROLCOUNT = 5; + EN_RULECOUNT = 6; + + EN_JUNCTION = 0; { Node types } + EN_RESERVOIR = 1; + EN_TANK = 2; + + EN_CVPIPE = 0; { Link types } + EN_PIPE = 1; + EN_PUMP = 2; + EN_PRV = 3; + EN_PSV = 4; + EN_PBV = 5; + EN_FCV = 6; + EN_TCV = 7; + EN_GPV = 8; + EN_PCV = 9; + + EN_CLOSED = 0; { Link status types } + EN_OPEN = 1; + + EN_PUMP_XHEAD = 0; { Pump state types } + EN_PUMP_CLOSED = 2; + EN_PUMP_OPEN = 3; + EN_PUMP_XFLOW = 5; + + EN_NONE = 0; { Quality analysis types } + EN_CHEM = 1; + EN_AGE = 2; + EN_TRACE = 3; + + EN_CONCEN = 0; { Source quality types } + EN_MASS = 1; + EN_SETPOINT = 2; + EN_FLOWPACED = 3; + + EN_HW = 0; { Head loss formulas } + EN_DW = 1; + EN_CM = 2; + + EN_CFS = 0; { Flow units types } + 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_CMS = 10; + + EN_PSI = 0; { Pressure units types } + EN_KPA = 1; + EN_METERS = 2; + EN_BAR = 3; + EN_FEET = 4; + + EN_DDA = 0; { Demand model types } + EN_PDA = 1; + + EN_TRIALS = 0; { Option types } + EN_ACCURACY = 1; + EN_TOLERANCE = 2; + EN_EMITEXPON = 3; + EN_DEMANDMULT = 4; + EN_HEADERROR = 5; + EN_FLOWCHANGE = 6; + EN_HEADLOSSFORM = 7; + EN_GLOBALEFFIC = 8; + EN_GLOBALPRICE = 9; + EN_GLOBALPATTERN = 10; + EN_DEMANDCHARGE = 11; + EN_SP_GRAVITY = 12; + EN_SP_VISCOS = 13; + EN_EXTRA_ITER = 14; + EN_CHECKFREQ = 15; + EN_MAXCHECK = 16; + EN_DAMPLIMIT = 17; + EN_SP_DIFFUS = 18; + EN_BULKORDER = 19; + EN_WALLORDER = 20; + EN_TANKORDER = 21; + EN_CONCENLIMIT = 22; + EN_DEMANDPATTERN = 23; + EN_EMITBACKFLOW = 24; + EN_PRESS_UNITS = 25; + EN_STATUS_REPORT = 26; + + EN_LOWLEVEL = 0; { Control types } + EN_HILEVEL = 1; + EN_TIMER = 2; + EN_TIMEOFDAY = 3; + + EN_SERIES = 0; { Report statistic types } + EN_AVERAGE = 1; + EN_MINIMUM = 2; + EN_MAXIMUM = 3; + EN_RANGE = 4; + + EN_MIX1 = 0; { Tank mixing models } + EN_MIX2 = 1; + EN_FIFO = 2; + EN_LIFO = 3; + + EN_NOSAVE = 0; { Hydraulics flags } + EN_SAVE = 1; + EN_INITFLOW = 10; + EN_SAVE_AND_INIT = 11; + + EN_CONST_HP = 0; { Pump curve types } + EN_POWER_FUNC = 1; + EN_CUSTOM = 2; + EN_NOCURVE = 3; + + EN_VOLUME_CURVE = 0; { Curve types } + EN_PUMP_CURVE = 1; + EN_EFFIC_CURVE = 2; + EN_HLOSS_CURVE = 3; + EN_GENERIC_CURVE = 4; + EN_VALVE_CURVE = 5; + + EN_UNCONDITIONAL = 0; { Deletion action codes } + EN_CONDITIONAL = 1; + + EN_NO_REPORT = 0; { Status reporting levels } + EN_NORMAL_REPORT = 1; + EN_FULL_REPORT = 2; + + EN_R_NODE = 6; { Rule-based control objects } + EN_R_LINK = 7; + EN_R_SYSTEM = 8; + + EN_R_DEMAND = 0; { Rule-based control variables } + 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_R_EQ = 0; { Rule-based control operators } + 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_R_IS_OPEN = 1; { Rule-based control link status } + EN_R_IS_CLOSED = 2; + EN_R_IS_ACTIVE = 3; + + EN_FALSE = 0; { boolean false } + EN_TRUE = 1; { boolean true } + + +{$MACRO ON} + +{$ifdef MSWINDOWS} + EpanetLib = 'epanet2.dll'; + {$DEFINE cdecl := stdcall} +{$endif} + +{$ifdef UNIX} + {$ifdef DARWIN} + EpanetLib = 'libepanet2.dylib'; + {$linklib libepanet2} + {$else} + EpanetLib = 'libepanet2.so'; + {$endif} +{$endif} + +{$ifdef UNIX} + {$DEFINE TimeType:=Int64} +{$else} + {$DEFINE TimeType:=Integer} +{$endif} + +{Project Functions} + function ENepanet(F1: PAnsiChar; F2: PAnsiChar; F3: PAnsiChar; F4: Pointer): Integer; cdecl; external EpanetLib; + function ENinit(F2: PAnsiChar; F3: PAnsiChar; UnitsType: Integer; HeadlossType: Integer): Integer; cdecl; external EpanetLib; + function ENopen(F1: PAnsiChar; F2: PAnsiChar; F3: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENopenX(F1: PAnsiChar; F2: PAnsiChar; F3: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgetcount(Code: Integer; var Count: Integer): Integer; cdecl; external EpanetLib; + function ENgettitle(Line1: PAnsiChar; Line2: PAnsiChar; Line3: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsettitle(Line1: PAnsiChar; Line2: PAnsiChar; Line3: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgetcomment(ObjType: Integer; Index: Integer; Comment: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetcomment(ObjType: Integer; Index: Integer; Comment: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgettag(ObjType: Integer; Index: Integer; Tag: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsettag(ObjType: Integer; Index: Integer; Tag: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsaveinpfile(F: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENclose: Integer; cdecl; external EpanetLib; + +{Hydraulic Functions} + function ENsolveH: Integer; cdecl; external EpanetLib; + function ENsaveH: Integer; cdecl; external EpanetLib; + function ENopenH: Integer; cdecl; external EpanetLib; + function ENinitH(SaveFlag: Integer): Integer; cdecl; external EpanetLib; + function ENrunH(var T: TimeType): Integer; cdecl; external EpanetLib; + function ENnextH(var Tstep: TimeType): Integer; cdecl; external EpanetLib; + function ENcloseH: Integer; cdecl; external EpanetLib; + function ENsavehydfile(F: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENusehydfile(F: PAnsiChar): Integer; cdecl; external EpanetLib; + +{Quality Functions} + function ENsolveQ: Integer; cdecl; external EpanetLib; + function ENopenQ: Integer; cdecl; external EpanetLib; + function ENinitQ(SaveFlag: Integer): Integer; cdecl; external EpanetLib; + function ENrunQ(var T: TimeType): Integer; cdecl; external EpanetLib; + function ENnextQ(var Tstep: TimeType): Integer; cdecl; external EpanetLib; + function ENstepQ(var Tleft: TimeType): Integer; cdecl; external EpanetLib; + function ENcloseQ: Integer; cdecl; external EpanetLib; + +{Reporting Functions} + function ENwriteline(S: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENreport: Integer; cdecl; external EpanetLib; + function ENcopyreport(F: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENclearreport: Integer; cdecl; external EpanetLib; + function ENresetreport: Integer; cdecl; external EpanetLib; + function ENsetreport(S: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetstatusreport(Code: Integer): Integer; cdecl; external EpanetLib; + function ENgetversion(var Version: Integer): Integer; cdecl; external EpanetLib; + function ENgeterror(Errcode: Integer; Errmsg: PAnsiChar; MaxLen: Integer): Integer; cdecl; external EpanetLib; + function ENgetstatistic(StatType: Integer; var Value: Single): Integer; cdecl; external EpanetLib; + function ENgetresultindex(Code: Integer; Index: Integer; var Value: Integer): Integer; cdecl; external EpanetLib; + function ENtimetonextevent(var EventType: Integer; var Duration: TimeType; var ElementIndex: Integer): Integer; cdecl; external EpanetLib; + +{Analysis Options Functions} + function ENgetoption(Code: Integer; var Value: Single): Integer; cdecl; external EpanetLib; + function ENsetoption(Code: Integer; Value: Single): Integer; cdecl; external EpanetLib; + function ENgetflowunits(var Code: Integer): Integer; cdecl; external EpanetLib; + function ENsetflowunits(Code: Integer): Integer; cdecl; external EpanetLib; + function ENgettimeparam(Code: Integer; var Value: TimeType): Integer; cdecl; external EpanetLib; + function ENsettimeparam(Code: Integer; Value: TimeType): Integer; cdecl; external EpanetLib; + function ENgetqualinfo(var QualType: Integer; ChemName: PAnsiChar; ChemUnits: PAnsiChar; var TraceNode: Integer): Integer; cdecl; external EpanetLib; + function ENgetqualtype(var QualCode: Integer; var TraceNode: Integer): Integer; cdecl; external EpanetLib; + function ENsetqualtype(QualCode: Integer; ChemName: PAnsiChar; ChemUnits: PAnsiChar; TraceNodeID: PAnsiChar): Integer; cdecl; external EpanetLib; + +{Node Functions} + function ENaddnode(ID: PAnsiChar; NodeType: Integer; var Index: Integer): Integer; cdecl; external EpanetLib; + function ENdeletenode(Index: Integer; ActionCode: Integer): Integer; cdecl; external EpanetLib; + function ENgetnodeindex(ID: PAnsiChar; var Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetnodeid(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetnodeid(Index: Integer; NewID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgetnodetype(Index: Integer; var Code: Integer): Integer; cdecl; external EpanetLib; + function ENgetnodevalue(Index: Integer; Code: Integer; var Value: Single): Integer; cdecl; external EpanetLib; + function ENsetnodevalue(Index: Integer; Code: Integer; Value: Single): Integer; cdecl; external EpanetLib; + function ENsetjuncdata(Index: Integer; Elev: Single; Dmnd: Single; DmndPat: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsettankdata(Index: Integer; Elev, InitLvl, MinLvl, MaxLvl, Diam, MinVol: Single; VolCurve: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgetcoord(Index: Integer; var X: Double; var Y: Double): Integer; cdecl; external EpanetLib; + function ENsetcoord(Index: Integer; X: Double; Y: Double): Integer; cdecl; external EpanetLib; + function ENgetnodevalues(Code: Integer; var X: array of Single): Integer; cdecl; external EpanetLib; + +{Demand Functions} + function ENgetdemandmodel(var Model: Integer; var Pmin: Single; var Preq: Single; var Pexp: Single): Integer; cdecl; external EpanetLib; + function ENsetdemandmodel(Model: Integer; Pmin: Single; Preq: Single; Pexp: Single): Integer; cdecl; external EpanetLib; + function ENgetnumdemands(NodeIndex: Integer; var NumDemands: Integer): Integer; cdecl; external EpanetLib; + function ENadddemand(NodeIndex: Integer; BaseDemand: Single; PatName: PAnsiChar; DemandName: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENdeletedemand(NodeIndex: Integer; DemandIndex: Integer): Integer; cdecl; external EpanetLib; + function ENgetdemandindex(NodeIndex: Integer; DemandName: PAnsiChar; var DemandIndex: Integer): Integer; cdecl; external EpanetLib; + function ENgetbasedemand(NodeIndex: Integer; DemandIndex: Integer; var BaseDemand: Single): Integer; cdecl; external EpanetLib; + function ENsetbasedemand(NodeIndex: Integer; DemandIndex: Integer; BaseDemand: Single): Integer; cdecl; external EpanetLib; + function ENgetdemandpattern(NodeIndex: Integer; DemandIndex: Integer; var PatIndex: Integer): Integer; cdecl; external EpanetLib; + function ENsetdemandpattern(NodeIndex: Integer; DemandIndex: Integer; PatIndex: Integer): Integer; cdecl; external EpanetLib; + function ENgetdemandname(NodeIndex: Integer; DemandIndex: Integer; DemandName: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetdemandname(NodeIndex: Integer; DemandIndex: Integer; DemandName: PAnsiChar): Integer; cdecl; external EpanetLib; + +{Link Functions} + function ENaddlink(ID: PAnsiChar; LinkType: Integer; FromNode: PAnsiChar; ToNode: PAnsiChar; var Index: Integer): Integer; cdecl; external EpanetLib; + function ENdeletelink(Index: Integer; ActionCode: Integer): Integer; cdecl; external EpanetLib; + function ENgetlinkindex(ID: PAnsiChar; var Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetlinkid(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetlinkid(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgetlinktype(Index: Integer; var Code: Integer): Integer; cdecl; external EpanetLib; + function ENsetlinktype(var Index: Integer; LinkType: Integer; ActionCode: Integer): Integer; cdecl; external EpanetLib; + function ENgetlinknodes(Index: Integer; var Node1: Integer; var Node2: Integer): Integer; cdecl; external EpanetLib; + function ENsetlinknodes(Index: Integer; Node1: Integer; Node2: Integer): Integer; cdecl; external EpanetLib; + function ENgetlinkvalue(Index: Integer; Code: Integer; var Value: Single): Integer; cdecl; external EpanetLib; + function ENsetlinkvalue(Index: Integer; Code: Integer; Value: Single): Integer; cdecl; external EpanetLib; + function ENsetpipedata(Index: Integer; Length: Single; Diam: Single; Rough: Single; Mloss:Single): Integer; cdecl; external EpanetLib; + function ENgetlinkvalues(Code: Integer; var X: array of Single): Integer; cdecl; external EpanetLib; + + function ENgetvertexcount(Index: Integer; var Count: Integer): Integer; cdecl; external EpanetLib; + function ENgetvertex(Index: Integer; Vertex: Integer; var X: Double; var Y: Double): Integer; cdecl; external EpanetLib; + function ENsetvertex(Index: Integer; Vertex: Integer; X: Double; Y: Double): Integer; cdecl; external EpanetLib; + function ENsetvertices(Index: Integer; var X: Double; var Y: Double; Count: Integer): Integer; cdecl; external EpanetLib; + +{Pump Functions} + function ENgetpumptype(LinkIndex: Integer; var PumpType: Integer): Integer; cdecl; external EpanetLib; + function ENgetheadcurveindex(LinkIndex: Integer; var CurveIndex: Integer): Integer; cdecl; external EpanetLib; + function ENsetheadcurveindex(LinkIndex: Integer; CurveIndex: Integer): Integer; cdecl; external EpanetLib; + +{Pattern Functions} + function ENaddpattern(ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENdeletepattern(Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetpatternindex(ID: PAnsiChar; var Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetpatternid(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetpatternid(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgetpatternlen(Index: Integer; var Len: Integer): Integer; cdecl; external EpanetLib; + function ENgetpatternvalue(Index: Integer; Period: Integer; var Value: Single): Integer; cdecl; external EpanetLib; + function ENsetpatternvalue(Index: Integer; Period: Integer; Value: Single): Integer; cdecl; external EpanetLib; + function ENgetaveragepatternvalue(Index: Integer; var Value: Single): Integer; cdecl; external EpanetLib; + function ENsetpattern(Index: Integer; var F: Single; N: Integer): Integer; cdecl; external EpanetLib; + +{Curve Functions} + function ENaddcurve(ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENdeletecurve(Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetcurveindex(ID: PAnsiChar; var Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetcurveid(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetcurveid(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENgetcurvelen(Index: Integer; var Len: Integer): Integer; cdecl; external EpanetLib; + function ENgetcurvetype(Index: Integer; var CurveType: Integer): Integer; cdecl; external EpanetLib; + function ENsetcurvetype(Index: Integer; CurveType: Integer): Integer; cdecl; external EpanetLib; + function ENgetcurvevalue(CurveIndex: Integer; PointIndex: Integer; var X: Single; var Y: Single): Integer; cdecl; external EpanetLib; + function ENsetcurvevalue(CurveIndex: Integer; PointIndex: Integer; X: Single; Y: Single): Integer; cdecl; external EpanetLib; + function ENgetcurve(Index: Integer; ID: PAnsiChar; var N: Integer; var X: Single; var Y: Single): Integer; cdecl; external EpanetLib; + function ENsetcurve(Index: Integer; var X: Single; var Y: Single; N: Integer): Integer; cdecl; external EpanetLib; + +{Control Functions} + function ENaddcontrol(Ctype: Integer; Link: Integer; Setting: Single; Node: Integer; Level: Single; var Index: Integer): Integer; cdecl; external EpanetLib; + function ENdeletecontrol(Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetcontrol(Index: Integer; var Ctype: Integer; var Link: Integer; var Setting: Single; var Node: Integer; var Level: Single): Integer; cdecl; external EpanetLib; + function ENsetcontrol(Index: Integer; Ctype: Integer; Link: Integer; Setting: Single; Node: Integer; Level: Single): Integer; cdecl; external EpanetLib; + function ENgetcontrolenabled(Index: Integer; var out_enabled: Integer): Integer; cdecl; external EpanetLib; + function ENsetcontrolenabled(Index: Integer; enabled: Integer): Integer; cdecl; external EpanetLib; + + {Rule-Based Control Functions} + function ENaddrule(Rule: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENdeleterule(Index: Integer): Integer; cdecl; external EpanetLib; + function ENgetrule(Index: Integer; var Npremises: Integer; var NthenActions: Integer; + var NelseActions: Integer; var Priority: Single): Integer; cdecl; external EpanetLib; + function ENgetruleID(Index: Integer; ID: PAnsiChar): Integer; cdecl; external EpanetLib; + function ENsetrulepriority(Index: Integer; Priority: Single): Integer; cdecl; external EpanetLib; + function ENgetpremise(RuleIndex: Integer; PremiseIndex: Integer; var LogOp: Integer; + var ObjType: Integer; var ObjIndex: Integer; var Param: Integer; var RelOp: Integer; + var Status: Integer; var Value: Single): Integer; cdecl; external EpanetLib; + function ENsetpremise(RuleIndex: Integer; PremiseIndex: Integer; LogOp: Integer; ObjType: Integer; + ObjIndex: Integer; Param: Integer; RelOp: Integer; Status: Integer; Value: Single): Integer; cdecl; external EpanetLib; + function ENsetpremiseindex(RuleIndex: Integer; PremiseIndex: Integer; ObjIndex: Integer): Integer; cdecl; external EpanetLib; + function ENsetpremisestatus(RuleIndex: Integer; PremiseIndex: Integer; Status: Integer): Integer; cdecl; external EpanetLib; + function ENsetpremisevalue(RuleIndex: Integer; PremiseIndex: Integer; Value: Single): Integer; cdecl; external EpanetLib; + function ENgetthenaction(RuleIndex: Integer; ActionIndex: Integer; var LinkIndex: Integer; + var Status: Integer; var Setting: Single): Integer; cdecl; external EpanetLib; + function ENsetthenaction(RuleIndex: Integer; ActionIndex: Integer; LinkIndex: Integer; + Status: Integer; Setting: Single): Integer; cdecl; external EpanetLib; + function ENgetelseaction(RuleIndex: Integer; ActionIndex: Integer; var LinkIndex: Integer; + var Status: Integer; var Setting: Single): Integer; cdecl; external EpanetLib; + function ENsetelseaction(RuleIndex: Integer; ActionIndex: Integer; LinkIndex: Integer; + Status: Integer; Setting: Single): Integer; cdecl; external EpanetLib; + function ENgetruleenabled(Index: Integer; var out_enabled: Integer): Integer; cdecl; external EpanetLib; + function ENsetruleenabled(Index: Integer; enabled: Integer): Integer; cdecl; external EpanetLib; + +implementation + +end. diff --git a/epanet/linux/epanet2_2.h b/epanet/linux/epanet2_2.h new file mode 100644 index 0000000..eca5095 --- /dev/null +++ b/epanet/linux/epanet2_2.h @@ -0,0 +1,1960 @@ +/** @file epanet2_2.h + @see http://github.com/openwateranalytics/epanet + */ + +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.3 + Module: epanet2.h + Description: API function declarations + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 04/25/2025 + ****************************************************************************** + */ + +#ifndef EPANET2_2_H +#define EPANET2_2_H + +#ifdef epanet_py_EXPORTS + #define DLLEXPORT +#else + #ifndef DLLEXPORT + #ifdef _WIN32 + #ifdef epanet2_EXPORTS + #define DLLEXPORT __declspec(dllexport) __stdcall + #else + #define DLLEXPORT __declspec(dllimport) __stdcall + #endif + #elif defined(__CYGWIN__) + #define DLLEXPORT __stdcall + #else + #define DLLEXPORT + #endif + #endif +#endif + +#include "epanet2_enums.h" + +// --- Declare the EPANET toolkit functions +#if defined(__cplusplus) +extern "C" { +#endif + +/** + @brief The EPANET Project wrapper object +*/ +typedef struct Project *EN_Project; + +/*=================================================================== + + Project Functions + +===================================================================*/ + + /** + @brief Creates an EPANET project. + @param[out] ph an EPANET project handle that is passed into all other API functions. + @return an error code. + + EN_createproject must be called before any other API functions are used. + */ + int DLLEXPORT EN_createproject(EN_Project *ph); + + /** + @brief Deletes a currently opened EPANET project. + @param[in,out] ph an EPANET project handle which is returned as NULL. + @return an error code. + + EN_deleteproject should be called after all network analysis has been completed. + */ + int DLLEXPORT EN_deleteproject(EN_Project ph); + + /** + @brief Runs a complete EPANET simulation. + @param ph an EPANET project handle. + @param inpFile the name of an existing EPANET-formatted input file. + @param rptFile the name of a report file to be created (or "" if not needed) + @param outFile the name of a binary output file to be created (or "" if not needed) + @param pviewprog a callback function that takes a character string (char *) as its only parameter. + @return an error code + + The callback function should reside in and be used by the calling code to display + the progress messages that EPANET generates as it carries out its computations. Here is + an example of a such a function that displays progress messages to stdout: + \code {.c} + void writeConsole(char *s) + { + fprintf(stdout, "\n%s", s); + } + \endcode + It would be passed into EN_runproject as `&writeConsole`. If this feature is not needed then + the pviewprog argument should be `NULL`. + */ + int DLLEXPORT EN_runproject(EN_Project ph, const char *inpFile, const char *rptFile, + const char *outFile, void (*pviewprog)(char *)); + + /** + @brief Initializes an EPANET project. + @param ph an EPANET project handle. + @param rptFile the name of a report file to be created (or "" if not needed). + @param outFile the name of a binary output file to be created (or "" if not needed). + @param unitsType the choice of flow units (see @ref EN_FlowUnits). + @param headLossType the choice of head loss formula (see @ref EN_HeadLossType). + @return an error code. + + This function should be called immediately after ::EN_createproject if an EPANET-formatted input + file will not be used to supply network data. If the project receives it's network data + from an input file then there is no need to call this function. + */ + int DLLEXPORT EN_init(EN_Project ph, const char *rptFile, const char *outFile, + int unitsType, int headLossType); + + /** + @brief Reads an EPANET input file with no errors allowed. + @param ph an EPANET project handle. + @param inpFile the name of an existing EPANET-formatted input file. + @param rptFile the name of a report file to be created (or "" if not needed). + @param outFile the name of a binary output file to be created (or "" if not needed). + @return an error code. + + This function should be called immediately after ::EN_createproject if an EPANET-formatted + input file will be used to supply network data. If errors are detected then the project is + not opened and will not accept toolkit function calls. + */ + int DLLEXPORT EN_open(EN_Project ph, const char *inpFile, const char *rptFile, + const char *outFile); + + /** + @brief Reads an EPANET input file with errors allowed. + @param ph an EPANET project handle. + @param inpFile the name of an existing EPANET-formatted input file. + @param rptFile the name of a report file to be created (or "" if not needed). + @param outFile the name of a binary output file to be created (or "" if not needed). + @return an error code. + + This function should be called immediately after ::EN_createproject if an EPANET-formatted + input file will be used to supply network data. If formatting errors are detected (error + code = 200) then the project remains open and will accept toolkit function calls. + */ + int DLLEXPORT EN_openX(EN_Project ph, const char *inpFile, const char *rptFile, + const char *outFile); + + /** + @brief Retrieves the title lines of the project + @param ph an EPANET project handle. + @param[out] out_line1 first title line + @param[out] out_line2 second title line + @param[out] out_line3 third title line + @return an error code + */ + int DLLEXPORT EN_gettitle(EN_Project ph, char *out_line1, char *out_line2, char *out_line3); + + /** + @brief Sets the title lines of the project + @param ph an EPANET project handle. + @param line1 first title line + @param line2 second title line + @param line3 third title line + @return an error code + */ + int DLLEXPORT EN_settitle(EN_Project ph, const char *line1, const char *line2, + const char *line3); + + /** + @brief Retrieves a descriptive comment assigned to a Node, Link, Pattern or Curve. + @param ph an EPANET project handle. + @param object a type of object (either EN_NODE, EN_LINK, EN_TIMEPAT or EN_CURVE) + @param index the object's index starting from 1 + @param[out] out_comment the comment string assigned to the object + @return an error code + */ + int DLLEXPORT EN_getcomment(EN_Project ph, int object, int index, char *out_comment); + + /** + @brief Assigns a descriptive comment to a Node, Link, Pattern or Curve. + @param ph an EPANET project handle. + @param object a type of object (either EN_NODE, EN_LINK, EN_TIMEPAT or EN_CURVE) + @param index the object's index starting from 1 + @param comment the comment string assigned to the object + @return an error code + */ + int DLLEXPORT EN_setcomment(EN_Project ph, int object, int index, + const char *comment); + + /** + @brief Retrieves a tag string assigned to a Node or Link. + @param ph an EPANET project handle. + @param object a type of object (either EN_NODE or EN_LINK) + @param index the object's index starting from 1 + @param[out] out_tag the tag string assigned to the object + @return an error code + */ + int DLLEXPORT EN_gettag(EN_Project ph, int object, int index, char *out_tag); + + /** + @brief Assigns a tag string to a Node or Link. + @param ph an EPANET project handle. + @param object a type of object (either EN_NODE or EN_LINK) + @param index the object's index starting from 1 + @param tag the tag string assigned to the object + @return an error code + */ + int DLLEXPORT EN_settag(EN_Project ph, int object, int index, + const char *tag); + + /** + @brief Retrieves the number of objects of a given type in a project. + @param ph an EPANET project handle. + @param object a type of object to count (see @ref EN_CountType) + @param[out] out_count number of objects of the specified type + @return an error code + */ + int DLLEXPORT EN_getcount(EN_Project ph, int object, int *out_count); + + /** + @brief Saves a project's data to an EPANET-formatted text file. + @param ph an EPANET project handle. + @param filename the name of the file to create. + @return an error code + */ + int DLLEXPORT EN_saveinpfile(EN_Project ph, const char *filename); + + /** + @brief Closes a project and frees all of its memory. + @param ph an EPANET project handle. + @return an error code + + This function clears all existing data from a project but does not delete the + project, so it can be re-used with another set of network data. Use ::EN_deleteproject + to actually delete a project from memory. + */ + int DLLEXPORT EN_close(EN_Project ph); + +/*=================================================================== + + Hydraulic Analysis Functions + +===================================================================*/ + + /** + @brief Runs a complete hydraulic simulation with results for all time periods + written to a temporary hydraulics file. + @param ph an EPANET project handle. + @return an error code. + + Use ::EN_solveH to generate a complete hydraulic solution which can stand alone + or be used as input to a water quality analysis. This function will not allow one to + examine intermediate hydraulic results as they are generated. It can also be followed by calls + to ::EN_saveH and ::EN_report to write hydraulic results to the report file. + + The sequence ::EN_openH - ::EN_initH - ::EN_runH - ::EN_nextH - ::EN_closeH + can be used instead to gain access to results at intermediate time periods and + directly adjust link status and control settings as a simulation proceeds. + + Example: + \code {.c} + EN_Project ph; + EN_createproject(&ph); + EN_open(ph, "net1.inp", "net1.rpt", ""); + EN_solveH(ph); + EN_solveQ(ph); + EN_report(ph); + EN_deleteproject(ph); + \endcode + */ + int DLLEXPORT EN_solveH(EN_Project ph); + + /** + @brief Uses a previously saved binary hydraulics file to supply a project's hydraulics. + @param ph an EPANET project handle. + @param filename the name of the binary file containing hydraulic results. + @return an error code. + + Call this function to re-use a set of hydraulic analysis results saved previously. This + can save computational time if water quality analyses are being made under the same set + of hydraulic conditions. + + Do not call this function while the hydraulics solver is open. + */ + int DLLEXPORT EN_usehydfile(EN_Project ph, const char *filename); + + /** + @brief Opens a project's hydraulic solver. + @param ph an EPANET project handle. + @return an error code. + + Call ::EN_openH prior to running the first hydraulic analysis using the + ::EN_initH - ::EN_runH - ::EN_nextH sequence. Multiple analyses can be made before + calling ::EN_closeH to close the hydraulic solver. + + Do not call this function if ::EN_solveH is being used to run a complete hydraulic + analysis or if hydraulics are being supplied by a previously saved hydraulics file + using ::EN_usehydfile. + */ + int DLLEXPORT EN_openH(EN_Project ph); + + /** + @brief Initializes a network prior to running a hydraulic analysis. + @param ph an EPANET project handle. + @param initFlag a 2-digit initialization flag (see @ref EN_InitHydOption). + @return an error code. + + This function initializes storage tank levels, link status and settings, and + the simulation time clock prior to running a hydraulic analysis. + + The initialization flag is a two digit number where the 1st (left) digit + indicates if link flows should be re-initialized (1) or not (0), and the + 2nd digit indicates if hydraulic results should be saved to a temporary + binary hydraulics file (1) or not (0). + + Be sure to call ::EN_initH prior to running a hydraulic analysis using a + ::EN_runH - ::EN_nextH loop. + + Choose to save hydraulics results if you will be: + - making a subsequent water quality run, + - using ::EN_report to generate a report + - using ::EN_savehydfile to save the binary hydraulics file. + + There is no need to save hydraulics if you will be writing custom code to + process hydraulic results as they are generated using the functions ::EN_getnodevalue + and ::EN_getlinkvalue. + */ + int DLLEXPORT EN_initH(EN_Project ph, int initFlag); + + /** + @brief Computes a hydraulic solution for the current point in time. + @param ph an EPANET project handle. + @param[out] out_currentTime the current simulation time in seconds. + @return an error or warning code. + + This function is used in a loop with ::EN_nextH to run an extended period hydraulic + simulation. This process automatically updates the simulation clock time so `currentTime` + should be treated as a read-only variable. + + ::EN_initH must have been called prior to running the ::EN_runH - ::EN_nextH loop. + + See ::EN_nextH for an example of using this function. + */ + int DLLEXPORT EN_runH(EN_Project ph, long *out_currentTime); + + /** + @brief Determines the length of time until the next hydraulic event occurs in an + extended period simulation. + @param ph an EPANET project handle. + @param[out] out_tStep the time (in seconds) until the next hydraulic event or 0 if at + the end of the full simulation duration. + @return an error code. + + This function is used in a loop with ::EN_runH to run an extended period hydraulic + simulation. + + The value of `out_tstep` should be treated as a read-only variable. It is automatically + computed as the smaller of: + - the time interval until the next hydraulic time step begins + - the time interval until the next reporting time step begins + - the time interval until the next change in demands occurs + - the time interval until a tank becomes full or empty + - the time interval until a control or rule fires. + + Example: + \code {.c} + long t, tstep; + EN_openH(ph); + EN_initH(ph, EN_NOSAVE); + do { + EN_runH(ph, &t); + // Retrieve hydraulic results for time t + EN_nextH(ph, &tstep); + } while (tstep > 0); + EN_closeH(ph); + \endcode + */ + int DLLEXPORT EN_nextH(EN_Project ph, long *out_tStep); + + /** + @brief Transfers a project's hydraulics results from its temporary hydraulics file + to its binary output file, where results are only reported at uniform reporting intervals. + @param ph an EPANET project handle. + @return an error code. + + ::EN_saveH is used when only a hydraulic analysis is run and results at uniform reporting + intervals need to be transferred to a project's binary output file. Such would be the case + when results are to be written in formatted fashion to the project's report file using ::EN_report. + */ + int DLLEXPORT EN_saveH(EN_Project ph); + + /** + @brief Saves a project's temporary hydraulics file to disk. + @param ph an EPANET project handle. + @param filename the name of the file to be created. + @return an error code. + + Use this function to save the current set of hydraulics results to a file, either for + post-processing or to be used at a later time by calling the ::EN_usehydfile function. + + The hydraulics file contains nodal demands and heads and link flows, status, and settings + for all hydraulic time steps, even intermediate ones. + + Before calling this function hydraulic results must have been generated and saved by having + called ::EN_solveH or the ::EN_initH - ::EN_runH - ::EN_nextH sequence with the initflag + argument of ::EN_initH set to `EN_SAVE` or `EN_SAVE_AND_INIT`. + */ + int DLLEXPORT EN_savehydfile(EN_Project ph, const char *filename); + + /** + @brief Closes the hydraulic solver freeing all of its allocated memory. + @return an error code. + + Call ::EN_closeH after all hydraulics analyses have been made using + ::EN_initH - ::EN_runH - ::EN_nextH. Do not call this function if ::EN_solveH is being used. + */ + int DLLEXPORT EN_closeH(EN_Project ph); + +/*=================================================================== + + Water Quality Analysis Functions + +===================================================================*/ + + /** + @brief Runs a complete water quality simulation with results at uniform + reporting intervals written to the project's binary output file. + @param ph an EPANET project handle. + @return an error code. + + A hydraulic analysis must have been run and saved to a hydraulics file before + calling ::EN_solveQ. This function will not allow one to examine intermediate water + quality results as they are generated. It can be followed by a call to ::EN_report + to write all hydraulic and water quality results to a formatted report file. + + One can instead use the ::EN_openQ - ::EN_initQ - ::EN_runQ - ::EN_nextQ - ::EN_closeQ + sequence to gain access to gain access to water quality results at intermediate time + periods. + + Example: see ::EN_solveH. + */ + int DLLEXPORT EN_solveQ(EN_Project ph); + + /** + @brief Opens a project's water quality solver. + @param ph an EPANET project handle. + @return an error code. + + Call ::EN_openQ prior to running the first water quality analysis using an + ::EN_initQ - ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) sequence. Multiple water + quality analyses can be made before calling ::EN_closeQ to close the water + quality solver. + + Do not call this function if a complete water quality analysis will be made + using ::EN_solveQ. + */ + int DLLEXPORT EN_openQ(EN_Project ph); + + /** + @brief Initializes a network prior to running a water quality analysis. + @param ph an EPANET project handle. + @param saveFlag set to `EN_SAVE` (1) if results are to be saved to the project's + binary output file, or to `EN_NOSAVE` (0) if not. + @return an error code. + + Call ::EN_initQ prior to running a water quality analysis using ::EN_runQ in + conjunction with either ::EN_nextQ or ::EN_stepQ. + + ::EN_openQ must have been called prior to calling ::EN_initQ. + + Do not call ::EN_initQ if a complete water quality analysis will be made using ::EN_solveQ. + */ + int DLLEXPORT EN_initQ(EN_Project ph, int saveFlag); + + /** + @brief Makes hydraulic and water quality results at the start of the current time + period available to a project's water quality solver. + @param ph an EPANET project handle. + @param[out] out_currentTime current simulation time in seconds. + @return an error code. + + Use ::EN_runQ along with ::EN_nextQ in a loop to access water quality results at the + start of each hydraulic period in an extended period simulation. Or use it in a loop + with ::EN_stepQ to access results at the start of each water quality time step. See + each of these functions for examples of how to code such loops. + + ::EN_initQ must have been called prior to running an ::EN_runQ - ::EN_nextQ + (or ::EN_stepQ) loop. + + The current time of the simulation, `out_currentTime`, is determined from information + saved with the hydraulic analysis that preceded the water quality analysis. Treat it + as a read-only variable. + */ + int DLLEXPORT EN_runQ(EN_Project ph, long *out_currentTime); + + /** + @brief Advances a water quality simulation over the time until the next hydraulic event. + @param ph an EPANET project handle. + @param[out] out_tStep time (in seconds) until the next hydraulic event or 0 if at the end + of the full simulation duration. + @return an error code. + + This function is used in a loop with ::EN_runQ to perform an extended period water + quality analysis. It reacts and routes a project's water quality constituent over a + time step determined by when the next hydraulic event occurs. Use ::EN_stepQ instead + if you wish to generate results over each water quality time step. + + The value of `out_tStep` is determined from information produced by the hydraulic analysis + that preceded the water quality analysis. Treat it as a read-only variable. + + Example: + \code {.c} + long t, tStep; + EN_solveH(ph); // Generate & save hydraulics + EN_openQ(ph); + EN_initQ(ph, EN_NOSAVE); + do { + EN_runQ(ph, &t); + // Monitor results at time t, which + // begins a new hydraulic time period + EN_nextQ(ph, &tStep); + } while (tStep > 0); + EN_closeQ(ph); + \endcode + */ + int DLLEXPORT EN_nextQ(EN_Project ph, long *out_tStep); + + /** + @brief Advances a water quality simulation by a single water quality time step. + @param ph an EPANET project handle. + @param[out] out_timeLeft time left (in seconds) to the overall simulation duration. + @return an error code. + + This function is used in a loop with ::EN_runQ to perform an extended period water + quality simulation. It allows one to generate water quality results at each water + quality time step of the simulation, rather than over each hydraulic event period + as with ::EN_nextQ. + + Use the argument `out_timeLeft` to determine when no more calls to ::EN_runQ are needed + because the end of the simulation period has been reached (i.e., when `out_timeLeft` = 0). + */ + int DLLEXPORT EN_stepQ(EN_Project ph, long *out_timeLeft); + + /** + @brief Closes the water quality solver, freeing all of its allocated memory. + @param ph an EPANET project handle. + @return an error code. + + Call ::EN_closeQ after all water quality analyses have been made using the + ::EN_initQ - ::EN_runQ - ::EN_nextQ (or ::EN_stepQ) sequence of function calls. + + Do not call this function if ::EN_solveQ is being used. + */ + int DLLEXPORT EN_closeQ(EN_Project ph); + +/*=================================================================== + + Reporting Functions + +===================================================================*/ + + /** + @brief Sets a user-supplied callback function for reporting + @param ph an EPANET project handle. + @param callback a function pointer used for reporting. + @return an error code. + + The callback function replaces the project's report file as + the destination for all output written by ::EN_writeline. It must have + the following signature: + + `void(void *userData, void *EN_projectHandle p, const char* s)` + + The `userData` parameter is a pointer to a client-side data object. + It can be changed using the ::EN_setreportcallbackuserdata function. + The parameter `s` is a placeholder for the EPANET-generated string + that was passed into ::EN_writeline. Setting the callback function to + NULL reverts to having ::EN_writeline use the project's report file. + */ + int DLLEXPORT EN_setreportcallback(EN_Project ph, void(*callback)(void *userData, void *EN_projectHandle, const char*)); + + /** + @brief Sets a pointer to a client-side data object + @param ph an EPANET project handle. + @param userData a pointer to a client-side data object. + @return an error code. + + The data pointer supplied by this function is passed into the callback + function declared in ::EN_setreportcallback that replaces a project's + report file as the destination for output written with ::EN_writeline. + */ + int DLLEXPORT EN_setreportcallbackuserdata(EN_Project ph, void *userData); + + /** + @brief Writes a line of text to a project's report file. + @param ph an EPANET project handle. + @param line a text string to write. + @return an error code. + + ::EN_setreportcallback can be used to assign an alternative destination + to write `line` to in place of the project's report file. + */ + int DLLEXPORT EN_writeline(EN_Project ph, const char *line); + + /** + @brief Writes simulation results in a tabular format to a project's report file. + @param ph an EPANET project handle. + @return an error code + + Either a full hydraulic analysis or full hydraulic and water quality analysis must + have been run, with results saved to file, before ::EN_report is called. In the + former case, ::EN_saveH must also be called first to transfer results from the + project's intermediate hydraulics file to its output file. + + The format of the report is controlled by commands issued with ::EN_setreport. + */ + int DLLEXPORT EN_report(EN_Project ph); + + /** + @brief Copies the current contents of a project's report file to another file. + @param ph an EPANET project handle. + @param filename the full path name of the destination file. + @return an error code. + + This function allows toolkit clients to retrieve the contents of a project's + report file while the project is still open. + */ + int DLLEXPORT EN_copyreport(EN_Project ph, const char *filename); + + /** + @brief Clears the contents of a project's report file. + @param ph an EPANET project handle. + @return an error code. + */ + int DLLEXPORT EN_clearreport(EN_Project ph); + + /** + @brief Resets a project's report options to their default values. + @param ph an EPANET project handle. + @return an error code + + After calling this function the default reporting options are in effect. These are: + - no status report + - no energy report + - no nodes reported on + - no links reported on + - node variables reported to 2 decimal places + - link variables reported to 2 decimal places (3 for friction factor) + - node variables reported are elevation, head, pressure, and quality + - link variables reported are flow, velocity, and head loss. + */ + int DLLEXPORT EN_resetreport(EN_Project ph); + + /** + @brief Processes a reporting format command. + @param ph an EPANET project handle. + @param format a report formatting command. + @return an error code + + Acceptable report formatting commands are described in the @ref ReportPage section of + the @ref InpFile topic. + + Formatted results of a simulation can be written to a project's report file + using the ::EN_report function. + */ + int DLLEXPORT EN_setreport(EN_Project ph, const char *format); + + /** + @brief Sets the level of hydraulic status reporting. + @param ph an EPANET project handle. + @param level a status reporting level code (see @ref EN_StatusReport). + @return an error code. + + Status reporting writes changes in the hydraulics status of network elements to a + project's report file as a hydraulic simulation unfolds. There are three levels + of reporting: `EN_NO_REPORT` (no status reporting), `EN_NORMAL_REPORT` (normal + reporting) `EN_FULL_REPORT` (full status reporting). + + The full status report contains information at each trial of the solution to the + system hydraulic equations at each time step of a simulation. It is useful mainly + for debugging purposes. + + If many hydraulic analyses will be run in the application it is recommended that + status reporting be turned off (`level` = `EN_NO_REPORT`). + */ + int DLLEXPORT EN_setstatusreport(EN_Project ph, int level); + + /** + @brief Retrieves the toolkit API version number. + @param[out] out_version the version of the OWA-EPANET toolkit. + @return an error code. + + The version number is to be interpreted with implied decimals, i.e., + "20100" == "2(.)01(.)00" + */ + int DLLEXPORT EN_getversion(int *out_version); + + /** + @brief Returns the text of an error message generated by an error code. + @param errcode an error code. + @param[out] out_errmsg the error message generated by the error code + @param maxLen maximum number of characters that errmsg can hold + @return an error code + + Error message strings should be greater than @ref EN_SizeLimits "EN_MAXMSG" characters in length. + */ + int DLLEXPORT EN_geterror(int errcode, char *out_errmsg, int maxLen); + + /** + @brief Retrieves a particular simulation statistic. + @param ph an EPANET project handle. + @param type the type of statistic to retrieve (see @ref EN_AnalysisStatistic). + @param[out] out_value the value of the statistic. + @return an error code + */ + int DLLEXPORT EN_getstatistic(EN_Project ph, int type, double* out_value); + + + /** + @brief Gets information about when the next hydraulic time step occurs. + @param ph an EPANET project handle. + @param[out] eventType the type of event that will occur (see @ref EN_TimestepEvent). + @param[out] duration the amount of time in the future this event will occur + @param[out] elementIndex the index of the element causing the event. + **/ + int DLLEXPORT EN_timetonextevent(EN_Project ph, int *eventType, long *duration, int *elementIndex); + + /** + @brief Retrieves the order in which a node or link appears in an @ref OutFile "output file". + @param ph an EPANET project handle. + @param type a type of element (either @ref EN_NODE or @ref EN_LINK). + @param index the element's current index (starting from 1). + @param[out] out_value the order in which the element's results were written to file. + @return an error code. + + If the element does not appear in the file then its result index is 0. + + This function can be used to correctly retrieve results from an EPANET binary output file + after the order of nodes or links in a network's database has been changed due to editing + operations. + */ + int DLLEXPORT EN_getresultindex(EN_Project ph, int type, int index, int *out_value); + +/*=================================================================== + + Analysis Options Functions + +===================================================================*/ + + /** + @brief Retrieves the value of an analysis option. + @param ph an EPANET project handle. + @param option a type of analysis option (see @ref EN_Option). + @param[out] out_value the current value of the option. + @return an error code + */ + int DLLEXPORT EN_getoption(EN_Project ph, int option, double *out_value); + + /** + @brief Sets the value for an analysis option. + @param ph an EPANET project handle. + @param option a type of analysis option (see @ref EN_Option). + @param value the new value assigned to the option. + @return an error code. + @see EN_Option + */ + int DLLEXPORT EN_setoption(EN_Project ph, int option, double value); + + /** + @brief Retrieves a project's flow units. + @param ph an EPANET project handle. + @param[out] out_units a flow units code (see @ref EN_FlowUnits) + @return an error code. + + Flow units in liters or cubic meters implies that SI metric units are used for all + other quantities in addition to flow. Otherwise US Customary units are employed. + */ + int DLLEXPORT EN_getflowunits(EN_Project ph, int *out_units); + + /** + @brief Sets a project's flow units. + @param ph an EPANET project handle. + @param units a flow units code (see @ref EN_FlowUnits) + @return an error code. + + Flow units in liters or cubic meters implies that SI metric units are used for all + other quantities in addition to flow. Otherwise US Customary units are employed. + */ + int DLLEXPORT EN_setflowunits(EN_Project ph, int units); + + /** + @brief Retrieves the value of a time parameter. + @param ph an EPANET project handle. + @param param a time parameter code (see @ref EN_TimeParameter). + @param[out] out_value the current value of the time parameter (in seconds). + @return an error code. + */ + int DLLEXPORT EN_gettimeparam(EN_Project ph, int param, long *out_value); + + /** + @brief Sets the value of a time parameter. + @param ph an EPANET project handle. + @param param a time parameter code (see @ref EN_TimeParameter). + @param value the new value of the time parameter (in seconds) + @return an error code. + */ + int DLLEXPORT EN_settimeparam(EN_Project ph, int param, long value); + + /** + @brief Gets information about the type of water quality analysis requested. + @param ph an EPANET project handle. + @param[out] out_qualType type of analysis to run (see @ref EN_QualityType). + @param[out] out_chemName name of chemical constituent. + @param[out] out_chemUnits concentration units of the constituent. + @param[out] out_traceNode index of the node being traced (if applicable). + @return an error code. + */ + int DLLEXPORT EN_getqualinfo(EN_Project ph, int *out_qualType, char *out_chemName, + char *out_chemUnits, int *out_traceNode); + + /** + @brief Retrieves the type of water quality analysis to be run. + @param ph an EPANET project handle. + @param[out] out_qualType the type of analysis to run (see @ref EN_QualityType). + @param[out] out_traceNode the index of node being traced if `out_qualType` = `EN_TRACE`. + @return an error code. + */ + int DLLEXPORT EN_getqualtype(EN_Project ph, int *out_qualType, int *out_traceNode); + + /** + @brief Sets the type of water quality analysis to run. + @param ph an EPANET project handle. + @param qualType the type of analysis to run (see @ref EN_QualityType). + @param chemName the name of the quality constituent. + @param chemUnits the concentration units of the constituent. + @param traceNode the ID name of the node being traced if `qualType` = `EN_TRACE`. + @return an error code. + + Chemical name and units can be an empty string if the analysis is not for a chemical. + The same holds for the trace node if the analysis is not for source tracing. + + Note that the trace node is specified by ID name and not by index. + */ + int DLLEXPORT EN_setqualtype(EN_Project ph, int qualType, const char *chemName, + const char *chemUnits, const char *traceNode); + +/*=================================================================== + + Node Functions + +===================================================================*/ + + /** + @brief Adds a new node to a project. + @param ph an EPANET project handle. + @param id the ID name of the node to be added. + @param nodeType the type of node being added (see @ref EN_NodeType) + @param[out] out_index the index of the newly added node + @return an error code. + + When a new node is created all of its properties (see @ref EN_NodeProperty) are set to 0. + */ + int DLLEXPORT EN_addnode(EN_Project ph, const char *id, int nodeType, int *out_index); + + /** + @brief Deletes a node from a project. + @param ph an EPANET project handle. + @param index the index of the node to be deleted. + @param actionCode the action taken if any control contains the node and its links. + @return an error code. + + If `actionCode` is `EN_UNCONDITIONAL` then the node, its incident links and all + simple and rule-based controls that contain them are deleted. If set to + `EN_CONDITIONAL` then the node is not deleted if it or its incident links appear + in any controls and error code 261 is returned. + + */ + int DLLEXPORT EN_deletenode(EN_Project ph, int index, int actionCode); + + /** + @brief Gets the index of a node given its ID name. + @param ph an EPANET project handle. + @param id a node ID name. + @param[out] out_index the node's index (starting from 1). + @return an error code + */ + int DLLEXPORT EN_getnodeindex(EN_Project ph, const char *id, int *out_index); + + /** + @brief Gets the ID name of a node given its index. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param[out] out_id the node's ID name. + @return an error code + + The ID name must be sized to hold at least @ref EN_SizeLimits "EN_MAXID+1" characters. + */ + int DLLEXPORT EN_getnodeid(EN_Project ph, int index, char *out_id); + + /** + @brief Changes the ID name of a node. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param newid the new ID name for the node. + @return an error code. + + The ID name must not be longer than @ref EN_SizeLimits "EN_MAXID" characters. + */ + int DLLEXPORT EN_setnodeid(EN_Project ph, int index, const char *newid); + + /** + @brief Retrieves a node's type given its index. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param[out] out_nodeType the node's type (see @ref EN_NodeType). + @return an error code. + */ + int DLLEXPORT EN_getnodetype(EN_Project ph, int index, int *out_nodeType); + + /** + @brief Retrieves a property value for a node. + @param ph an EPANET project handle. + @param index a node's index. + @param property the property to retrieve (see @ref EN_NodeProperty). + @param[out] out_value the current value of the property. + @return an error code. + + Values are returned in units that depend on the units used for flow rate + (see @ref Units). + */ + + int DLLEXPORT EN_getnodevalue(EN_Project ph, int index, int property, double *out_value); + + /** + @brief Retrieves an array of property values for all nodes. + @param ph an EPANET project handle. + @param property the property to retrieve (see @ref EN_NodeProperty). + @param[out] out_values an array of values for all nodes. + @return an error code. + + Values are returned in units that depend on the units used for flow rate + (see @ref Units). + */ + + int DLLEXPORT EN_getnodevalues(EN_Project ph, int property, double *out_values); + + /** + @brief Sets a property value for a node. + @param ph an EPANET project handle. + @param index a node's index (starting from 1). + @param property the property to set (see @ref EN_NodeProperty). + @param value the new value for the property. + @return an error code. + + Values are in units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setnodevalue(EN_Project ph, int index, int property, double value); + + /** + @brief Sets a group of properties for a junction node. + @param ph an EPANET project handle. + @param index a junction node's index (starting from 1). + @param elev the value of the junction's elevation. + @param dmnd the value of the junction's primary base demand. + @param dmndpat the ID name of the demand's time pattern ("" for no pattern) + @return an error code. + + These properties have units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setjuncdata(EN_Project ph, int index, double elev, double dmnd, + const char *dmndpat); + + /** + @brief Sets a group of properties for a tank node. + @param ph an EPANET project handle. + @param index a tank node's index (starting from 1). + @param elev the tank's bottom elevation. + @param initlvl the initial water level in the tank. + @param minlvl the minimum water level for the tank. + @param maxlvl the maximum water level for the tank. + @param diam the tank's diameter (0 if a volume curve is supplied). + @param minvol the volume of the tank at its minimum water level. + @param volcurve the name of the tank's volume curve ("" for no curve) + @return an error code. + + These properties have units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_settankdata(EN_Project ph, int index, double elev, double initlvl, + double minlvl, double maxlvl, double diam, double minvol, const char *volcurve); + + /** + @brief Gets the (x,y) coordinates of a node. + @param ph an EPANET project handle. + @param index a node index (starting from 1). + @param[out] out_x the node's X-coordinate value. + @param[out] out_y the node's Y-coordinate value. + @return an error code. + */ + int DLLEXPORT EN_getcoord(EN_Project ph, int index, double *out_x, double *out_y); + + /** + @brief Sets the (x,y) coordinates of a node. + @param ph an EPANET project handle. + @param index a node index (starting from 1). + @param x the node's X-coordinate value. + @param y the node's Y-coordinate value. + @return an error code. + */ + int DLLEXPORT EN_setcoord(EN_Project ph, int index, double x, double y); + +/*=================================================================== + + Nodal Demand Functions + +===================================================================*/ + + /** + @brief Retrieves the type of demand model in use and its parameters. + @param ph an EPANET project handle. + @param[out] out_type Type of demand model (see @ref EN_DemandModel). + @param[out] out_pmin Pressure below which there is no demand. + @param[out] out_preq Pressure required to deliver full demand. + @param[out] out_pexp Pressure exponent in demand function. + @return an error code. + + Parameters `out_pmin`, `out_preq`, and `out_pexp` are only used when the demand model is `EN_PDA`. + */ + int DLLEXPORT EN_getdemandmodel(EN_Project ph, int *out_type, double *out_pmin, + double *out_preq, double *out_pexp); + + /** + @brief Sets the type of demand model to use and its parameters. + @param ph an EPANET project handle. + @param type Type of demand model (see @ref EN_DemandModel). + @param pmin Pressure below which there is no demand. + @param preq Pressure required to deliver full demand. + @param pexp Pressure exponent in demand function. + @return an error code. + + Set `type` to `EN_DDA` for a traditional demand driven analysis (in which case the + remaining three parameter values are ignored) or to `EN_PDA` for a pressure driven + analysis. In the latter case a node's demand is 0 when pressure is below `pmin`, is at full demand when pressure is above `preq`, or is otherwise computed as:\n + `Dfull * [ (P - pmin) / (preq - pmin) ] ^ pexp`\n + where `Dfull` is the full demand and `P` is the current pressure. + + A valid value for `preq` must be at least 0.1 pressure units larger than `pmin`. + */ + int DLLEXPORT EN_setdemandmodel(EN_Project ph, int type, double pmin, + double preq, double pexp); + + + /** + @brief appends a new demand to a junction node demands list. + @param ph an EPANET project handle. + @param nodeIndex the index of a node (starting from 1). + @param baseDemand the demand's base value. + @param demandPattern the name of a time pattern used by the demand + @param demandName the name of the demand's category + @return an error code. + + A NULL or blank string can be used for `demandPattern` and for `demandName` to indicate + that no time pattern or category name is associated with the demand. + */ + int DLLEXPORT EN_adddemand(EN_Project ph, int nodeIndex, double baseDemand, + const char *demandPattern, const char *demandName); + + /** + @brief deletes a demand from a junction node. + @param ph an EPANET project handle. + @param nodeIndex the index of a node (starting from 1). + @param demandIndex the position of the demand in the node's demands list (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_deletedemand(EN_Project ph, int nodeIndex, int demandIndex); + + /** + @brief Retrieves the index of a node's named demand category + @param ph an EPANET project handle. + @param nodeIndex the index of a node (starting from 1) + @param demandName the name of a demand category for the node + @param[out] out_demandIndex the index of the demand being sought + @return an error code + */ + int DLLEXPORT EN_getdemandindex(EN_Project ph, int nodeIndex, const char *demandName, + int *out_demandIndex); + + /** + @brief Retrieves the number of demand categories for a junction node. + @param ph an EPANET project handle. + @param nodeIndex the index of a node (starting from 1). + @param[out] out_numDemands the number of demand categories assigned to the node. + @return an error code. + */ + int DLLEXPORT EN_getnumdemands(EN_Project ph, int nodeIndex, int *out_numDemands); + + /** + @brief Gets the base demand for one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of a demand category for the node (starting from 1). + @param[out] out_baseDemand the category's base demand. + @return an error code. + */ + int DLLEXPORT EN_getbasedemand(EN_Project ph, int nodeIndex, int demandIndex, + double *out_baseDemand); + + /** + @brief Sets the base demand for one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of a demand category for the node (starting from 1). + @param baseDemand the new base demand for the category. + @return an error code. + */ + int DLLEXPORT EN_setbasedemand(EN_Project ph, int nodeIndex, int demandIndex, + double baseDemand); + + /** + @brief Retrieves the index of a time pattern assigned to one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex the node's index (starting from 1). + @param demandIndex the index of a demand category for the node (starting from 1). + @param[out] out_patIndex the index of the category's time pattern. + @return an error code. + + A returned pattern index of 0 indicates that no time pattern has been assigned to the + demand category. + */ + int DLLEXPORT EN_getdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, + int *out_patIndex); + + /** + @brief Sets the index of a time pattern used for one of a node's demand categories. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of one of the node's demand categories (starting from 1). + @param patIndex the index of the time pattern assigned to the category. + @return an error code. + + Specifying a pattern index of 0 indicates that no time pattern is assigned to the + demand category. + */ + int DLLEXPORT EN_setdemandpattern(EN_Project ph, int nodeIndex, int demandIndex, int patIndex); + + /** + @brief Retrieves the name of a node's demand category. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIndex the index of one of the node's demand categories (starting from 1). + @param[out] out_demandName The name of the selected category. + @return an error code. + + `out_demandName` must be sized to contain at least @ref EN_SizeLimits "EN_MAXID+1" characters. + */ + int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIndex, char *out_demandName); + + /** + @brief Assigns a name to a node's demand category. + @param ph an EPANET project handle. + @param nodeIndex a node's index (starting from 1). + @param demandIdx the index of one of the node's demand categories (starting from 1). + @param demandName the new name assigned to the category. + @return an error code. + + The category name must contain no more than @ref EN_SizeLimits "EN_MAXID" characters. + */ + int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, + const char *demandName); + +/*=================================================================== + + Link Functions + +===================================================================*/ + + /** + @brief Adds a new link to a project. + @param ph an EPANET project handle. + @param id the ID name of the link to be added. + @param linkType The type of link being added (see @ref EN_LinkType) + @param fromNode The ID name of the link's starting node. + @param toNode The ID name of the link's ending node. + @param[out] out_index the index of the newly added link. + @return an error code. + + A new pipe is assigned a diameter of 10 inches (254 mm) and a length of 330 + feet (~ 100 meters). Its roughness coefficient depends on the head loss formula in effect (see @ref EN_HeadLossType) as follows: + - Hazen-Williams formula: 130 + - Darcy-Weisbach formula: 0.5 millifeet (0.15 mm) + - Chezy-Manning formula: 0.01 + + All other pipe properties are set to 0. + + A new pump has a status of `EN_OPEN`, a speed setting of 1, and has no pump + curve or power rating assigned to it. + + A new valve has a diameter of 10 inches (254 mm) and all other properties set to 0. + + See @ref EN_LinkProperty. + */ + int DLLEXPORT EN_addlink(EN_Project ph, const char *id, int linkType, const char *fromNode, + const char *toNode, int *out_index); + + /** + @brief Deletes a link from the project. + @param ph an EPANET project handle. + @param index the index of the link to be deleted. + @param actionCode The action taken if any control contains the link. + @return an error code. + + If `actionCode` is `EN_UNCONDITIONAL` then the link and all simple and rule-based + controls that contain it are deleted. If set to `EN_CONDITIONAL` then the link + is not deleted if it appears in any control and error 261 is returned. + */ + int DLLEXPORT EN_deletelink(EN_Project ph, int index, int actionCode); + + /** + @brief Gets the index of a link given its ID name. + @param ph an EPANET project handle. + @param id a link's ID name. + @param[out] out_index the link's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getlinkindex(EN_Project ph, const char *id, int *out_index); + + /** + @brief Gets the ID name of a link given its index. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param[out] out_id The link's ID name. + @return an error code. + + The ID name must be sized to hold at least @ref EN_SizeLimits "EN_MAXID+1" characters. + */ + int DLLEXPORT EN_getlinkid(EN_Project ph, int index, char *out_id); + + /** + @brief Changes the ID name of a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param newid the new ID name for the link. + @return an error code. + + The ID name must not be longer than @ref EN_SizeLimits "EN_MAXID" characters. + */ + int DLLEXPORT EN_setlinkid(EN_Project ph, int index, const char *newid); + + /** + @brief Retrieves a link's type. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param[out] out_linkType the link's type (see @ref EN_LinkType). + @return an error code. + */ + int DLLEXPORT EN_getlinktype(EN_Project ph, int index, int *out_linkType); + + /** + @brief Changes a link's type. + @param ph an EPANET project handle. + @param[in,out] inout_index the link's index before [in] and after [out] the type change. + @param linkType the new type to change the link to (see @ref EN_LinkType). + @param actionCode the action taken if any controls contain the link. + @return an error code. + + If `actionCode` is `EN_UNCONDITIONAL` then all simple and rule-based controls that + contain the link are deleted when the link's type is changed. If set to + `EN_CONDITIONAL` then the type change is cancelled if the link appears in any + control and error 261 is returned. + + To only change a valve's type (such as from PRV to PSV) use ::EN_setlinkvalue with property `EN_VALVE_TYPE` whose value is selected from the valves in @ref EN_LinkType. + */ + int DLLEXPORT EN_setlinktype(EN_Project ph, int *inout_index, int linkType, int actionCode); + + /** + @brief Gets the indexes of a link's start- and end-nodes. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param[out] out_node1 the index of the link's start node (starting from 1). + @param[out] out_node2 the index of the link's end node (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getlinknodes(EN_Project ph, int index, int *out_node1, int *out_node2); + + /** + @brief Sets the indexes of a link's start- and end-nodes. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param node1 The index of the link's start node (starting from 1). + @param node2 The index of the link's end node (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_setlinknodes(EN_Project ph, int index, int node1, int node2); + + /** + @brief Retrieves a property value for a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param property the property to retrieve (see @ref EN_LinkProperty). + @param[out] out_value the current value of the property. + @return an error code. + + Values are returned in units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_getlinkvalue(EN_Project ph, int index, int property, double *out_value); + + /** + @brief Retrieves an array of property values for all links. + @param ph an EPANET project handle. + @param property the property to retrieve (see @ref EN_LinkProperty). + @param[out] out_values an array of values for all links. + @return an error code. + + Values are returned in units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_getlinkvalues(EN_Project ph, int property, double *out_values); + + /** + @brief Sets a property value for a link. + @param ph an EPANET project handle. + @param index a link's index. + @param property the property to set (see @ref EN_LinkProperty). + @param value the new value for the property. + @return an error code. + + Values are in units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setlinkvalue(EN_Project ph, int index, int property, double value); + + /** + @brief Sets a group of properties for a pipe link. + @param ph an EPANET project handle. + @param index the index of a pipe link (starting from 1). + @param length the pipe's length. + @param diam the pipe's diameter. + @param rough the pipe's roughness coefficient. + @param mloss the pipe's minor loss coefficient. + @return an error code. + + These properties have units that depend on the units used for flow rate (see @ref Units). + */ + int DLLEXPORT EN_setpipedata(EN_Project ph, int index, double length, double diam, + double rough, double mloss); + + /** + @brief Retrieves the number of internal vertex points assigned to a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param[out] out_count the number of vertex points that describe the link's shape. + @return an error code. + */ + int DLLEXPORT EN_getvertexcount(EN_Project ph, int index, int *out_count); + + /** + @brief Retrieves the coordinates of a vertex point assigned to a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param vertex a vertex point index (starting from 1). + @param[out] out_x the vertex's X-coordinate value. + @param[out] out_y the vertex's Y-coordinate value. + @return an error code. + */ + int DLLEXPORT EN_getvertex(EN_Project ph, int index, int vertex, double *out_x, double *out_y); + + /** + @brief Sets the coordinates of a vertex point assigned to a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param vertex a vertex point index (starting from 1). + @param x the vertex's X-coordinate value. + @param y the vertex's Y-coordinate value. + @return an error code. + */ + int DLLEXPORT EN_setvertex(EN_Project ph, int index, int vertex, double x, double y); + + /** + @brief Assigns a set of internal vertex points to a link. + @param ph an EPANET project handle. + @param index a link's index (starting from 1). + @param x an array of X-coordinates for the vertex points. + @param y an array of Y-coordinates for the vertex points. + @param count the number of vertex points being assigned. + @return an error code. + + Replaces any existing vertices previously assigned to the link. + */ + int DLLEXPORT EN_setvertices(EN_Project ph, int index, double *x, double *y, int count); + +/*=================================================================== + + Pump Functions + +===================================================================*/ + + /** + @brief Retrieves the type of head curve used by a pump. + @param ph an EPANET project handle. + @param linkIndex the index of a pump link (starting from 1). + @param[out] out_pumpType the type of head curve used by the pump (see @ref EN_PumpType). + @return an error code. + */ + int DLLEXPORT EN_getpumptype(EN_Project ph, int linkIndex, int *out_pumpType); + + /** + @brief Retrieves the curve assigned to a pump's head curve. + @param ph an EPANET project handle. + @param linkIndex the index of a pump link (starting from 1). + @param[out] out_curveIndex the index of the curve assigned to the pump's head curve. + @return an error code. + */ + int DLLEXPORT EN_getheadcurveindex(EN_Project ph, int linkIndex, int *out_curveIndex); + + /** + @brief Assigns a curve to a pump's head curve. + @param ph an EPANET project handle. + @param linkIndex the index of a pump link (starting from 1). + @param curveIndex the index of a curve to be assigned as the pump's head curve. + @return an error code. + */ + int DLLEXPORT EN_setheadcurveindex(EN_Project ph, int linkIndex, int curveIndex); + +/*=================================================================== + + Time Pattern Functions + +===================================================================*/ + + /** + @brief Adds a new time pattern to a project. + @param ph an EPANET project handle. + @param id the ID name of the pattern to add. + @return an error code. + + The new pattern contains a single time period whose factor is 1.0. + */ + int DLLEXPORT EN_addpattern(EN_Project ph, const char *id); + + /** + @brief Deletes a time pattern from a project. + @param ph an EPANET project handle. + @param index the time pattern's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_deletepattern(EN_Project ph, int index); + + /** + @brief Retrieves the index of a time pattern given its ID name. + @param ph an EPANET project handle. + @param id the ID name of a time pattern. + @param[out] out_index the time pattern's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getpatternindex(EN_Project ph, const char *id, int *out_index); + + /** + @brief Retrieves the ID name of a time pattern given its index. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param[out] out_id the time pattern's ID name. + @return an error code. + + The ID name must be sized to hold at least @ref EN_SizeLimits "EN_MAXID+1" characters. + */ + int DLLEXPORT EN_getpatternid(EN_Project ph, int index, char *out_id); + + /** + @brief Changes the ID name of a time pattern given its index. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param id the time pattern's new ID name. + @return an error code. + + The new ID name must not exceed @ref EN_SizeLimits "EN_MAXID" characters. + */ + int DLLEXPORT EN_setpatternid(EN_Project ph, int index, const char *id); + + /** + @brief Retrieves the number of time periods in a time pattern. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param[out] out_len the number of time periods in the pattern. + @return an error code. + */ + int DLLEXPORT EN_getpatternlen(EN_Project ph, int index, int *out_len); + + /** + @brief Retrieves a time pattern's factor for a given time period. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param period a time period in the pattern (starting from 1). + @param[out] out_value the pattern factor for the given time period. + @return an error code. + */ + int DLLEXPORT EN_getpatternvalue(EN_Project ph, int index, int period, double *out_value); + + /** + @brief Sets a time pattern's factor for a given time period. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param period a time period in the pattern (starting from 1). + @param value the new value of the pattern factor for the given time period. + @return an error code. + */ + int DLLEXPORT EN_setpatternvalue(EN_Project ph, int index, int period, double value); + + /** + @brief Retrieves the average of all pattern factors in a time pattern. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param[out] out_value The average of all of the time pattern's factors. + @return an error code. + */ + int DLLEXPORT EN_getaveragepatternvalue(EN_Project ph, int index, double *out_value); + + /** + @brief Sets the pattern factors for a given time pattern. + @param ph an EPANET project handle. + @param index a time pattern index (starting from 1). + @param values an array of new pattern factor values. + @param len the number of factor values supplied. + @return an error code. + + `values` is a zero-based array that contains `len` elements. + + Use this function to redefine (and resize) a time pattern all at once; + use @ref EN_setpatternvalue to revise pattern factors one at a time. + */ + int DLLEXPORT EN_setpattern(EN_Project ph, int index, double *values, int len); + + /** + @brief Loads time patterns from a file into a project under a specific pattern ID. + @param ph an EPANET project handle. + @param filename the name of the file containing pattern data. + @param id the ID name of the new pattern to load. + @return an error code. + */ + int DLLEXPORT EN_loadpatternfile(EN_Project ph, const char *filename, const char *id); + +/*=================================================================== + + Data Curve Functions + +===================================================================*/ + + /** + @brief Adds a new data curve to a project. + @param ph an EPANET project handle. + @param id The ID name of the curve to be added. + @return an error code. + + The new curve contains a single data point (1.0, 1.0). + */ + int DLLEXPORT EN_addcurve(EN_Project ph, const char *id); + + /** + @brief Deletes a data curve from a project. + @param ph an EPANET project handle. + @param index the data curve's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_deletecurve(EN_Project ph, int index); + + /** + @brief Retrieves the index of a curve given its ID name. + @param ph an EPANET project handle. + @param id the ID name of a curve. + @param[out] out_index The curve's index (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_getcurveindex(EN_Project ph, const char *id, int *out_index); + + /** + @brief Retrieves the ID name of a curve given its index. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] out_id the curve's ID name. + @return an error code. + + The ID name must be sized to hold at least @ref EN_SizeLimits "EN_MAXID+1" characters. + */ + int DLLEXPORT EN_getcurveid(EN_Project ph, int index, char *out_id); + + /** + @brief Changes the ID name of a data curve given its index. + @param ph an EPANET project handle. + @param index a data curve index (starting from 1). + @param id the data curve's new ID name. + @return an error code. + + The new ID name must not exceed @ref EN_SizeLimits "EN_MAXID" characters. + */ + int DLLEXPORT EN_setcurveid(EN_Project ph, int index, const char *id); + + /** + @brief Retrieves the number of points in a curve. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] out_len The number of data points assigned to the curve. + @return an error code. + */ + int DLLEXPORT EN_getcurvelen(EN_Project ph, int index, int *out_len); + + /** + @brief Retrieves a curve's type. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] out_type the curve's type (see @ref EN_CurveType). + @return an error code. + */ + int DLLEXPORT EN_getcurvetype(EN_Project ph, int index, int *out_type); + + /** + @brief Sets a curve's type. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param type the curve's type (see @ref EN_CurveType). + @return an error code. + */ + int DLLEXPORT EN_setcurvetype(EN_Project ph, int index, int type); + + /** + @brief Retrieves the value of a single data point for a curve. + @param ph an EPANET project handle. + @param curveIndex a curve's index (starting from 1). + @param pointIndex the index of a point on the curve (starting from 1). + @param[out] out_x the point's x-value. + @param[out] out_y the point's y-value. + @return an error code. + */ + int DLLEXPORT EN_getcurvevalue(EN_Project ph, int curveIndex, int pointIndex, + double *out_x, double *out_y); + + /** + @brief Sets the value of a single data point for a curve. + @param ph an EPANET project handle. + @param curveIndex a curve's index (starting from 1). + @param pointIndex the index of a point on the curve (starting from 1). + @param x the point's new x-value. + @param y the point's new y-value. + @return an error code. + */ + int DLLEXPORT EN_setcurvevalue(EN_Project ph, int curveIndex, int pointIndex, + double x, double y); + + /** + @brief Retrieves all of a curve's data. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param[out] out_id the curve's ID name. + @param[out] out_nPoints the number of data points on the curve. + @param[out] out_xValues the curve's x-values. + @param[out] out_yValues the curve's y-values. + @return an error code. + + The calling program is responsible for making `out_xValues` and `out_yValues` large enough + to hold `out_nPoints` number of data points and for sizing `out_id` to hold at least + @ref EN_SizeLimits "EN_MAXID+1" characters. + */ + int DLLEXPORT EN_getcurve(EN_Project ph, int index, char *out_id, int *out_nPoints, + double *out_xValues, double *out_yValues); + + /** + @brief assigns a set of data points to a curve. + @param ph an EPANET project handle. + @param index a curve's index (starting from 1). + @param xValues an array of new x-values for the curve. + @param yValues an array of new y-values for the curve. + @param nPoints the new number of data points for the curve. + @return an error code. + + `xValues` and `yValues` are zero-based arrays that contains `nPoints` elements. + + Use this function to redefine (and resize) a curve all at once; + use @ref EN_setcurvevalue to revise a curve's data points one at a time. + */ + int DLLEXPORT EN_setcurve(EN_Project ph, int index, double *xValues, + double *yValues, int nPoints); + +/*=================================================================== + + Simple Controls Functions + +===================================================================*/ + + /** + @brief Adds a new simple control to a project. + @param ph an EPANET project handle. + @param type the type of control to add (see @ref EN_ControlType). + @param linkIndex the index of a link to control (starting from 1). + @param setting control setting applied to the link. + @param nodeIndex index of the node used to control the link + (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). + @param level action level (tank level, junction pressure, or time in seconds) + that triggers the control. + @param[out] out_index index of the new control. + @return an error code. + */ + int DLLEXPORT EN_addcontrol(EN_Project ph, int type, int linkIndex, + double setting, int nodeIndex, double level, int *out_index); + + /** + @brief Deletes an existing simple control. + @param ph an EPANET project handle. + @param index the index of the control to delete (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_deletecontrol(EN_Project ph, int index); + + /** + @brief Retrieves the properties of a simple control. + @param ph an EPANET project handle. + @param index the control's index (starting from 1). + @param[out] out_type the type of control (see @ref EN_ControlType). + @param[out] out_linkIndex the index of the link being controlled. + @param[out] out_setting the control setting applied to the link. + @param[out] out_nodeIndex the index of the node used to trigger the control + (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). + @param[out] out_level the action level (tank level, junction pressure, or time in seconds) + that triggers the control. + @return an error code. + */ + int DLLEXPORT EN_getcontrol(EN_Project ph, int index, int *out_type, int *out_linkIndex, + double *out_setting, int *out_nodeIndex, double *out_level); + + /** + @brief Sets the properties of an existing simple control. + @param ph an EPANET project handle. + @param index the control's index (starting from 1). + @param type the type of control (see @ref EN_ControlType). + @param linkIndex the index of the link being controlled. + @param setting the control setting applied to the link. + @param nodeIndex the index of the node used to trigger the control + (0 for `EN_TIMER` and `EN_TIMEOFDAY` controls). + @param level the action level (tank level, junction pressure, or time in seconds) + that triggers the control. + @return an error code. + */ + int DLLEXPORT EN_setcontrol(EN_Project ph, int index, int type, int linkIndex, + double setting, int nodeIndex, double level); + + /** + @brief Gets the enabled status of a simple control. + @param ph an EPANET project handle. + @param index the control's index (starting from 1). + @param out_enabled `EN_TRUE` (= 1) if the control is enabled or `EN_FALSE` (= 0) if it is disabled. + @return an error code. + */ + int DLLEXPORT EN_getcontrolenabled(EN_Project ph, int index, int *out_enabled); + + /** + @brief Sets the enabled status of a simple control. + @param ph an EPANET project handle. + @param index the control's index (starting from 1). + @param enabled `EN_TRUE` (= 1) sets the control to enabled, `EN_FALSE` (= 0) sets it to disabled. + @return an error code. + */ + int DLLEXPORT EN_setcontrolenabled(EN_Project ph, int index, int enabled); + +/*=================================================================== + + Rule-Based Controls Functions + +===================================================================*/ + + /** + @brief Adds a new rule-based control to a project. + @param ph an EPANET project handle. + @param rule text of the rule following the format used in an EPANET input file. + @return an error code. + + Consult the @ref RulesPage section of the @ref InpFile topic to learn about a + rule's format. Each clause of the rule must end with a newline character `\n`. + */ + int DLLEXPORT EN_addrule(EN_Project ph, char *rule); + + /** + @brief Deletes an existing rule-based control. + @param ph an EPANET project handle. + @param index the index of the rule to be deleted (starting from 1). + @return an error code. + */ + int DLLEXPORT EN_deleterule(EN_Project ph, int index); + + /** + @brief Retrieves summary information about a rule-based control. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param[out] out_nPremises number of premises in the rule's IF section. + @param[out] out_nThenActions number of actions in the rule's THEN section. + @param[out] out_nElseActions number of actions in the rule's ELSE section. + @param[out] out_priority the rule's priority value. + @return an error code. + */ + int DLLEXPORT EN_getrule(EN_Project ph, int index, int *out_nPremises, + int *out_nThenActions, int *out_nElseActions, double *out_priority); + + /** + @brief Gets the ID name of a rule-based control given its index. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param[out] out_id the rule's ID name. + @return an error code. + + The ID name must be sized to hold at least @ref EN_SizeLimits "EN_MAXID+1" characters. + */ + int DLLEXPORT EN_getruleID(EN_Project ph, int index, char *out_id); + + /** + @brief Gets the properties of a premise in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the position of the premise in the rule's list of premises + (starting from 1). + @param[out] out_logop the premise's logical operator (`IF` = 1, `AND` = 2, `OR` = 3` ). + @param[out] out_object the type of object the premise refers to (see @ref EN_RuleObject). + @param[out] out_objIndex the index of the object (e.g. the index of a tank). + @param[out] out_variable the object's variable being compared (see @ref EN_RuleVariable). + @param[out] out_relop the premise's comparison operator (see @ref EN_RuleOperator). + @param[out] out_status the status that the object's status is compared to + (see @ref EN_RuleStatus). + @param[out] out_value the value that the object's variable is compared to. + @return an error code. + */ + int DLLEXPORT EN_getpremise(EN_Project ph, int ruleIndex, int premiseIndex, + int *out_logop, int *out_object, int *out_objIndex, int *out_variable, + int *out_relop, int *out_status, double *out_value); + + /** + @brief Sets the properties of a premise in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the position of the premise in the rule's list of premises. + @param logop the premise's logical operator (`IF` = 1, `AND` = 2, `OR` = 3 ). + @param object the type of object the premise refers to (see @ref EN_RuleObject). + @param objIndex the index of the object (e.g. the index of a tank). + @param variable the object's variable being compared (see @ref EN_RuleVariable). + @param relop the premise's comparison operator (see @ref EN_RuleOperator). + @param status the status that the object's status is compared to + (see @ref EN_RuleStatus). + @param value the value that the object's variable is compared to. + @return an error code. + */ + int DLLEXPORT EN_setpremise(EN_Project ph, int ruleIndex, int premiseIndex, + int logop, int object, int objIndex, int variable, int relop, + int status, double value); + + /** + @brief Sets the index of an object in a premise of a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the premise's index (starting from 1). + @param objIndex the index of the premise's object (e.g. the index of a tank). + @return an error code. + */ + int DLLEXPORT EN_setpremiseindex(EN_Project ph, int ruleIndex, int premiseIndex, + int objIndex); + + /** + @brief Sets the status being compared to in a premise of a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param premiseIndex the premise's index (starting from 1). + @param status the status that the premise's object status is compared to + (see @ref EN_RuleStatus). + @return an error code. + */ + int DLLEXPORT EN_setpremisestatus(EN_Project ph, int ruleIndex, int premiseIndex, + int status); + + /** + @brief Sets the value in a premise of a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (staring from 1). + @param premiseIndex the premise's index (starting from 1). + @param value The value that the premise's variable is compared to. + @return an error code. + */ + int DLLEXPORT EN_setpremisevalue(EN_Project ph, int ruleIndex, int premiseIndex, + double value); + + /** + @brief Gets the properties of a THEN action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the THEN action to retrieve (starting from 1). + @param[out] out_linkIndex the index of the link in the action (starting from 1). + @param[out] out_status the status assigned to the link (see @ref EN_RuleStatus) + @param[out] out_setting the value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_getthenaction(EN_Project ph, int ruleIndex, int actionIndex, + int *out_linkIndex, int *out_status, double *out_setting); + + /** + @brief Sets the properties of a THEN action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the THEN action to modify (starting from 1). + @param linkIndex the index of the link in the action. + @param status the new status assigned to the link (see @ref EN_RuleStatus). + @param setting the new value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_setthenaction(EN_Project ph, int ruleIndex, int actionIndex, + int linkIndex, int status, double setting); + + /** + @brief Gets the properties of an ELSE action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the ELSE action to retrieve (starting from 1). + @param[out] out_linkIndex the index of the link in the action. + @param[out] out_status the status assigned to the link (see @ref EN_RuleStatus). + @param[out] out_setting the value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_getelseaction(EN_Project ph, int ruleIndex, int actionIndex, + int *out_linkIndex, int *out_status, double *out_setting); + + /** + @brief Sets the properties of an ELSE action in a rule-based control. + @param ph an EPANET project handle. + @param ruleIndex the rule's index (starting from 1). + @param actionIndex the index of the ELSE action being modified (starting from 1). + @param linkIndex the index of the link in the action (starting from 1). + @param status the new status assigned to the link (see @ref EN_RuleStatus) + @param setting the new value assigned to the link's setting. + @return an error code. + */ + int DLLEXPORT EN_setelseaction(EN_Project ph, int ruleIndex, int actionIndex, + int linkIndex, int status, double setting); + + /** + @brief Sets the priority of a rule-based control. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param priority the priority value assigned to the rule. + @return an error code. + */ + int DLLEXPORT EN_setrulepriority(EN_Project ph, int index, double priority); + + /** + @brief Gets the enabled status of a rule-based control. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param out_enabled the rule will be either EN_TRUE=enabled or EN_FALSE=disabled. + @return an error code. + */ + int DLLEXPORT EN_getruleenabled(EN_Project ph, int index, int *out_enabled); + + /** + @brief Sets the enabled status of a rule-based control. + @param ph an EPANET project handle. + @param index the rule's index (starting from 1). + @param enabled set the rule to either EN_TRUE=enabled or EN_FALSE=disabled. + @return an error code. + */ + int DLLEXPORT EN_setruleenabled(EN_Project ph, int index, int enabled); + +#if defined(__cplusplus) +} +#endif + +#endif //EPANET2_2_H diff --git a/epanet/linux/epanet2_enums.h b/epanet/linux/epanet2_enums.h new file mode 100644 index 0000000..2da2e68 --- /dev/null +++ b/epanet/linux/epanet2_enums.h @@ -0,0 +1,518 @@ +/** @file epanet2_enums.h +*/ +/* + ****************************************************************************** + Project: OWA EPANET + Version: 2.3 + Module: epanet2_enums.h + Description: enumerations of symbolic constants used by the API functions + Authors: see AUTHORS + Copyright: see AUTHORS + License: see LICENSE + Last Updated: 04/23/2025 + ****************************************************************************** +*/ + + +#ifndef EPANET2_ENUMS_H +#define EPANET2_ENUMS_H + +// --- Define the EPANET toolkit constants +/// Character array size limits +/*! \enum EN_SizeLimits + * Limits on the size of character arrays used to store ID names + * and text messages. +*/ +typedef enum { + EN_MAXID = 31, //!< Max. # characters in ID name + EN_MAXMSG = 255 //!< Max. # characters in message text +} EN_SizeLimits; + +/// Node properties +/*! \enum EN_NodeProperty + * These node properties are used with @ref EN_getnodevalue and @ref EN_setnodevalue. + * Those marked as read only are computed values that can only be retrieved. +*/ +typedef enum { + EN_ELEVATION = 0, //!< Elevation + EN_BASEDEMAND = 1, //!< Primary demand baseline value + EN_PATTERN = 2, //!< Primary demand time pattern index + EN_EMITTER = 3, //!< Emitter flow coefficient + EN_INITQUAL = 4, //!< Initial quality + EN_SOURCEQUAL = 5, //!< Quality source strength + EN_SOURCEPAT = 6, //!< Quality source pattern index + EN_SOURCETYPE = 7, //!< Quality source type (see @ref EN_SourceType) + EN_TANKLEVEL = 8, //!< Current computed tank water level (read only) + EN_DEMAND = 9, //!< Current computed demand (read only) + EN_HEAD = 10, //!< Current computed hydraulic head (read only) + EN_PRESSURE = 11, //!< Current computed pressure (read only) + EN_QUALITY = 12, //!< Current computed quality (read only) + EN_SOURCEMASS = 13, //!< Current computed quality source mass inflow (read only) + EN_INITVOLUME = 14, //!< Tank initial volume (read only) + EN_MIXMODEL = 15, //!< Tank mixing model (see @ref EN_MixingModel) + EN_MIXZONEVOL = 16, //!< Tank mixing zone volume (read only) + EN_TANKDIAM = 17, //!< Tank diameter + EN_MINVOLUME = 18, //!< Tank minimum volume + EN_VOLCURVE = 19, //!< Tank volume curve index + 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, //!< Current computed tank volume (read only) + EN_MAXVOLUME = 25, //!< Tank maximum volume (read only) + EN_CANOVERFLOW = 26, //!< `EN_TRUE` (= 1) if the Tank can overflow, `EN_FALSE` (= 0) if it cannot + EN_DEMANDDEFICIT = 27,//!< Amount that full demand is reduced under PDA (read only) + EN_NODE_INCONTROL = 28, //!< `EN_TRUE` (= 1) if the node appears in any control, `EN_FALSE` (= 0) if not + EN_EMITTERFLOW = 29, //!< Current emitter flow (read only) + EN_LEAKAGEFLOW = 30, //!< Current leakage flow (read only) + EN_DEMANDFLOW = 31, //!< Current consumer demand delivered (read only) + EN_FULLDEMAND = 32 //!< Current consumer demand requested (read only) +} EN_NodeProperty; + +/// Link properties +/** +These link properties are used with @ref EN_getlinkvalue and @ref EN_setlinkvalue. +Those marked as read only are computed values that can only be retrieved. +*/ +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 (see @ref EN_LinkStatusType) + EN_INITSETTING = 5, //!< Initial pump speed or valve setting + EN_KBULK = 6, //!< Bulk flow chemical reaction coefficient + EN_KWALL = 7, //!< Pipe wall chemical reaction coefficient + EN_FLOW = 8, //!< Current computed flow rate (read only) + EN_VELOCITY = 9, //!< Current computed flow velocity (read only) + EN_HEADLOSS = 10, //!< Current computed head loss (read only) + EN_STATUS = 11, //!< Current link status (see @ref EN_LinkStatusType) + EN_SETTING = 12, //!< Current link setting + EN_ENERGY = 13, //!< Current computed pump energy usage (read only) + EN_LINKQUAL = 14, //!< Current computed link quality (read only) + EN_LINKPATTERN = 15, //!< Pump speed time pattern index + EN_PUMP_STATE = 16, //!< Current computed pump state (read only) (see @ref EN_PumpStateType) + EN_PUMP_EFFIC = 17, //!< Current computed pump efficiency (read only) + EN_PUMP_POWER = 18, //!< Pump constant power rating + EN_PUMP_HCURVE = 19, //!< Pump head v. flow curve index + EN_PUMP_ECURVE = 20, //!< Pump efficiency v. flow curve index + EN_PUMP_ECOST = 21, //!< Pump average energy price + EN_PUMP_EPAT = 22, //!< Pump energy price time pattern index + EN_LINK_INCONTROL = 23, //!< Is present in any simple or rule-based control (= 1) or not (= 0) + EN_GPV_CURVE = 24, //!< GPV head loss v. flow curve index + EN_PCV_CURVE = 25, //!< PCV characteristic curve index + EN_LEAK_AREA = 26, //!< Pipe leak area (sq mm per 100 length units) + EN_LEAK_EXPAN = 27, //!< Leak expansion rate (sq mm per unit of pressure head) + EN_LINK_LEAKAGE = 28, //!< Current leakage rate (read only) + EN_VALVE_TYPE = 29 //!< Type of valve (see @ref EN_LinkType) +} EN_LinkProperty; + +/// Time parameters +/** +These time-related options are used with @ref EN_gettimeparam and@ref EN_settimeparam. +All times are expressed in seconds The parameters marked as read only are +computed values that can only be retrieved. +*/ +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-based control evaluation time step + EN_STATISTIC = 8, //!< Reporting statistic code (see @ref EN_StatisticType) + EN_PERIODS = 9, //!< Number of reporting time periods (read only) + EN_STARTTIME = 10, //!< Simulation starting time of day + EN_HTIME = 11, //!< Elapsed time of current hydraulic solution (read only) + EN_QTIME = 12, //!< Elapsed time of current quality solution (read only) + EN_HALTFLAG = 13, //!< Flag indicating if the simulation was halted (read only) + EN_NEXTEVENT = 14, //!< Shortest time until a tank becomes empty or full (read only) + EN_NEXTEVENTTANK = 15 //!< Index of tank with shortest time to become empty or full (read only) +} EN_TimeParameter; + +/// Time step events +/** +These are the types of events that can cause a new time step to be taken. +**/ +typedef enum { + EN_STEP_REPORT = 0, //!< A reporting time step has ended + EN_STEP_HYD = 1, //!< A hydraulic time step has ended + EN_STEP_WQ = 2, //!< A water quality time step has ended + EN_STEP_TANKEVENT = 3, //!< A tank has become empty or full + EN_STEP_CONTROLEVENT = 4 //!< A link control needs to be activated +} EN_TimestepEvent; + +/// Analysis convergence statistics +/** +These statistics report the convergence criteria for the most current hydraulic analysis +and the cumulative water quality mass balance error at the current simulation time. They +can be retrieved with @ref EN_getstatistic. +*/ +typedef enum { + EN_ITERATIONS = 0, //!< Number of hydraulic iterations taken + EN_RELATIVEERROR = 1, //!< Sum of link flow changes / sum of link flows + EN_MAXHEADERROR = 2, //!< Largest head loss error for links + EN_MAXFLOWCHANGE = 3, //!< Largest flow change in links + EN_MASSBALANCE = 4, //!< Cumulative water quality mass balance ratio + EN_DEFICIENTNODES = 5, //!< Number of pressure deficient nodes + EN_DEMANDREDUCTION = 6, //!< % demand reduction at pressure deficient nodes + EN_LEAKAGELOSS = 7 //!< % flow lost to system leakage +} EN_AnalysisStatistic; + +/// Types of network objects +/** +The types of objects that comprise a network model. +*/ +typedef enum { + EN_NODE = 0, //!< Nodes + EN_LINK = 1, //!< Links + EN_TIMEPAT = 2, //!< Time patterns + EN_CURVE = 3, //!< Data curves + EN_CONTROL = 4, //!< Simple controls + EN_RULE = 5 //!< Control rules +} EN_ObjectType; + +/// Types of objects to count +/** +These options tell @ref EN_getcount which type of object to count. +*/ +typedef enum { + EN_NODECOUNT = 0, //!< Number of nodes (junctions + 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 data curves + EN_CONTROLCOUNT = 5, //!< Number of simple controls + EN_RULECOUNT = 6 //!< Number of rule-based controls +} EN_CountType; + +/// Node Types +/** +These are the different types of nodes that can be returned by calling @ref EN_getnodetype. +*/ +typedef enum { + EN_JUNCTION = 0, //!< Junction node + EN_RESERVOIR = 1, //!< Reservoir node + EN_TANK = 2 //!< Storage tank node +} EN_NodeType; + +/// Link types +/** +These are the different types of links that can be returned by calling @ref EN_getlinktype. +*/ +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_PCV = 9 //!< Positional control valve +} EN_LinkType; + +/// Link status +/** +One of these values is returned when @ref EN_getlinkvalue is used to retrieve a link's +initial status (`EN_INITSTATUS`) or its current status (`EN_STATUS`). These options are +also used with @ref EN_setlinkvalue to set values for these same properties. +*/ +typedef enum { + EN_CLOSED = 0, //!< Link is closed and cannot convey any flow + EN_OPEN = 1 //!< Link is open and is able to convey flow +} EN_LinkStatusType; + +/// Pump states +/** +One of these codes is returned when @ref EN_getlinkvalue is used to retrieve a pump's +current operating state (`EN_PUMP_STATE`). `EN_PUMP_XHEAD` indicates that the pump has been +shut down because it is being asked to deliver more than its shutoff head. `EN_PUMP_XFLOW` +indicates that the pump is being asked to deliver more than its maximum flow. +*/ +typedef enum { + EN_PUMP_XHEAD = 0, //!< Pump closed - cannot supply head + EN_PUMP_CLOSED = 2, //!< Pump closed + EN_PUMP_OPEN = 3, //!< Pump open + EN_PUMP_XFLOW = 5 //!< Pump open - cannot supply flow +} EN_PumpStateType; + +/// Types of water quality analyses +/** +These are the different types of water quality analyses that EPANET can run. They +are used with @ref EN_getqualinfo, @ref EN_getqualtype, and @ref EN_setqualtype. +*/ +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 +/** +These are the different types of external water quality sources that can be assigned +to a node's `EN_SOURCETYPE` property as used by @ref EN_getnodevalue and @ref EN_setnodevalue. +*/ +typedef enum { + EN_CONCEN = 0, //!< Sets the concentration of external inflow entering a node + EN_MASS = 1, //!< Injects a given mass/minute into a node + EN_SETPOINT = 2, //!< Sets the concentration leaving a node to a given value + EN_FLOWPACED = 3 //!< Adds a given value to the concentration leaving a node +} EN_SourceType; + +/// Head loss formulas +/** +The available choices for the `EN_HEADLOSSFORM` option in @ref EN_getoption and +@ref EN_setoption. They are also used for the head loss type argument in @ref EN_init. +Each head loss formula uses a different type of roughness coefficient (`EN_ROUGHNESS`) +that can be set with @ref EN_setlinkvalue. +*/ +typedef enum { + EN_HW = 0, //!< Hazen-Williams + EN_DW = 1, //!< Darcy-Weisbach + EN_CM = 2 //!< Chezy-Manning +} EN_HeadLossType; + +/// Flow units +/** +These choices for flow units are used with @ref EN_getflowunits and @ref EN_setflowunits. +They are also used for the flow units type argument in @ref EN_init. If flow units are +expressed in US Customary units (`EN_CFS` through `EN_AFD`) then all other quantities are +in US Customary units. Otherwise they are in metric units. +*/ +typedef enum { + EN_CFS = 0, //!< Cubic feet per second + EN_GPM = 1, //!< Gallons per minute + EN_MGD = 2, //!< Million gallons per day + EN_IMGD = 3, //!< Imperial million gallons per day + EN_AFD = 4, //!< Acre-feet per day + EN_LPS = 5, //!< Liters per second + EN_LPM = 6, //!< Liters per minute + EN_MLD = 7, //!< Million liters per day + EN_CMH = 8, //!< Cubic meters per hour + EN_CMD = 9, //!< Cubic meters per day + EN_CMS = 10 //!< Cubic meters per second +} EN_FlowUnits; + +/// Pressure units +/** +The available choices for pressure units for the `EN_PRESS_UNITS` option in @ref EN_getoption +and @ref EN_setoption. +*/ +typedef enum { + EN_PSI = 0, //!< Pounds per square inch + EN_KPA = 1, //!< Kilopascals + EN_METERS = 2, //!< Meters + EN_BAR = 3, //!< Bar + EN_FEET = 4 //!< Feet +} EN_PressUnits; + +/// Demand models +/** +These choices for modeling consumer demands are used with @ref EN_getdemandmodel +and @ref EN_setdemandmodel. + +A demand driven analysis requires that a junction's full demand be supplied +in each time period independent of how much pressure is available. A pressure +driven analysis makes demand be a power function of pressure, up to the point +where the full demand is met. +*/ +typedef enum { + EN_DDA = 0, //!< Demand driven analysis + EN_PDA = 1 //!< Pressure driven analysis +} EN_DemandModel; + +/// Simulation options +/** +These constants identify the hydraulic and water quality simulation options +that are applied on a network-wide basis. They are accessed using the +@ref EN_getoption and @ref EN_setoption functions. +*/ +typedef enum { + EN_TRIALS = 0, //!< Maximum trials allowed for hydraulic convergence + EN_ACCURACY = 1, //!< Total normalized flow change for hydraulic convergence + EN_TOLERANCE = 2, //!< Water quality tolerance + EN_EMITEXPON = 3, //!< Exponent in emitter discharge formula + EN_DEMANDMULT = 4, //!< Global demand multiplier + EN_HEADERROR = 5, //!< Maximum head loss error for hydraulic convergence + EN_FLOWCHANGE = 6, //!< Maximum flow change for hydraulic convergence + EN_HEADLOSSFORM = 7, //!< Head loss formula (see @ref EN_HeadLossType) + EN_GLOBALEFFIC = 8, //!< Global pump efficiency (percent) + EN_GLOBALPRICE = 9, //!< Global energy price per KWH + EN_GLOBALPATTERN = 10, //!< Index of a global energy price pattern + EN_DEMANDCHARGE = 11, //!< Energy charge per max. KW usage + EN_SP_GRAVITY = 12, //!< Specific gravity + EN_SP_VISCOS = 13, //!< Specific viscosity (relative to water at 20 deg C) + EN_UNBALANCED = 14, //!< Extra trials allowed if hydraulics don't converge + EN_CHECKFREQ = 15, //!< Frequency of hydraulic status checks + EN_MAXCHECK = 16, //!< Maximum trials for status checking + EN_DAMPLIMIT = 17, //!< Accuracy level where solution damping begins + EN_SP_DIFFUS = 18, //!< Specific diffusivity (relative to chlorine at 20 deg C) + EN_BULKORDER = 19, //!< Bulk water reaction order for pipes + EN_WALLORDER = 20, //!< Wall reaction order for pipes (either 0 or 1) + EN_TANKORDER = 21, //!< Bulk water reaction order for tanks + EN_CONCENLIMIT = 22, //!< Limiting concentration for growth reactions + EN_DEMANDPATTERN = 23, //!< Name of default demand pattern + EN_EMITBACKFLOW = 24, //!< `EN_TRUE` (= 1) if emitters can backflow, `EN_FALSE` (= 0) if not + EN_PRESS_UNITS = 25, //!< Pressure units (see @ref EN_PressUnits) + EN_STATUS_REPORT = 26 //!< Type of status report to produce (see @ref EN_StatusReport) +} EN_Option; + +/// Simple control types +/** +These are the different types of simple (single statement) controls that can be applied +to network links. They are used as an argument to @ref EN_addcontrol,@ref EN_getcontrol, +and @ref EN_setcontrol. +*/ +typedef enum { + EN_LOWLEVEL = 0, //!< Act when pressure or tank level drops below a setpoint + EN_HILEVEL = 1, //!< Act when pressure or tank level rises above a setpoint + EN_TIMER = 2, //!< Act at a prescribed elapsed amount of time + EN_TIMEOFDAY = 3 //!< Act at a particular time of day +} EN_ControlType; + +/// Reporting statistic choices +/** +These options determine what kind of statistical post-processing should be done on +the time series of simulation results before they are reported using @ref EN_report +or saved to the project's binary output file. These options are used in the +@ref EN_gettimeparam and @ref EN_settimeparam functions when `EN_STATISTIC` is the +time parameter being set or retrieved. +*/ +typedef enum { + EN_SERIES = 0, //!< Report all time series points + 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 +/** +These are the different types of models that describe water quality mixing in storage tanks. +The choice of model is accessed with the `EN_MIXMODEL` property of a Tank node using +@ref EN_getnodevalue and @ref EN_setnodevalue. +*/ +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 +/** +These options are used to initialize a new hydraulic analysis when @ref EN_initH is called. +*/ +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_InitHydOption; + +/// Types of pump curves +/** +@ref EN_getpumptype returns one of these values when it is called. +*/ +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; + +/// Types of data curves +/** +These are the different types of physical relationships that a data curve can +represent as returned by calling @ref EN_getcurvetype. +*/ +typedef enum { + EN_VOLUME_CURVE = 0, //!< Tank volume v. depth curve + EN_PUMP_CURVE = 1, //!< Pump head v. flow curve + EN_EFFIC_CURVE = 2, //!< Pump efficiency v. flow curve + EN_HLOSS_CURVE = 3, //!< Valve head loss v. flow curve + EN_GENERIC_CURVE = 4, //!< Generic curve + EN_VALVE_CURVE = 5 //!< % of fully open flow v. % open +} EN_CurveType; + +/// Deletion action codes +/** +These codes are used in @ref EN_deletenode and @ref EN_deletelink to indicate what action +should be taken if the node or link being deleted appears in any simple or rule-based +controls or if a deleted node has any links connected to it. +*/ +typedef enum { + EN_UNCONDITIONAL = 0, //!< Delete all controls and connecting links + EN_CONDITIONAL = 1 //!< Cancel object deletion if it appears in controls or has connecting links +} EN_ActionCodeType; + +/// Status reporting levels +/** +These choices specify the level of status reporting written to a project's report +file during a hydraulic analysis. The level is set using the @ref EN_setstatusreport +or the @ref EN_setoption functions. +*/ +typedef enum { + EN_NO_REPORT = 0, //!< No status reporting + EN_NORMAL_REPORT = 1, //!< Normal level of status reporting + EN_FULL_REPORT = 2 //!< Full level of status reporting +} EN_StatusReport; + +/// Network objects used in rule-based controls +typedef enum { + EN_R_NODE = 6, //!< Clause refers to a node + EN_R_LINK = 7, //!< Clause refers to a link + EN_R_SYSTEM = 8 //!< Clause refers to a system parameter (e.g., time) +} EN_RuleObject; + +/// Object variables used in rule-based controls +typedef enum { + EN_R_DEMAND = 0, //!< Nodal demand + EN_R_HEAD = 1, //!< Nodal hydraulic head + EN_R_GRADE = 2, //!< Nodal hydraulic grade + EN_R_LEVEL = 3, //!< Tank water level + EN_R_PRESSURE = 4, //!< Nodal pressure + EN_R_FLOW = 5, //!< Link flow rate + EN_R_STATUS = 6, //!< Link status + EN_R_SETTING = 7, //!< Link setting + EN_R_POWER = 8, //!< Pump power output + EN_R_TIME = 9, //!< Elapsed simulation time + EN_R_CLOCKTIME = 10, //!< Time of day + EN_R_FILLTIME = 11, //!< Time to fill a tank + EN_R_DRAINTIME = 12 //!< Time to drain a tank +} EN_RuleVariable; + +/// Comparison operators used in rule-based controls +typedef enum { + EN_R_EQ = 0, //!< Equal to + EN_R_NE = 1, //!< Not equal + EN_R_LE = 2, //!< Less than or equal to + EN_R_GE = 3, //!< Greater than or equal to + EN_R_LT = 4, //!< Less than + EN_R_GT = 5, //!< Greater than + EN_R_IS = 6, //!< Is equal to + EN_R_NOT = 7, //!< Is not equal to + EN_R_BELOW = 8, //!< Is below + EN_R_ABOVE = 9 //!< Is above +} EN_RuleOperator; + +/// Link status codes used in rule-based controls +typedef enum { + EN_R_IS_OPEN = 1, //!< Link is open + EN_R_IS_CLOSED = 2, //!< Link is closed + EN_R_IS_ACTIVE = 3 //!< Control valve is active +} EN_RuleStatus; + +#define EN_MISSING -1.E10 //!< Missing value indicator +#define EN_SET_CLOSED -1.E10 //!< Link set closed indicator +#define EN_SET_OPEN 1.E10 //!< Link set open indicator + +#define EN_FALSE 0 //!< boolean false +#define EN_TRUE 1 //!< boolean true + +#endif //EPANET2_ENUMS_H diff --git a/epanet/linux/libepanet-output.so b/epanet/linux/libepanet-output.so new file mode 100644 index 0000000000000000000000000000000000000000..6e9aec598f97701d712288e4d635470d7fa8002f GIT binary patch literal 22528 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 AU;qFB literal 0 HcmV?d00001 diff --git a/epanet/linux/libepanet2.so b/epanet/linux/libepanet2.so new file mode 100644 index 0000000000000000000000000000000000000000..168f2150f1e4a4046ab33f762272690a7170b32e GIT binary patch literal 430008 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 n59eJc^3SUxN literal 0 HcmV?d00001 diff --git a/epanet/linux/runepanet b/epanet/linux/runepanet new file mode 100644 index 0000000000000000000000000000000000000000..c22bd1cecd45a11d79c2a430bb7713cec3609bbd GIT binary patch literal 16952 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 by`TY0aH^MV@i91;|MMG!#S)8yMP&Z~Q2C8@ literal 0 HcmV?d00001