class Test1(unittest.TestCase): def setUp(self): print("SETUP!") file = os.path.join(os.path.dirname(simple.__file__), 'Net3.inp') self.es = EPANetSimulation(file) def tearDown(self): self.es.clean() print("TEAR DOWN!") @skip def test_false(self): assert False def test_EPANetSimulation_by_default_has_no_ADF_values(self): d= Link.value_type['EN_DIAMETER'] self.assertAlmostEqual(self.es.network.links[1].results[d][0],99.,delta=1) self.assertRaises(AttributeError, getattr, self.es.network.links[1], "ADF") def test_EPANetSimulation_after_calling_adfcalc_has_ADF_values(self): d= Link.value_type['EN_DIAMETER'] self.assertAlmostEqual(self.es.network.links[1].results[d][0],99.,delta=1) raised=False try: self.assertAlmostEqual(self.es.network.links[1].ADF,.05) except AttributeError: raised=True self.assertTrue(raised,"Did not raise exception.") self.es.adfcalc() self.assertAlmostEqual(self.es.network.links[1].ADF,0.99996,delta=.001) self.assertAlmostEqual(self.es.network.links['151'].ADF,0.974816, delta=0.001)
class Test1(unittest.TestCase): def setUp(self): print("SETUP!") file = os.path.join(os.path.dirname(simple.__file__), 'Net3.inp') self.es = EPANetSimulation(file) def tearDown(self): self.es.clean() print("TEAR DOWN!") @skip def test_false(self): assert False def test_EPANetSimulation_by_default_has_no_ADF_values(self): d = Link.value_type['EN_DIAMETER'] self.assertAlmostEqual(self.es.network.links[1].results[d][0], 99., delta=1) self.assertRaises(AttributeError, getattr, self.es.network.links[1], "ADF") def test_EPANetSimulation_after_calling_adfcalc_has_ADF_values(self): d = Link.value_type['EN_DIAMETER'] self.assertAlmostEqual(self.es.network.links[1].results[d][0], 99., delta=1) raised = False try: self.assertAlmostEqual(self.es.network.links[1].ADF, .05) except AttributeError: raised = True self.assertTrue(raised, "Did not raise exception.") self.es.adfcalc() self.assertAlmostEqual(self.es.network.links[1].ADF, 0.99996, delta=.001) self.assertAlmostEqual(self.es.network.links['151'].ADF, 0.974816, delta=0.001)
class pdd_service(object): def __init__(self, epanet_network, diafact=10.0, coords=False, adfcalc=True): self.epanet_network = epanet_network self.diafact = diafact self.adfcalc = adfcalc self.open_network(epanet_network) if (coords): self.read_coordinates(epanet_network) self.orig_networkfile = epanet_network self._get_units() def _get_units(self): import re pattern = re.compile("^\s*Units\s*([A-Z]{3})\s*$") self.units = None with open(self.orig_networkfile, "r") as f: for line in f: p = pattern.search(line) if p: self.units = p.group(1) break if not self.units: raise Exception( "Wrong file format. Can Not find 'Units XXX' entry") def read_coordinates(self, epanet_network): """Reads the epanet input file and extracts the coorinates of: 1. nodes 2. link vertices if any """ with open(epanet_network, 'r') as f: l = [x.strip() for x in f.readlines()] data = [x for x in l if (x and x != '' and x[0] != ';')] # drop all empty lines st = data.index("[COORDINATES]") lines = data[st + 1:-1] for line in lines: if line[0] + line[-1] == '[]': break vals = str.split(line) self.nodes[vals[0]].x = float(vals[1]) self.nodes[vals[0]].y = float(vals[2]) # now check and raise error if a certain node does not have coordinates try: for i, node in self.nodes.items(): node.x node.y except AttributeError as e: logger.warn("Exception raised(see below): %e" % e) logger.warn( "There is an error in your network file, some nodes do not have coordinates. Fix them and retry please." ) logger.warn("Offending item: %s: Node: %s (%d)" % (epanet_network, node.id, i)) raise AttributeError( "There is an error in your network file, some nodes do not have coordinates. Fix them and retry please." ) for i, link in self.links.items(): if (link.start.x == link.end.x): link.start.x = link.start.x link.end.x = link.end.x # now extract vertices (if any) st = data.index("[VERTICES]") lines = data[st + 1:-1] # first add empty list called vertices for i, link in self.links.items(): link.vertices = [] # now find any vertices and append them for line in lines: if line[0] + line[-1] == '[]': break vals = str.split(line) self.links[vals[0]].vertices.append( (float(vals[1]), float(vals[2]))) def open_network(self, epanet_network): logger.info("Opening network %s" % epanet_network) self.es = EPANetSimulation(epanet_network, pdd=True) if (self.adfcalc): logger.info("Doing ADF calculations") self.es.adfcalc(diafact=self.diafact) else: logger.info("Skipping ADF") self._set_static_values() # set nodes, links for easy access! self.nodes = Nodes() self.links = Links() logger.info("Mapping nodes and links to new objects") for key, value in self.es.network.nodes.items(): n = _Node() n.id = value.id self.nodes[key] = n for key, value in self.es.network.links.items(): l = _Link() l.id = value.id l.length = value.length l.diameter = value.diameter try: l.ADF = value.ADF except: pass l.start = self.nodes[value.start.id] l.end = self.nodes[value.end.id] self.links[key] = l # self.nodes = self.es.network.nodes # self.links = self.es.network.links def _set_static_values(self): """ Adds attibutes of length, diameter for easy access.""" for i, link in self.es.network.links.items(): d = Link.value_type['EN_DIAMETER'] l = Link.value_type['EN_LENGTH'] link.diameter = link.results[d][0] link.length = link.results[l][0] def get_total_demand(self): self.es.run() total = 0.0 st = self.es.network.tsteps j = Node.node_types['JUNCTION'] for (i, node) in [(i, x) for i, x in self.es.network.nodes.items() if x.node_type == j]: d = Node.value_type["EN_DEMAND"] dem = [x * y for x, y in zip(node.results[d], st)] total = total + sum(dem) return total def _c_and_r(self, vals): try: r = vals[0] results = vals[1] except: r = vals results = None if (r != 0): # pragma: no cover raise Exception("epanettools error!") return results def get_pipe_closed_demand(self, pipeindex, dia_factor): import os prefix_ = "epanet_" + self._c_and_r(self.es.ENgetlinkid(pipeindex)) fd, f = tempfile.mkstemp(suffix=".inp", prefix=prefix_, dir=tempfile.gettempdir(), text=True) os.close(fd) d = Link.value_type['EN_DIAMETER'] ret, diam = self.es.ENgetlinkvalue(pipeindex, d) dsmall = diam / float(dia_factor) self._c_and_r(self.es.ENsetlinkvalue(pipeindex, d, dsmall)) self.es.ENsaveinpfile(f) self._c_and_r(self.es.ENsetlinkvalue(pipeindex, d, diam)) # reset diameter self.es = EPANetSimulation(f, pdd=True) demand = self.get_total_demand() self.es = EPANetSimulation( self.orig_networkfile) # reset original network return demand