Spaces:
Runtime error
Runtime error
| 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 |