Index: wflow-py/UnitTests/TestBMI.py =================================================================== diff -u -r3844888de0b2f066d4831fd900634056413c9acd -r25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8 --- wflow-py/UnitTests/TestBMI.py (.../TestBMI.py) (revision 3844888de0b2f066d4831fd900634056413c9acd) +++ wflow-py/UnitTests/TestBMI.py (.../TestBMI.py) (revision 25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8) @@ -183,6 +183,8 @@ cnt = 0 lastcurtime = bmiobj.get_current_time() while curtime < ett: + avar = bmiobj.get_value('PET') + bmiobj.set_value('PET',avar + 10.0) cnt = cnt + 1 bmiobj.update_until(curtime + ts) print (curtime + ts)/ts Index: wflow-py/UnitTests/Testwflow_hbv.py =================================================================== diff -u -rf22ca2514228757f98671c126bd459b02612277b -r25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8 --- wflow-py/UnitTests/Testwflow_hbv.py (.../Testwflow_hbv.py) (revision f22ca2514228757f98671c126bd459b02612277b) +++ wflow-py/UnitTests/Testwflow_hbv.py (.../Testwflow_hbv.py) (revision 25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8) @@ -2,7 +2,7 @@ import unittest import wflow.wflow_hbv as wf -import os +import os, datetime """ Run wflow_hbv for 30 steps and checks if the outcome is approx that of the reference run @@ -21,19 +21,21 @@ configfile="wflow_hbv.ini" wflow_cloneMap = 'wflow_catchment.map' caseName="wflow_hbv" + starttime = starttime = datetime.datetime(1990,01,01) myModel = wf.WflowModel(wflow_cloneMap, caseName,runId,configfile) # initialise the framework - dynModelFw = wf.wf_DynamicFramework(myModel, stopTime,startTime) + dynModelFw = wf.wf_DynamicFramework(myModel, stopTime,firstTimestep=startTime,datetimestart=starttime) + print dynModelFw.DT # Load model config from files and check directory structure - dynModelFw.createRunId(NoOverWrite=False,level=wf.logging.ERROR) + dynModelFw.createRunId(NoOverWrite=False,level=wf.logging.DEBUG) # Run the initial part of the model (reads parameters and sets initial values) dynModelFw._runInitial() # Runs initial part dynModelFw._runResume() # gets the state variables sump = 0.0 - for ts in range(startTime,stopTime): + for ts in range(startTime,stopTime + 1): if ts <10: dynModelFw.wf_setValues('P', 0.0) elif ts <= 15: @@ -54,7 +56,7 @@ my_data = wf.genfromtxt(os.path.join(caseName,runId,"watbal.csv"), delimiter=',') print("Checking water budget ....") - self.assertAlmostEquals(0.00017691167514044537,my_data[:,2].sum()) + self.assertAlmostEquals(0.00018747509412264662,my_data[:,2].sum()) print("Checking precip sum ....") my_data = wf.genfromtxt(os.path.join(caseName,runId,"P.csv"), delimiter=',') Index: wflow-py/UnitTests/wflow_hbv/wflow_hbv.ini =================================================================== diff -u -r234211937722016a7637bfb2bc76306b44cc5a9b -r25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8 --- wflow-py/UnitTests/wflow_hbv/wflow_hbv.ini (.../wflow_hbv.ini) (revision 234211937722016a7637bfb2bc76306b44cc5a9b) +++ wflow-py/UnitTests/wflow_hbv/wflow_hbv.ini (.../wflow_hbv.ini) (revision 25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8) @@ -39,8 +39,8 @@ [run] # either a runinfo file or a start and end-time are required #runinfo=runinfo.xml -starttime= 1995-01-31 00:00:00 -endtime= 1995-02-28 00:00:00 +#starttime= 1995-01-31 00:00:00 +#endtime= 1995-02-28 00:00:00 # required, base timestep of the model timestepsecs = 86400 #start model with cold state Index: wflow-py/UnitTests/wflow_sceleton/outstate/TSoil.map =================================================================== diff -u -r3844888de0b2f066d4831fd900634056413c9acd -r25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8 Binary files differ Index: wflow-py/wflow/wf_DynamicFramework.py =================================================================== diff -u -rf22ca2514228757f98671c126bd459b02612277b -r25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8 --- wflow-py/wflow/wf_DynamicFramework.py (.../wf_DynamicFramework.py) (revision f22ca2514228757f98671c126bd459b02612277b) +++ wflow-py/wflow/wf_DynamicFramework.py (.../wf_DynamicFramework.py) (revision 25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8) @@ -68,10 +68,15 @@ self.currentYday = self.currentDateTime.timetuple().tm_yday self.currentHour = self.currentDateTime.hour + def __str__(self): + a = self.__dict__ + + return str(a) + def update(self, timestepsecs=None, datetimestart=None, datetimeend=None, currentTimeStep=None, currentDatetime=None,runTimeSteps=None,mode='steps'): """ - Updates the content of the object. Use only one input parameter per call. or runTimeSteps and datatimestart at the same time + Updates the content of the framework date/time object. Use only one input parameter per call. or runTimeSteps and datatimestart at the same time use the mode option to switch between steps and intervals ('steps' or 'intervals') :param timestepsecs: @@ -338,10 +343,12 @@ self._d_model = userModel self._testRequirements() - dte = datetimestart + datetime.timedelta(seconds=(lastTimeStep - firstTimestep -1) * timestepsecs) + dte = datetimestart + datetime.timedelta(seconds=(lastTimeStep - firstTimestep) * timestepsecs) self.DT = runDateTimeInfo(timestepsecs=timestepsecs, datetimestart=datetimestart, datetimeend=dte, mode='steps') + self.setviaAPI = {} + # Flag for each variable. If 1 it is set by the API before this timestep. Reset is done at the end of each timestep if firstTimestep > lastTimeStep: @@ -522,8 +529,10 @@ else: self._userModel().logger.debug(tblname + " not available for this step, using previous value.") + self.setviaAPI = {} + def wf_timeinputscalar(self, tssfile, areamap, default): """ @@ -1230,6 +1239,8 @@ arpcr = numpy2pcr(Scalar, values.copy(), -999) + self.setviaAPI[mapname] = 1 + if hasattr(self._userModel(), mapname): if "LDD" in mapname.upper(): @@ -1256,6 +1267,7 @@ """ arpcr = pcrmap + self.setviaAPI[mapname] = 1 if hasattr(self._userModel(), mapname): exec "self._userModel()." + mapname + " = arpcr" @@ -1279,6 +1291,7 @@ :returns: 1 if the map was present, 0 if a new map was created """ + self.setviaAPI[mapname] = 1 if isinstance(values, list): ar = array(values) ar.reshape(getrows(), getcols()) @@ -1309,7 +1322,7 @@ :returns: 1 if the map was present, 0 if nothing was done """ - + self.setviaAPI[mapname] = 1 if hasattr(self._userModel(), mapname): exec "ar = pcr2numpy(self._userModel()." + mapname + ",-999)" ar[row, col] = value @@ -1333,7 +1346,7 @@ :returns: 1 if the map was present, 0 if nothing was done """ - + self.setviaAPI[mapname] = 1 if hasattr(self._userModel(), mapname): pcrmap = getattr(self._userModel(), mapname) ar = pcr2numpy(scalar(pcrmap), -999) @@ -1362,7 +1375,7 @@ :returns: 1 if the map was present, 0 if nothing was done """ - + self.setviaAPI[mapname] = 1 if hasattr(self._userModel(), mapname): exec "pcrmap = self._userModel()." + mapname ar = pcr2numpy(pcrmap, -999) @@ -1390,7 +1403,7 @@ """ arpcr = cover(value) - + self.setviaAPI[mapname] = 1 if hasattr(self._userModel(), mapname): exec "self._userModel()." + mapname + " = arpcr * " + "self._userModel()." + mapname return 1 @@ -1415,7 +1428,7 @@ """ arpcr = cover(value) - + self.setviaAPI[mapname] = 1 if hasattr(self._userModel(), mapname): # exec "self._userModel()." + mapname + " = arpcr * " + "self._userModel()." + mapname exec "self._userModel()." + mapname + " = ifthenelse(self._userModel()." + areamapname + " == " + str( @@ -1440,7 +1453,7 @@ :returns: 1 if the map was present, 0 if nothing was done """ - + self.setviaAPI[mapname] = 1 if isinstance(values, list): ar = array(values) @@ -1854,10 +1867,10 @@ self._userModel()._setNrTimeSteps(laststep) while step <= self._userModel().nrTimeSteps(): - self.logger.debug("timestep: " + str(self.DT.currentTimeStep) + "/" + str(self.DT.runTimeSteps) + " (" + str(self.DT.currentDateTime) + ")") + self._incrementIndentLevel() self._atStartOfTimeStep(step) - # TODO: Check why the timestep setting doesn not work..... + # TODO: Check why the timestep setting doesn't not work..... self._userModel()._setCurrentTimeStep(step) if hasattr(self._userModel(), 'dynamic'): @@ -1879,11 +1892,13 @@ self.DT.update(currentTimeStep=self.DT.currentTimeStep + 1, mode=self.runlengthdetermination) self._userModel().currentdatetime = self.DT.currentDateTime + self.logger.debug("timestep: " + str(self.DT.currentTimeStep) + "/" + str(self.DT.runTimeSteps) + " (" + str(self.DT.currentDateTime) + ")") self._timeStepFinished() self._decrementIndentLevel() step += 1 + self.setviaAPI = {} self._userModel()._setInDynamic(False) @@ -2066,6 +2081,13 @@ :param kind: type of the climatology :return: a map """ + + # Assume the variable is via the API (replaces the + if os.path.basename(name) in self.setviaAPI: + self.setviaAPI.pop(os.path.basename(name)) + self.logger.debug(os.path.basename(name) + " set via API, not reading from file, using memory copy") + return getattr(self._userModel(),os.path.basename(name)) + directoryPrefix = "" if kind == 1: month = self.DT.currentDateTime.month @@ -2123,12 +2145,17 @@ style = self.exchnageitems.getvarStyle(varname) - # set this for initil (before the model is actually running) + # set this for initial (before the model is actually running) if os.path.splitext(name)[1] == ".map": newName = name else: newName = name + nameSuffix + # Assume the variable is via the API (replaces the + if os.path.basename(name) in self.setviaAPI: + self.setviaAPI.pop(os.path.basename(name)) + self.logger.debug(os.path.basename(name) + " set via API, not reading from file, using memory copy") + return getattr(self._userModel(),os.path.basename(name)) if hasattr(self._userModel(), "_inStochastic"): if self._userModel()._inStochastic(): @@ -2245,6 +2272,7 @@ elif style == 2: # Assuming they are set in memory by the API + # # first get basename (last bit of path) name = os.path.basename(name) if hasattr(self._userModel(), name): Index: wflow-py/wflow/wflow_hbv.py =================================================================== diff -u -r3844888de0b2f066d4831fd900634056413c9acd -r25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8 --- wflow-py/wflow/wflow_hbv.py (.../wflow_hbv.py) (revision 3844888de0b2f066d4831fd900634056413c9acd) +++ wflow-py/wflow/wflow_hbv.py (.../wflow_hbv.py) (revision 25fd5288e8a5fc0dde3d411e5666ab7ab1e532d8) @@ -928,6 +928,7 @@ myModel = WflowModel(wflow_cloneMap, caseName,runId,configfile) dynModelFw = wf_DynamicFramework(myModel, _lastTimeStep,firstTimestep=_firstTimeStep,datetimestart=starttime) dynModelFw.createRunId(NoOverWrite=NoOverWrite,logfname=LogFileName,level=loglevel,doSetupFramework=False) + print str(dynModelFw.DT) for o, a in opts: if o == '-P':