Index: wflow-py/Scripts/bmi2runner.py =================================================================== diff -u -r42fd01a5e3fcb6d0fa9f8f9880c74cd282dc0d0f -rdbb856e2a6f375e5c7f2db502d7ca90b9fbcf421 --- wflow-py/Scripts/bmi2runner.py (.../bmi2runner.py) (revision 42fd01a5e3fcb6d0fa9f8f9880c74cd282dc0d0f) +++ wflow-py/Scripts/bmi2runner.py (.../bmi2runner.py) (revision dbb856e2a6f375e5c7f2db502d7ca90b9fbcf421) @@ -71,7 +71,6 @@ end = bmiobj.get_end_time() ts = bmiobj.get_time_step() curtime = bmiobj.get_current_time() - # Loop over the time duration while curtime < end: bmiobj.update_until(curtime + ts) Index: wflow-py/wflow/wf_DynamicFramework.py =================================================================== diff -u -r8e62145254bea78f01d01e69573753ba631ecef5 -rdbb856e2a6f375e5c7f2db502d7ca90b9fbcf421 --- wflow-py/wflow/wf_DynamicFramework.py (.../wf_DynamicFramework.py) (revision 8e62145254bea78f01d01e69573753ba631ecef5) +++ wflow-py/wflow/wf_DynamicFramework.py (.../wf_DynamicFramework.py) (revision dbb856e2a6f375e5c7f2db502d7ca90b9fbcf421) @@ -547,13 +547,6 @@ """ Makes sure the logging closed """ - try: - pcrut.logging.shutdown() - for ofile_list in self.oscv: - self.oscv[ofile_list].closeall() - except: - return - if hasattr(self, 'NcOutput'): self.NcOutput.finish() @@ -1241,7 +1234,7 @@ :returns: 1 if the map was present, 0 if a new map was created """ - arpcr = numpy2pcr(Scalar, values.copy(), -999) + arpcr = numpy2pcr(Scalar, flipud(values).copy(), -999) self.setviaAPI[mapname] = 1 @@ -1520,7 +1513,7 @@ def wf_supplyMapAsNumpy(self, mapname): """ Returns a numpy array (matrix) for the specified map and the current - timestep. If the maps is not dynamic the current staus of the map is + timestep. If the maps is not dynamic the current status of the map is returns which may be undefined for maps that are filled with data at the end of a run Missing value is -999 @@ -1535,7 +1528,8 @@ # exec "retval = pcr2numpy(self._userModel()." + mapname + ",-999)" pcrmap = getattr(self._userModel(), mapname) if isinstance(pcrmap, pcraster._pcraster.Field): - retval = pcr_as_numpy(pcrmap) + tt = pcr2numpy(pcrmap,-999.0) + retval = flipud(tt).copy() else: retval = pcrmap if self.APIDebug: @@ -1555,9 +1549,9 @@ """ x = xcoordinate((spatial(boolean(1.0)))) - retval = pcr_as_numpy(x) + retval = pcr_as_numpy(x).copy() - return retval + return flipud(retval).copy() def wf_supplyMapYAsNumpy(self): """ @@ -1568,9 +1562,9 @@ """ y = ycoordinate((spatial(boolean(1.0)))) - retval = pcr_as_numpy(y) + retval = pcr_as_numpy(y).copy() - return retval + return flipud(retval).copy() def wf_supplyMapZAsNumpy(self): """ @@ -1584,7 +1578,7 @@ if hasattr(self._userModel(), 'Altitude'): retval = getattr(self._userModel(), 'Altitude') - return pcr2numpy(retval, -999) + return flipud(pcr2numpy(retval, -999)).copy() else: self.logger.warn("Altitude is not defined in the usermodel, returning empty list") return [] Index: wflow-py/wflow/wflow_bmi.py =================================================================== diff -u -r42fd01a5e3fcb6d0fa9f8f9880c74cd282dc0d0f -rdbb856e2a6f375e5c7f2db502d7ca90b9fbcf421 --- wflow-py/wflow/wflow_bmi.py (.../wflow_bmi.py) (revision 42fd01a5e3fcb6d0fa9f8f9880c74cd282dc0d0f) +++ wflow-py/wflow/wflow_bmi.py (.../wflow_bmi.py) (revision dbb856e2a6f375e5c7f2db502d7ca90b9fbcf421) @@ -9,6 +9,7 @@ import wflow_lib import numpy as np from wflow.pcrut import setlogger +from pcraster import * class wflowbmi_light(object): """ @@ -272,11 +273,11 @@ if self.wrtodisk: fname = str(self.currenttimestep) + "_get_" + long_var_name + ".map" - arpcr = self.dynModel.numpy2pcr(self.dynModel.Scalar, src, -999) + arpcr = numpy2pcr(Scalar, src, -999) self.bmilogger.debug("Writing to disk: " + fname) - self.dynModel.report(arpcr,fname) + report(arpcr,fname) - return np.flipud(src) + return src def set_var(self, long_var_name, src): """ @@ -289,9 +290,9 @@ if self.wrtodisk: fname = str(self.currenttimestep) + "_set_" + long_var_name + ".map" - arpcr = self.dynModel.numpy2pcr(self.dynModel.Scalar, np.flipud(src), -999) + arpcr = numpy2pcr(Scalar, src, -999) self.bmilogger.debug("Writing to disk: " + fname) - self.dynModel.report(arpcr,fname) + report(arpcr,fname) if long_var_name in self.outputonlyvars: self.bmilogger.error("set_var: " + long_var_name + " is listed as an output only variable, cannot set. " + str(self.outputonlyvars)) @@ -302,7 +303,7 @@ self.dynModel.wf_setValues(long_var_name,float(src)) else: self.bmilogger.debug("set_var: (grid) " + long_var_name) - self.dynModel.wf_setValuesAsNumpy(long_var_name, np.flipud(src)) + self.dynModel.wf_setValuesAsNumpy(long_var_name, src) def set_var_slice(self, name, start, count, var): @@ -314,7 +315,7 @@ For some implementations it can be equivalent and more efficient to do: `get_var(name)[start[0]:start[0]+count[0], ..., start[n]:start[n]+count[n]] = var` """ - tmp = np.flipud(self.get_var(name).copy()) + tmp = self.get_var(name).copy() try: # if we have start and count as a number we can do this tmp[start:(start+count)] = var @@ -323,7 +324,7 @@ slices = [np.s_[i:(i+n)] for i,n in zip(start, count)] tmp[slices] - self.set_var(name, name, np.flipud(tmp)) + self.set_var(name, name, tmp) def set_var_index(self, name, index, var): """ @@ -335,9 +336,9 @@ and more efficient to do: `get_var(name).flat[index] = var` """ - tmp = np.flipud(self.get_var(name).copy()) + tmp = self.get_var(name).copy() tmp.flat[index] = var - self.set_var(name, name, np.flipud(tmp)) + self.set_var(name, name, tmp) def inq_compound(self, name): """ @@ -394,7 +395,7 @@ logstr = os.getenv('wflow_bmi_loglevel', 'ERROR') self.wrtodisk = False - if os.getenv("wflow_bmi_writedisk",'False') in 'True': + if os.getenv("wflow_bmi_writetodisk",'False') in 'True': self.wrtodisk = True if logstr in 'ERROR': @@ -408,6 +409,8 @@ self.bmilogger = setlogger('wflow_bmi.log','wflow_bmi_logging',thelevel=self.loggingmode) self.bmilogger.info("__init__: wflow_bmi object initialised.") + if self.wrtodisk: + self.bmilogger.warn('Will write all bmi set and get grids to disk!...') def initialize_config(self, filename, loglevel=logging.DEBUG): @@ -836,17 +839,14 @@ if long_var_name in self.inputoutputvars: ret = self.dynModel.wf_supplyMapAsNumpy(long_var_name) self.bmilogger.debug("get_value: " + long_var_name) + if self.wrtodisk: fname = str(self.currenttimestep) + "_get_" + long_var_name + ".map" - arpcr = self.dynModel.numpy2pcr(self.dynModel.Scalar, ret, -999) + arpcr = numpy2pcr(Scalar, ret, -999) self.bmilogger.debug("Writing to disk: " + fname) - self.dynModel.report(arpcr,fname) + report(arpcr,fname) - try: - fret = np.flipud(ret) - return fret - except: - return ret + return ret else: self.bmilogger.error("get_value: " + long_var_name + ' not in list of output values ' + str(self.inputoutputvars)) return None @@ -863,7 +863,7 @@ if long_var_name in self.inputoutputvars: self.bmilogger.debug("get_value_at_indices: " + long_var_name + ' at ' + str(inds)) - npmap = np.flipud(self.dynModel.wf_supplyMapAsNumpy(long_var_name)) + npmap = self.dynModel.wf_supplyMapAsNumpy(long_var_name) return npmap[inds] else: self.bmilogger.error("get_value_at_indices: " + long_var_name + ' not in list of output values ' + str(self.inputoutputvars)) @@ -886,9 +886,9 @@ raise ValueError("set_value_at_indices: " + long_var_name + " is listed as an output only variable, cannot set. " + str(self.outputonlyvars)) else: self.bmilogger.debug("set_value_at_indices: " + long_var_name + ' at ' + str(inds)) - npmap = np.flipud(self.dynModel.wf_supplyMapAsNumpy(long_var_name)) + npmap = self.dynModel.wf_supplyMapAsNumpy(long_var_name) npmap[inds] = src - self.dynModel.wf_setValuesAsNumpy(long_var_name,np.flipud(npmap)) + self.dynModel.wf_setValuesAsNumpy(long_var_name,npmap) def get_grid_type(self, long_var_name): """ @@ -970,7 +970,7 @@ """ self.bmilogger.debug("get_grid_y: " + long_var_name) - return np.flipud(self.dynModel.wf_supplyMapYAsNumpy()) + return self.dynModel.wf_supplyMapYAsNumpy() def get_grid_z(self, long_var_name): """ @@ -981,7 +981,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. """ self.bmilogger.debug("get_grid_z: " + long_var_name) - return np.flipud(self.dynModel.wf_supplyMapZAsNumpy()) + return self.dynModel.wf_supplyMapZAsNumpy() def get_var_units(self, long_var_name): """ @@ -1016,9 +1016,9 @@ self.bmilogger.debug("set_value: " + long_var_name + ":" + str(src)) if self.wrtodisk: fname = str(self.currenttimestep) + "_set_" + long_var_name + ".map" - arpcr = self.dynModel.numpy2pcr(self.dynModel.Scalar, src, -999) + arpcr = numpy2pcr(Scalar, src, -999) self.bmilogger.debug("Writing to disk: " + fname) - self.dynModel.report(arpcr,fname) + report(arpcr,fname) if long_var_name in self.outputonlyvars: self.bmilogger.error("set_value: " + long_var_name + " is listed as an output only variable, cannot set. " + str(self.outputonlyvars)) @@ -1029,7 +1029,7 @@ self.dynModel.wf_setValues(long_var_name,float(src)) else: self.bmilogger.debug("set_value: (grid) " + long_var_name) - self.dynModel.wf_setValuesAsNumpy(long_var_name, np.flipud(src)) + self.dynModel.wf_setValuesAsNumpy(long_var_name, src) def get_grid_connectivity(self, long_var_name): """ Index: wflow-py/wflow/wflow_bmi_combined.py =================================================================== diff -u -r8e62145254bea78f01d01e69573753ba631ecef5 -rdbb856e2a6f375e5c7f2db502d7ca90b9fbcf421 --- wflow-py/wflow/wflow_bmi_combined.py (.../wflow_bmi_combined.py) (revision 8e62145254bea78f01d01e69573753ba631ecef5) +++ wflow-py/wflow/wflow_bmi_combined.py (.../wflow_bmi_combined.py) (revision dbb856e2a6f375e5c7f2db502d7ca90b9fbcf421) @@ -6,8 +6,9 @@ from wflow.pcrut import setlogger from wflow.wflow_lib import configget import ConfigParser +import logging +from pcraster import * - def iniFileSetUp(configfile): """ Reads .ini file and returns a config object. @@ -60,7 +61,28 @@ self.currenttimestep = 0 self.exchanges = [] self.comp_sep = "@" + self.wrtodisk = False + if os.getenv("wflow_bmi_writetodisk",'False') in 'True': + self.wrtodisk = True + self.loggingmode = logging.ERROR + logstr = os.getenv('wflow_bmi_loglevel', 'ERROR') + if logstr in 'ERROR': + self.loggingmode = logging.ERROR + if logstr in 'WARNING': + self.loggingmode = logging.WARNING + if logstr in 'INFO': + self.loggingmode = logging.INFO + if logstr in 'DEBUG': + self.loggingmode = logging.DEBUG + + self.bmilogger = setlogger('wflow_bmi_combined.log','wflow_bmi_combined_logging',thelevel=self.loggingmode) + self.bmilogger.info("__init__: wflow_bmi_combined object initialised.") + if self.wrtodisk: + self.bmilogger.warn('Will write all bmi set and get grids to disk!...') + + + def __getmodulenamefromvar__(self,long_var_name): """ @@ -209,7 +231,7 @@ for item in self.exchanges: supplymodel = self.__getmodulenamefromvar__(item) if curmodel == supplymodel: - outofmodel = self.get_value(item).copy() + outofmodel = self.get_value(item) tomodel = self.config.get('exchanges',item) self.set_value(tomodel,outofmodel) @@ -285,6 +307,8 @@ for key, value in self.bmimodels.iteritems(): self.bmimodels[key].finalize() + self.bmilogger.info("finalize.") + def get_component_name(self): """ :return: identifier of the models separated by a comma (,) @@ -436,7 +460,7 @@ for key, value in self.bmimodels.iteritems(): st.append(self.bmimodels[key].get_time_step()) - return max(st) + return max(st)[0] def get_time_units(self): """ @@ -461,10 +485,15 @@ :return: a np array of long_var_name """ # first part should be the component name + self.bmilogger.debug('get_value: ' + long_var_name) cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): - return self.bmimodels[cname[0]].get_value(cname[1]) + tmp = self.bmimodels[cname[0]].get_value(cname[1]) + if self.wrtodisk: + report(numpy2pcr(Scalar,tmp, -999),long_var_name + "_get_" + str(self.get_current_time()) + '.map') + return tmp else: + self.bmilogger.error('get_value: ' + long_var_name + ' returning None!!!!') return None @@ -639,12 +668,16 @@ is present a uniform map will be set in the wflow model. """ # first part should be the component name + self.bmilogger.debug('set_value: ' + long_var_name) cname = long_var_name.split(self.comp_sep) if self.bmimodels.has_key(cname[0]): self.bmimodels[cname[0]].set_value(cname[1],src) + if self.wrtodisk: + report(numpy2pcr(Scalar,src, -999),long_var_name + "_set_" + str(self.get_current_time()) + '.map') + def get_grid_connectivity(self, long_var_name): """ Not applicable, raises NotImplementedError