Index: examples/wflow_rhine_sbm/instate/LowerZoneStorage.map =================================================================== diff -u Binary files differ Index: examples/wflow_rhine_sbm/wflow_sbm.ini =================================================================== diff -u -r927466608e2a5432a5e83ee462c12dc624eec2bb -r78b81240834b72259fab14b4081f2b9cf0cd44ec --- examples/wflow_rhine_sbm/wflow_sbm.ini (.../wflow_sbm.ini) (revision 927466608e2a5432a5e83ee462c12dc624eec2bb) +++ examples/wflow_rhine_sbm/wflow_sbm.ini (.../wflow_sbm.ini) (revision 78b81240834b72259fab14b4081f2b9cf0cd44ec) @@ -1,5 +1,6 @@ [API] IF=0,1 +SurfaceRunoff=2,1 # Define the forcings needed for the model here @@ -24,11 +25,13 @@ [run] +# either a runinfo file or a start and end-time are required +#runinfofile=runinfo.xml +starttime= 1995-01-31 00:00:00 +endtime= 1996-01-31 00:00:00 +# required, base timestep of the model +timestepsecs = 86400 -runinfofile= -starttime= -endtime= - # Model parameters and settings [model] modeltype= sbm @@ -44,6 +47,7 @@ # Maximum upstream distance to update the flow in metres UpdMaxDist=300000.0 #SubCatchFlowOnly = 1 +origTopogLateral = 1 [misc] #mapSaveInterval=365 Index: wflow-py/wflow/wf_DynamicFramework.py =================================================================== diff -u -r927466608e2a5432a5e83ee462c12dc624eec2bb -r78b81240834b72259fab14b4081f2b9cf0cd44ec --- wflow-py/wflow/wf_DynamicFramework.py (.../wf_DynamicFramework.py) (revision 927466608e2a5432a5e83ee462c12dc624eec2bb) +++ wflow-py/wflow/wf_DynamicFramework.py (.../wf_DynamicFramework.py) (revision 78b81240834b72259fab14b4081f2b9cf0cd44ec) @@ -28,13 +28,14 @@ from wflow.wf_netcdfio import * import numpy +import datetime import ConfigParser #from wf_Timeoutput import * import pcrut import shutil, glob import sys import traceback -from wflow_adapt import getStartTimefromRuninfo +from wflow_adapt import getStartTimefromRuninfo, getEndTimefromRuninfo @@ -131,6 +132,7 @@ self.filename = filename self.data = None self.count = 0 + self.result = None self.availtypes =['sum','avg','min','max'] @@ -154,10 +156,11 @@ Perform final calculations if needed (average, etc) and assign to the result variable """ - if self.mode == 'sum' or self.mode == 'min' or self.mode == 'max': - self.result = self.data - if self.mode == 'avg': - self.result = self.data/self.count + if self.data != None: + if self.mode == 'sum' or self.mode == 'min' or self.mode == 'max': + self.result = self.data + if self.mode == 'avg': + self.result = self.data/self.count @@ -251,15 +254,17 @@ # \param firstTimestep sets the starting timestep of the model (optional, # default is 1) # - def __init__(self, userModel, lastTimeStep=0, firstTimestep=1,datetimestart=dt.datetime(1990,01,01)): + def __init__(self, userModel, lastTimeStep=0, firstTimestep=1,datetimestart=dt.datetime(1990,01,01),timestepsecs=86400): frameworkBase.FrameworkBase.__init__(self) self.exchnageitems = wf_exchnageVariables() self.setQuiet(True) self._d_model = userModel self._testRequirements() + self.timestepsecs = timestepsecs self.datetime_firststep = datetimestart self.currentdatetime = self.datetime_firststep + self.datetime_laststep = datetimestart + datetime.timedelta(seconds=(lastTimeStep - firstTimestep) * self.timestepsecs) if firstTimestep > lastTimeStep: msg = "Cannot run dynamic framework: Start timestep smaller than end timestep" @@ -276,9 +281,11 @@ self._addMethodToClass(self.wf_supplyVariableNamesAndRoles) self._addMethodToClass(self.wf_supplyVariableNamesAndRoles) - self._userModel()._setNrTimeSteps(lastTimeStep - firstTimestep + 1) - self._d_firstTimestep = firstTimestep + if firstTimestep == 0: + self._d_firstTimestep = 1 + else: + self._d_firstTimestep = firstTimestep self._userModel()._setFirstTimeStep(self._d_firstTimestep) self._d_lastTimestep = lastTimeStep self.APIDebug = 0 @@ -422,9 +429,33 @@ self.datetime_firststep = getStartTimefromRuninfo(rinfo) self.currentdatetime = self.datetime_firststep self._userModel().currentdatetime = self.currentdatetime + self.datetime_laststep = getEndTimefromRuninfo(rinfo) + self.timestepsecs = int(configget(self._userModel().config,'run','timestepsecs',"86400")) + duration = self.datetime_laststep - self.datetime_firststep + nrseconds = duration.total_seconds() + self._userModel()._setNrTimeSteps(int(nrseconds/self.timestepsecs)) + self._userModel().timestepsecs = self.timestepsecs + self._d_firstTimestep = 1 + self._userModel()._setFirstTimeStep(self._d_firstTimestep) + self._d_lastTimestep = int(nrseconds/self.timestepsecs) + else: + self.datetime_firststep=datetime.datetime.strptime(st, "%Y-%m-%d %H:%M:%S") + self.currentdatetime = self.datetime_firststep + self._userModel().currentdatetime = self.currentdatetime + ed = configget(self._userModel().config,'run','endtime',"None") + self.datetime_laststep = datetime.datetime.strptime(ed, "%Y-%m-%d %H:%M:%S") + self.timestepsecs = int(configget(self._userModel().config,'run','timestepsecs',"86400")) + self._userModel().timestepsecs = self.timestepsecs + duration = self.datetime_laststep - self.datetime_firststep + nrseconds = duration.total_seconds() + self._userModel()._setNrTimeSteps(int(nrseconds/self.timestepsecs)) + self._d_firstTimestep = 1 + self._userModel()._setFirstTimeStep(self._d_firstTimestep) + self._d_lastTimestep = int(nrseconds/self.timestepsecs) + if self.ncfile != "None": mstacks = configsection(self._userModel().config,"inputmapstacks") varlst = [] @@ -548,7 +579,7 @@ b = a.replace('self.','') try: pcrmap = getattr(self._userModel(),b) - report( pcrmap , self._userModel().Dir + "/" + self._userModel().runId + "/outsum/" + self._userModel().config.get("summary",a) ) + report( pcrmap , os.path.join(self._userModel().Dir, self._userModel().runId, "outsum", self._userModel().config.get("summary",a)) ) except: self._userModel().logger.warn("Could not find or save the configured summary map:" + a) @@ -557,13 +588,16 @@ for a in self._userModel().default_summarymaps(): b = a.replace('self.','') pcrmap = getattr(self._userModel(),b) - report( pcrmap , self._userModel().Dir + "/" + self._userModel().runId + "/outsum/" + b + ".map" ) + report( pcrmap , os.path.join(self._userModel().Dir, self._userModel().runId, "outsum", b + ".map" )) + # These are the ones in the _sum _average etc sections for a in range(0,len(self.statslst)): self.statslst[a].finalise() - data = self.statslst[a].result - fname = self.statslst[a].filename - report (data,fname) + if self.statslst[a].result != None: + data = self.statslst[a].result + fname = self.statslst[a].filename + if data != None: + report (data,fname) @@ -1259,9 +1293,19 @@ """ self._userModel()._setInDynamic(True) + + # + if firststep == 0: + step = self._d_firstTimestep + else: + step = firststep + + if laststep == 0: + laststep = self._d_lastTimestep + self._userModel()._setNrTimeSteps(laststep) - step = firststep + while step <= self._userModel().nrTimeSteps(): self._incrementIndentLevel() Index: wflow-py/wflow/wflow_bmi.py =================================================================== diff -u -r927466608e2a5432a5e83ee462c12dc624eec2bb -r78b81240834b72259fab14b4081f2b9cf0cd44ec --- wflow-py/wflow/wflow_bmi.py (.../wflow_bmi.py) (revision 927466608e2a5432a5e83ee462c12dc624eec2bb) +++ wflow-py/wflow/wflow_bmi.py (.../wflow_bmi.py) (revision 78b81240834b72259fab14b4081f2b9cf0cd44ec) @@ -1,8 +1,10 @@ __author__ = 'schelle' import os +import logging -#TODO: Put link to runinfo file in ini ( to get date time) +#TODO: Set log level also ini to be able to make quiet runs +#TODO: set re-init in the ini file to be able to make cold start runs #TODO: Rework framework to get rid of max timesteps shit class wflowbmi(object): @@ -15,7 +17,7 @@ """ retval = 0; wflow_cloneMap = 'wflow_subcatch.map' - datadir = os.path.basename(os.path.dirname(configfile)) + datadir = os.path.dirname(configfile) inifile = os.path.basename(configfile) runid = "run_default" # The current pcraster framework needs a max number of timesteps :-( @@ -27,10 +29,10 @@ elif "hbv" in configfile: import wflow_sbm as wf - myModel = wf.WflowModel(wflow_cloneMap, datadir, runid,inifile) + myModel = wf.WflowModel(wflow_cloneMap, datadir, runid, inifile) self.dynModel = wf.wf_DynamicFramework(myModel, maxNrSteps, firstTimestep = 1) - self.dynModel.createRunId(NoOverWrite=0) + self.dynModel.createRunId(NoOverWrite=0,level=logging.ERROR) self.dynModel._runInitial() self.dynModel._runResume() @@ -68,7 +70,8 @@ Return variable name """ - return self.dynModel.wf_supplyVariableNames(i) + names = self.dynModel.wf_supplyVariableNames() + return names[i] def get_var_type(self, name): Index: wflow-py/wflow/wflow_sbm.py =================================================================== diff -u -rdef023660c30cb9c63deb1f58b559716ad15d2ed -r78b81240834b72259fab14b4081f2b9cf0cd44ec --- wflow-py/wflow/wflow_sbm.py (.../wflow_sbm.py) (revision def023660c30cb9c63deb1f58b559716ad15d2ed) +++ wflow-py/wflow/wflow_sbm.py (.../wflow_sbm.py) (revision 78b81240834b72259fab14b4081f2b9cf0cd44ec) @@ -399,7 +399,7 @@ self.updateFile = configget(self.config, "model", "updateFile", "no_set") self.origTopogLateral = int(configget(self.config, "model", "origTopogLateral", "0")) - if self.origTopogLateral: + if self.origTopogLateral == 0: self.logger.info("Applying the original topog_sbm lateral transfer formulation") else: self.logger.warn("Using the original (depreciated!!) wflow lateral transfer formulation") @@ -707,6 +707,7 @@ self.CumInfiltExcess = self.ZeroMap self.CumExfiltWater = self.ZeroMap self.CumSurfaceWater = self.ZeroMap + self.watbal = self.ZeroMap self.CumEvap = self.ZeroMap self.CumPotenEvap = self.ZeroMap self.CumPotenTrans = self.ZeroMap @@ -1301,7 +1302,7 @@ runId = "run_default" configfile = "wflow_sbm.ini" _lastTimeStep = 0 - _firstTimeStep = 1 + _firstTimeStep = 0 LogFileName = "wflow.log" fewsrun = False runinfoFile = "runinfo.xml"