def get_pump_energy_usage_statistics(self): """ Read pump energy usage statistics for all pumps. Returns: dictionary (keyed by each pump's link name) of PumpEnergy instances """ all_pump_energy = {} pump_count = self._call_int(_lib.ENR_getNetSize, _lib.ENR_pumpCount) if pump_count: link_index_return = c_int() returned_length = c_int() error_new = c_int() array_pointer = _lib.ENR_newOutValueArray(self.ptrapi, _lib.ENR_getEnergy, _lib.ENR_link, byref(returned_length), byref(error_new)) if error_new.value != 0: print("Error " + str(error_new.value) + " calling ENR_newOutValueArray for getEnergy") self._raise_error(error_new.value) for pump_index in range(1, pump_count + 1): self.call(_lib.ENR_getEnergyUsage, pump_index, byref(link_index_return), array_pointer) link_index = link_index_return.value for link in self.links.itervalues(): if link.index == link_index: all_pump_energy[link.name] = PumpEnergy( link.name, array_pointer[1], array_pointer[2], array_pointer[3], array_pointer[4], array_pointer[5], array_pointer[6]) break _lib.ENR_free(array_pointer) return all_pump_energy
def get_LinkSeries(self, LinkInd, LinkAttr, SeriesStartInd=0, SeriesLen=-1): """ Purpose: Get time series results for particular attribute. Specify series start and length using seriesStart and seriesLength respectively. SeriesLen = -1 Default input: Gets data from Series Start Ind to end """ if SeriesLen > self.numPeriods: raise Exception("Outside Number of TimeSteps") elif SeriesLen == -1: SeriesLen = self.numPeriods sLength = c_int() ErrNo1 = c_int() SeriesPtr = _lib.ENR_newOutValueSeries(self.enrapi, SeriesStartInd, SeriesLen, byref(sLength), byref(ErrNo1)) ErrNo2 = _lib.ENR_getLinkSeries(self.enrapi, LinkInd, LinkAttr, SeriesStartInd, sLength.value, SeriesPtr) BldArray = [SeriesPtr[i] for i in range(sLength.value)] ret = _lib.ENR_free(SeriesPtr) return BldArray
def get_attribute_for_all_at_time(cls, output, attribute, time_index): """ Purpose: For all items of this type (nodes or links) at given time, get a particular attribute. Args output: OutputObject that already has the desired output file open. attribute: attribute to get values of - must be an ENR_attribute from self.Attributes. time_index: time index to retrieve, 0 is the first time index. Examples for node in output.nodes: values = node.get_all_attributes_at_time(output, time_index) for attribute in (node.AttributeDemand, node.AttributeHead): print(attribute.name, attribute.str(values[attribute.index])) """ returned_length = c_int() error_new = c_int() array_pointer = _lib.ENR_newOutValueArray(output.ptrapi, _lib.ENR_getAttribute, cls._elementType, byref(returned_length), byref(error_new)) if error_new.value != 0: print("Error " + str(error_new.value) + " calling ENR_newOutValueArray for " + cls.TypeLabel) output._raise_error(error_new.value) error_get = cls._get_attribute(output.ptrapi, time_index, attribute.index, array_pointer) if error_get != 0: print("Error reading " + str(attribute.name) + " for all " + cls.TypeLabel + "s at " + str(time_index)) output._raise_error(error_get) BldArray = [array_pointer[i] for i in range(returned_length.value)] _lib.ENR_free(array_pointer) return BldArray
def get_series(self, output, attribute, start_index=0, end_index=-1): """ Purpose: Get time series results for the requested attribute. Args output: OutputObject that already has the desired output file open. attribute: attribute to get values of - must be an ENR_attribute from self.Attributes. start_index: first time index to retrieve, default = 0 for first time index. end_index: last time index to retrieve, or -1 to get all values starting at start_index. """ if end_index == -1: end_index = output.num_periods - 1 if start_index < 0: raise Exception("get_series start_index " + str(start_index) + " cannot be less than zero.") if start_index >= output.num_periods: raise Exception("get_series start_index " + str(start_index) + " must be less than number of time steps " + str(output.num_periods)) if end_index < start_index: raise Exception("get_series end_index " + str(end_index) + " less than start_index " + str(start_index)) if end_index >= output.num_periods: raise Exception("get_series end_index " + str(end_index) + " must be less than number of time steps " + str(output.num_periods)) returned_length = c_int() error_new = c_int() ask_for_end = end_index # if output.newOutValueSeriesLengthIsEnd: # ask_for_end += start_index + 1 series_pointer = _lib.ENR_newOutValueSeries(output.ptrapi, start_index, ask_for_end, byref(returned_length), byref(error_new)) if error_new.value != 0: print("Error " + str(error_new.value) + " allocating series start=" + str(start_index) + ", end=" + str(ask_for_end)) output._raise_error(error_new.value) if self.index >= 0: error_get = self._get_series(output.ptrapi, self.index, attribute.index, start_index, returned_length.value, series_pointer) else: error_get = self._get_series(output.ptrapi, attribute.index, start_index, returned_length.value, series_pointer) if error_get != 0: print("Error reading series " + self.TypeLabel + " " + str(self.name) + ', att #' + str(attribute.index)) output._raise_error(error_get) build_array = [series_pointer[i] for i in range(returned_length.value)] _lib.ENR_free(series_pointer) return build_array
def get_LinkResult(self, LinkInd, TimeInd): """ Purpose: For a link at given time, get all attributes """ alength = c_int() ErrNo1 = c_int() ValArrayPtr = _lib.ENR_newOutValueArray(self.enrapi, _lib.ENR_getResult, _lib.ENR_link, byref(alength), byref(ErrNo1)) ErrNo2 = _lib.ENR_getLinkResult(self.enrapi, TimeInd, LinkInd, ValArrayPtr) BldArray = [ValArrayPtr[i] for i in range(alength.value)] _lib.ENR_free(ValArrayPtr) return BldArray
def get_LinkAttribute(self, LinkAttr, TimeInd): """ Purpose: For all links at given time, get a particular attribute """ alength = c_int() ErrNo1 = c_int() ValArrayPtr = _lib.ENR_newOutValueArray(self.enrapi, _lib.ENR_getAttribute, _lib.ENR_link, byref(alength), byref(ErrNo1)) ErrNo2 = _lib.ENR_getLinkAttribute(self.enrapi, TimeInd, LinkAttr, ValArrayPtr) BldArray = [ValArrayPtr[i] for i in range(alength.value)] _lib.ENR_free(ValArrayPtr) return BldArray
def _measure_new_out_value_series(self): """Test ENR_newOutValueSeries to see whether it treats the requested length as length or end. Sets self.newOutValueSeriesLengthIsEnd flag so we can adjust how we call this method.""" returned_length = c_int() error_new = c_int() try: series_pointer = _lib.ENR_newOutValueSeries( self.ptrapi, 0, 1, byref(returned_length), byref(error_new)) if error_new.value != 0: print( "Error allocating series start to test ENR_newOutValueSeries: " + str(error_new.value)) self._raise_error(error_new.value) self.newOutValueSeriesLengthIsEnd = (returned_length.value == 1) _lib.ENR_free(series_pointer) except Exception as ex: print(str(ex)) raise Exception( "SWMM output error calling ENR_newOutValueSeries: " + str(ex))
def get_reaction_summary(self): """ Read reaction summary (network-wide average reaction rates and average source mass inflow) Returns: four floating-point numbers: bulk, wall, tank, source """ returned_length = c_int() error_new = c_int() array_pointer = _lib.ENR_newOutValueArray(self.ptrapi, _lib.ENR_getReacts, _lib.ENR_link, byref(returned_length), byref(error_new)) if error_new.value != 0: print("Error " + str(error_new.value) + " calling ENR_newOutValueArray for getReacts") self._raise_error(error_new.value) self.call(_lib.ENR_getNetReacts, array_pointer) bulk = array_pointer[1] wall = array_pointer[2] tank = array_pointer[3] source = array_pointer[4] _lib.ENR_free(array_pointer) return bulk, wall, tank, source
def get_all_attributes_at_time(self, output, time_index): """ For one location at one time, get all attributes. Returns: List of attribute values in the same order as self.attributes. Examples output = ENOutputWrapper.OutputObject("Net1.out") for time_index in range(0, output.num_periods): for node in output.nodes: attribute_values = node.get_all_attributes_at_time(output, time_index) for value, definition in zip(attribute_values, node.attributes): print("At node " + node.name + ", attribute " + definition.name + " has value " + str(value) + " at time step " + time_index) """ returned_length = c_int() error_new = c_int() array_pointer = _lib.ENR_newOutValueArray(output.ptrapi, _lib.ENR_getResult, self._elementType, byref(returned_length), byref(error_new)) if error_new.value != 0: print("Error " + str(error_new.value) + " calling ENR_newOutValueArray for " + self.TypeLabel) output._raise_error(error_new.value) error_get = self._get_result(output.ptrapi, time_index, self.index, array_pointer) if error_get != 0: print("Error reading all attributes for " + self.name + " at " + str(time_index)) output._raise_error(error_get) BldArray = [array_pointer[i] for i in range(returned_length.value)] _lib.ENR_free(array_pointer) return BldArray