"""
The ``albedo`` module contains functions for modeling albedo.
"""
from pvlib.tools import sind
import numpy as np
import pandas as pd
# Sources of for the albedo values are provided in
# pvlib.irradiance.get_ground_diffuse.
SURFACE_ALBEDOS = {
'urban': 0.18,
'grass': 0.20,
'fresh grass': 0.26,
'soil': 0.17,
'sand': 0.40,
'snow': 0.65,
'fresh snow': 0.75,
'asphalt': 0.12,
'concrete': 0.30,
'aluminum': 0.85,
'copper': 0.74,
'fresh steel': 0.35,
'dirty steel': 0.08,
'sea': 0.06,
}
WATER_COLOR_COEFFS = {
'clear_water_no_waves': 0.13,
'clear_water_ripples_up_to_2.5cm': 0.16,
'clear_water_ripples_larger_than_2.5cm_occasional_whitecaps': 0.23,
'clear_water_frequent_whitecaps': 0.3,
'green_water_ripples_up_to_2.5cm': 0.22,
'muddy_water_no_waves': 0.19
}
WATER_ROUGHNESS_COEFFS = {
'clear_water_no_waves': 0.29,
'clear_water_ripples_up_to_2.5cm': 0.7,
'clear_water_ripples_larger_than_2.5cm_occasional_whitecaps': 1.25,
'clear_water_frequent_whitecaps': 2,
'green_water_ripples_up_to_2.5cm': 0.7,
'muddy_water_no_waves': 0.29
}
[docs]
def inland_water_dvoracek(solar_elevation, surface_condition=None,
color_coeff=None, wave_roughness_coeff=None):
r"""
Estimation of albedo for inland water bodies.
The available surface conditions are for inland water bodies, e.g., lakes
and ponds. For ocean/open sea, see
:py:const:`pvlib.albedo.SURFACE_ALBEDOS`.
Parameters
----------
solar_elevation : numeric
Sun elevation angle. [degrees]
surface_condition : string, optional
If supplied, overrides ``color_coeff`` and ``wave_roughness_coeff``.
``surface_condition`` can be one of the following:
* ``'clear_water_no_waves'``
* ``'clear_water_ripples_up_to_2.5cm'``
* ``'clear_water_ripples_larger_than_2.5cm_occasional_whitecaps'``
* ``'clear_water_frequent_whitecaps'``
* ``'green_water_ripples_up_to_2.5cm'``
* ``'muddy_water_no_waves'``
color_coeff : float, optional
Water color coefficient. [-]
wave_roughness_coeff : float, optional
Water wave roughness coefficient. [-]
Returns
-------
albedo : numeric
Albedo for inland water bodies. [-]
Raises
------
ValueError
If neither of ``surface_condition`` nor a combination of
``color_coeff`` and ``wave_roughness_coeff`` are given.
If ``surface_condition`` and any of ``color_coeff`` or
``wave_roughness_coeff`` are given. These parameters are
mutually exclusive.
KeyError
If ``surface_condition`` is invalid.
Notes
-----
The equation for calculating the albedo :math:`\rho` is given by
.. math::
:label: albedo
\rho = c^{(r \cdot \sin(\alpha) + 1)}
Inputs to the model are the water color coefficient :math:`c` [-], the
water wave roughness coefficient :math:`r` [-] and the solar elevation
:math:`\alpha` [degrees]. Parameters are provided in [1]_ , and are coded
for convenience in :data:`~pvlib.albedo.WATER_COLOR_COEFFS` and
:data:`~pvlib.albedo.WATER_ROUGHNESS_COEFFS`. The values of these
coefficients are experimentally determined.
+------------------------+-------------------+-------------------------+
| Surface and condition | Color coefficient | Wave roughness |
| | (:math:`c`) | coefficient (:math:`r`) |
+========================+===================+=========================+
| Clear water, no waves | 0.13 | 0.29 |
+------------------------+-------------------+-------------------------+
| Clear water, ripples | 0.16 | 0.70 |
| up to 2.5 cm | | |
+------------------------+-------------------+-------------------------+
| Clear water, ripples | 0.23 | 1.25 |
| larger than 2.5 cm | | |
| (occasional whitecaps) | | |
+------------------------+-------------------+-------------------------+
| Clear water, | 0.30 | 2.00 |
| frequent whitecaps | | |
+------------------------+-------------------+-------------------------+
| Green water, ripples | 0.22 | 0.70 |
| up to 2.5cm | | |
+------------------------+-------------------+-------------------------+
| Muddy water, no waves | 0.19 | 0.29 |
+------------------------+-------------------+-------------------------+
References
----------
.. [1] Dvoracek M.J., Hannabas B. (1990). "Prediction of albedo for use in
evapotranspiration and irrigation scheduling." IN: Visions of the Future
American Society of Agricultural Engineers 04-90: 692-699.
"""
if surface_condition is not None and (
color_coeff is None and wave_roughness_coeff is None
):
# use surface_condition
color_coeff = WATER_COLOR_COEFFS[surface_condition]
wave_roughness_coeff = WATER_ROUGHNESS_COEFFS[surface_condition]
elif surface_condition is None and not (
color_coeff is None or wave_roughness_coeff is None
):
# use provided color_coeff and wave_roughness_coeff
pass
else:
raise ValueError(
"Either a `surface_condition` has to be chosen or"
" a combination of `color_coeff` and"
" `wave_roughness_coeff`.")
solar_elevation_positive = np.where(solar_elevation < 0, 0,
solar_elevation)
albedo = color_coeff ** (wave_roughness_coeff *
sind(solar_elevation_positive) + 1)
if isinstance(solar_elevation, pd.Series):
albedo = pd.Series(albedo, index=solar_elevation.index)
return albedo