Source code for hydpy.models.ga.ga_derived
# -*- coding: utf-8 -*-
# pylint: disable=missing-module-docstring
# import...
# ...from site-packages
import numpy
# ...from HydPy
from hydpy.core import parametertools
from hydpy.models.ga import ga_control
[docs]
class NmbSubsteps(parametertools.Parameter):
"""The number of numerical substeps in each simulation step [-]."""
NDIM, TYPE, TIME, SPAN = 0, int, None, (1, numpy.inf)
CONTROLPARAMETERS = (ga_control.DT,)
[docs]
def update(self) -> None:
"""Calculate the number of substeps based on :math:`NmbSubsteps = 1 / DT`.
>>> from hydpy.models.ga import *
>>> simulationstep("1h")
>>> parameterstep("1h")
>>> dt(0.5)
>>> derived.nmbsubsteps.update()
>>> derived.nmbsubsteps
nmbsubsteps(2)
"""
self.value = int(round(1.0 / self.subpars.pars.control.dt.value))
[docs]
class SoilAreaFraction(parametertools.Parameter):
"""The area fraction of each soil compartment [-]."""
NDIM, TYPE, TIME, SPAN = 1, float, None, (0.0, 1.0)
CONTROLPARAMETERS = (ga_control.SoilArea,)
[docs]
def update(self) -> None:
r"""Calculate the fractions based on
:math:`SoilAreaFraction_i = SoilArea_i / \Sigma SoilArea`.
>>> from hydpy.models.ga import *
>>> parameterstep()
>>> nmbsoils(5)
>>> soilarea(10.0, 40.0, 20.0, 25.0, 5.0)
>>> derived.soilareafraction.update()
>>> derived.soilareafraction
soilareafraction(0.1, 0.4, 0.2, 0.25, 0.05)
"""
soilarea = self.subpars.pars.control.soilarea.values
self.values = soilarea / numpy.sum(soilarea)
[docs]
class EffectiveCapillarySuction(parametertools.Parameter):
"""The effective capillary suction according to the Brooks-Corey soil moisture
characteristic model :cite:p:`ref-Brooks1966` [mm]."""
NDIM, TYPE, TIME, SPAN = 1, float, None, (0.0, None)
CONTROLPARAMETERS = (ga_control.PoreSizeDistribution, ga_control.AirEntryPotential)
[docs]
def update(self) -> None:
r"""Calculate the effective capillary suction based on the current values of
|AirEntryPotential| and |PoreSizeDistribution|.
The used equation follows equation 13 of :cite:t:`ref-Lai2015` if setting the
initial equal to the residual water content:
:math:`EffectiveCapillarySuction = AirEntryPotential \cdot
\frac{3 \cdot PoreSizeDistribution + 2}{3 \cdot PoreSizeDistribution + 1}`
"""
control = self.subpars.pars.control
psd = control.poresizedistribution.values
aep = control.airentrypotential.values
self.values = aep * (3.0 * psd + 2.0) / (3.0 * psd + 1.0)