新增 epanet Linux版本;为 epanet.py 新增 Linux 的环境运行代码
This commit is contained in:
309
epanet/epanet.py
309
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)
|
||||
|
||||
464
epanet/linux/epanet2.h
Normal file
464
epanet/linux/epanet2.h
Normal file
@@ -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
|
||||
486
epanet/linux/epanet2.pas
Normal file
486
epanet/linux/epanet2.pas
Normal file
@@ -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.
|
||||
1960
epanet/linux/epanet2_2.h
Normal file
1960
epanet/linux/epanet2_2.h
Normal file
File diff suppressed because it is too large
Load Diff
518
epanet/linux/epanet2_enums.h
Normal file
518
epanet/linux/epanet2_enums.h
Normal file
@@ -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
|
||||
BIN
epanet/linux/libepanet-output.so
Normal file
BIN
epanet/linux/libepanet-output.so
Normal file
Binary file not shown.
BIN
epanet/linux/libepanet2.so
Normal file
BIN
epanet/linux/libepanet2.so
Normal file
Binary file not shown.
BIN
epanet/linux/runepanet
Normal file
BIN
epanet/linux/runepanet
Normal file
Binary file not shown.
Reference in New Issue
Block a user