lland_v3

One can understand version 3 of the L-Land model as an extended, more complicated version of the application model lland_v1, using precipitation, temperature, air pressure, wind speed, relative humidity, and actual and possible sunshine duration as meteorological input parameters. It relies on the equations after Penman and Penman-Monteith for calculating evaporation and evapotranspiration, which require much more input data than the simple Turc-Wendling equation but bring flexibility regarding the simulation time step (Turc-Wendling is limited to daily time steps, Penman and Penman-Monteith work for any time step size). The second main difference is that lland_v3 models the energy balance of snow processes in more detail (following Knauf, 2006), taking not only the air temperature but also forcings like the soil heat flux or global radiation into account explicitly. The third difference is that lland_v3 models the soil temperature to simulate the effect of soil water freezing on runoff generation. We created lland_v3 on behalf of the German Federal Institute of Hydrology (BfG) in the context of optimising the control of the Kiel Canal (Nord-Ostsee-Kanal).

The following list summarises the main components of lland_v3:

  • Multiple routines for adjusting the meteorological input data

  • Evaporation from water surfaces after Penman (Penman, 1948)

  • Evapotranspiration (interception evaporation) after Penman-Monteith (Thompson et al., 1981)

  • Actual soil evapotranspiration after Wigmosta (Wigmosta et al., 1994)

  • Surface roughnesses after Quast and Böhm (Böhm and Quast, 1998)

  • Mixed precipitation within a definable temperature-range

  • Energy balance of the snow-layer after Knauf (LUBW, 2006)

  • Dynamical adjustment of the snow albedo

  • Optional refinement of the snow-surface temperature

  • Optional (re)freezing of liquid water within the snow-layer

  • A simple snow retention routine

  • A soil routine based on the Xinanjiang model (Zhao, 1977)

  • Frost-sealing of the upper soil-layer

  • One base flow, two interflow and two direct flow components

  • A freely configurable capillary rise routine

  • Options to limit the capacity of the base flow storage

  • Separate linear storages for modelling runoff concentration

  • Additional evaporation from water areas within the subcatchment

  • Optional evaporation from inflowing runoff

Some notes for LARSIM users: lland_v3 is similar to many LARSIM models used for forecasting (relying on a combination of options equivalent to the features listed above) but not identical. Often, we strive for more flexibility. One example is modifying parameter KTSchnee to control if and how lland_v3 adjusts the snow surface temperature. However, there are also differences due to technical reasons. One relevant difference is that HydPy does not include “future values” in the current simulation timestep. For example, LARSIM fills nightly gaps regarding cloudiness with the average value of the present calendar day, while lland_v3 uses the average over the 24 hours preceding the current simulation step. Hence, do not expect the results of lland_v3 and LARSIM to be identical. When switching from one model system to the other, the need to fine-tune some parameters via calibration might arise.

Among others, lland_v3 requires the time series of global radiation and astronomically possible sunshine duration as input. You can prepare them during data preprocessing and provide them via files. Alternatively, you can connect lland_v3 to suitable members of the meteo model family. An obvious choice is meteo_v003, which estimates these meteorological properties according to LARSIM.

Note

Some details of lland_v3 are still under discussion and might change in the future.

Integration tests

Note

When new to HydPy, consider reading section How to understand integration tests? first.

Many of the following integration tests are similar to the integration tests performed for the application model lland_v1. When there are no substantial differences, we do not repeat our explanations, so please note the respective sections of the documentation on lland_v1. Some additional tests cover structural differences between land-use types that only exist for lland_v3, and others show the different possible snow-related configurations of lland_v3. Furthermore, we perform some daily and hourly tests to point out some differences and make sure lland_v3 works well for different simulation step sizes.

Note that, while our daily simulations always cover an entire month, our hourly simulations cover only three days, focussing on the “most interesting” part of the daily simulation. To ensure the best possible comparability, we use the same input data (we aggregate the hourly values to daily values), the same parameter values (possibly adapted to the change in the time step size), and the same initial conditions (we extract the required initial conditions of the respective hourly simulation from the longer daily simulation).

daily simulation

The following general setup is identical to the one of lland_v1, except that we now start with a different period and a daily simulation time step:

>>> from hydpy import pub, Timegrid
>>> pub.timegrids = "1997-08-01", "1997-09-01", "1d"
>>> from hydpy.models.lland_v3 import *
>>> parameterstep("1h")
>>> from hydpy import Node, Element
>>> outlet = Node("outlet")
>>> inlet = Node("inlet")
>>> land = Element("land", inlets=inlet, outlets=outlet)
>>> land.model = model
>>> nhru(1)
>>> ft(1.0)
>>> fhru(1.0)
>>> from hydpy import IntegrationTest
>>> IntegrationTest.plotting_options.axis1 = inputs.nied
>>> IntegrationTest.plotting_options.axis2 = fluxes.qah
>>> test = IntegrationTest(land)
>>> test.dateformat = "%Y-%d-%m"

acre (summer)

First, we set the values of those parameters also required by the application model lland_v1 (see integration test acre (summer)):

>>> lnk(ACKER)
>>> kg(0.94)
>>> kt(0.0)
>>> hinz(0.2)
>>> lai.acker_aug = 3.5
>>> tgr(0.0)
>>> trefn(0.0)
>>> tsp(4.0)
>>> pwmax(1.43)
>>> wmax(309.0)
>>> fk(199.0)
>>> pwp(119.4)
>>> kapgrenz(option="0_WMax/10")
>>> kapmax(0.08)
>>> beta(0.001/24)
>>> fbeta(1.0)
>>> rbeta(False)
>>> dmax(r_dmax=0.55)
>>> dmin(r_dmin=10.0)
>>> bsf(0.3)
>>> volbmax(inf)
>>> gsbmax(1.0)
>>> gsbgrad1(inf)
>>> gsbgrad2(inf)
>>> a1(0.0)
>>> a2(0.5)
>>> tind(0.191056)
>>> eqb(35000.0)
>>> eqi1(400.0)
>>> eqi2(400.0)
>>> eqd1(200.0)
>>> eqd2(50.0)

In contrast to the documentation on lland_v1, we set parameter NegQ to True in most examples. That means we favour negative discharge estimates over water balance errors whenever the base flow storage cannot meet the water demand of the capillary rise of groundwater into the soil:

>>> negq(True)

Next, we set the values of the parameters specific to lland_v3, beginning with those required for calculating the evaporation via Penman and the evapotranspiration via Penman-Monteith:

>>> measuringheightwindspeed(10.0)
>>> emissivity(0.95)
>>> py(119.4)
>>> cropheight.acker_aug = 0.4
>>> albedo.acker_aug = 0.24
>>> wg2z.aug = -2.9
>>> surfaceresistance.acker = 40.0

The following parameters are related to the energy accounting snow modelling approach after Knauf (LUBW, 2006):

>>> p1strahl(0.5)
>>> p2strahl(1.0/35.0)
>>> p1wind(0.6)
>>> p2wind(1.0/70.0)
>>> turb0(2.0)
>>> turb1(1.6)
>>> albedo0snow(0.9)
>>> snowagingfactor(0.35)
>>> refreezeflag(True)
>>> ktschnee(inf)

Now we set the values of the parameters controlling the frost sealing of the upper soil layer:

>>> fvf(0.3)
>>> bsff(2.0)

Due to preparing a simulation with a daily simulation step size, we only need to define the initial values of the state sequences (and not the values of the log sequences):

>>> test.inits = (
...     (states.inzp, 0.0),
...     (states.wats, 0.0),
...     (states.waes, 0.0),
...     (states.esnow, 0.0),
...     (states.taus, 0.0),
...     (states.ebdn, 350.0),
...     (states.bowa, 72.0),
...     (states.qdgz1, 0.0),
...     (states.qdgz2, 0.0),
...     (states.qigz1, 0.0),
...     (states.qigz2, 0.0),
...     (states.qbgz, 0.0),
...     (states.qdga1, 0.0),
...     (states.qdga2, 0.0),
...     (states.qiga1, 0.0),
...     (states.qiga2, 0.0),
...     (states.qbga, 0.0))

We prepare those input time series usually available as measurements:

>>> inputs.nied.series = (
...     13.3, 0.1, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 2.7,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.3, 0.0, 0.1, 10.5, 6.5, 15.0, 9.2, 0.0,
...     0.0)
>>> inputs.teml.series = (
...     16.1, 17.3, 18.9, 17.8, 18.5, 19.9, 20.8, 20.9, 22.3, 23.0, 23.1, 23.2, 23.2,
...     21.7, 20.8, 19.5, 21.0, 21.6, 21.1, 22.4, 22.5, 19.6, 20.3, 24.1, 23.7, 21.1,
...     20.9, 20.2, 16.1, 17.0, 18.2)
>>> inputs.sunshineduration.series = (
...     6.3, 1.7, 4.5, 12.4, 13.9, 13.0, 13.8, 12.3, 13.1, 12.8, 13.1, 13.3, 12.7,
...     10.2, 9.4, 10.3, 11.1, 11.0, 8.5, 11.3, 12.4, 0.1, 6.7, 10.4, 6.5, 4.9, 6.6,
...     0.3, 0.1, 5.0, 3.8)
>>> inputs.windspeed.series = (
...     2.4, 1.6, 1.5, 2.8, 3.0, 3.5, 3.8, 3.3, 1.8, 1.9, 3.0, 2.5, 1.6, 2.7, 3.2, 1.3,
...     1.9, 2.0, 2.6, 3.6, 2.5, 2.1, 1.5, 2.2, 1.9, 2.3, 2.1, 2.6, 2.6, 2.1, 2.1)
>>> inputs.relativehumidity.series = (
...     86.2, 85.8, 82.4, 77.6, 74.9, 77.9, 73.5, 80.1, 72.9, 68.5, 68.6, 66.0, 69.0,
...     75.6, 81.4, 79.0, 75.9, 70.0, 70.3, 69.0, 62.1, 84.5, 83.6, 76.5, 76.6, 84.2,
...     85.8, 86.5, 89.6, 78.3, 78.5)
>>> inputs.atmosphericpressure.series = (
...     1007.0, 1013.0, 1016.0, 1017.0, 1018.0, 1018.0, 1019.0, 1019.0, 1019.0, 1020.0,
...     1021.0, 1022.0, 1019.0, 1015.0, 1016.0, 1019.0, 1019.0, 1018.0, 1019.0, 1019.0,
...     1017.0, 1015.0, 1015.0, 1011.0, 1008.0, 1006.0, 1005.0, 1000.0, 1004.0, 1011.0,
...     1014.0)
>>> inlet.sequences.sim.series = 0.0

The following two input time series stem from the results of meteo_v003 calculated in the daily simulation summer example, which addresses the same place and time:

>>> inputs.possiblesunshineduration.series = (
...     15.69078473, 15.62882066, 15.56613383, 15.50275437, 15.43871163, 15.37403418,
...     15.3087498, 15.24288548, 15.17646742, 15.10952106, 15.04207104, 14.97414122,
...     14.90575471, 14.83693386, 14.76770029, 14.69807488, 14.62807779, 14.5577285,
...     14.48704578, 14.41604776, 14.34475191, 14.27317506, 14.20133345, 14.12924271,
...     14.05691791, 13.98437357, 13.91162366, 13.83868165, 13.76556053, 13.69227282,
...     13.61883057)
>>> inputs.globalradiation.series = (
...     190.2514903, 127.6607822, 164.4012978, 269.0205016, 287.8486672, 274.6742631,
...     284.0478917, 262.9712633, 272.2564135, 267.0192178, 269.6265466, 270.8782909,
...     261.6971638, 227.9621155, 216.3563213, 226.6379036, 235.5285025, 232.8494284,
...     199.7134896, 233.7719021, 246.1212861, 90.58551, 171.9449932, 216.5498126,
...     166.9168296, 145.9856109, 165.5438903, 87.6933456, 84.356885, 142.3092025,
...     126.7220785)

The following results illustrate the behaviour of lland_v3 for relatively dry and hot summer condions. Compared to the result table of integration test acre (summer) of the application model lland_v1, there are much more columns because of to the higher number of input, flux, and state sequences. These are mainly due to the increased data requirements and the more complex calculations of the Penman-Monteith equation and the Knauf (LUBW, 2006) approach. Additionally, lland_v3 calculates many daily values (containing the averages or sums over the last 24 hours) required for the Penman equation, which we generally apply based on the input data of the previous 24-hours. (Note that we could save some computation time by not calculating daily values that are never required. First, land-use type ACKER only relies on the Penman-Monteith equation. Second, the values of the “normal” sequences are already daily values, due to the selected simulation step size of one day. Maybe we perform some related optimisations later.):

>>> parameters.update()
>>> test.reset_inits()
>>> conditions = sequences.conditions
>>> conditions_acker_summer = test(
...     "lland_v3_acker_summer_daily",
...     axis1=(inputs.nied, fluxes.qah), axis2=states.bowa,
...     get_conditions="1997-08-03")
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> from hydpy import round_
>>> round_(model.check_waterbalance(conditions))
0.0

acre (routing)

The following calculation shows the possibility to route inflowing runoff, discussed in the documentation of lland_v1:

>>> inlet.sequences.sim.series = 0.02
>>> test("lland_v3_acker_routing_daily",
...      axis1=(inputs.nied, fluxes.qah), axis2=states.bowa)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

acre (heavy rain)

Integration test acre (summer) deals with dry summer conditions. To show how lland_v3 works for warm but wet conditions, we set the precipitation input time series constantly to 20 mm. Now, the soil water content (BoWa) rises from its initial value of 72 mm and nearly reaches its maximum value of 309 mm (WMax), resulting in a relevant response of all runoff components:

>>> lnk(ACKER)
>>> inlet.sequences.sim.series = 0.0
>>> nied = inputs.nied.series.copy()
>>> inputs.nied.series = 20.0
>>> conditions_acker_heavy_rain = test(
...     "lland_v3_acker_heavy_rain_daily",
...     axis1=(inputs.nied, fluxes.qah), axis2=states.bowa,
...     get_conditions="1997-08-03")
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0
>>> inputs.nied.series = nied

water

L-Land defines three types of water areas, WASSER, FLUSS and SEE. lland_v3 calculates their evaporation via the Penman equation based on daily input data. Besides that, there are no structural differences to lland_v1, so please read the detailed discussions in integration test water for better understanding the following test results for water type WASSER:

>>> lnk(WASSER)
>>> negq(False)
>>> surfaceresistance.wasser_aug = 0.0
>>> cropheight.wasser_aug = 0.05
>>> albedo.wasser_aug = 0.7
>>> conditions_wasser = test(
...     "lland_v3_wasser_daily",
...     axis1=(fluxes.nkor, fluxes.evi, fluxes.qah),
...     get_conditions="1997-08-03")
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

water (routing)

The following calculation shows the possibility of subtracting evaporation from inflowing runoff, discussed in the integration test water (routing) of lland_v1:

>>> inlet.sequences.sim.series = 0.02
>>> test("lland_v3_wasser_routing_daily",
...      axis1=(fluxes.nkor, fluxes.evi, fluxes.qah))
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

water (negative runoff)

The following calculation shows the possibility to calculate negative discharge values, discussed in the integration test water (negative runoff) of lland_v1:

>>> negq(True)
>>> inlet.sequences.sim.series = 0.0
>>> test("lland_v3_wasser_negq_daily",
...      axis1=(fluxes.nkor, fluxes.evi, fluxes.qah))
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

lakes

The following example focuses on water-type SEE (for further information, see integration test lakes of lland_v1):

>>> lnk(SEE)
>>> surfaceresistance.see_aug = 0.0
>>> cropheight.see_aug = 0.05
>>> albedo.see_aug = 0.7
>>> negq(False)
>>> test("lland_v3_see_daily",
...      axis1=(fluxes.nkor, fluxes.evi, fluxes.qah))
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

streams

The following example focuses on water-type FLUSS (for further information, see integration test streams of lland_v1):

>>> lnk(FLUSS)
>>> surfaceresistance.fluss_aug = 0.0
>>> cropheight.fluss_aug = 0.05
>>> albedo.fluss_aug = 0.7
>>> test("lland_v3_fluss_daily",
...       axis1=(fluxes.nkor, fluxes.evi, fluxes.qah))
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

sealed surfaces

As also shown in the integration test sealed surfaces of lland_v1, sealed surfaces route the not intercepted water to the linear storages for direct discharge immediately:

>>> lnk(VERS)
>>> negq(True)
>>> surfaceresistance.vers_aug = 500
>>> cropheight.vers_aug = 5.0
>>> albedo.vers_aug = 0.10
>>> lai.vers_aug = 10.0
>>> test("lland_v3_vers_daily",
...      axis1=(inputs.nied, fluxes.qah, states.bowa))
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

conifers (summer)

The following tests focus on functionalities of lland_v3 not implemented by application model lland_v1. We start with the land-use type NADELW. For lland_v1, there is no structural difference between NADELW and, for example, ACKER. Different simulation results only are based solely on different parameterisations. In contrast, lland_v3 handles NADELW unlike all other land use types (even unlike LAUBW and MISCHW) regarding the calculation of the surface resistance, relevant for the Penman-Monteith equation (see method Calc_LanduseSurfaceResistance_V1 for more details). The calculated soil evapotranspiration (EvB) is similar to the one calculated with the same input data for land-use type ACKER in the integration test acre (summer):

>>> lnk(NADELW)
>>> surfaceresistance.nadelw = 56.0
>>> cropheight.nadelw = 10.0
>>> albedo.nadelw = 0.12
>>> lai.nadelw = 11.0
>>> conditions_nadelw_summer = test(
...     "lland_v3_nadelw_summer_daily",
...     axis1=(inputs.nied, fluxes.qah, states.bowa),
...     get_conditions="1997-08-03")
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

acre (winter)

None of the examples discussed so far dealt with snow processes. Thus, we now switch from a warm August to a snowy December and adapt the initial conditions and the input time series accordingly (those of global radiation and the astronomically possible sunshine duration stem from the example daily simulation winter of meteo_v003):

>>> pub.timegrids = "2010-12-01", "2011-01-01", "1d"
>>> lnk(ACKER)
>>> lai.acker_dec = 0.3
>>> cropheight.acker_dec = 0.05
>>> albedo.acker_dec = 0.1
>>> wg2z.dec = 8.6
>>> test = IntegrationTest(land)
>>> test.dateformat = "%Y-%d-%m"
>>> test.inits = (
...     (states.inzp, 0.0),
...     (states.wats, 0.0),
...     (states.waes, 0.0),
...     (states.esnow, 0.0),
...     (states.taus, 0.0),
...     (states.ebdn, 0.0),
...     (states.bowa, 72.0),
...     (states.qdgz1, 0.0),
...     (states.qdgz2, 0.0),
...     (states.qigz1, 0.0),
...     (states.qigz2, 0.0),
...     (states.qbgz, 0.0),
...     (states.qdga1, 0.0),
...     (states.qdga2, 0.0),
...     (states.qiga1, 0.0),
...     (states.qiga2, 0.0),
...     (states.qbga, 0.0))
>>> inputs.nied.series = (
...     0.0, 11.1, 0.4, 1.2, 6.4, 0.0, 0.0, 0.0, 0.7, 3.3, 9.4, 0.2, 2.9, 0.0, 0.0,
...     6.7, 0.0, 0.1, 0.0, 0.2, 0.2, 2.4, 7.0, 0.2, 0.0, 1.2, 0.9, 0.0, 0.0, 0.2, 0.9)
>>> inputs.teml.series = (
...     -5.8, -3.0, -5.6, -3.8, 0.2, -1.1, -2.9, -2.9, -2.1, -3.1, 5.1, 0.2, -3.5,
...     -3.9, -6.3, -3.5, -7.3, -5.8, -7.9, -5.7, -5.6, -4.8, -1.1, -2.9, -9.1, -8.6,
...     -5.3, -7.7, -9.2, -7.4, 1.7)
>>> inputs.sunshineduration.series = (
...     3.5, 0.0, 0.1, 3.7, 0.0, 0.1, 0.0, 0.0, 4.4, 0.1, 0.2, 0.7, 0.0, 1.2, 3.0, 0.0,
...     0.0, 0.0, 0.0, 0.2, 0.8, 0.0, 0.0, 0.0, 3.2, 4.3, 0.0, 3.4, 0.0, 0.0, 4.0)
>>> inputs.windspeed.series = (
...     6.9, 5.2, 2.0, 4.3, 4.0, 2.4, 1.9, 1.8, 2.7, 3.0, 7.4, 5.7, 2.2, 3.1, 2.8, 3.7,
...     0.9, 1.3, 1.9, 2.4, 2.3, 4.6, 8.6, 7.6, 3.8, 1.5, 1.3, 3.0, 2.7, 1.4, 4.2)
>>> inputs.relativehumidity.series = (
...     70.3, 85.0, 95.9, 90.6, 96.5, 99.0, 99.2, 99.1, 96.9, 95.0, 90.6, 78.7, 90.5,
...     88.1, 92.8, 98.1, 96.6, 97.7, 95.8, 97.5, 95.0, 93.8, 94.9, 85.4, 87.2, 92.7,
...     97.8, 95.4, 94.9, 96.0, 96.5)
>>> inputs.atmosphericpressure.series = (
...     1015.0, 1007.0, 1005.0, 1008.0, 996.0, 998.0, 1004.0, 1006.0, 1009.0, 1018.0,
...     1004.0, 1012.0, 1020.0, 1025.0, 1023.0, 1000.0, 991.0, 997.0, 997.0, 997.0,
...     1004.0, 1007.0, 1004.0, 1008.0, 1018.0, 1019.0, 1017.0, 1022.0, 1024.0, 1021.0,
...     1016.0)
>>> inlet.sequences.sim.series = 0.0
>>> inputs.possiblesunshineduration.series = (
...     7.64102946, 7.6096444, 7.57982377, 7.55159603, 7.52498861, 7.50002776,
...     7.47673851, 7.45514453, 7.43526809, 7.41712991, 7.40074913, 7.38614323,
...     7.3733279, 7.36231706, 7.35312273, 7.34575502, 7.34022207, 7.33653002,
...     7.33468296, 7.33468296, 7.33653002, 7.34022207, 7.34575502, 7.35312273,
...     7.36231706, 7.3733279, 7.38614323, 7.40074913, 7.41712991, 7.43526809,
...     7.45514453)
>>> inputs.globalradiation.series = (
...     31.9427981, 9.8738984, 16.6834998, 31.8074275, 9.5325105, 16.1414844,
...     9.3414287, 9.2567644, 33.405815, 15.5911584, 15.8915442, 17.8235189, 8.941324,
...     19.6680679, 26.8315815, 8.8377384, 8.817416, 8.8041854, 8.7980439, 15.4647459,
...     17.8795412, 8.8221612, 8.8443961, 8.8737425, 27.7596417, 32.3287553, 9.0045823,
...     28.9823209, 9.1276454, 9.1999895, 32.0622345)

When comparing the following results with those of integration test acre (winter) on lland_v1, it is not immediately clear what differences are due to the much higher complexities of the snow module of lland_v3. But, at least, one can see that lland_v3 allows for the (re)freezing of liquid water within the snow layer. Refreezing occurs around December 7th, where the frozen water equivalent (WATS) grows until it reaches to total water equivalent (WAeS) (a note for LARSIM users: currently, LARSIM does not implement such a freezing feature; you can disable it in lland_v3 through setting RefreezeFlag to False):

>>> test.reset_inits()
>>> conditions = sequences.conditions
>>> conditions_acker_winter = test(
...     "lland_v3_acker_winter_daily",
...     axis1=(inputs.nied, fluxes.wada), axis2=(states.waes, states.wats),
...     get_conditions="2010-12-10")
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

conifers (winter)

Next, we repeat the integration test acre (winter) but select the land use type NADELW instead of ACKER. Like for LAUBW and MISCHW, lland_v3 now modifies the global radiation, the net longwave radiation, and the wind speed to take the shadowing effects of the tree-canopies into account. Here, the net effect of these modifications is that the total water equivalent’s peak amounts are two to three times smaller than for land use type ACKER. Also, snow evaporation (EvS) coincides with interception (EvI) and soil evaporation (EvB), which never happens non-forest sites:

>>> lnk(NADELW)
>>> conditions_nadelw_winter = test(
...     "lland_v3_nadelw_winter_daily",
...     axis1=(inputs.nied, fluxes.wada), axis2=(states.waes, states.wats),
...     get_conditions="2010-12-10")
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0

acre (snow surface temperature)

In integration test acre (winter), lland_v3 assumes that the snow-layer has a constant temperature over its complete depth. For less simplified modelling of the processes within the snow layer, one can enable an iterative adjustment of the snow surface temperature (see method Return_TempSSurface_V1). Therefore, one must set the thermal conductivity of the top snow layer (KTSchnee) to a value smaller than inf. The lower the conductivity, the higher the possible differences between the bulk and the surface temperature of the snow layer. Setting it to zero (which is not advisable) would prevent any thermal exchange. Setting it to inf results in an infinitely fast exchange, avoiding any temperature differences within the snow layer.

We show what happens when we use the default KTSchnee value used by LARSIM. In integration test acre (winter), with \(KTSchnee = inf\), nearly the complete frozen water equivalent melts on December 11th, where the average air temperature is 5 °C. In our next test, with \(KTSchnee = 5 W/m²/K\), the limited thermal conductivity of the top snow layer weakens the energy flux into the snow layer and fewer snow melts. The snow surface temperature rises faster than the bulk temperature, and the higher surface temperature results in smaller sensible (WSensSnow) and latent (WLatSnow) heat fluxes from the atmosphere into the snow layer and to larger longwave radiation losses (NetLongwaveRadiationSnow):

>>> lnk(ACKER)
>>> ktschnee(5.0)
>>> conditions_acker_winter_ktschnee = test(
...     "lland_v3_acker_winter_ktschnee_daily",
...     axis1=(inputs.nied, fluxes.wada), axis2=(states.waes, states.wats),
...     get_conditions="2010-12-10")
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0
>>> ktschnee(inf)

hourly simulation

We change the simulation time step size from one day to one hour. Consequently, we need to change the values of all time-dependent control parameters by the factor 1/24 (or, in single cases, 24). Also, we need to restore() all time-dependent fixed parameter values:

>>> pub.timegrids = "1997-08-03", "1997-08-06", "1h"
>>> for parameter in control:
...     if parameter.TIME == True:
...         parameter.value = parameter.value/24
...     if parameter.TIME == False:
...         parameter.value = parameter.value*24
>>> for parameter in fixed:
...     parameter.restore()
>>> test = IntegrationTest(land)

acre (summer)

The following input values agree with the ones of the respective sub-period of the daily integration test acre (summer) (global radiation and possible sunshine duration stem from hourly simulation summer):

>>> inputs.nied.series = 0.0
>>> inputs.teml.series = (
...     16.9, 16.6, 16.4, 16.3, 16.0, 15.9, 16.0, 16.6, 17.4, 19.0, 20.3, 21.4, 21.3,
...     21.8, 22.9, 22.7, 22.5, 21.9, 21.4, 20.7, 19.4, 17.8, 17.0, 16.4, 15.9, 15.4,
...     15.2, 14.9, 14.3, 14.1, 14.3, 15.4, 16.8, 18.2, 19.5, 20.3, 21.0, 21.8, 21.9,
...     21.8, 22.2, 21.8, 20.9, 19.7, 17.9, 15.8, 14.8, 14.1, 13.4, 12.8, 12.3, 12.0,
...     11.7, 11.6, 12.6, 14.8, 17.1, 19.4, 20.6, 21.4, 22.5, 23.1, 23.4, 23.8, 24.0,
...     24.0, 23.7, 22.8, 21.3, 19.3, 18.3, 17.4)
>>> inputs.sunshineduration.series = (
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.5, 0.7, 0.8, 0.5, 0.4, 0.5,
...     0.5, 0.3, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.9,
...     1.0, 1.0, 0.9, 0.8, 0.9, 0.8, 0.9, 0.9, 0.9, 1.0, 1.0, 1.0, 0.3, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.9, 1.0, 0.9, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
...     1.0, 1.0, 1.0, 1.0, 0.5, 0.0, 0.0, 0.0)
>>> inputs.windspeed.series = (
...     0.8, 0.8, 0.8, 0.8, 0.8, 0.6, 0.9, 0.9, 0.9, 1.3, 1.5, 1.2, 1.3, 1.5, 1.9, 1.9,
...     2.3, 2.4, 2.5, 2.5, 2.2, 1.7, 1.7, 2.3, 2.3, 2.2, 2.3, 2.0, 2.3, 2.5, 2.4, 2.5,
...     2.5, 2.9, 3.1, 3.3, 3.3, 3.2, 2.5, 2.9, 3.6, 4.2, 4.2, 3.6, 3.2, 2.2, 2.2, 2.1,
...     1.8, 1.8, 1.6, 1.2, 1.9, 1.3, 1.6, 1.9, 3.2, 4.0, 4.6, 4.1, 4.1, 4.4, 4.6, 4.5,
...     4.7, 4.5, 4.1, 3.8, 2.5, 1.9, 2.2, 2.7)
>>> inputs.relativehumidity.series = (
...     95.1, 94.9, 95.9, 96.7, 97.2, 97.5, 97.7, 97.4, 96.8, 86.1, 76.8, 71.8, 67.5,
...     66.1, 63.4, 62.4, 61.1, 62.1, 67.0, 74.5, 81.2, 86.9, 90.1, 90.9, 88.0, 89.2,
...     88.8, 89.7, 93.0, 93.6, 94.6, 93.3, 86.9, 78.9, 75.8, 73.4, 68.3, 61.3, 60.6,
...     58.8, 57.2, 57.2, 59.9, 66.1, 71.7, 80.6, 85.9, 89.3, 91.4, 93.1, 94.6, 95.6,
...     96.2, 95.7, 95.1, 96.3, 89.9, 79.2, 73.4, 67.3, 62.2, 59.6, 55.4, 52.1, 49.5,
...     48.1, 49.4, 57.0, 65.9, 73.0, 76.7, 81.8)
>>> inputs.atmosphericpressure.series = (
...     1015.0, 1015.0, 1015.0, 1015.0, 1015.0, 1015.0, 1015.0, 1015.0, 1016.0, 1016.0,
...     1016.0, 1016.0, 1016.0, 1016.0, 1016.0, 1016.0, 1016.0, 1016.0, 1016.0, 1016.0,
...     1016.0, 1016.0, 1017.0, 1017.0, 1017.0, 1016.0, 1016.0, 1016.0, 1016.0, 1017.0,
...     1017.0, 1017.0, 1017.0, 1017.0, 1017.0, 1018.0, 1018.0, 1018.0, 1018.0, 1017.0,
...     1017.0, 1017.0, 1017.0, 1017.0, 1017.0, 1018.0, 1018.0, 1018.0, 1018.0, 1018.0,
...     1018.0, 1018.0, 1018.0, 1018.0, 1018.0, 1019.0, 1019.0, 1019.0, 1019.0, 1019.0,
...     1019.0, 1019.0, 1019.0, 1019.0, 1018.0, 1018.0, 1018.0, 1018.0, 1018.0, 1018.0,
...     1018.0, 1018.0)
>>> inlet.sequences.sim.series = 0.0
>>> inputs.possiblesunshineduration.series = (
...     0.0, 0.0, 0.0, 0.0, 0.42973358, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
...     1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.13640025, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.39804385, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
...     1.0, 1.0, 0.10471052, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.36602248, 1.0, 1.0,
...     1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.07268915,
...     0.0, 0.0, 0.0)
>>> inputs.globalradiation.series = (
...     0.0, 0.0, 0.0, 0.0, 1.9436861, 21.9324417, 57.2561861, 109.3328444,
...     170.9491528, 311.762625, 501.5833, 615.0187278, 626.544325, 496.1334167,
...     419.5209944, 387.8873528, 278.4968722, 137.1386083, 51.0807139, 13.6328167,
...     0.1859444, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.5905167, 19.9509028,
...     62.985775, 285.7763889, 475.2252472, 614.0067194, 643.8065083, 600.2629806,
...     620.5141389, 599.4413861, 613.5512222, 517.1070472, 377.8366167, 252.2046389,
...     128.5767139, 42.0725861, 0.8128972, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     1.4823472, 21.1355667, 125.88345, 305.9549444, 511.104575, 629.5192389,
...     765.8165889, 767.1458417, 736.2638528, 768.0061833, 735.9293694, 620.3749528,
...     450.0952639, 273.6141417, 133.3681056, 40.3265028, 0.8671222, 0.0, 0.0, 0.0)

In this and the following “summer” examples, we use the initial conditions of August 3rd, calculated by the corresponding daily integration tests. However, this is possible for most state sequences, but not for the (now higher resolved) log sequences. Hence, we need to define them manually:

>>> test.inits = (
...     (logs.loggedsunshineduration,
...      [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.1, 0.2, 0.1, 0.2, 0.2, 0.3, 0.0,
...       0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
...     (logs.loggedpossiblesunshineduration,
...      [0.0, 0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
...       1.0, 1.0, 1.0, 1.0, 1.0, 0.2, 0.0, 0.0, 0.0]),
...     (logs.loggedglobalradiation,
...      [0.0, 0.0, 0.0, 0.0, 0.0, 27.8, 55.6, 138.9, 222.2, 305.6, 333.3, 388.9,
...       527.8, 444.4, 250.0, 222.2, 166.7, 111.1, 55.6, 27.8, 0.0, 0.0, 0.0, 0.0]),
...     (logs.loggedteml,
...      [13.2, 13.2, 13.1, 12.6, 12.7, 13.0, 13.5, 14.8, 16.2, 17.7, 18.8, 19.4, 20.4,
...       21.0, 21.5, 21.2, 20.4, 20.7, 20.2, 19.7, 19.0, 18.0, 17.5, 17.1]),
...     (logs.loggedrelativehumidity,
...      [95.1, 94.5, 94.8, 96.4, 96.6, 97.1, 97.1, 96.7, 92.2, 88.5, 81.1, 76.5, 75.1,
...       70.8, 68.9, 69.2, 75.0, 74.0, 77.4, 81.4, 85.3, 90.1, 92.3, 93.8]),
...     (logs.loggedwindspeed2m,
...      [0.8, 1.0, 1.2, 1.3, 0.9, 1.1, 1.3, 1.3, 1.9, 2.2, 1.8, 2.3, 2.4, 2.5, 2.4,
...       2.5, 2.1, 2.2, 1.7, 1.7, 1.3, 1.3, 0.7, 0.8]))

ESnow and EBdn are the only state sequences with values depending on the current simulation step size. According to their unit WT/m², we must multiply their conditions saved for August 3rd and December 10th (referring to Wd/m²) by 24 (to adapt them to Wh/m²). We do so by trick to ensure we do not miss one of the relevant condition dictionaries:

>>> for key, value in locals().copy().items():
...     if key.startswith("conditions_") and "states" in value:
...         value["states"]["esnow"] *= 24
...         value["states"]["ebdn"] *= 24

This integration test deals with a dry situation. Hence, the soil water content (BoWa) shows a pronounced decline. This decline is sharpest around noon when evapotranspiration from the soil (EvB) reaches its maximum:

>>> test("lland_v3_acker_summer_hourly",
...      axis1=(fluxes.evb, fluxes.qah), axis2=states.bowa,
...      use_conditions=conditions_acker_summer)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions_acker_summer))
0.0

acre (heavy rain)

When comparing the soil moisture content (BoWa) on August 6th, 00:00, we notice only minor differences between the daily (acre (summer), 70.2 mm) and the hourly (acre (summer), 69.5) simulation results for a dry situation. However, when we compare the differences between our daily (acre (heavy rain), 152.8 mm) and our hourly test for a wet situation, we see much more pronounced differences, which are mainly due to the prioritisation of throughfall (NBes) over interception evaporation (EvI):

>>> inputs.nied.series = 20.0 / 24.0
>>> control.negq(False)
>>> test("lland_v3_acker_heavy_rain_hourly",
...      axis1=(inputs.nied, fluxes.qah), axis2=states.bowa,
...      use_conditions=conditions_acker_heavy_rain)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions_acker_heavy_rain))
0.0

water

For our hourly integration test on water type WASSER, we deviate from the input data of the daily simulation (water) in setting precipitation to the constant value of 0.05 mm/h. Neither the actual (EvI) or the potential evaporation (EvPo) does show a diurnal pattern due to method Return_Penman_V1 relying on daily aggregated input data (e.g. DailyNetRadiation) only (the same holds for water types FLUSS and SEE):

>>> lnk(WASSER)
>>> inputs.nied.series = 0.05
>>> test("lland_v3_water_hourly",
...      axis1=(fluxes.nkor, fluxes.evpo, fluxes.evi, fluxes.qah),
...      use_conditions=conditions_wasser)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions))
0.0
>>> inputs.nied.series = 0.0

conifers (summer)

Now we repeat the daily integration test conifers (summer) on an hourly basis. In contrast to the calculation for water areas (see water), both the interception evaporation (EvI) and the soil evapotranspiration (EvB) rely on hourly input data (see method Return_PenmanMonteith_V1) and thus show a diurnal pattern. lland_v3 always adds condensed water to the interception storage (Inzp). Hence, EvI is sometimes negative at night, but Inzp dries out as soon as the sun starts to rise:

>>> lnk(NADELW)
>>> test("lland_v3_nadelw_summer_hourly",
...      axis1=(fluxes.evi, fluxes.evb), axis2=states.inzp,
...      use_conditions=conditions_nadelw_summer)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions_nadelw_summer))
0.0

acre (winter)

In our hourly integration tests covering snow processes, we focus on the subperiod from December 10th to December 12th, where, according to the daily simulations, some melting occurs:

>>> pub.timegrids = "2010-12-10", "2010-12-13", "1h"

The following input values agree with the ones of the respective sub-period of the daily integration test acre (winter) (global radiation and possible sunshine duration stem from hourly simulation winter):

>>> inputs.nied.series = (
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.1, 0.0, 0.3, 0.2, 0.4, 0.7, 0.5, 1.0, 2.0, 2.1, 1.8, 1.3, 0.5, 0.2, 0.5, 0.2,
...     0.1, 0.3, 0.1, 0.1, 0.0, 0.1, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.1,
...     0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
>>> inputs.teml.series = (
...     -3.7, -4.8, -5.6, -6.2, -7.3, -8.3, -8.6, -8.5, -9.5, -9.2, -6.9, -4.0, -2.8,
...     -1.4, -0.4, 0.5, 1.0, 1.1, 1.0, 1.4, 1.6, 2.0, 2.4, 2.5, 2.7, 3.2, 3.9, 4.4,
...     4.8, 4.8, 5.1, 5.1, 5.4, 5.3, 5.5, 6.1, 6.4, 6.4, 6.5, 6.3, 5.9, 5.5, 5.1, 4.8,
...     4.9, 4.9, 4.7, 3.8, 3.9, 3.7, 3.5, 3.3, 3.3, 3.0, 1.9, 1.2, 0.8, 0.8, 0.5, 0.3,
...     -0.1, -0.4, -0.6, -0.8, -1.3, -1.6, -2.0, -2.1, -2.2, -2.6, -3.1, -3.9)
>>> inputs.sunshineduration.series = (
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2,
...     0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
>>> inputs.windspeed.series = (
...     3.4, 2.9, 2.5, 3.0, 2.5, 2.3, 2.1, 1.4, 1.1, 1.0, 1.4, 1.3, 1.3, 1.4, 2.3, 2.8,
...     3.1, 3.5, 4.4, 3.8, 5.7, 5.6, 5.8, 6.2, 5.6, 5.2, 5.7, 6.6, 7.0, 7.3, 7.2, 7.6,
...     7.3, 7.1, 7.1, 8.9, 9.5, 7.9, 9.6, 9.1, 8.7, 8.9, 7.9, 7.1, 6.4, 7.2, 7.0, 6.8,
...     6.4, 6.3, 5.7, 5.2, 4.6, 4.9, 6.3, 5.8, 6.1, 5.9, 6.4, 6.8, 7.0, 6.3, 7.3, 7.5,
...     7.0, 6.0, 4.8, 4.2, 4.9, 4.0, 3.4, 3.4)
>>> inputs.relativehumidity.series = (
...     87.5, 90.7, 89.7, 91.3, 94.2, 93.2, 96.5, 95.9, 96.8, 94.3, 96.7, 97.4, 93.9,
...     93.4, 93.3, 94.1, 94.6, 94.4, 96.9, 98.3, 98.7, 99.6, 99.4, 99.2, 99.2, 99.6,
...     99.8, 99.8, 99.0, 97.6, 97.4, 96.3, 95.2, 96.3, 95.5, 91.6, 90.0, 85.7, 82.3,
...     82.5, 82.2, 76.5, 81.7, 83.4, 82.8, 85.8, 87.6, 85.6, 85.3, 86.2, 89.3, 91.4,
...     90.9, 89.2, 85.6, 86.3, 91.2, 87.5, 84.5, 76.7, 74.8, 69.7, 66.9, 64.4, 65.4,
...     67.6, 70.2, 70.4, 69.5, 71.6, 74.5, 80.2)
>>> inputs.atmosphericpressure.series = (
...     1017.0, 1018.0, 1018.0, 1019.0, 1020.0, 1020.0, 1021.0, 1021.0, 1022.0, 1022.0,
...     1022.0, 1022.0, 1022.0, 1021.0, 1020.0, 1020.0, 1019.0, 1018.0, 1016.0, 1015.0,
...     1014.0, 1013.0, 1011.0, 1010.0, 1008.0, 1007.0, 1006.0, 1005.0, 1005.0, 1004.0,
...     1004.0, 1004.0, 1003.0, 1003.0, 1003.0, 1002.0, 1002.0, 1002.0, 1002.0, 1003.0,
...     1003.0, 1003.0, 1003.0, 1003.0, 1003.0, 1003.0, 1003.0, 1002.0, 1002.0, 1002.0,
...     1002.0, 1003.0, 1004.0, 1005.0, 1006.0, 1008.0, 1009.0, 1010.0, 1011.0, 1012.0,
...     1013.0, 1014.0, 1015.0, 1015.0, 1017.0, 1017.0, 1018.0, 1019.0, 1019.0, 1020.0,
...     1020.0, 1020.0)
>>> inputs.possiblesunshineduration.series = (
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.35523162, 1.0, 1.0, 1.0, 1.0, 1.0,
...     1.0, 1.0, 0.06189829, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.34704123, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0537079,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.33973828, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.04640495, 0.0, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0)
>>> inputs.globalradiation.series = (
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.1076111, 18.6632028, 56.2679083,
...     107.1682361, 91.4733333, 80.4755361, 43.1205917, 10.3200917, 0.0281028, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.9007333, 17.2675111, 52.6176111, 80.1356333, 80.2761167, 75.8354028,
...     42.2279111, 12.6139194, 0.0219111, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8941444, 17.7125389, 54.3025861,
...     81.5041472, 81.6652944, 77.0789583, 60.2540417, 14.8373, 0.1688556, 0.0, 0.0,
...     0.0, 0.0, 0.0, 0.0, 0.0)

In this and the following “winter” examples, we use the initial conditions of December 10th, calculated by the corresponding daily integration tests. However, this is possible for the state sequences, but not for the (now higher resolved) log sequences. Hence, we need to define them manually:

>>> test.inits = (
...     (logs.loggedsunshineduration,
...      [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04, 0.25, 0.59, 0.91,
...       0.97, 1.0, 0.65, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
...     (logs.loggedpossiblesunshineduration,
...      [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
...       1.0, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
...     (logs.loggedglobalradiation,
...      [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.8, 55.6, 111.1, 166.7, 138.9,
...       55.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]),
...     (logs.loggedteml,
...      [-2.8, -2.6, -2.2, -1.8, -1.8, -2.4, -1.5, -1.4, -0.8, -0.8, -0.9, 0.9, -0.8,
...       -1.0, -1.2, -1.8, -2.8, -3.8, -4.3, -4, -3.9, -1.6, -1.6, 2.6]),
...     (logs.loggedrelativehumidity,
...      [99.4, 99.0, 99.6, 99.6, 99.3, 99.3, 99.8, 99.7, 100.0, 99.6, 99.3, 98.9,
...       96.6, 93.0, 91.4, 92.0, 94.5, 96.5, 98.2, 96.9, 98.0, 95.0, 91.8, 88.5]),
...     (logs.loggedwindspeed2m,
...      [2.2, 2.0, 2.5, 2.6, 2.3, 1.7, 2.8, 1.9, 2.6, 2.9, 3.5, 3.4, 3.5, 3.0, 3.9,
...       3.6, 2.2, 2.4, 2.5, 1.5, 2.5, 3.0, 3.2, 3.1]))

Compared to the daily simulation acre (winter), the hourly simulation estimates a slightly more pronounced melting rate for land-use type ACKER, resulting in a complete depletion of the snow-cover:

>>> lnk(ACKER)
>>> test("lland_v3_acker_winter_hourly",
...      axis1=(inputs.nied, fluxes.wada), axis2=(states.waes, states.wats),
...      use_conditions=conditions_acker_winter)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions_acker_winter))
0.0

conifers (winter)

By comparing the hourly simulation results for ACKER (acre (winter)) and NADELW (this example), you can see the shading effect of the tree-canopies. During the nighttime, the decreased longwave radiation loss (NetLongwaveRadiationSnow) under the canopy results in an earlier start of the snow-melt. But then, during the daytime, the decreased shortwave radiation gain (NetShortwaveRadiationSnow) results in a lower melting rate, so that the complete melting process finishes even later for NADELW than for ACKER:

>>> lnk(NADELW)
>>> test("lland_v3_nadelw_winter_hourly",
...      axis1=(inputs.nied, fluxes.wada), axis2=(states.waes, states.wats),
...      use_conditions=conditions_nadelw_winter)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions_nadelw_winter))
0.0

acre (snow surface temperature)

Due to the reasons discussed in the daily integration test acre (snow surface temperature), enabling the iterative adjustment of the snow surface temperature results in a more delayed and smoothed snow-melt, which becomes even more apparent in the following hourly simulation results:

>>> lnk(ACKER)
>>> ktschnee(5.0)
>>> test("lland_v3_acker_winter_ktschnee_hourly",
...      axis1=(inputs.nied, fluxes.wada), axis2=(states.waes, states.wats),
...      use_conditions=conditions_acker_winter_ktschnee)
Click to see the table
Click to see the graph

There is no indication of an error in the water balance:

>>> round_(model.check_waterbalance(conditions_acker_winter_ktschnee))
0.0
class hydpy.models.lland_v3.Model[source]

Bases: AdHocModel

Penman-Monteith and Knauf version of HydPy-L-Land (lland_v3).

The following “inlet update methods” are called in the given sequence at the beginning of each simulation step:
  • Pick_QZ_V1 Query the current inflow from all inlet nodes.

The following “run methods” are called in the given sequence during each simulation step:
The following “outlet update methods” are called in the given sequence at the end of each simulation step:
The following “additional methods” might be called by one or more of the other methods or are meant to be directly called by the user:
The following “submodels” might be called by one or more of the implemented methods or are meant to be directly called by the user:
  • PegasusESnow Pegasus iterator for finding the correct snow energy content.

  • PegasusTempSSurface Pegasus iterator for finding the correct snow surface temperature.

idx_hru

The hydrological response unit index.

check_waterbalance(initial_conditions: Dict[str, Dict[str, ArrayFloat]]) float[source]

Determine the water balance error of the previous simulation run in mm.

Method check_waterbalance() calculates the balance error as follows:

\[\sum_{t=t0}^{t1} \Bigg( NKor_t + QZH_t - \bigg( \sum_{k=1}^{nhru} fhru^k \cdot \Big( EvI_t^k + EvS_t^k + EvB_t^k \Big) \bigg) - QAH_t \Bigg) + \sum_{k=1}^{nhru} fhru^k \cdot \bigg( \Big( Inzp_{t0}^k - Inzp_{t1}^k \Big) + \Big( WAeS_{t0}^{k} - WAeS_{t1}^{k} \Big) + \Big( BoWa_{t0}^{k} - BoWa_{t1}^{k} \Big) \bigg) - \sum_{t=t0}^{t1} \bigg( \Big( QDGZ1_t - QDGA1_t \Big) + \Big( QDGZ2_t - QDGA2_t \Big) + \Big( QIGZ1_t - QIGA1_t \Big) + \Big( QIGZ2_t - QIGA2_t \Big) + \Big( QBGZ_t - QBGA_t \Big) \bigg)\]

The returned error should usually be in scale with numerical precision so that it does not affect the simulation results in any relevant manner. The only exception we are aware of is the “generation” of additional water when the base flow storage cannot meet the water demand required for the calculated capillary rise (see acre (capillary rise, water balance error)).

Pick the required initial conditions before starting the simulation run via property conditions. See the integration tests of the application model lland_v3 for some examples.

class hydpy.models.lland_v3.Masks[source]

Bases: Masks

Masks applicable to lland_v3.

The following classes are selected:
class hydpy.models.lland_v3.AideSequences(master: Sequences, cls_fastaccess: Type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: AideSequences

Aide sequences of model lland_v3.

The following classes are selected:
  • SNRatio() Ratio of frozen precipitation to total precipitation [-].

  • RLAtm() Atmosphärische Gegenstrahlung (longwave radiation emitted from the atmosphere) [W/m²].

  • TempS() Temperatur der Schneedecke (temperature of the snow layer) [°C].

class hydpy.models.lland_v3.ControlParameters(master: Parameters, cls_fastaccess: Type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)

Bases: SubParameters

Control parameters of model lland_v3.

The following classes are selected:
  • FT() Teileinzugsgebietsfläche (subbasin area) [km²].

  • NHRU() Anzahl der Hydrotope (number of hydrological response units) [-].

  • Lnk() Landnutzungsklasse (land use class) [-].

  • FHRU() Flächenanteile der Hydrotope (area percentages of the respective HRUs) [-].

  • KG() Niederschlagskorrekturfaktor (adjustment factor for precipitation) [-].

  • KT() Temperaturkorrektursummand (adjustment summand for air temperature) [°C].

  • P1Strahl() Konstante der Globalstrahlungsreduktion für Wald (constant for reducing the global radiation in forests) [-].

  • P2Strahl() Faktor der Globalstrahlungsreduktion für Wald (factor for reducing the global radiation in forests) [-].

  • Albedo() Albedo [-].

  • Albedo0Snow() Albedo von Neuschnee (albedo of fresh snow) [-].

  • SnowAgingFactor() Wichtungsfaktor für die Sensitivität der Albedo für die Alterung des Schnees (weighting factor of albedo sensitivity for snow aging) [-].

  • Turb0() Parameter des Übergangskoeffizienten des turbulenten Wärmestroms (parameter of transition coefficient for turbulent heat flux) [W/m²/K].

  • Turb1() Parameter des Übergangskoeffizienten des turbulenten Wärmestroms (parameter of transition coefficient for turbulent heat flux) [J/m³/K].

  • Emissivity() Emissivität der Oberfläche (emissivity) [-]

  • MeasuringHeightWindSpeed() The height above ground of the wind speed measurements [m].

  • P1Wind() Konstante der Windgeschwindigkeitsreduktion für Wald (constant for reducing the wind speed in forests) [-].

  • P2Wind() Faktor der Windgeschwindigkeitsreduktion für Wald (factor for reducing the wind speed in forests) [-].

  • LAI() Blattflächenindex (leaf area index) [-].

  • HInz() Interzeptionskapazität bezogen auf die Blattoberfläche (interception capacity normalized to the leaf surface area) [mm].

  • TRefN() Niederschlagstemperaturgrenzwert des zur Berechnung des Wärmeeintrags durch Regen (precipitation temperature threshold to calculate heat flux caused by liquid precipitation on snow) [°C].

  • TGr() Temperaturgrenzwert flüssiger/fester Niederschlag (threshold temperature liquid/frozen precipitation) [°C].

  • TSp() Temperaturspanne flüssiger/fester Niederschlag (temperature range with mixed precipitation) [°C].

  • PWMax() Maximalverhältnis Gesamt- zu Trockenschnee (maximum ratio of the total and the frozen water equivalent stored in the snow cover) [-].

  • RefreezeFlag() Flag um wiedergefrieren zu aktivieren (flag to activate refreezing) [-].

  • KTSchnee() Effektive Wärmeleitfähigkeit der obersten Schneeschicht (effective thermal conductivity of the top snow layer) [W/m²/K].

  • WG2Z() Bodenwärmestrom in der Tiefe 2z (soil heat flux at depth 2z) [W/m²].

  • CropHeight() Crop height [m].

  • SurfaceResistance() Surface Resistance [s/m].

  • WMax() Maximaler Bodenwasserspeicher (maximum soil water storage) [mm].

  • FK() Feldkapazität / Mindestbodenfeuchte für die Interflowentstehung (field capacity / threshold value of soil moisture for interflow generation) [mm].

  • PWP() Permanenter Welkepunkt / Mindestbodenfeuchte für die Basisabflussentstehung (permanent wilting point threshold value of soil moisture for base flow generation) [mm].

  • PY() Permanenter Welkepunkt / Schwellenwert für den Anteil des für Pflanzen gebundenen Bodenwassers (permanent wilting point) [mm].

  • BSf() Bodenfeuchte-Sättigungsfläche-Parameter (shape parameter for the relation between the avarage soil moisture and the relative saturated area of a subbasin) [-].

  • FVF() Frostversiegelungsfaktor zur Ermittelung des Frostversiegelungsgrades (frost sealing factor for determination of the degree of frost sealing FVG) [-].

  • BSFF() Exponent zur Ermittelung des Frostversieglungsgrades (frost sealing exponent for determination of degree of frost sealing FVG) [-].

  • DMin() Drainageindex des mittleren Bodenspeichers (flux rate for releasing interflow from the middle soil compartment) [mm/T].

  • DMax() Drainageindex des oberen Bodenspeichers (additional flux rate for releasing interflow from the upper soil compartment) [mm/T].

  • Beta() Drainageindex des tiefen Bodenspeichers (storage coefficient for releasing base flow from the lower soil compartment) [1/T].

  • FBeta() Faktor zur Erhöhung der Perkolation im Grobporenbereich (factor for increasing percolation under wet conditions) [-].

  • KapMax() Maximale kapillare Aufstiegsrate (maximum capillary rise) [mm/T].

  • KapGrenz() Grenzwerte für den kapillaren Aufstieg (threshold values related to the capillary rise) [mm].

  • RBeta() Boolscher Parameter der steuert, ob the Perkolation unterhalb der Feldkapazität auf Null reduziert wird (flag to indicate if seepage is reduced to zero below field capacity) [-].

  • VolBMax() Maximaler Inhalt des Gebietsspeichers für Basisabfluss (maximum value of the storage compartment for base flow) [mm].

  • GSBMax() Faktor zur Anpassung von VolBMax (factor for adjusting VolBMax) [-].

  • GSBGrad1() Höchste Volumenzunahme des Gebietsspeichers für Basisabfluss ohne Begrenzung des Zuflusses (highest possible storage increase of the compartment for base flow without inflow reductions) [mm/T].

  • GSBGrad2() Volumenzunahme des Gebietsspeichers für Basisabfluss, oberhalb der jeglicher Zufluss ausgeschlossen ist (highest possible storage increase of the compartment for base flow) [mm/T].

  • A1() Parameter für die kontinuierliche Aufteilung der Direktabflusskomponenten (threshold value for the continuous seperation of direct runoff in a slow and a fast component) [mm/T]

  • A2() Parameter für die diskontinuierliche Aufteilung der Direktabflusskomponenten (threshold value for the discontinuous seperation of direct runoff in a slow and a fast component) [mm/T]

  • TInd() Fließzeitindex (factor related to the time of concentration) [T].

  • EQB() Kalibrierfaktor für die Basisabflusskonzentration (factor for adjusting the concentration time of baseflow). [-].

  • EQI1() Kalibrierfaktor für die “untere” Zwischenabflusskonzentration (factor for adjusting the concentration time of the first interflow component) [-].

  • EQI2() Kalibrierfaktor für die “obere” Zwischenabflusskonzentration (factor for adjusting the concentration time of the second interflow component) [-].

  • EQD1() Kalibrierfaktor für die langsamere Direktabflusskonzentration (factor for adjusting the concentration time of the slower component of direct runoff). [-].

  • EQD2() Kalibrierfaktor für die schnellere Direktabflusskonzentration (factor for adjusting the concentration time of the faster component of direct runoff). [-].

  • NegQ() Option: sind negative Abflüsse erlaubt (flag that indicated wether negative discharge values are allowed or not) [-].

class hydpy.models.lland_v3.DerivedParameters(master: Parameters, cls_fastaccess: Type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)

Bases: SubParameters

Derived parameters of model lland_v3.

The following classes are selected:
  • MOY() References the “global” month of the year index array [-].

  • Seconds() The length of the actual simulation step size in seconds [s].

  • Hours() The length of the actual simulation step size in hours [h].

  • Days() The length of the actual simulation step size in days [d].

  • NmbLogEntries() The number of log entries required for a memory duration of 24 hours [-].

  • AbsFHRU() Flächen der Hydrotope (areas of the respective HRUs) [km²].

  • KInz() Interzeptionskapazität bezogen auf die Bodenoberfläche (interception capacity normalized to the soil surface area) [mm].

  • HeatOfFusion() Heat which is necessary to melt the frozen soil water content [WT].

  • Fr() Reduktionsfaktor für Strahlung according to LEG (2020) (basierend auf LUWG (2015)) (reduction factor for short- and long wave radiation) LEG (2020) (based on LUWG (2015)) [-].

  • NFk() Nutzbare Feldkapazität (usable field capacity) [mm].

  • KB() Konzentrationszeit des Basisabflusses (concentration time of baseflow) [T].

  • KI1() Konzentrationszeit des “unteren” Zwischenabflusses (concentration time of the first interflow component) [T].

  • KI2() Konzentrationszeit des “oberen” Zwischenabflusses” (concentration time of the second interflow component) [T].

  • KD1() Konzentrationszeit des “langsamen” Direktabflusses (concentration time of the slower component of direct runoff) [T].

  • KD2() Konzentrationszeit des “schnellen” Direktabflusses (concentration time of the faster component of direct runoff) [T].

  • QBGAMax() Maximaler Abfluss aus dem Basisabfluss-Gebietsspeicher (maximum outflow from the storage compartment for base flow) [mm/T].

  • QFactor() Factor for converting mm/T to m³/s.

class hydpy.models.lland_v3.FixedParameters(master: Parameters, cls_fastaccess: Type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)

Bases: SubParameters

Fixed parameters of model lland_v3.

The following classes are selected:
  • CPWasser() Spezifische Wärmekapazität von Wasser (specific heat capacity of water) [WT/kg/K].

  • CPEis() Spezifische Wärmekapazität von Eis bei 0 °C (specific heat capacity of ice at a temperature of 0 °C) [WT/kg/K].

  • RSchmelz() Spezifische Schmelzwärme von Wasser (specific melt heat of water) [WT/kg].

  • Z() Halbe Mächtigkeit der in der Temperaturmodellierung betrachteten Bodensäule (the half thickness of the surface soil layer relevant for modelling soil temperature) [m].

  • BoWa2Z() Bodenwassergehalt der Bodenschicht bis zu einer Tiefe 2z (soil water content of the soil layer down two a depth of 2z) [mm].

  • LambdaG() Wärmeleitfähigkeit des Bodens (thermal conductivity of the top soil layer) [W/m/K].

  • Sigma() Stefan-Boltzmann-Konstante (Stefan-Boltzmann constant) [W/m²/K].

  • RDryAir() Gaskonstante für trockene Luft (gas constant for dry air) [J/kg/K].

  • RWaterVapour() Gaskonstante für Wasserdampf (gas constant for water vapour) [J/kg/K].

  • LW() Latente Verdunstungswärme bei 15°C (heat of condensation at at temperature of 15°C) [WT/kg)].

  • LWE() Mittlere latente Verdunstungswärme für Wasser und Eis (average heat of condensation for water and ice) [WT/kg].

  • CPLuft() Spezifische Wärmekapazität Luft (heat of condensation for a water temperature of 15°C) [WT/kg/K].

  • Psy() Psychrometerkonstante bei Normaldruck (psychrometric constant at normal pressure) [hPa/K].

  • PsyInv() Kehrwert der Psychrometerkonstante über Schnee und Eis bei 0°C (inverse psychrometric constant for ice and snow at 0°C) [K/hPa].

  • Z0() Rauhigkeitslänge für Wiese (roughness length for short grass) [m].

  • FrAtm() Empirischer Faktor zur Berechnung der atmosphärischen Gegenstrahlung (empirical factor for the calculation of atmospheric radiation) [-]

  • CG() Volumetrische Wärmekapazität des Bodens (volumetric heat capacity of soil) [WT/m³/K].

class hydpy.models.lland_v3.FluxSequences(master: Sequences, cls_fastaccess: Type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: FluxSequences

Flux sequences of model lland_v3.

The following classes are selected:
  • QZ() Zufluss in das Teilgebiet (inflow into the subcatchment) [m³/s].

  • QZH() Abflussspende in das Teilgebiet (inflow into the subcatchment) [mm/T].

  • TemLTag() Tageswert der Lufttemperatur (daily air temperature) [°C].

  • DailyRelativeHumidity() Daily relative humidity [%].

  • DailySunshineDuration() Daily sunshine duration [h].

  • DailyPossibleSunshineDuration() Astronomically possible daily sunshine duration [h].

  • DailyGlobalRadiation() Daily global radiation [h].

  • NKor() Korrigierter Niederschlag (corrected precipitation) [mm/T].

  • TKor() Korrigierte Lufttemperatur (corrected air temperature) [°C].

  • TKorTag() Tageswert der korrigierten Lufttemperatur (corrected daily air temperature) [°C].

  • WindSpeed2m() Wind speed at a height of 2 m above the ground for grass [m/s].

  • DailyWindSpeed2m() Daily wind speed 2 meters above ground [m/s].

  • ReducedWindSpeed2m() Land-use-specific wind speed at a height of 2 m above the ground [m/s].

  • WindSpeed10m() Wind speed at a height of 10 m above the ground for grass [m/s].

  • SaturationVapourPressure() Saturation vapour pressure [hPa].

  • DailySaturationVapourPressure() Daily satuarion vapour pressure [hPa].

  • SaturationVapourPressureSnow() Saturation vapour pressure snow [hPa].

  • SaturationVapourPressureSlope() The slope of the saturation vapour pressure curve [hPa/K].

  • DailySaturationVapourPressureSlope() Daily satuarion vapour pressure [hPa/K].

  • ActualVapourPressure() Actual vapour pressure [hPa].

  • DailyActualVapourPressure() Daily actual vapour pressure [hPa].

  • DryAirPressure() Dry air pressure [hPa].

  • DensityAir() Air density [kg/m³]

  • G() “MORECS” Bodenwärmestrom (“MORECS” soil heat flux) [W/m²].

  • TZ() Bodentemperatur in der Tiefe z (soil temperature at depth z) [°C].

  • WG() “Dynamischer” Bodenwärmestrom (“dynamic” soil heat flux) [W/m²].

  • NetShortwaveRadiation() Netto kurzwellige Strahlungsbilanz (net shortwave radiation) [W/m²].

  • NetShortwaveRadiationSnow() Kurzwellige Netto-Strahlungsbilanz für Schneeoberflächen (net shortwave radiation for snow surfaces) [W/m²].

  • DailyNetShortwaveRadiation() Daily not shortwave radiation [W/m²].

  • DailyNetLongwaveRadiation() Daily net longwave radiation [W/m²].

  • NetLongwaveRadiationSnow() Net longwave radiation for snow-surfaces [W/m²].

  • NetRadiation() Total net radiation [W/m²].

  • NetRadiationSnow() Total net radiation for snow-surfaces [W/m²].

  • DailyNetRadiation() Daily net radiation [W/m²].

  • AerodynamicResistance() Aerodynamischer Widerstand (aerodynamic resistance) [s/m].

  • SoilSurfaceResistance() Oberflächenwiderstand (surface resistance) [s/m].

  • LanduseSurfaceResistance() Oberflächenwiderstand (surface resistance) [s/m].

  • ActualSurfaceResistance() Oberflächenwiderstand (surface resistance) [s/m].

  • NBes() Gesamter Bestandsniederschlag (total stand precipitation) [mm/T].

  • SBes() Schneeanteil Bestandsniederschlag (frozen stand precipitation) [mm/T].

  • EvPo() Evapotranspiration (evapotranspiration) [mm/T].

  • EvI() Tatsächliche Interzeptionsverdunstung (actual evaporation of intercepted water) [mm/T].

  • EvB() Tatsächliche Verdunstung von Bodenwasser (actual evaporation of soil water) [mm/T].

  • EvS() Tatsächliche Schneeverdunstung (actual evaporation of snow-water) [mm/T].

  • WNied() Niederschlagsbedingter Wärmestrom in die Schneedecke (heat flux into the snow layer due to precipitation) [W/m²].

  • TempSSurface() Schneetemperatur an der Schneeoberfläche (the snow temperature at the snow surface) [°C].

  • ActualAlbedo() Aktuelle Albedo der relevanten Oberfläche (the current albedo of the relevant surface) [-].

  • SchmPot() Potentielle Schneeschmelze (potential amount of water melting within the snow cover) [mm/T].

  • Schm() Tatsächliche Schneeschmelze (actual amount of water melting within the snow cover) [mm/T].

  • GefrPot() Potentielles Schnee-Wiedergefrieren (potential amount of water refreezing within the snow cover) [mm/T].

  • Gefr() Tatsächliche Schnee-Wiedergefrieren (actual amount of water refreezing within the snow cover) [mm/T].

  • WLatSnow() Latente Wärmestrom Schnee/Atmosphäre (latent heat flux between the snow-layer and the atmosphere) [W/m²].

  • WSensSnow() Fühlbare Wärmestrom Schnee/Atmosphäre (sensible heat flux between the snow-layer and the atmosphere) [W/m²].

  • WSurf() Wärmestrom von der Schneedecke zur Schneeoberfläche (heat flux from the snow layer to the snow surface) [W/m²].

  • SFF() Relativer Anteil des gefrorenen Bodenwassers bis zu einer Tiefe von 2z (relative proportion of frozen soil water) [-].

  • FVG() Frostversiegelungsgrad (degree of frost sealing) [-].

  • WaDa() Wasserdargebot (water reaching the soil routine) [mm/T].

  • QDB() Direktabfluss-Abgabe aus dem Bodenspeicher (direct runoff release from the soil storage) [mm/T].

  • QIB1() Erste Komponente der Interflow-Abgabe aus dem Bodenspeicher (first component of the interflow release from the soil storage) [mm/T].

  • QIB2() Zweite Komponente der Interflow-Abgabe aus dem Bodenspeicher (second component of the interflow release from the soil storage) [mm/T].

  • QBB() Basisabfluss-Abgabe aus dem Bodenspeicher (base flow release from the soil storage) [mm/T].

  • QKap() Kapillarer Aufstieg in den Bodenspeicher (capillary rise to soil storage) [mm/T].

  • QDGZ() Gesamtzufluss in beide Direktabfluss-Gebietsspeicher (total inflow into both storage compartments for direct runoff) [mm/T].

  • QAH() Abflussspende des Teilgebiets (runoff at the catchment outlet) [mm/T].

  • QA() Abfluss des Teilgebiets (runoff at the catchment outlet) [m³/s].

class hydpy.models.lland_v3.InletSequences(master: Sequences, cls_fastaccess: Type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: InletSequences

Inlet sequences of model lland_v3.

The following classes are selected:
  • Q() Abfluss (runoff) [m³/s].

class hydpy.models.lland_v3.InputSequences(master: Sequences, cls_fastaccess: Type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: InputSequences

Input sequences of model lland_v3.

The following classes are selected:
class hydpy.models.lland_v3.LogSequences(master: Sequences, cls_fastaccess: Type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: LogSequences

Log sequences of model lland_v3.

The following classes are selected:
class hydpy.models.lland_v3.OutletSequences(master: Sequences, cls_fastaccess: Type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: OutletSequences

Outlet sequences of model lland_v3.

The following classes are selected:
  • Q() Abfluss (runoff) [m³/s].

class hydpy.models.lland_v3.StateSequences(master: Sequences, cls_fastaccess: Type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: StateSequences

State sequences of model lland_v3.

The following classes are selected:
  • Inzp() Interzeptionsspeicherung (interception storage) [mm].

  • WATS() Wasseräquivalent Trockenschnee auf der Bodenoberfläche (frozen water equivalent of the snow cover) [mm].

  • WAeS() Wasseräquivalent Gesamtschnee auf der Bodenoberfläche (total water equivalent of the snow cover) [mm].

  • ESnow() Thermischer Energieinhalt der Schneedecke bezogen auf 0°C (thermal energy content of the snow layer with respect to 0°C) [WT/m²].

  • TauS() Dimensionsloses Alter der Schneedecke (dimensionless age of the snow layer) [-].

  • EBdn() Energiegehalt des Bodenwassers (energy content of the soil water) [WT/m²].

  • BoWa() Bodenwasserspeicherung (soil water storage) [mm].

  • QDGZ1() Zufluss in den trägeren Direktabfluss-Gebietsspeicher (inflow into the less responsive storage compartment for direct runoff) [mm/T].

  • QDGZ2() Zufluss in den dynamischeren Direktabfluss-Gebietsspeicher (inflow into the more responsive storage compartment for direct runoff) [mm/T].

  • QIGZ1() “Zufluss in den ersten Zwischenabfluss-Gebietsspeicher (inflow into the first storage compartment for interflow) [mm/T].

  • QIGZ2() Zufluss in den zweiten Zwischenabfluss-Gebietsspeicher (inflow into the second storage compartment for interflow) [mm/T].

  • QBGZ() Zufluss in den Basisabfluss-Gebietsspeicher (inflow into the storage compartment for base flow) [mm/T].

  • QDGA1() Abfluss aus dem trägeren Direktabfluss-Gebietsspeicher (outflow from the less responsive storage compartment for direct runoff) [mm/T].

  • QDGA2() Abfluss aus dem dynamischeren Direktabfluss-Gebietsspeicher (outflow from the more responsive storage compartment for direct runoff) [mm/T].

  • QIGA1() Abfluss aus dem “unteren” Zwischenabfluss-Gebietsspeicher (outflow from the storage compartment for the first interflow component) [mm/T].

  • QIGA2() Abfluss aus dem “oberen” Zwischenabfluss-Gebietsspeicher (outflow from the storage compartment for the second interflow component) [mm/T].

  • QBGA() Abfluss aus dem Basisabfluss-Gebietsspeicher (outflow from the storage compartment for base flow) [mm/T].