Index: doc/wflow_topoflex.rst =================================================================== diff -u --- doc/wflow_topoflex.rst (revision 0) +++ doc/wflow_topoflex.rst (revision 687a7cb59a549f3d4f41cd8b76eac92b1f8486d1) @@ -0,0 +1,110 @@ +The wflow_topoflex Model +=================== + + +Introduction +------------ + +Topoflex applies the concept of using different model configurations for different hydrological response units (HRUs). These HRUs can for a large part be derived from topography ([savenije]); however, additional data such as land use and geology can further optimize the selection of hydrological response units. In contrast to other models, topoflex generally uses a minimum amount of HRUs, which are defined manually, i.e. 2-5 depending on the size of and the variablity within the catchment. Nevertheless, the model code is written such that it can handle an infinte number of classes. The individual HRUs are treated as parallel model structures and only connected via the groundwater reservoir and the stream network. + +The model code is written in a modular setup: different conceptualisations can be selected for each reservoir for each HRU. The code currently contains some reservoir conceptualisations (see below), but new conceptualisations can easily be added. + +Examples of the application of topoflex can be found in [gharari], [gao] and [euser]. + +Figure 1 shows a possible model conceptualistion: one that used two HRUs (wetland (W) and hillslope (H)) + +.. figure:: _images/topoflex.jpg + :width: 600px + + Schematic view of the relevant components of the topoflex model + +Limitations +~~~~~~~~~~~ +- Using a set of HRUs introduces additional complexity (structural and computational) in the model. Therefore, calibration of the model should be carried out carefully (see below for some tips and tricks that might help). +- The selection and deliniation of the HRUs is a relatively subjective exercise: different data sources and preferably some expert knowledge migth help to construct meaningful HRUs. + + +Spatial resolution +------------------ +The model uses a grid based on the available input or required output data. The combination with the HRUs has to be done in the preparation step: for each cell the percentage of each class needs to be determined and stored in a staticmap. + +The cell sizes do not have to have the same size: the size of individual cells can be stored in a staticmap, which is used to calculate the contribution of each cell to the generated discharge. + + +Input data +---------- +The required input data consists of timeseries of precipitation, temperature potential evaporation. In case the Jarvis equations are used to determine transpiration more input variable are required, such as humidity, radiation, wind speed and LAI. + + +Different HRUs +-------------- +Currently there are conceptualisations for three main HRUs: wetland, hillslope and (agricultural) plateau. These conceptualisations are simply a set of reservoirs, which match the perception of different landscape elements (in western Europe). Dependent on the area or interest the HRUs can be adapted, was well as the set of reservoirs per HRU. + +wetland +~~~~~~~ +Wetlands are areas close to the stream, where the groundwater levels are assumed to be shallow and assumed to rise quickly during an event. The dominant runoff process in wetlands is assumed to be saturation overland flow, leading to quick and sharp responses to rainfall. + +hillslope +~~~~~~~~~ +Hillslopes are steep areas in an catchment, generally covered with forest. The dominant runoff process is assumed to be quick subsurface flow: the hillslopes mainly contribute to the discharge during the winter period. + +(agricultural) plateau +~~~~~~~~~~~~~~~~~~~~~~ +Plateus are flat areas high above the stream, thus with deep ground water levels. Depending on the specific conditions, the dominant runoff processes are ground water recharge, quick subsurface flow and hortonian overland flow. The latter is especially important in agricultural areas. + +Other modelling options +----------------------- +.. Jarvis equations +.. snow and frozen ground +.. deep infiltration losses + +Routing of generated discharge +------------------------------ +The routing of generated discharge is based on the average velocity of water through the river, which is currently set to 1 m/s. For each cell the average distance to the outlet is calculated and multiplied with the selected flow velocity to determine the delay at the outlet. + +There are currently two options to apply this routing: +1. only calculating the delay relevant for the discharge at the outlet +2. calculating the delay (and thus discharge) over the stream network. This option is mainly relevant for calculations with a finer grid + + +Calibrating the wflow_topoflex model +------------------------------------- +Including more HRUs in the model leads to an increase in parameters. To make it still feasible to calibrate the model, a set of constraints is introduced: parameter and process constraints. These constraints are assumed relations between parameters and fluxes of different HRUs and prevent the selection of unreaslistic parameters. The constraints are an important part of the perceptual model, but are not (yet) included in de wflow code. Below some examples of constraints are given, more examples of constraints can be found in [gharari], [gao] and [euser]. + +Parameter constraints +~~~~~~~~~~~~~~~~~~~~~ +Parameter constraints are relations between parameters of different HRUs, for example the root zone storage capacity (S_{u,max}), which is assumed to be larger on hillslopes than in wetlands. As in the latter groundwater levels quicky rise during a rain event, reducing the root zone storage capacity. Parameter constraints are calculated before the model runs. + + +Process constraints +~~~~~~~~~~~~~~~~~~~ +Process constraints are comparable with parameter constraints, but focus on fluxes from different HRUs, for example the fast response from the wetlands is assumed to be larger than the fast response of the hillslopes in the summer period. As on the hillslopes generally more storage is required before a runoff generation threshold is exceeded. Process constraints are calculated after the model runs. + + +References +---------- +.. [euser] Euser, T., Hrachowitz, M., Winsemius, H. C. and Savenije, H. H. G.: The effect of forcing and landscape distribution on performance and consistency of model structures. Hydrol. Process., doi: 10.1002/hyp.10445, 2015. +.. [gao] Gao, H., Hrachowitz, M., Fenicia, F., Gharari, S., and Savenije, H. H. G.: Testing the realism of a topography-driven model (FLEX-Topo) in the nested catchments of the Upper Heihe, China, Hydrol. Earth Syst. Sci., 18, 1895-1915, doi:10.5194/hess-18-1895-2014, 2014. +.. [gharari] Gharari, S., Hrachowitz, M., Fenicia, F., Gao, H., and Savenije, H. H. G.: Using expert knowledge to increase realism in environmental system models can dramatically reduce the need for calibration, Hydrol. Earth Syst. Sci., 18, 4839-4859, doi:10.5194/hess-18-4839-2014, 2014. +.. [savenije] Savenije, H. H. G.: HESS Opinions "Topography driven conceptual modelling (FLEX-Topo)", Hydrol. Earth Syst. Sci., 14, 2681-2692, doi:10.5194/hess-14-2681-2010, 2010. + +example ini file +---------------- +The .ini file below shows the available options + +.. literalinclude:: _download/wflow_topoflex_example.ini + +An example ini file be found :download:`here. <_download/wflow_topoflex_example.ini>` + + +wflow_topoflex module documentation +------------------------------ + +.. automodule:: wflow_topoflex + :members: + :undoc-members: + :show-inheritance: + + .. autoattribute:: usage + + Index: examples/batches/run_topoflex.bat =================================================================== diff -u -r666a418a8a7170634fc9c9b10a47340ca926f889 -r687a7cb59a549f3d4f41cd8b76eac92b1f8486d1 --- examples/batches/run_topoflex.bat (.../run_topoflex.bat) (revision 666a418a8a7170634fc9c9b10a47340ca926f889) +++ examples/batches/run_topoflex.bat (.../run_topoflex.bat) (revision 687a7cb59a549f3d4f41cd8b76eac92b1f8486d1) @@ -1,3 +1,3 @@ cd -python ../../wflow-py/Sandbox/wflow_topoflex/wflow_topoflex.py -C ../wflow_orientale_topoflex -R test_run_reservoirs_names -c wflow_orientale_topoflexHCW.ini -I -T 20 +python ../../wflow-py/Sandbox/wflow_topoflex/wflow_topoflex.py -C ../wflow_orientale_topoflex -R test_run_reservoirs_names -c wflow_orientale_topoflex_zero_res.ini -I -T 20 pause \ No newline at end of file Fisheye: Tag 687a7cb59a549f3d4f41cd8b76eac92b1f8486d1 refers to a dead (removed) revision in file `examples/wflow_orientale_topoflex/wflow_orientale_topoflexHCW.ini'. Fisheye: No comparison available. Pass `N' to diff? Index: examples/wflow_orientale_topoflex/wflow_orientale_topoflex_zero_res.ini =================================================================== diff -u -r66cb2b18c62989d3cbb7e3dc259490d4944b5a7f -r687a7cb59a549f3d4f41cd8b76eac92b1f8486d1 --- examples/wflow_orientale_topoflex/wflow_orientale_topoflex_zero_res.ini (.../wflow_orientale_topoflex_zero_res.ini) (revision 66cb2b18c62989d3cbb7e3dc259490d4944b5a7f) +++ examples/wflow_orientale_topoflex/wflow_orientale_topoflex_zero_res.ini (.../wflow_orientale_topoflex_zero_res.ini) (revision 687a7cb59a549f3d4f41cd8b76eac92b1f8486d1) @@ -1,28 +1,27 @@ - [framework] outputformat = 1 # Model parameters and settings [model] -AnnualDischarge=2290 +#AnnualDischarge=2290 # Alpha for wiver-width estimation 5 for mountain stream 60 for the river rhine -Alpha=120 -ModelSnow=1 +#Alpha=120 +#ModelSnow=1 ScalarInput=1 InputSeries=1 InterpolationMethod=inv -Tslice=1 -UpdMaxDist=300000.0 -P_style = 1 +#Tslice=1 +#UpdMaxDist=300000.0 +#P_style = 1 L_IRURFR = 0 L_URFR = 0 L_FR = 0 maxTransitTime = 9 DistForcing = 3 maxGaugeId = 10 Ks = 0.0004 -spinUp_time = 5 -NSEbreak = 0 +#spinUp_time = 5 +#NSEbreak = 0 #W=wetland(0) H=hillslope(1) P=plateau(2) WD = drained wetland(3) classes = ['W','H'] @@ -149,7 +148,7 @@ self.Cap_[0]=CapW.tss self.Qf_[1] = QfH.tss self.Qf_[0] = QfW.tss -self.Qfcub = Qfcub.tss +#self.Qfcub = Qfcub.tss self.Qtlag = Qtlag.tss [outputtss_1] @@ -161,34 +160,7 @@ self.QLagTot = runLag.tss self.WBtot = WB.tss -#[outputtss] -##stages -#self.Si[0]=SiW -#self.Si[1]=SiH -#self.Sf[1]=SfH -#self.Sf[0]=SfW -#self.Su[1]=SuH -#self.Su[0]=SuW -##fluxen -#self.Precipitation=Prec -#self.Qu_[0]=QuW -#self.Qu_[1]=QuH -#self.Ei_[0]=EiW -#self.Ei_[1]=EiH -#self.Eu_[0]=EuW -#self.Eu_[1]=EuH -#self.Pe_[0]=peW -#self.Pe_[1]=peH -#self.Perc_[1]=PercH -#self.Cap_[0]=CapW -#self.Qf_[1] = QfH -#self.Qf_[0] = QfW -#self.Qfcub = Qfcub -#self.Qtlag = Qtlag -##waterbalance - - [modelparameters] # Format: # name=stack,type,default,verbose[lookupmap_1],[lookupmap_2],lookupmap_n] Index: wflow-py/Sandbox/wflow_topoflex/wflow_topoflex.py =================================================================== diff -u -r043c0a45a4b21cc6badc41d1a29302bf08406549 -r687a7cb59a549f3d4f41cd8b76eac92b1f8486d1 --- wflow-py/Sandbox/wflow_topoflex/wflow_topoflex.py (.../wflow_topoflex.py) (revision 043c0a45a4b21cc6badc41d1a29302bf08406549) +++ wflow-py/Sandbox/wflow_topoflex/wflow_topoflex.py (.../wflow_topoflex.py) (revision 687a7cb59a549f3d4f41cd8b76eac92b1f8486d1) @@ -318,8 +318,8 @@ "model", "wflow_surfaceArea", "staticmaps/wflow_surfaceArea.map") wflow_transit = configget(self.config, "model", "wflow_transit", "staticmaps/wflow_transit.map") - wflow_velocity = configget(self.config, - "model", "wflow_velocity", "staticmaps/wflow_velocity.map") + #wflow_velocity = configget(self.config, + #"model", "wflow_velocity", "staticmaps/wflow_velocity.map") wflow_percent = [configget(self.config, "model", "wflow_percent_" + str(self.Classes[i]), "staticmaps/wflow_percent" + str(self.Classes[i]) + ".map") for i in self.Classes] @@ -342,7 +342,7 @@ self.totalArea = areatotal(self.surfaceArea, nominal(self.TopoId)) self.percentArea = self.surfaceArea / self.totalArea self.Transit = scalar(readmap(os.path.join(self.Dir, wflow_transit))) #: Map with surface area per cell - self.velocity = scalar(readmap(os.path.join(self.Dir, wflow_velocity))) #: Map with surface area per cell + #self.velocity = scalar(readmap(os.path.join(self.Dir, wflow_velocity))) #: Map with surface area per cell self.gaugesR = nominal(readmap(os.path.join(self.Dir, wflow_gauges))) self.percent = [] for i in self.Classes: @@ -614,14 +614,14 @@ eval(eval_str) # ROUTING - self.Qtot = self.Qftotal + self.Qs_ # total local discharge in mm/hour - self.Qtotal = self.Qtot / 1000 * self.surfaceArea / self.timestepsecs # total local discharge in m3/s - self.Qstate_t = self.Qstate - self.Qrout = accutraveltimeflux(self.TopoLdd, self.Qstate + self.Qtotal, self.velocity) - self.Qstate = accutraveltimestate(self.TopoLdd, self.Qstate + self.Qtotal, self.velocity) - # water balance of flux routing - self.dSdt = self.Qstate-self.Qstate_t - self.WB_rout = (accuflux(self.TopoLdd, self.Qtotal - self.dSdt)-self.Qrout)/accuflux(self.TopoLdd, self.Qtotal) + #self.Qtot = self.Qftotal + self.Qs_ # total local discharge in mm/hour + #self.Qtotal = self.Qtot / 1000 * self.surfaceArea / self.timestepsecs # total local discharge in m3/s + #self.Qstate_t = self.Qstate + #self.Qrout = accutraveltimeflux(self.TopoLdd, self.Qstate + self.Qtotal, self.velocity) + #self.Qstate = accutraveltimestate(self.TopoLdd, self.Qstate + self.Qtotal, self.velocity) + ## water balance of flux routing + #self.dSdt = self.Qstate-self.Qstate_t + #self.WB_rout = (accuflux(self.TopoLdd, self.Qtotal - self.dSdt)-self.Qrout)/accuflux(self.TopoLdd, self.Qtotal) self.Qtlag = self.Qflag_ / self.timestepsecs + self.Qs_ / 1000 * self.surfaceArea / self.timestepsecs self.QLagTot = areatotal(self.Qtlag, nominal(self.TopoId)) # catchment total runoff with looptijd @@ -648,8 +648,8 @@ self.Ei = areatotal(sum(multiply(self.Ei_, self.percent)) / 1000 * self.surfaceArea, nominal(self.TopoId)) self.Eu = areatotal(sum(multiply(self.Eu_, self.percent)) / 1000 * self.surfaceArea, nominal(self.TopoId)) self.Er = areatotal(sum(multiply(self.Er_, self.percent)) / 1000 * self.surfaceArea, nominal(self.TopoId)) - #self.Qtot = self.QLagTot * self.timestepsecs - self.QtotnoRout = areatotal(self.Qtotal, nominal(self.TopoId)) + self.Qtot = self.QLagTot * self.timestepsecs + #self.QtotnoRout = areatotal(self.Qtotal, nominal(self.TopoId)) self.SiWB = areatotal(sum(multiply(self.Si, self.percent)) / 1000 * self.surfaceArea, nominal(self.TopoId)) self.Si_WB = areatotal(sum(multiply(self.Si_t, self.percent)) / 1000 * self.surfaceArea, nominal(self.TopoId)) self.SuWB = areatotal(sum(multiply(self.Su, self.percent)) / 1000 * self.surfaceArea, nominal(self.TopoId)) Index: wflow-py/setup.py =================================================================== diff -u -r6a7bc8aa1448ca6ea1197143f25524e413ac27b5 -r687a7cb59a549f3d4f41cd8b76eac92b1f8486d1 --- wflow-py/setup.py (.../setup.py) (revision 6a7bc8aa1448ca6ea1197143f25524e413ac27b5) +++ wflow-py/setup.py (.../setup.py) (revision 687a7cb59a549f3d4f41cd8b76eac92b1f8486d1) @@ -38,5 +38,4 @@ 'wflow/wflow_sbm.py','wflow/wflow_hbv.py','wflow/wflow_W3RA.py', 'wflow/wflow_upscale.py','wflow/wflow_routing.py'], description='the wflow hydrological models (part of OpenStreams)', - ) - + ) \ No newline at end of file