Source code for hydpy.models.hstream.hstream_derived

# -*- coding: utf-8 -*-
# pylint: disable=missing-docstring
# pylint: enable=missing-docstring

# import...
# ...from site-packages
import numpy

# ...from HydPy
from hydpy.core import parametertools
from hydpy.models.hstream import hstream_control


[docs]class NmbSegments(parametertools.Parameter): """Number of river segments [-].""" NDIM, TYPE, TIME, SPAN = 0, int, None, (0, None) CONTROLPARAMETERS = (hstream_control.Lag,)
[docs] def update(self): """Determines in how many segments the whole reach needs to be divided to approximate the desired lag time via integer rounding. Adjusts the shape of sequence |QJoints| additionally. Required control parameters: |Lag| Calculated derived parameters: |NmbSegments| Prepared state sequence: |QJoints| Examples: Define a lag time of 1.4 days and a simulation step size of 12 hours: >>> from hydpy.models.hstream import * >>> parameterstep("1d") >>> simulationstep("12h") >>> lag(1.4) Then the actual lag value for the simulation step size is 2.8 >>> lag lag(1.4) >>> lag.value 2.8 Through rounding the number of segments is determined: >>> derived.nmbsegments.update() >>> derived.nmbsegments nmbsegments(3) The number of joints is always the number of segments plus one: >>> states.qjoints.shape (4,) """ pars = self.subpars.pars self(int(round(pars.control.lag))) pars.model.sequences.states.qjoints.shape = self + 1
[docs]class C1(parametertools.Parameter): """First coefficient of the Muskingum working formula [-].""" NDIM, TYPE, TIME, SPAN = 0, float, None, (0.0, 0.5) CONTROLPARAMETERS = (hstream_control.Damp,)
[docs] def update(self): """Update |C1| based on :math:`c_1 = \\frac{Damp}{1+Damp}`. Examples: The first examples show the calculated value of |C1| for the lowest possible value of |Lag|, the lowest possible value, and an intermediate value: >>> from hydpy.models.hstream import * >>> parameterstep("1d") >>> damp(0.0) >>> derived.c1.update() >>> derived.c1 c1(0.0) >>> damp(1.0) >>> derived.c1.update() >>> derived.c1 c1(0.5) >>> damp(0.25) >>> derived.c1.update() >>> derived.c1 c1(0.2) For to low and to high values of |Lag|, clipping is performed: >>> damp.value = -0.1 >>> derived.c1.update() >>> derived.c1 c1(0.0) >>> damp.value = 1.1 >>> derived.c1.update() >>> derived.c1 c1(0.5) """ damp = self.subpars.pars.control.damp self(numpy.clip(damp / (1.0 + damp), 0.0, 0.5))
[docs]class C3(parametertools.Parameter): """Third coefficient of the muskingum working formula [-].""" NDIM, TYPE, TIME, SPAN = 0, float, None, (0.0, 0.5) DERIVEDPARAMETERS = (C1,)
[docs] def update(self): """Update |C3| based on :math:`c_1 = c_3`. Example: >>> from hydpy.models.hstream import * >>> parameterstep("1d") >>> derived.c1 = 0.5 >>> derived.c3.update() >>> derived.c3 c3(0.5) """ self(self.subpars.c1)
[docs]class C2(parametertools.Parameter): """Second coefficient of the muskingum working formula [-].""" NDIM, TYPE, TIME, SPAN = 0, float, None, (0.0, 1.0) DERIVEDPARAMETERS = ( C1, C3, )
[docs] def update(self): """Update |C2| based on :math:`c_2 = 1.-c_1-c_3`. Examples: The following examples show the calculated value of |C2| are clipped when to low or to high: >>> from hydpy.models.hstream import * >>> parameterstep("1d") >>> derived.c1 = 0.6 >>> derived.c3 = 0.1 >>> derived.c2.update() >>> derived.c2 c2(0.3) >>> derived.c1 = 1.6 >>> derived.c2.update() >>> derived.c2 c2(0.0) >>> derived.c1 = -1.6 >>> derived.c2.update() >>> derived.c2 c2(1.0) """ der = self.subpars self(numpy.clip(1.0 - der.c1 - der.c3, 0.0, 1.0))