Source code for cwatm.hydrological_modules.inflow

# -------------------------------------------------------------------------
# Name:        INFLOW HYDROGRAPHS module (OPTIONAL)
# Purpose:
#
# Author:      PB
#
# Created:     13/07/2016
# Copyright:   (c) PB 2016
# -------------------------------------------------------------------------


import math
from cwatm.management_modules.data_handling import *

[docs]class inflow(object): """ READ INFLOW HYDROGRAPHS (OPTIONAL) If option "inflow" is set to 1 the inflow hydrograph code is used otherwise dummy code is used **Global variables** ===================================== ====================================================================== ===== Variable [self.var] Description Unit ===================================== ====================================================================== ===== sampleInflow location of inflow point lat/l noinflowpoints number of inflow points -- inflowTs inflow time series data m3/s totalQInM3 total inflow over time (for mass balance calculation) m3 inflowM3 inflow to basin m3 DtSec number of seconds per timestep (default = 86400) s QInM3Old Inflow from previous day m3 ===================================== ====================================================================== ===== **Functions** """ def __init__(self, model): self.var = model.var self.model = model
[docs] def initial(self): """ Initial part of the inflow module Get the inflow points calls function :meth:`hydrological_modules.getlocOutpoints` calls function :meth:`hydrological_modules.join_struct_arrays2` """ def getlocOutpoints(out): """ Get location from Inflow (same as outflow) points :param out: get out :return: sampleAdresses - number and locs of the output """ sampleAdresses = {} for i in range(maskinfo['mapC'][0]): if out[i]>0: sampleAdresses[out[i]] = i return sampleAdresses def join_struct_arrays2(arrays): """ Join arrays to a combined one :param arrays: :return: combined arry """ """ :param arrays: :return: """ newdtype = sum((a.dtype.descr for a in arrays), []) newrecarray = np.empty(len(arrays[0]), dtype=newdtype) for a in arrays: for name in a.dtype.names: newrecarray[name] = a[name] return newrecarray if checkOption('inflow'): localGauges = returnBool('InLocal') where = "InflowPoints" inflowPointsMap = cbinding(where) coord = cbinding(where).split() # could be gauges, sites, lakeSites etc. if len(coord) % 2 == 0: inflowPoints = valuecell(coord, inflowPointsMap) else: if os.path.exists(inflowPointsMap): inflowPoints = loadmap(where, local=localGauges).astype(np.int64) else: if len(coord) == 1: msg = "Error 216: Checking output-points file\n" else: msg = "Error 127: Coordinates are not pairs\n" raise CWATMFileError(inflowPointsMap, msg, sname="Gauges") inflowPoints[inflowPoints < 0] = 0 self.var.sampleInflow = getlocOutpoints(inflowPoints) # for key in sorted(mydict): self.var.noinflowpoints = len(self.var.sampleInflow) inDir = cbinding('In_Dir') inflowFile = cbinding('QInTS').split() inflowNames =[] flagFirstTss = True for name in inflowFile: names =['timestep'] try: filename = os.path.join(inDir,name) file = open(filename, "r") # read data header line = file.readline() no = int(file.readline()) - 1 line = file.readline() for i in range(no): line = file.readline().strip('\n') if line in inflowNames: msg = "Error 217:" + line + " in: " + filename + " is used already" raise CWATMError(msg) inflowNames.append(line) names.append(line) file.close() skiplines = 3 + no except: msg = "Error 218: Mistake reading inflow file\n" raise CWATMFileError(os.path.join(inDir,name), sname=name) tempTssData = np.genfromtxt(filename, skip_header=skiplines, names=names, usecols=names[1:], filling_values=0.0) if flagFirstTss: self.var.inflowTs = tempTssData.copy() flagFirstTss = False # copy temp data into the inflow data else: self.var.inflowTs = join_struct_arrays2((self.var.inflowTs, tempTssData)) # join this dataset with the ones before ###import numpy.lib.recfunctions as rfn ###d = rfn.merge_arrays((a,b), flatten=True, usemask=False) self.var.QInM3Old = globals.inZero.copy() # Initialising cumulative output variables # These are all needed to compute the cumulative mass balance error self.var.totalQInM3 = globals.inZero.copy()
[docs] def dynamic(self): """ Dynamic part of the inflow module Use the inflow points to add inflow from time series file(s) """ if checkOption('inflow'): # Get inflow hydrograph at each inflow point [m3/s] self.var.inflowM3 = globals.inZero.copy() for key in self.var.sampleInflow: loc = self.var.sampleInflow[key] index = dateVar['curr']-1 self.var.inflowM3[loc] = self.var.inflowTs[str(key)][index] * self.var.DtSec # Convert to [m3] per time step self.var.totalQInM3 += self.var.inflowM3
# Map of total inflow from inflow hydrographs [m3]