gaia / docs /agro_indicators.py
mohamed.tsouli
add function compute et0
6a1c12b
import numpy as np
from pvlib.location import lookup_altitude
from docs.pyeto import fao
def et0(irradiance, T, Tmax, Tmin, RHmin, RHmax, WS, JJulien, latitude, longitude):
"""
Calculate the daily reference evapotranspiration [ml/day] w.r.t. Penman-Monteith formula.
Parameters
----------
irradiance : array_like
Daily global horizontal irradiance [MJ/m2/day].
T : array_like
Mean daily air temperature at 2 m height [deg Celsius].
Tmax : array_like
Maximum air temperature at 2 m height [deg Celsius].
Tmin : array_like
Minimum air temperature at 2 m height [deg Celsius].
RHmin : array_like
Minimum daily relative humidity [%].
RHmax : array_like
Maximum daily relative humidity [%].
WS : array_like
Wind speed at 10 m height [m s-1].
JJulien : array_like
Julian day.
latitude : array_like
Latitude in °.
longitude : array_like
Longitude in °.
Returns
-------
array_like
Reference evapotranspiration (ETo) from a hypothetical grass reference surface [mm day-1].
"""
latRad = (latitude * np.pi) / 180
### VPD, SVP
svp_tmax = fao.svp_from_t(Tmax)
svp_tmin = fao.svp_from_t(Tmin)
svp = fao.svp_from_t(T)
avp = fao.avp_from_rhmin_rhmax(svp_tmin, svp_tmax, RHmin, RHmax)
delta_svp = fao.delta_svp(T)
### IR
#sol_rad = irradiance * 36 / 10000 #Conversion W/m2 en MJ/m2/day
sol_rad = irradiance
### Radiation Nette
sol_dec = fao.sol_dec(JJulien)
sunset_hour_angle = fao.sunset_hour_angle(latRad, sol_dec)
inv_dist_earth_sun = fao.inv_rel_dist_earth_sun(JJulien)
et_rad = fao.et_rad(latRad, sol_dec, sunset_hour_angle, inv_dist_earth_sun)
T_kelvin = T + 273.15
Tmin_kelvin = Tmin + 273.15
Tmax_kelvin = Tmax + 273.15
altitude = np.array(lookup_altitude(latitude, longitude))
cs_rad = fao.cs_rad(altitude, et_rad)
net_out_lw_rad = fao.net_out_lw_rad(Tmin_kelvin, Tmax_kelvin, sol_rad, cs_rad, avp)
net_in_sol_rad = fao.net_in_sol_rad(sol_rad, 0.2)
net_rad = fao.net_rad(net_in_sol_rad, net_out_lw_rad)
atm_pressure = fao.atm_pressure(altitude)
psy = fao.psy_const_of_psychrometer(2, atm_pressure)
ws_2m = fao.wind_speed_2m(WS, 10)
et0 = fao.fao56_penman_monteith(net_rad, T_kelvin, ws_2m, svp, avp, delta_svp, psy)
return et0
def gdd(Tmin, Tmax, Tbase):
"""
Calculate the Growing Degree Days [Degrees Celsius].
Parameters
----------
Tmax : float or numpy array
Maximum daily air temperature [deg Celsius].
Tmin : float or numpy array
Minimum daily air temperature [deg Celsius].
Tbase : float or numpy array
Base crop temperature (corresponding to zero vegetation) [deg Celsius].
Returns
-------
float
Growing Degree Days [deg Celsius].
"""
return ((Tmax + Tmin) / 2) - Tbase
def gelif(Tmin, Tfrost):
"""
Define if the day is a frosting day.
Parameters
----------
Tmin : float or numpy array
Minimum daily air temperature [deg Celsius].
Tfrost : float
Crop frost temperature (depends on the crop and phenophase) [deg Celsius].
Returns
-------
bool
True if it's a frosting day, else False.
"""
if Tmin > Tfrost:
is_forst = False
elif Tmin <= Tfrost:
is_forst = True
return is_forst
def vpd(T, RH):
"""
Compute deficit vapor pressure.
Parameters
----------
T : float or numpy array
Mean timestep air temperature [deg Celsius].
RH : float or numpy array
Mean timestep relative humidity [unitless %].
Returns
-------
float or numpy array
Vapor pressure deficit (VPD).
"""
VPS = 0.6108 * np.exp((17.27 * T) / (T + 237.3))
VPD = VPS * (1 - RH / 100)
return VPD