예제 #1
0
        def preSemeio(diaAtual, varDiaAnterior):
            varDiaAtual = VariaveisBalHidrico(
                self.parametros)  # Receber parametros

            # Calcula ETP em funcao de decendios
            varDiaAtual['ETP'] = self.calcularETP(diaAtual)
            varDiaAtual['Hr'] = varDiaAnterior['Hr']
            varDiaAtual['Kc'] = varDiaAnterior['Kc']

            #Calcula escoamento superficial em funcao da agua em excesso que entrou no sistema
            (varDiaAtual['Esc'],
             varDiaAtual['ik']) = self.calcularEsc(diaAtual, varDiaAnterior)
            # Calcula Apport como precipitação + irrigação - escoamento superficial
            varDiaAtual['Apport'] = self.calcularApport(
                diaAtual, varDiaAtual['Esc'])

            # Calcula evapotranspiracao maxima como mulch vezes a evapotranspiração potencial
            varDiaAtual['Etm'] = self.calcularEps(varDiaAtual['ETP'])
            #varDiaAtual['Eps'] = 0 #REDUNDANTE
            #varDiaAtual['Epc'] = 0 #REDUNDANTE

            # St reserva util superficial como o minimo entre valor calculado e tabelado
            varDiaAtual['StRuSurf'] = min(
                varDiaAnterior['StRuSurf'] + varDiaAtual['Apport'],
                self.parametros.RUSURF)
            # EVS recebe o minimo entre valor de St Reserva Util e seu valor calculado a partir da evapotranspiracao maxima
            varDiaAtual['Evs'] = min(
                varDiaAtual['Etm'] * varDiaAtual['StRuSurf'] /
                self.parametros.RUSURF, varDiaAtual['StRuSurf'])
            varDiaAtual['Etr'] = varDiaAtual[
                'Evs']  # Evapotranspiracao REAL eh encontrada por EVS

            # StRu eh ele antigo + apport ou o valor maximo de RU, DR representa a lamina de irrigacao, HUM o maior valor entre StRu e DR
            (varDiaAtual['StRu'], varDiaAtual['Hum'],
             varDiaAtual['Dr']) = self.rempliRu(varDiaAtual['Apport'],
                                                varDiaAnterior['StRu'],
                                                varDiaAnterior['Hum'])

            varDiaAtual['StRu'] = max(varDiaAtual['StRu'] - varDiaAtual['Etr'],
                                      0)  # Diminuir ETR de StRU
            varDiaAtual['StRuSurf'] = max(
                varDiaAtual['StRuSurf'] - varDiaAtual['Etr'],
                0)  # Diminuir ETR de StRU superficial

            # Atualizando valores
            varDiaAtual['Vrad'] = varDiaAnterior['Vrad']
            varDiaAtual['StRur'] = varDiaAnterior['StRur']
            varDiaAtual['StRurMax'] = varDiaAnterior['StRurMax']
            varDiaAtual['TP'] = varDiaAnterior['TP']
            varDiaAtual['EtrEtm'] = 100 * varDiaAtual['Etr'] / varDiaAtual[
                'Etm']  # ISNA esta feito em porcentagem

            return varDiaAtual
예제 #2
0
        def posColheita(diaAtual, varDiaAnterior):
            # Inicializa HUM e St RU com valores do estoque, Kc é 1 e o resto comeca em zero
            varDiaAtual = VariaveisBalHidrico(self.parametros)

            varDiaAtual['ETP'] = self.calcularETP(
                diaAtual)  # Calculo por decendio
            varDiaAtual['Hr'] = 0
            varDiaAtual['Kc'] = 1

            (varDiaAtual['Esc'], varDiaAtual['ik']) = self.calcularEsc(
                diaAtual,
                varDiaAnterior)  # Agua atual em excesso que entrou no sistema
            varDiaAtual['Apport'] = self.calcularApport(
                diaAtual, varDiaAtual['Esc']
            )  # precipitacao + irrigacao - escoamento superficial

            varDiaAtual['Etm'] = self.calcularEps(
                varDiaAtual['ETP'])  # mulch * ETP
            varDiaAtual['Epc'] = 0

            # Calculo de STRUSURF tem que ser menor do que a tabela
            varDiaAtual['StRuSurf'] = min(
                varDiaAnterior['StRuSurf'] + varDiaAtual['Apport'],
                self.parametros.RUSURF)
            # Calculo de EVS tem que ser menor que St reserva util superficial
            varDiaAtual['Evs'] = min(
                varDiaAtual['Etm'] * varDiaAtual['StRuSurf'] /
                self.parametros.RUSURF, varDiaAtual['StRuSurf'])
            varDiaAtual['Etr'] = varDiaAtual['Evs']

            # StRU eh atualizado ao somar Apport, Dr recebe a diferenca dele para a tabela de RU e ele recebe o valor tabelado (se ele for maior)
            #HUM contem sempre o maior valor de reserva util ate o momento
            (varDiaAtual['StRu'], varDiaAtual['Hum'],
             varDiaAtual['Dr']) = self.rempliRu(varDiaAtual['Apport'],
                                                varDiaAnterior['StRu'],
                                                varDiaAnterior['Hum'])

            varDiaAtual['StRu'] = max(varDiaAtual['StRu'] - varDiaAtual['Etr'],
                                      0)  # Subtrai ETR
            varDiaAtual['StRuSurf'] = max(varDiaAtual['StRuSurf'] -
                                          varDiaAtual['Etr'], 0)  # Subtrai ETR
            varDiaAtual['Eps'] = 0
            varDiaAtual['Vrad'] = 0
            varDiaAtual['StRur'] = varDiaAnterior['StRur']
            varDiaAtual['StRurMax'] = varDiaAnterior['StRurMax']
            varDiaAtual['TP'] = varDiaAnterior['TP']
            varDiaAtual['EtrEtm'] = 100 * varDiaAtual['Etr'] / varDiaAtual[
                'Etm']  # Calculo do ISNA

            return varDiaAtual
예제 #3
0
        def posColheita(diaAtual, varDiaAnterior):
            varDiaAtual = VariaveisBalHidrico(self.parametros)

            varDiaAtual['ETP'] = self.calcularETP(diaAtual)
            varDiaAtual['Hr'] = 0
            varDiaAtual['Kc'] = 1

            varDiaAtual['Esc'] = self.calcularEsc(diaAtual)
            varDiaAtual['Apport'] = self.calcularApport(
                diaAtual, varDiaAtual['Esc'])

            varDiaAtual['Etm'] = self.calcularEps(varDiaAtual['ETP'])
            varDiaAtual['Epc'] = 0

            varDiaAtual['StRuSurf'] = min(
                varDiaAnterior['StRuSurf'] + varDiaAtual['Apport'],
                self.parametros.RUSURF)
            varDiaAtual['Evs'] = min(
                varDiaAtual['Etm'] * varDiaAtual['StRuSurf'] /
                self.parametros.RUSURF, varDiaAtual['StRuSurf'])
            varDiaAtual['Etr'] = varDiaAtual['Evs']

            (varDiaAtual['StRu'], varDiaAtual['Hum'],
             varDiaAtual['Dr']) = self.rempliRu(varDiaAtual['Apport'],
                                                varDiaAnterior['StRu'],
                                                varDiaAnterior['Hum'])

            varDiaAtual['StRu'] = max(varDiaAtual['StRu'] - varDiaAtual['Etr'],
                                      0)
            varDiaAtual['StRuSurf'] = max(
                varDiaAtual['StRuSurf'] - varDiaAtual['Etr'], 0)
            varDiaAtual['Eps'] = 0
            varDiaAtual['Vrad'] = 0
            varDiaAtual['StRur'] = varDiaAnterior['StRur']
            varDiaAtual['StRurMax'] = varDiaAnterior['StRurMax']
            varDiaAtual['TP'] = varDiaAnterior['TP']
            varDiaAtual[
                'EtrEtm'] = 100 * varDiaAtual['Etr'] / varDiaAtual['Etm']

            return varDiaAtual
예제 #4
0
        def fasesFenologicas(diaAtual, varDiaAnterior, inicioPlantio):
            # Inicializa HUM e St RU com valores do estoque, Kc é 1 e o resto comeca em zero
            varDiaAtual = VariaveisBalHidrico(self.parametros)

            ## Agora as outras variaveis sao determinadas pelas funcoes ja vistas
            varDiaAtual['ETP'] = self.calcularETP(
                diaAtual)  # decendio para diario
            (varDiaAtual['Esc'], varDiaAtual['ik']) = self.calcularEsc(
                diaAtual, varDiaAnterior)  # funcao da agua em excesso
            varDiaAtual['Apport'] = self.calcularApport(
                diaAtual, varDiaAtual['Esc']
            )  # funcao da precipitacao, irrigacao e escoamento
            if self.cultura.tipoKc == 1:
                varDiaAtual['Kc'] = self.calcularKc(
                    diaAtual, inicioPlantio
                )  # Calculado para o dia especifico, com aproximacoes de dados fornecidos
            varDiaAtual['Eps'] = self.calcularEps(
                varDiaAtual['ETP'])  # mulch * ETP atual
            varDiaAtual['Etm'] = varDiaAtual['Eps']

            varDiaAtual['StRuSurf'] = min(
                varDiaAnterior['StRuSurf'] + varDiaAtual['Apport'],
                self.parametros.RUSURF)
            varDiaAtual['Evs'] = min(
                varDiaAtual['Eps'] * varDiaAtual['StRuSurf'] /
                self.parametros.RUSURF, varDiaAtual['StRuSurf'])
            varDiaAtual['Etr'] = varDiaAtual['Evs']

            # StRU eh atualizado ao somar Apport, Dr recebe a diferenca dele para a tabela de RU e ele recebe o valor tabelado (se ele for maior)
            # HUM contem sempre o maior valor de reserva util ate o momento
            (varDiaAtual['StRu'], varDiaAtual['Hum'],
             varDiaAtual['Dr']) = self.rempliRu(varDiaAtual['Apport'],
                                                varDiaAnterior['StRu'],
                                                varDiaAnterior['Hum'])

            if diaAtual == inicioPlantio:  #Inicializacao
                varDiaAtual['Vrad'] = varDiaAnterior['Vrad']
                varDiaAtual['StRurMax'] = varDiaAnterior['StRurMax']
                varDiaAtual['Hr'] = varDiaAnterior['Hr']
                varDiaAtual['Epc'] = 0
                varDiaAtual['TP'] = varDiaAnterior['TP']
                varDiaAtual['StRur'] = varDiaAnterior['StRur']
            else:
                # Vrad eh proporcao de HUM para StRUR máximo sobre o valor tabelado, deltaRUR eh um decimo disso (1 dia do decendio)
                (varDiaAtual['Vrad'],
                 deltaRur) = self.calcularVrad(varDiaAtual['Hum'],
                                               varDiaAnterior['StRurMax'])
                varDiaAtual['StRurMax'] = varDiaAnterior[
                    'StRurMax'] + deltaRur  # Atualiza valor do dia a partir de dados decendiais
                # StRUR eh calculado, mas nao pode ultrapassar StRUR máximo nem StRU
                varDiaAtual['StRur'] = min(
                    varDiaAnterior['StRur'] + varDiaAtual['Apport'] + deltaRur,
                    varDiaAtual['StRurMax'], varDiaAtual['StRu'])
                varDiaAtual['Hr'] = self.calcularHr(
                    varDiaAtual['StRur'], varDiaAtual['StRurMax']
                )  # umidade relativa = StRUR/StRURMaximo

                varDiaAtual['Epc'] = varDiaAtual['Kc'] * varDiaAtual[
                    'ETP']  # Evapotranspiracao de Cultura (nao leva em conta restricao hidrica)
                # Calculos fixos e algumas duvidas
                (varDiaAtual['Etr'], varDiaAtual['Etm'],
                 varDiaAtual['TP']) = self.calcularEtrEtm(
                     varDiaAtual['Epc'], varDiaAtual['ETP'], varDiaAtual['Hr'],
                     varDiaAtual['Evs'], varDiaAtual['StRur'],
                     varDiaAtual['Etm'])

                varDiaAtual['Eps'] = varDiaAtual['StRurMax'] - varDiaAtual[
                    'StRur']  #O QUE EH EPS?
                varDiaAtual['StRur'] = max(varDiaAtual['StRur'] -
                                           varDiaAtual['Etr'],
                                           0)  # Subtrai ETR

            varDiaAtual['StRuSurf'] = max(varDiaAtual['StRuSurf'] -
                                          varDiaAtual['Etr'], 0)  # Subtrai ETR
            varDiaAtual['StRu'] = max(varDiaAtual['StRu'] - varDiaAtual['Etr'],
                                      0)  # Subtrai ETR
            varDiaAtual['EtrEtm'] = 100 * varDiaAtual['Etr'] / varDiaAtual[
                'Etm']  # Calculo do ISNA

            return varDiaAtual
예제 #5
0
    def simularBalancoHidrico(self, inicioSimulTuple, inicioPlantioTuple):
        def preSemeio(diaAtual, varDiaAnterior):
            varDiaAtual = VariaveisBalHidrico(
                self.parametros)  # Receber parametros

            # Calcula ETP em funcao de decendios
            varDiaAtual['ETP'] = self.calcularETP(diaAtual)
            varDiaAtual['Hr'] = varDiaAnterior['Hr']
            varDiaAtual['Kc'] = varDiaAnterior['Kc']

            #Calcula escoamento superficial em funcao da agua em excesso que entrou no sistema
            (varDiaAtual['Esc'],
             varDiaAtual['ik']) = self.calcularEsc(diaAtual, varDiaAnterior)
            # Calcula Apport como precipitação + irrigação - escoamento superficial
            varDiaAtual['Apport'] = self.calcularApport(
                diaAtual, varDiaAtual['Esc'])

            # Calcula evapotranspiracao maxima como mulch vezes a evapotranspiração potencial
            varDiaAtual['Etm'] = self.calcularEps(varDiaAtual['ETP'])
            #varDiaAtual['Eps'] = 0 #REDUNDANTE
            #varDiaAtual['Epc'] = 0 #REDUNDANTE

            # St reserva util superficial como o minimo entre valor calculado e tabelado
            varDiaAtual['StRuSurf'] = min(
                varDiaAnterior['StRuSurf'] + varDiaAtual['Apport'],
                self.parametros.RUSURF)
            # EVS recebe o minimo entre valor de St Reserva Util e seu valor calculado a partir da evapotranspiracao maxima
            varDiaAtual['Evs'] = min(
                varDiaAtual['Etm'] * varDiaAtual['StRuSurf'] /
                self.parametros.RUSURF, varDiaAtual['StRuSurf'])
            varDiaAtual['Etr'] = varDiaAtual[
                'Evs']  # Evapotranspiracao REAL eh encontrada por EVS

            # StRu eh ele antigo + apport ou o valor maximo de RU, DR representa a lamina de irrigacao, HUM o maior valor entre StRu e DR
            (varDiaAtual['StRu'], varDiaAtual['Hum'],
             varDiaAtual['Dr']) = self.rempliRu(varDiaAtual['Apport'],
                                                varDiaAnterior['StRu'],
                                                varDiaAnterior['Hum'])

            varDiaAtual['StRu'] = max(varDiaAtual['StRu'] - varDiaAtual['Etr'],
                                      0)  # Diminuir ETR de StRU
            varDiaAtual['StRuSurf'] = max(
                varDiaAtual['StRuSurf'] - varDiaAtual['Etr'],
                0)  # Diminuir ETR de StRU superficial

            # Atualizando valores
            varDiaAtual['Vrad'] = varDiaAnterior['Vrad']
            varDiaAtual['StRur'] = varDiaAnterior['StRur']
            varDiaAtual['StRurMax'] = varDiaAnterior['StRurMax']
            varDiaAtual['TP'] = varDiaAnterior['TP']
            varDiaAtual['EtrEtm'] = 100 * varDiaAtual['Etr'] / varDiaAtual[
                'Etm']  # ISNA esta feito em porcentagem

            return varDiaAtual

        def fasesFenologicas(diaAtual, varDiaAnterior, inicioPlantio):
            # Inicializa HUM e St RU com valores do estoque, Kc é 1 e o resto comeca em zero
            varDiaAtual = VariaveisBalHidrico(self.parametros)

            ## Agora as outras variaveis sao determinadas pelas funcoes ja vistas
            varDiaAtual['ETP'] = self.calcularETP(
                diaAtual)  # decendio para diario
            (varDiaAtual['Esc'], varDiaAtual['ik']) = self.calcularEsc(
                diaAtual, varDiaAnterior)  # funcao da agua em excesso
            varDiaAtual['Apport'] = self.calcularApport(
                diaAtual, varDiaAtual['Esc']
            )  # funcao da precipitacao, irrigacao e escoamento
            if self.cultura.tipoKc == 1:
                varDiaAtual['Kc'] = self.calcularKc(
                    diaAtual, inicioPlantio
                )  # Calculado para o dia especifico, com aproximacoes de dados fornecidos
            varDiaAtual['Eps'] = self.calcularEps(
                varDiaAtual['ETP'])  # mulch * ETP atual
            varDiaAtual['Etm'] = varDiaAtual['Eps']

            varDiaAtual['StRuSurf'] = min(
                varDiaAnterior['StRuSurf'] + varDiaAtual['Apport'],
                self.parametros.RUSURF)
            varDiaAtual['Evs'] = min(
                varDiaAtual['Eps'] * varDiaAtual['StRuSurf'] /
                self.parametros.RUSURF, varDiaAtual['StRuSurf'])
            varDiaAtual['Etr'] = varDiaAtual['Evs']

            # StRU eh atualizado ao somar Apport, Dr recebe a diferenca dele para a tabela de RU e ele recebe o valor tabelado (se ele for maior)
            # HUM contem sempre o maior valor de reserva util ate o momento
            (varDiaAtual['StRu'], varDiaAtual['Hum'],
             varDiaAtual['Dr']) = self.rempliRu(varDiaAtual['Apport'],
                                                varDiaAnterior['StRu'],
                                                varDiaAnterior['Hum'])

            if diaAtual == inicioPlantio:  #Inicializacao
                varDiaAtual['Vrad'] = varDiaAnterior['Vrad']
                varDiaAtual['StRurMax'] = varDiaAnterior['StRurMax']
                varDiaAtual['Hr'] = varDiaAnterior['Hr']
                varDiaAtual['Epc'] = 0
                varDiaAtual['TP'] = varDiaAnterior['TP']
                varDiaAtual['StRur'] = varDiaAnterior['StRur']
            else:
                # Vrad eh proporcao de HUM para StRUR máximo sobre o valor tabelado, deltaRUR eh um decimo disso (1 dia do decendio)
                (varDiaAtual['Vrad'],
                 deltaRur) = self.calcularVrad(varDiaAtual['Hum'],
                                               varDiaAnterior['StRurMax'])
                varDiaAtual['StRurMax'] = varDiaAnterior[
                    'StRurMax'] + deltaRur  # Atualiza valor do dia a partir de dados decendiais
                # StRUR eh calculado, mas nao pode ultrapassar StRUR máximo nem StRU
                varDiaAtual['StRur'] = min(
                    varDiaAnterior['StRur'] + varDiaAtual['Apport'] + deltaRur,
                    varDiaAtual['StRurMax'], varDiaAtual['StRu'])
                varDiaAtual['Hr'] = self.calcularHr(
                    varDiaAtual['StRur'], varDiaAtual['StRurMax']
                )  # umidade relativa = StRUR/StRURMaximo

                varDiaAtual['Epc'] = varDiaAtual['Kc'] * varDiaAtual[
                    'ETP']  # Evapotranspiracao de Cultura (nao leva em conta restricao hidrica)
                # Calculos fixos e algumas duvidas
                (varDiaAtual['Etr'], varDiaAtual['Etm'],
                 varDiaAtual['TP']) = self.calcularEtrEtm(
                     varDiaAtual['Epc'], varDiaAtual['ETP'], varDiaAtual['Hr'],
                     varDiaAtual['Evs'], varDiaAtual['StRur'],
                     varDiaAtual['Etm'])

                varDiaAtual['Eps'] = varDiaAtual['StRurMax'] - varDiaAtual[
                    'StRur']  #O QUE EH EPS?
                varDiaAtual['StRur'] = max(varDiaAtual['StRur'] -
                                           varDiaAtual['Etr'],
                                           0)  # Subtrai ETR

            varDiaAtual['StRuSurf'] = max(varDiaAtual['StRuSurf'] -
                                          varDiaAtual['Etr'], 0)  # Subtrai ETR
            varDiaAtual['StRu'] = max(varDiaAtual['StRu'] - varDiaAtual['Etr'],
                                      0)  # Subtrai ETR
            varDiaAtual['EtrEtm'] = 100 * varDiaAtual['Etr'] / varDiaAtual[
                'Etm']  # Calculo do ISNA

            return varDiaAtual

        def posColheita(diaAtual, varDiaAnterior):
            # Inicializa HUM e St RU com valores do estoque, Kc é 1 e o resto comeca em zero
            varDiaAtual = VariaveisBalHidrico(self.parametros)

            varDiaAtual['ETP'] = self.calcularETP(
                diaAtual)  # Calculo por decendio
            varDiaAtual['Hr'] = 0
            varDiaAtual['Kc'] = 1

            (varDiaAtual['Esc'], varDiaAtual['ik']) = self.calcularEsc(
                diaAtual,
                varDiaAnterior)  # Agua atual em excesso que entrou no sistema
            varDiaAtual['Apport'] = self.calcularApport(
                diaAtual, varDiaAtual['Esc']
            )  # precipitacao + irrigacao - escoamento superficial

            varDiaAtual['Etm'] = self.calcularEps(
                varDiaAtual['ETP'])  # mulch * ETP
            varDiaAtual['Epc'] = 0

            # Calculo de STRUSURF tem que ser menor do que a tabela
            varDiaAtual['StRuSurf'] = min(
                varDiaAnterior['StRuSurf'] + varDiaAtual['Apport'],
                self.parametros.RUSURF)
            # Calculo de EVS tem que ser menor que St reserva util superficial
            varDiaAtual['Evs'] = min(
                varDiaAtual['Etm'] * varDiaAtual['StRuSurf'] /
                self.parametros.RUSURF, varDiaAtual['StRuSurf'])
            varDiaAtual['Etr'] = varDiaAtual['Evs']

            # StRU eh atualizado ao somar Apport, Dr recebe a diferenca dele para a tabela de RU e ele recebe o valor tabelado (se ele for maior)
            #HUM contem sempre o maior valor de reserva util ate o momento
            (varDiaAtual['StRu'], varDiaAtual['Hum'],
             varDiaAtual['Dr']) = self.rempliRu(varDiaAtual['Apport'],
                                                varDiaAnterior['StRu'],
                                                varDiaAnterior['Hum'])

            varDiaAtual['StRu'] = max(varDiaAtual['StRu'] - varDiaAtual['Etr'],
                                      0)  # Subtrai ETR
            varDiaAtual['StRuSurf'] = max(varDiaAtual['StRuSurf'] -
                                          varDiaAtual['Etr'], 0)  # Subtrai ETR
            varDiaAtual['Eps'] = 0
            varDiaAtual['Vrad'] = 0
            varDiaAtual['StRur'] = varDiaAnterior['StRur']
            varDiaAtual['StRurMax'] = varDiaAnterior['StRurMax']
            varDiaAtual['TP'] = varDiaAnterior['TP']
            varDiaAtual['EtrEtm'] = 100 * varDiaAtual['Etr'] / varDiaAtual[
                'Etm']  # Calculo do ISNA

            return varDiaAtual

        #print('to aqui')

        ## Começo da função balancoHidrico()
        if self.ETPsDecendiais.any:
            #anos=len(self.parametros.anosDadosHistoricos)
            for ano in self.anosCalculo:
                #anos+=1
                #if ano in self.estacao.dados['data']:
                #    print(self.estacao.dados['data'])
                #else:
                #print(self.estacao.dados)
                #ano=2000 #ano fixo, somente um

                # Para cada ano desejado, faz-se uma simulacao
                #jm = self.dadosMeteorologicos.index(inicioSimulTuple[0])
                #ano=self.dadosMeteorologicos[:][jm].year
                #ano in self.limitesDadosHistoricos.
                #ano=self.limitesDadosHistoricos[0].year
                inicioSimul = date(ano, inicioSimulTuple[0],
                                   inicioSimulTuple[1])
                inicioPlantio = date(ano, inicioPlantioTuple[0],
                                     inicioPlantioTuple[1])
                fimSimul = inicioPlantio
                #print('Gerei datas')
                #print(inicioSimul)
                #print(fimSimul)
                #print(self.limitesDadosHistoricos)
                if self.cultura.fases != 0:
                    for fase in self.cultura.fases:
                        fimSimul += timedelta(
                            days=fase
                        )  # Inicio do plantio + dias que sao fase = Data final do plantio
                    #timedelta é uma funcao
                else:
                    fimSimul = date(fimSimul.year + 1, fimSimul.month,
                                    fimSimul.day)

                diaColheita = fimSimul - timedelta(days=1)

                # Se a data de inicio esta dentro do desejado
                if inicioSimul >= self.limitesDadosHistoricos[
                        0] and fimSimul <= self.limitesDadosHistoricos[1]:
                    #print('Inicio da simulacao OK')
                    diaAtual = inicioSimul  # Inicia dia
                    #print(diaAtual)
                    varDiaAnterior = VariaveisBalHidrico(
                        self.parametros
                    )  # Inicializa variaveis de saida e coloca alguns valores delas

                    # self.valoresDiarios[ano] = {}

                    while diaAtual < inicioPlantio:
                        # Realiza o pre semeio: reserva util, evapotranspiracao, etc
                        varDiaAtual = preSemeio(diaAtual, varDiaAnterior)
                        # Atualizar variaveis de saida a cada dia calculado
                        self.variaveisSaida = self.variaveisSaida.append(
                            VariaveisSaida(varDiaAtual,
                                           index=[diaAtual],
                                           columns=self.columns))

                        # self.valoresDiarios[ano][diaAtual] = varDiaAtual
                        #n = diaAtual+timedelta(days=1)
                        #if (n.year != diaAtual.year):
                        #    diaAtual.year-=1
                        diaAtual += timedelta(days=1)

                        varDiaAnterior = varDiaAtual

                    fase = 1
                    inicioFase = inicioPlantio
                    while diaAtual <= diaColheita:
                        # Para todos os dias eh feita :
                        varDiaAtual = fasesFenologicas(diaAtual,
                                                       varDiaAnterior,
                                                       inicioPlantio)

                        if self.cultura.fases != 0:
                            if (
                                    diaAtual.day == (inicioFase + timedelta(
                                        days=self.cultura.fases[fase - 1])).day
                            ) and (diaAtual.month == (inicioFase + timedelta(
                                    days=self.cultura.fases[fase - 1])).month):
                                fase += 1
                                inicioFase = diaAtual

                            varDiaAtual['fase'] = fase

                        self.variaveisSaida = self.variaveisSaida.append(
                            VariaveisSaida(varDiaAtual,
                                           index=[diaAtual],
                                           columns=self.columns))

                        # self.valoresDiarios[ano][diaAtual] = varDiaAtual
                        diaAtual += timedelta(days=1)
                        varDiaAnterior = varDiaAtual

                    while diaAtual < fimSimul:
                        varDiaAtual = posColheita(diaAtual, varDiaAnterior)

                        self.variaveisSaida = self.variaveisSaida.append(
                            VariaveisSaida(varDiaAtual,
                                           index=[diaAtual],
                                           columns=self.columns))

                        # self.valoresDiarios[ano][diaAtual] = varDiaAtual
                        diaAtual += timedelta(days=1)
                        varDiaAnterior = varDiaAtual

            self.balancoHidricoNormalDF = self.balancoHidricoNormal()

            if not self.variaveisSaida.empty:

                return (pd.concat(
                    [self.variaveisSaida, self.dadosMeteorologicos],
                    axis=1), self.balancoHidricoNormalDF, self.anosCalculo)
                #return self.variaveisSaida, self.balancoHidricoNormalDF

        return 'Dados insuficientes'