HydPy-Meteo-Glob-FAO56 (global radiation estimation adopted from FAO56)

meteo_glob_fao56 follows the guideline provided by Allen et al. (1998). There are a few differences, but, at least for the following example calculations, they seem to be of minor importance. See the documentation on the individual methods for more detailed information.

meteo_glob_fao56 is tested for daily and hourly simulation time steps. We are confident that it also works fine for steps shorter than one hour. Applying it on step sizes longer one day or between one hour and one day is not advisable (your contributions to extend its applicability are welcome, of course). There is also a geographic restriction due to the calculation of the longwave radiation, which fails during polar nights (again, contributions are welcome).

Integration tests

Note

When new to HydPy, consider reading section Integration Tests first.

Application model meteo_glob_fao56 calculates multiple meteorological factors hydrological models could require. Many require GlobalRadiation for calculating net shortwave radiation. Some also require PossibleSunshineDuration or ClearSkySolarRadiation to guess cloudiness for calculating net longwave radiation. Here, we select GlobalRadiation and ClearSkySolarRadiation by importing their globally available aliases, which we hand over to the Node instances node1 and node2:

>>> from hydpy import Element, Node
>>> from hydpy.aliases import meteo_fluxes_GlobalRadiation, meteo_fluxes_ClearSkySolarRadiation
>>> node1 = Node("node1", variable=meteo_fluxes_GlobalRadiation)
>>> node2 = Node("node2", variable=meteo_fluxes_ClearSkySolarRadiation)

Now, we can prepare an instance of meteo_glob_fao56 and assign it to an element connected to the prepared nodes:

>>> from hydpy.models.meteo_glob_fao56 import *
>>> parameterstep()
>>> element = Element("element", outputs=(node1, node2))
>>> element.model = model

daily simulation

The first example deals with a daily simulation time step. We calculate the radiation terms on 6 July in Uccle (Brussels, Belgium) and take all input data from example 18 of Allen et al. (1998):

>>> from hydpy import IntegrationTest, pub, round_
>>> pub.timegrids = "2000-07-06", "2000-07-07", "1d"
>>> latitude(50.8)
>>> angstromconstant(0.25)
>>> angstromfactor(0.5)
>>> parameters.update()
>>> test = IntegrationTest(element)
>>> test.dateformat = "%Y-%d-%m"
>>> inputs.sunshineduration.series = 9.25

Both for GlobalRadiation and ClearSkySolarRadiation, the differences to the results given by Allen et al. (1998) are significantly less than 1 %:

>>> test()
Click to see the table

All getters specified by the RadiationModel_V1 interface return the correct data:

>>> round_(model.get_possiblesunshineduration())
16.093247
>>> round_(model.get_sunshineduration())
9.25
>>> round_(model.get_clearskysolarradiation())
356.40121
>>> round_(model.get_globalradiation())
255.367464

hourly simulation

The second example deals with an hourly simulation over multiple time steps. We calculate the different radiation terms from 30 September to 1 October in N’Diaye (Senegal) and take (or try to derive as well as possible) all parameter and input values from example 19 of Allen et al. (1998).

Example 19 of Allen et al. (1998) gives results for the intervals between 2 and 3 o’clock and between 14 and 15 o’clock only. We assume these clock times refer to UTC-1:

>>> pub.options.utcoffset = -60
>>> pub.options.utclongitude = -15
>>> pub.timegrids = "2001-09-30 02:00", "2001-10-01 15:00", "1h"
>>> latitude(16.0 + 0.13 / 60 * 100)
>>> longitude(-16.25)

We reuse the Ångström coefficients from the first example:

>>> angstromconstant(0.25)
>>> angstromfactor(0.5)
>>> parameters.update()
>>> test = IntegrationTest(element)
>>> test.dateformat = "%Y-%d-%m %H:00"

We set the sunshine duration constant at 80 % during the first daytime period and let it linearly increase from 82 % to 88 % in the (incomplete) second daytime period. The exceedance of the potential sunshine duration during both sunsets does not affect the results negatively. At the end of the simulation period, the given sunshine duration of 88 % corresponds to a ratio of global radiation and clear sky radiation of approximately 0.92, which is an intermediate result of Allen et al. (1998):

>>> import numpy
>>> inputs.sunshineduration.series = 0.0
>>> inputs.sunshineduration.series[3:16] = 0.8
>>> inputs.sunshineduration.series[27:] = numpy.linspace(0.82, 0.88, 10)

Again, the calculated GlobalRadiation and ClearSkySolarRadiation differ significantly less than 1 % from the results given by Allen et al. (1998):

>>> test("meteo_glob_fao56_hourly",
...      axis1=(fluxes.globalradiation, fluxes.clearskysolarradiation))
Click to see the table
Click to see the graph
class hydpy.models.meteo_glob_fao56.Model[source]

Bases: AdHocModel, RadiationModel_V1

HydPy-Meteo-Glob-FAO56 (global radiation estimation adopted from FAO56).

The following “run methods” are called in the given sequence during each simulation step:
The following interface methods are available to main models using the defined model as a submodel:
DOCNAME: DocName = ('Meteo-Glob-FAO56', 'global radiation estimation adopted from FAO56')
REUSABLE_METHODS: ClassVar[tuple[type[ReusableMethod], ...]] = (<class 'hydpy.models.meteo.meteo_model.Process_Radiation_V1'>,)
class hydpy.models.meteo_glob_fao56.ControlParameters(master: Parameters, cls_fastaccess: type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)

Bases: SubParameters

Control parameters of model meteo_glob_fao56.

The following classes are selected:
class hydpy.models.meteo_glob_fao56.DerivedParameters(master: Parameters, cls_fastaccess: type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)

Bases: SubParameters

Derived parameters of model meteo_glob_fao56.

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

  • MOY() References the “global” month of the year index array [-].

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

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

  • SCT() References the “global” standard clock time array [h].

  • UTCLongitude() Longitude of the centre of the local time zone [°].

  • LatitudeRad() The latitude [rad].

class hydpy.models.meteo_glob_fao56.FactorSequences(master: Sequences, cls_fastaccess: type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)

Bases: FactorSequences

Factor sequences of model meteo_glob_fao56.

The following classes are selected:
class hydpy.models.meteo_glob_fao56.FixedParameters(master: Parameters, cls_fastaccess: type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)

Bases: SubParameters

Fixed parameters of model meteo_glob_fao56.

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

Bases: FluxSequences

Flux sequences of model meteo_glob_fao56.

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

Bases: InputSequences

Input sequences of model meteo_glob_fao56.

The following classes are selected: