Esempio n. 1
0
 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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
 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)
Esempio n. 7
0
 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)