Index: wflow-py/UnitTests/bmirunner.ini =================================================================== diff -u -r6506c343c0e081144b316c548882a31cec975d93 -rfef6928683af218c4b3e7a26df6599dfe2add99d --- wflow-py/UnitTests/bmirunner.ini (.../bmirunner.ini) (revision 6506c343c0e081144b316c548882a31cec975d93) +++ wflow-py/UnitTests/bmirunner.ini (.../bmirunner.ini) (revision fef6928683af218c4b3e7a26df6599dfe2add99d) @@ -4,5 +4,5 @@ [exchanges] # From_model/var -> To_model/var -wflow_sbm/InwaterMM=wflow_routing/IW -wflow_routing/SurfaceRunoff=wflow_sbm/HadieJaap \ No newline at end of file +wflow_sbm.InwaterMM=wflow_routing.IW +wflow_routing.SurfaceRunoff=wflow_sbm.HadieJaap \ No newline at end of file Index: wflow-py/setup.py =================================================================== diff -u -r9d6d3f02533e3452466d6115f29c905c9eb646f2 -rfef6928683af218c4b3e7a26df6599dfe2add99d --- wflow-py/setup.py (.../setup.py) (revision 9d6d3f02533e3452466d6115f29c905c9eb646f2) +++ wflow-py/setup.py (.../setup.py) (revision fef6928683af218c4b3e7a26df6599dfe2add99d) @@ -54,6 +54,6 @@ 'wflow/wflow_fit.py','wflow/wflow_adapt.py','wflow/wflow_delwaq.py', 'Scripts/wflow_prepare_step1.py','Scripts/wflow_prepare_step2.py', 'wflow/wflow_sbm.py','wflow/wflow_hbv.py','wflow/wflow_W3RA.py', - 'wflow/wflow_upscale.py','wflow/wflow_routing.py'], + 'wflow/wflow_upscale.py','wflow/wflow_routing.py','Scripts/bmi2runner.py'], description='the wflow hydrological models (part of OpenStreams)', ) \ No newline at end of file Index: wflow-py/wflow/wflow_bmi.py =================================================================== diff -u -r3844888de0b2f066d4831fd900634056413c9acd -rfef6928683af218c4b3e7a26df6599dfe2add99d --- wflow-py/wflow/wflow_bmi.py (.../wflow_bmi.py) (revision 3844888de0b2f066d4831fd900634056413c9acd) +++ wflow-py/wflow/wflow_bmi.py (.../wflow_bmi.py) (revision fef6928683af218c4b3e7a26df6599dfe2add99d) @@ -361,7 +361,7 @@ implement translation of long_var_names """ - def __init__(self): + def __init__(self,log=None): """ Initialises the object @@ -392,6 +392,7 @@ self.bmilogger = setlogger('wflow_bmi.log','wflow_bmi_logging',thelevel=self.loggingmode) self.bmilogger.info("__init__: wflow_bmi object initialised.") + def initialize_config(self, filename, loglevel=logging.DEBUG): """ *Extended functionality*, see https://github.com/eWaterCycle/bmi/blob/master/src/main/python/bmi.py Index: wflow-py/wflow/wflow_bmi_combined.py =================================================================== diff -u -r6506c343c0e081144b316c548882a31cec975d93 -rfef6928683af218c4b3e7a26df6599dfe2add99d --- wflow-py/wflow/wflow_bmi_combined.py (.../wflow_bmi_combined.py) (revision 6506c343c0e081144b316c548882a31cec975d93) +++ wflow-py/wflow/wflow_bmi_combined.py (.../wflow_bmi_combined.py) (revision fef6928683af218c4b3e7a26df6599dfe2add99d) @@ -59,14 +59,15 @@ self.bmimodels = {} self.currenttimestep = 0 self.exchanges = [] + self.comp_sep = "." def __getmodulenamefromvar__(self,long_var_name): """ :param long_var_name: :return: name of the module """ - return long_var_name.split('/')[0] + return long_var_name.split(self.comp_sep)[0] def initialize_config(self, filename): """ @@ -81,8 +82,9 @@ self.currenttimestep = 1 - self.config = iniFileSetUp(filename) - self.datadir = os.path.dirname(filename) + fullpathname = os.path.abspath(filename) + self.config = iniFileSetUp(fullpathname) + self.datadir = os.path.dirname(fullpathname) inifile = os.path.basename(filename) self.models = configsection(self.config,'models') @@ -93,7 +95,7 @@ # Initialize all bmi model objects for key, value in self.bmimodels.iteritems(): - modconf = self.config.get('models',key) + modconf = os.path.join(self.datadir,self.config.get('models',key)) self.bmimodels[key].initialize_config(modconf) @@ -139,7 +141,7 @@ :return: """ for key, value in self.bmimodels.iteritems(): - self.bmimodels[key].set_send_time(end_time) + self.bmimodels[key].set_end_time(end_time) @@ -152,7 +154,7 @@ names = [] for key, value in self.bmimodels.iteritems(): names.append(self.bmimodels[key].get_attribute_names()) - names[-1] = [self.bmimodels[key].get_component_name() + "/" + s for s in names[-1]] + names[-1] = [self.bmimodels[key].get_component_name() + self.comp_sep + s for s in names[-1]] ret = [item for sublist in names for item in sublist] return ret @@ -162,7 +164,7 @@ :param attribute_name: :return: attribute value """ - cname = attribute_name.split('/') + cname = attribute_name.split(self.comp_sep) return self.bmimodels[cname[0]].get_attribute_value(cname[1]) @@ -172,7 +174,7 @@ :param attribute_value: string value of the option :return: """ - cname = attribute_name.split('/') + cname = attribute_name.split(self.comp_sep) self.bmimodels[cname[0]].set_attribute_value(cname[1],attribute_value) @@ -302,7 +304,7 @@ names = [] for key, value in self.bmimodels.iteritems(): names.append(self.bmimodels[key].get_input_var_names()) - names[-1] = [self.bmimodels[key].get_component_name() + "/" + s for s in names[-1]] + names[-1] = [self.bmimodels[key].get_component_name() + self.comp_sep + s for s in names[-1]] ret = [item for sublist in names for item in sublist] return ret @@ -316,7 +318,7 @@ names = [] for key, value in self.bmimodels.iteritems(): names.append(self.bmimodels[key].get_output_var_names()) - names[-1] = [self.bmimodels[key].get_component_name() + "/" + s for s in names[-1]] + names[-1] = [self.bmimodels[key].get_component_name() + self.comp_sep + s for s in names[-1]] ret = [item for sublist in names for item in sublist] @@ -330,7 +332,7 @@ """ # first part should be the component name - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) for key, value in self.bmimodels.iteritems(): nn = self.bmimodels[key].get_component_name() if nn == cname[0]: @@ -346,7 +348,7 @@ :return: array rank or 0 for scalar (number of dimensions): """ # first part should be the component name - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) for key, value in self.bmimodels.iteritems(): nn = self.bmimodels[key].get_component_name() if nn == cname[0]: @@ -363,7 +365,7 @@ :return: total number of values contained in the given variable (number of elements in map) """ # first part should be the component name - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) for key, value in self.bmimodels.iteritems(): nn = self.bmimodels[key].get_component_name() if nn == cname[0]: @@ -379,7 +381,7 @@ :return: total number of bytes contained in the given variable (number of elements * bytes per element) """ # first part should be the component name - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) for key, value in self.bmimodels.iteritems(): nn = self.bmimodels[key].get_component_name() if nn == cname[0]: @@ -459,7 +461,7 @@ :return: a np array of long_var_name """ # first part should be the component name - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_value(cname[1]) else: @@ -475,7 +477,7 @@ :return: numpy array of values in the data type returned by the function get_var_type. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_value_at_indices(cname[1],inds) @@ -493,7 +495,7 @@ e.g. [[0, 0], [0, 1], [15, 19], [15, 20], [15, 21]] indicates 5 elements in a 2D grid.: :var src: Numpy array of values. one value to set for each of the indicated elements: """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): self.bmimodels[cname[0]].set_value_at_indices(cname[1], inds,src) @@ -506,7 +508,7 @@ :return: BmiGridType type of the grid geometry of the given variable. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_grid_type(cname[1]) @@ -521,7 +523,7 @@ :return: List of integers: the sizes of the dimensions of the given variable, e.g. [500, 400] for a 2D grid with 500x400 grid cells. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_grid_shape(cname[1]) @@ -537,7 +539,7 @@ :return: The size of a grid cell for each of the dimensions of the given variable, e.g. [width, height]: for a 2D grid cell. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_grid_spacing(cname[1]) @@ -553,7 +555,7 @@ :return: X, Y: ,the lower left corner of the grid. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_grid_origin(cname[1]) @@ -570,7 +572,7 @@ :return: Numpy array of doubles: x coordinate of grid cell center for each grid cell, in the same order as the values returned by function get_value. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_grid_x(cname[1]) @@ -588,7 +590,7 @@ values returned by function get_value. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_grid_y(cname[1]) @@ -603,7 +605,7 @@ :return: Numpy array of doubles: z coordinate of grid cell center for each grid cell, in the same order as the values returned by function get_value. """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_grid_z(cname[1]) @@ -621,7 +623,7 @@ using the UDUNITS standard from Unidata. (only if set properly in the ini file) """ - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): return self.bmimodels[cname[0]].get_var_units(cname[1]) @@ -637,7 +639,7 @@ is present a uniform map will be set in the wflow model. """ # first part should be the component name - cname = long_var_name.split('/') + cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): self.bmimodels[cname[0]].set_value(cname[1],src) Index: wflow-py/wflow/wflow_routing.py =================================================================== diff -u -rcd5aba82922626ce43876518171777f023072194 -rfef6928683af218c4b3e7a26df6599dfe2add99d --- wflow-py/wflow/wflow_routing.py (.../wflow_routing.py) (revision cd5aba82922626ce43876518171777f023072194) +++ wflow-py/wflow/wflow_routing.py (.../wflow_routing.py) (revision fef6928683af218c4b3e7a26df6599dfe2add99d) @@ -346,19 +346,19 @@ # read landuse and soilmap and make sure there are no missing points related to the # subcatchment map. Currently sets the lu and soil type type to 1 - self.LandUse = self.wf_readmap(os.path.join(self.Dir,wflow_landuse),0.0,fail=True) - self.LandUse = cover(self.LandUse, nominal(ordinal(subcatch) > 0)) - self.Soil = self.wf_readmap(os.path.join(self.Dir,wflow_soil),0.0,fail=True) - self.Soil = cover(self.Soil, nominal(ordinal(subcatch) > 0)) + self.LandUse = ordinal(self.wf_readmap(os.path.join(self.Dir,wflow_landuse),0.0,fail=True)) + self.LandUse = cover(self.LandUse, ordinal(subcatch > 0)) + self.Soil = ordinal(self.wf_readmap(os.path.join(self.Dir,wflow_soil),0.0,fail=True)) + self.Soil = cover(self.Soil, ordinal(subcatch > 0)) - self.OutputLoc = self.wf_readmap(os.path.join(self.Dir,wflow_gauges),0.0,fail=True) # location of output gauge(s) - self.InflowLoc = self.wf_readmap(os.path.join(self.Dir,wflow_inflow), 0.0) # location abstractions/inflows. + self.OutputLoc = ordinal(self.wf_readmap(os.path.join(self.Dir,wflow_gauges),0.0,fail=True)) # location of output gauge(s) + self.InflowLoc = ordinal(self.wf_readmap(os.path.join(self.Dir,wflow_inflow), 0.0)) # location abstractions/inflows. self.RiverWidth = self.wf_readmap(os.path.join(self.Dir,wflow_riverwidth), 0.0) self.bankFull = self.wf_readmap(os.path.join(self.Dir,wflow_bankfulldepth), 999999.0) self.floodPlainWidth = self.wf_readmap(os.path.join(self.Dir,wflow_floodplainwidth), 8000.0) self.floodPlainDist = self.wf_readmap(os.path.join(self.Dir,wflow_floodplaindist), 0.5) - self.OutputId = self.wf_readmap(os.path.join(self.Dir,wflow_subcatch),0.0,fail=True) # location of subcatchment + self.OutputId = ordinal(self.wf_readmap(os.path.join(self.Dir,wflow_subcatch),0.0,fail=True)) # location of subcatchment self.ZeroMap = 0.0 * scalar(subcatch) #map with only zero's