def estimate_fao56_daily(self, day_of_year, temp_c, temp_c_min, temp_c_max, tdew, elevation, latitude, rh, wind_m_s, atmos_pres): """ Estimate fao56 from weather """ sha = pyeto.sunset_hour_angle(pyeto.deg2rad(latitude), pyeto.sol_dec(day_of_year)) daylight_hours = pyeto.daylight_hours(sha) sunshine_hours = 0.8 * daylight_hours ird = pyeto.inv_rel_dist_earth_sun(day_of_year) et_rad = pyeto.et_rad(pyeto.deg2rad(latitude), pyeto.sol_dec(day_of_year), sha, ird) sol_rad = pyeto.sol_rad_from_sun_hours(daylight_hours, sunshine_hours, et_rad) net_in_sol_rad = pyeto.net_in_sol_rad(sol_rad=sol_rad, albedo=0.23) cs_rad = pyeto.cs_rad(elevation, et_rad) avp = pyeto.avp_from_tdew(tdew) net_out_lw_rad = pyeto.net_out_lw_rad( pyeto.convert.celsius2kelvin(temp_c_min), pyeto.convert.celsius2kelvin(temp_c_max), sol_rad, cs_rad, avp) net_rad = pyeto.net_rad(net_in_sol_rad, net_out_lw_rad) eto = pyeto.fao56_penman_monteith( net_rad=net_rad, t=pyeto.convert.celsius2kelvin(temp_c), ws=wind_m_s, svp=pyeto.svp_from_t(temp_c), avp=avp, delta_svp=pyeto.delta_svp(temp_c), psy=pyeto.psy_const(atmos_pres)) return eto
for j in range(0,len(Tmean["0"])): tmin=(Tmin["0"][j]) tmink=pyeto.celsius2kelvin(tmin) tmax=(Tmax["0"][j]) tmaxk=pyeto.celsius2kelvin(tmax) t=(Tmean["0"][j]) tk=pyeto.celsius2kelvin(t) rh_mean=(HR["0"][j]) ws=(VV["0"][j]) lat=pyeto.deg2rad(lat) day=day+1 sunshine_hours=(BS["0"][j]) #Radiacion neta sol_dec=pyeto.sol_dec(day) sha=pyeto.sunset_hour_angle(lat,sol_dec) daylight_hours=pyeto.daylight_hours(sha) ird=pyeto.inv_rel_dist_earth_sun(day) et_rad=pyeto.et_rad(lat, sol_dec, sha, ird) sol_rad=pyeto.sol_rad_from_sun_hours(daylight_hours,sunshine_hours,et_rad) ni_sw_rad=pyeto.net_in_sol_rad(sol_rad, albedo=0.23) cs_rad=pyeto.cs_rad(altitude, et_rad) svp_tmin=pyeto.svp_from_t(tmin) svp_tmax=pyeto.svp_from_t(tmax) avp=pyeto.avp_from_rhmean(svp_tmin, svp_tmax, rh_mean) no_lw_rad=pyeto.net_out_lw_rad(tmink, tmaxk, sol_rad, cs_rad, avp) net_rad=pyeto.net_rad(ni_sw_rad, no_lw_rad) #Presion de vapor de saturacion svp=pyeto.svp_from_t(t) #Delta presion de vapor de saturacion delta_svp=pyeto.delta_svp(t) #Constante psicrométrica
def etp_Thornthwaite(self, anosCalculoETP, inicioPlantioTuple): latitudeRad = deg2rad(self.estacao.latitude) temperaturaMensalAcc = np.array([]).reshape(0, 12) temperaturaDecendioAcc = np.array([]).reshape(12, 3, 0) ETPs = np.zeros([len(anosCalculoETP), 13, 4]) self.anosCalculo = anosCalculoETP # O ETP é calculado anualmente e o resultado final é a média desses cálculos # anosCalculoETP grava os anos selecionados pelo usuário para o cálculo do ETP if anosCalculoETP: for ano in anosCalculoETP: #ano = min(anosCalculoETP) ### Calcula medias mensais e decendiais de temperatura para um ano ### diaAtual = date(ano, 1, 1) temperaturaAcum = 0 temperaturaAcumMes = 0 diasNoDecendio = 0 diasNoMes = 0 temperaturaMensal = [] temperaturaDecendio = np.zeros((12, 3)) #final = date(min(anosCalculoETP)+1, inicioPlantioTuple[0], inicioPlantioTuple[1]) #print(anosCalculoETP) while (diaAtual.year == ano): #while (diaAtual.year in anosCalculoETP) and ((diaAtual)!=final): #print(diaAtual) if not np.isnan( self.dadosMeteorologicos['tmed'][diaAtual]): #print(self.dadosMeteorologicos['tmed'][diaAtual]) temperaturaAcum += self.dadosMeteorologicos['tmed'][ diaAtual] temperaturaAcumMes += self.dadosMeteorologicos['tmed'][ diaAtual] diasNoDecendio += 1 diasNoMes += 1 amanha = diaAtual + timedelta(days=1) #print(temperaturaAcum) if amanha.month != diaAtual.month: #print('trocou mes') #print(amanha.month) if diasNoMes > 0: # Corrigir temperaturas negativas temperaturaMensal.append(temperaturaAcumMes / diasNoMes * (temperaturaAcumMes >= 0)) else: temperaturaMensal.append(25) temperaturaAcumMes = 0 diasNoMes = 0 if amanha.day == 1 or amanha.day == 11 or amanha.day == 21: decendioAtual = calculosDecendiais.converterToDataDecendio( diaAtual) if diasNoDecendio > 0: temperaturaDecendio[ decendioAtual[0] - 1, decendioAtual[1] - 1] = (temperaturaAcum / diasNoDecendio) * (temperaturaAcum >= 0) else: temperaturaDecendio[decendioAtual[0] - 1, decendioAtual[1] - 1] = 25 temperaturaAcum = 0 diasNoDecendio = 0 #print(diaAtual) diaAtual = amanha ########### #print('temp Acumulada e temp Mensal') #print(temperaturaMensalAcc) #print(temperaturaDecendioAcc) temperaturaMensalAcc = np.vstack( (temperaturaMensalAcc, temperaturaMensal)) temperaturaDecendioAcc = np.dstack( (temperaturaDecendioAcc, temperaturaDecendio)) temperaturaMensalMedia = temperaturaMensal temperaturaDecendioMedia = temperaturaDecendio #print(temperaturaMensalAcc) #print(temperaturaDecendioAcc) #print(temperaturaMensalAcc) # Calcula o heat index a partir das temperaturas I = 0.0 for Tai in temperaturaMensalMedia: if Tai / 5.0 > 0.0: I += (Tai / 5.0)**1.514 a = (6.75e-07 * I**3) - (7.71e-05 * I**2) + (1.792e-02 * I) + 0.49239 #print(I) #print(a) horasDeSolAcum = 0 diasNoDecendio = 0 diaAtual = date(ano, 1, 1) while (diaAtual.year == ano): # Calcula o valor dos ETPs decendiais #while diaAtual.year == 2000: sd = sol_dec(int(diaAtual.strftime('%j'))) sha = sunset_hour_angle(latitudeRad, sd) horasDeSolAcum += daylight_hours(sha) idx = anosCalculoETP.index(ano) diasNoDecendio += 1 amanha = diaAtual + timedelta(days=1) if amanha.day == 1 or amanha.day == 11 or amanha.day == 21: horasDeSolMedia = horasDeSolAcum / diasNoDecendio decendioAtual = calculosDecendiais.converterToDataDecendio( diaAtual) #print(idx) #print(decendioAtual) #print(temperaturaDecendioMedia) ETPs[idx][decendioAtual] = 16 * ( horasDeSolMedia / 12.0) * (diasNoDecendio / 30.0) * ( (10.0 * temperaturaDecendioMedia[decendioAtual[0] - 1, decendioAtual[1] - 1] / I)**a) horasDeSolAcum = 0 diasNoDecendio = 0 diaAtual = amanha self.temperaturaMensalMedia = temperaturaMensalAcc return ETPs
def etp_Thornthwaite(self, anosCalculoETP): latitudeRad = deg2rad(self.estacao.latitude) temperaturaMensalAcc = np.array([]).reshape(0, 12) temperaturaDecendioAcc = np.array([]).reshape(12, 3, 0) ETPs = {} # O ETP é calculado anualmente e o resultado final é a média desses cálculos # anosCalculoETP grava os anos selecionados pelo usuário para o cálculo do ETP if anosCalculoETP: for ano in anosCalculoETP: ### Calcula medias mensais e decendiais de temperatura para um ano ### diaAtual = date(ano, 1, 1) temperaturaAcum = 0 temperaturaAcumMes = 0 diasNoDecendio = 0 diasNoMes = 0 temperaturaMensal = [] temperaturaDecendio = np.zeros((12, 3)) while diaAtual.year == ano: if self.dadosMeteorologicos['tmed'][diaAtual] is not None: temperaturaAcum += self.dadosMeteorologicos['tmed'][ diaAtual] temperaturaAcumMes += self.dadosMeteorologicos['tmed'][ diaAtual] diasNoDecendio += 1 diasNoMes += 1 amanha = diaAtual + timedelta(days=1) if amanha.month != diaAtual.month: if diasNoMes > 0: # Corrigir temperaturas negativas temperaturaMensal.append(temperaturaAcumMes / diasNoMes * (temperaturaAcumMes >= 0)) else: temperaturaMensal.append(25) temperaturaAcumMes = 0 diasNoMes = 0 if amanha.day == 1 or amanha.day == 11 or amanha.day == 21: decendioAtual = calculosDecendiais.converterToDataDecendio( diaAtual) if diasNoDecendio > 0: temperaturaDecendio[ decendioAtual[0] - 1, decendioAtual[1] - 1] = (temperaturaAcum / diasNoDecendio) * (temperaturaAcum >= 0) else: temperaturaDecendio[decendioAtual[0] - 1, decendioAtual[1] - 1] = 25 temperaturaAcum = 0 diasNoDecendio = 0 diaAtual = amanha ########### temperaturaMensalAcc = np.vstack( (temperaturaMensalAcc, temperaturaMensal)) temperaturaDecendioAcc = np.dstack( (temperaturaDecendioAcc, temperaturaDecendio)) temperaturaMensalMedia = np.mean(temperaturaMensalAcc, axis=0) temperaturaDecendioMedia = np.mean(temperaturaDecendioAcc, axis=2) # Calcula o heat index a partir das temperaturas self.temperaturaMensalMedia = temperaturaMensalMedia I = 0.0 for Tai in temperaturaMensalMedia: if Tai / 5.0 > 0.0: I += (Tai / 5.0)**1.514 a = (6.75e-07 * I**3) - (7.71e-05 * I**2) + (1.792e-02 * I) + 0.49239 diaAtual = date(2000, 1, 1) horasDeSolAcum = 0 diasNoDecendio = 0 # Calcula o valor dos ETPs decendiais while diaAtual.year == 2000: sd = sol_dec(int(diaAtual.strftime('%j'))) sha = sunset_hour_angle(latitudeRad, sd) horasDeSolAcum += daylight_hours(sha) diasNoDecendio += 1 amanha = diaAtual + timedelta(days=1) if amanha.day == 1 or amanha.day == 11 or amanha.day == 21: horasDeSolMedia = horasDeSolAcum / diasNoDecendio decendioAtual = calculosDecendiais.converterToDataDecendio( diaAtual) ETPs[decendioAtual] = 1.6 * (horasDeSolMedia / 12.0) * ( diasNoDecendio / 30.0) * ( (10.0 * temperaturaDecendioMedia[decendioAtual[0] - 1, decendioAtual[1] - 1] / I)**a) * 10.0 horasDeSolAcum = 0 diasNoDecendio = 0 diaAtual = amanha return ETPs
def calculate_precipitation(self, d): if "rain" in d: self.rain_day = float(d["rain"]) if "snow" in d: self.snow_day = float(d["snow"]) # def calculate_ev_fao56_factor(self, d): dt = d['dt'] factor = 0.0 if dt > d['sunrise']: if dt < d['sunset']: factor = min(float(dt - d['sunrise'])/3600.0, 1.0) else: if dt > d['sunset']: factor = (dt - d['sunrise'])/3600.0 if factor < 1.0: factor = 1.0 - factor return factor #def estimate_fao56_hourly(self, day_of_year, temp_c, tdew, elevation, latitude, rh, wind_m_s, atmos_pres): """ Estimate fao56 from weather """ sha = pyeto.sunset_hour_angle(pyeto.deg2rad(latitude), pyeto.sol_dec(day_of_year)) daylight_hours = pyeto.daylight_hours(sha) sunshine_hours = 0.8 * daylight_hours ird = pyeto.inv_rel_dist_earth_sun(day_of_year) et_rad = pyeto.et_rad(pyeto.deg2rad(latitude), pyeto.sol_dec(day_of_year), sha, ird) sol_rad = pyeto.sol_rad_from_sun_hours(daylight_hours, sunshine_hours, et_rad) net_in_sol_rad = pyeto.net_in_sol_rad(sol_rad=sol_rad, albedo=0.23) cs_rad = pyeto.cs_rad(elevation, et_rad) avp = pyeto.avp_from_tdew(tdew) #not sure if I trust this net_out_lw_rad calculation here! net_out_lw_rad = pyeto.net_out_lw_rad(temp_c-1, temp_c, sol_rad, cs_rad, avp) net_rad = pyeto.net_rad(net_in_sol_rad, net_out_lw_rad) eto = pyeto.fao56_penman_monteith( net_rad=net_rad, t=pyeto.convert.celsius2kelvin(temp_c), ws=wind_m_s, svp=pyeto.svp_from_t(temp_c), avp=avp, delta_svp=pyeto.delta_svp(temp_c), psy=pyeto.psy_const(atmos_pres)) return eto #def calculate_fao56_hourly(self, d): day_of_year = datetime.datetime.now().timetuple().tm_yday T_hr = d['temp'] t_dew = float(d["dew_point"]) pressure = d['pressure'] RH_hr = d['humidity'] u_2 = d['wind_speed'] #print("CALCULATE_FAO56:") #print("T_hr: {}".format(T_hr)) #print("t_dew: {}".format(t_dew)) #print("RH_hr: {}".format(RH_hr)) #print("u_2: {}".format(u_2)) #print("pressure: {}".format(pressure)) fao56 = self.estimate_fao56_hourly(day_of_year, T_hr, t_dew, self.elevation, LAT, RH_hr, u_2, pressure) return fao56
def test_daylight_hours(self): # Test based on example 9, p.83 of FAO paper dh = pyeto.daylight_hours(1.527) self.assertAlmostEqual(dh, 11.7, 1)