Fogos Florestais



Introdução

Este modelo simula a propagação de um fogo florestal. O fogo começa numa das orlas da floresta e propaga-se às árvores vizinhas. Na versão sem vento (percolação de sítios) o fogo propaga-se às quatro árvores vizinhas, a norte, sul, leste e oeste, da árvore a arder.

Nesta versão, o fogo só se pode propagar numa direcção se existir uma árvore verde nessa direcção. O fogo não pode saltar sobre sítios sem árvores e os sítios vazios bloqueiam a propagação do fogo nessas direcções.

A probabilidade do fogo atingir a orla direita da floresta depende criticamente da densidade de árvores na floresta. Para florestas densas o fogo queima rápidamente quase todas as árvores. Para florestas com baixa densidade de árvores, o fogo extingue-se rápidamente queimando uma pequena fracção das árvores. Existe uma densidade crítica para a qual o fogo se propaga pela primeira vez de uma orla á outra da floresta. Para esta densidade de árvores o tempo de propagação do fogo diverge(numa floresta infinita).

O efeito do vento pode ser incluído alterando as regras de propagação: Uma árvore a arder propaga o fogo não só ás árvores vizinhas, mas também ás árvores que estão a uma distância igual a 'intensidade' do vento, na direcção deste.

Início

Utilização

A interface gráfica do modelo é constituída por duas secções. A primeira no lado esquerdo permite correr simulações individuais. Basta premir o botão "preparar", criar focos de incêndio com botão "incendiar" e iniciar a simulação com o botão "executar". Para escolher a densidade de árvores, deve utilizar o slider. O botão incendiar linha, inicia uma frente contínua de fogo no lado esquerdo da caixa de simulação

Para estudar a transição de percolação, é útil correr simulações para diferentes valores da densidade de árvores. Para tal,na secção do lado direito, é possível regular a densidade mínima e máxima de uma sequência de simulações, assim como o incremento dado à densidade no final de cada simulação. No início de cada simulação, é incendiada uma linha de fogo, sendo os resultados finais registados nos dois gráficos à direita. O gráfico do canto superior direito corresponde à dependência da duração do fogo na densidade florestal, e o segundo corresponde à percentagem de árvores queimadas em função da densidade.

Nas simulações contínuas, o tempo de simulação é longo. Para acelerar o processo, o netlogo permite desligar a actualização da janela de visualização. Basta carregar no botão on/off junto do botão more.

Para incluir o efeito do vento, existem três botões: Um selector VENTO?, que permite ligar e desligar a acção do vento; um slider que controla a direcção do vento (0 graus é norte, 90 graus é este, 180 graus é sul, e 270 graus é oeste); e um cursor que controla a intensidade.

Início

Questões

1. a) Corra simulações para uma densidade de árvores de 0.55 usando várias condições iniciais. O que observa?Resultados Obtidos

  • Condição inicial de linha de incêndio

  • b) Repita o procedimento para uma densidade de 0.75. Anote as suas conclusões.Resultados Obtidos

    Condição inicial de linha de incêndio

  • situação em que decorre o incêndio

  • c) Compare a duração dos fogos para as duas densidades.

    2. Corra 10 simulações para uma densidade de árvores à volta da densidade crítica, 59%. Calcule a fracção dos fogos que se propagam a toda a floresta.Resultados Obtidos

  • Condição inicial de linha de incêndio

  • 3.a)Como varia a densidade crítica com a intensidade do vento?Resultados Obtidos

  • Condição inicial de linha de incêncio

  • b)E com a direccao deste?Resultados Obtidos

    Direcção de propagação do vento paralela à linha de incêndio

  • situação em que decorre o incêndio

    Direcção de propagação do vento perpendicular à linha de incêndio

  • situação em que decorre o incêndio

  • 4. Finalmente, volte a considerar o modelo sem vento e corra simulações automáticas para uma gama de densidades à volta da densidade crítica. Identifique a transição de percolação.

    5. Na transição (e só na transição) a duração do fogo diverge para uma floresta infinita. Porque?

    6. Observe a estrutura na região à volta de 0.59. Compare com as estruturas obtidas para densidades muito acima do limiar de percolação?

    Início

    Breve Análise do Código

    Conceito Geral

    Neste modelo, para além de existirem patches que são a base do tabuleiro, existem também dois tipos de turtles (breeds): turtles do tipo fogos e do tipo cinzas. As primeiras, representam as chamas e as segundas as ávores ardidas.

    Para incendiar um patch cria-se nesse patch uma turtle do tipo fogos. Seguidamente, essa turtle procura na sua vizinhança ortogonal patches verdes e cria em cada um deles uma nova turtle do tipo fogos. No final, a turtle original transforma-se numa turtle do tipo cinzas ficando com uma cor mais escura. A passagem a cinzas no fim de cada iteração garante que cada turtle incendeia apenas uma única vez a sua vizinhança.

    Variáveis globais
    arvores-iniciais número total de árvores plantadas (número de patches verdes).
    arvores-queimadas número total de árvores queimadas.
    estado variável utilizada na função automatico. Representa o número de iterações para terminar a simulação de acordo com a gama de densidades escolhida pelo utilizador.
    tempo-de-simulacao variável utilizada na função automatico. Dá-nos o tempo de simulação que é apresentado no monitor com o mesmo nome.
    Funções principais
    executar contêm o conjunto de instruções realizadas em cada iteração, sendo responsável pela evolução da simulação.
    preparar Função associada ao botão preparar, possuindo a função de limpar as variáveis e inicializar os patches. Para tal, recorre à função auxiliar limpa.
    Funções auxiliares
    limpainicializa a janela gráfica com uma distribuição de árvores de acordo com a densidade escolhida no slider densidade. Além disso, é aqui que são definidas as condições fronteira e inicializadas as variáveis globais mais importantes.
    inflamar Para um determinado patch, cria uma turtle do tipo fogos com a cor vermelha.
    fade-cinzasTem como função produzir o escurecimento das turtles representativas dos fogos. Quando as turtles chegam a uma cor muito escura significa que o fogo está praticamente extinto, sendo a turtle eliminada.
    incendiar
    incendiar-linha
    A função incendiar permite incendiar um dado conjunto de pontos com o rato enquanto que função incendiar_linha cria uma linha de fogo vertical do lado esquerdo.
    automatico permite correr a simulação numa gama de densidades definida pelo utilizador, com um passo dado pelo slider INCREMENTO. Permite ainda traçar dois gráficos, o tempo de simulação e a percentagem de árvores queimadas em função da densidade.

    Código

    Antes de qualquer procedimento, o NetLogo obriga à declaração de todas as variáveis globais e tipos de turtles a utilizar

    Variáveis globais
    globals 
    [ 
      arvores-iniciais 
      arvores-queimadas 
      estado
      tempo-de-simulacao
    ]  
    
    breeds [ fogos cinzas ]
    

    Na interface existem diversos botões (executar, preparar, incendiar e incendiar linha) que estão associados a funções existentes no programa. O botão preparar acciona a função preparar que tem como finalidade a criação da floresta com a densidade especificada pelo utilizador.

    preparar
    to preparar
      ca
      limpa
    end
    

    A função preparar chama a instrução ca que apaga turtles, patches e gráficos. A função limpa inicializa a janela gráfica com uma distribuição de árvores de acordo com a densidade escolhida no slider.

    executar
    to executar   
      ask fogos 
      [ without-interruption        
                                   
        [ ask neighbors4 with [ pcolor = green ]   
          [ inflamar ]
          if vento?                
          [ ask patch-at-heading-and-distance direccao intensidade  
            [ if pcolor = green          
              [ inflamar ] ] ] ]
         set breed cinzas          
       ]
      fade-cinzas  
    end
    

    Esta função, contêm o conjunto de instruções realizadas em cada iteração. Repare que, a utilização das turtles do tipo fogos dispensa uma actualização de todos os patches, bastando apenas um ciclo sobre todos os fogos. Assim, para implementar um ciclo que "varra" a totalidade das turtles fogos basta utilizar o comando ask. Este comando, executa as instruções seguintes em paralelo para todas as turtles. Para evitar que um patch seja incendiado duas vezes é necessário a utilização do comando without-interruption.

    Dentro da instrução without-interruption, são dadas instruções a cada uma das turtles do tipo fogos (que correspondem às árvores que foram previamente incendiadas pelo utilizador). Cada turtle chama os 4 primeiros vizinhos (neighbors4), que serão incendiados (inflamar) caso sejam árvores (with [pcolor = green]). Além disso, se a opção VENTO? estiver seleccionada, repetimos o processo para os patches dados pela instrução patch-at-heading-and-distance. Esta possui dois argumentos: o primeiro corresponde ao ângulo que a direcção do vento faz com a vertical e o segundo, à distância, em patches, da intensidade do vento. Assim, a instrução devolve um patch que se encontra à distância e direcção especificadas.

    De seguida, muda-se a turtle do tipo fogos para cinzas (comando set breed cinzas) e procede-se a um um escurecimento (fade-cinzas)

    Como se viu, a função executar recorre a duas funções que não fazem parte das primitivas do NetLogo.

    Funções auxiliares
    limpa
    to limpa
      clear-graphics
      ask patches with [abs pxcor < (screen-edge-x - ceiling intensidade) and
                        abs pycor < (screen-edge-y - ceiling intensidade)]
      [ if (random-float 100) < densidade
        [ set pcolor green ] ]
      set arvores-iniciais count patches with [pcolor = green]
      set arvores-queimadas 0
    end
    

    ceilling devolve o menor número inteiro maior que o seu argumento

    Com o objectivo de inicializar a janela gráfica com uma distribuição de árvores de acordo com a densidade escolhida pelo utilizador, usa-se a seguinte instrução:

    if (random-float 100) < densidade
    [ set pcolor green ]
    

    Para cada patch é gerado um número aleatório entre 0 e 100 (primitiva random). Se esse número for inferior à densidade escolhida, esse patch é pintado de verde, caso contrário continua preto.

    O NetLogo, por defeito, possui condições de fronteira aos limites periódicas, o que significa que a fronteira Este está ligada à fronteira Oeste, e a fronteira Norte à fronteira Sul. Deste modo, foi necessário introduzir um conjunto de instruções na função limpa que têm como finalidade não deixar o fogo, quando existe vento, dar a volta pelas margens da janela gráfica

    ask patches with [abs pxcor < (screen-edge-x - ceiling intensidade) and
                      abs pycor < (screen-edge-y - ceiling intensidade)]
    

    Basicamente o que este procedimento faz é criar uma margem de patches pretos (zonas sem árvores) proporcional à intensidade do vento para impedir que o fogo dê a volta à janela.

    A variável arvores-iniciais é inicializada com o número total de árvores plantadas (número de patches verdes). A variável arvores-queimadas é inicializada a zero.

    inflamar
    to inflamar   
      sprout 1             
        [ 
          set breed fogos   
          set color red    
        ]
      set pcolor black
      set arvores-queimadas arvores-queimadas + 1   
    end
    

    Recorde que a função inflamar é executada por patches. Dentro desta função, existe uma primeira instrução sprout que cria uma turtle do tipo fogos com a cor vermelha e coloca-a num dado patch. Seguidamente, o patch (não a turtle)é pintado de preto, o que significa que a árvore ardeu. Após estas instruções a variável ARVORES-QUEIMADAS é incrementada.

    fade-cinzas
    to fade-cinzas   
      ask cinzas  
      [ 
         set color color - 0.3  
         if color < red - 4     
         [ 
            stamp color        
            die                
         ] 
      ]
    end
    

    Esta função é executada sobre todas as turtles do tipo cinzas (novamente através do comado ask). A sua cor é escurecida, até atinguir um valor limite (red-4) altura em que é morta pelo comando die.

    incendiar e incendiar_linha

    Existem ainda duas funções associadas a botões. A função incendiar permite incendiar um dado conjunto de pontos com o rato enquanto que função incendiar_linha cria uma linha de fogo vertical do lado esquerdo.

    to incendiar                 
      locals [ botao ]
      set botao false            
      if mouse-down?              
      [ while [ mouse-down? ]    
        [ ask patch-at mouse-xcor mouse-ycor
          [ inflamar ]
          display      
        ]              
        set botao true   
      ]        
      if botao          
      [ stop ]             
    end
    
    to incendiar_linha
      ask patches with [pxcor = (ceiling intensidade - screen-edge-x) AND 
                        abs pycor < (screen-edge-y - ceiling intensidade)]
      [ inflamar ]
    end
    

    Na função incendiar, é utilizada uma variável local declarada no início com o nome BOTAO que indica se o botão do rato está premido. Inicialmente, é-lhe atribuido o valor false, indicando que o botão do rato não está premido. Quando o utilizador carrega no botão do rato, a variável BOTAO adquire o valor true e são inflamados os patches cujas coordenadas são as do ponteiro do rato. A janela gráfica é actualizada progressivamente com o comando display, e logo após o utilizador largar o botão do rato, a variável BOTAO adquire o valor false terminando a função incendiar (stop).

    automatico

    Por último temos a função mais complexa. Não é essencial para a realização da simulação, mas é útil para perceber o comportamento sistema. Definidos os valores mínimo e máximo para a DENSIDADE, a função permite correr a simulação nesta gama de densidades com um passo dado pelo INCREMENTO. Permite ainda traçar dois gráficos, o tempo de simulação e a percentagem de árvores queimadas em função da densidade.

    to automatico
      locals             
      [ 
         den_max         
         den_min         
         increm         
         iter-combustao      
      ]
      
      reset-timer                   
      set tempo-de-simulacao timer   
                                    
      
      set den_min densidade_min    
      set den_max densidade_max
      set increm incremento
                                     
      if den_min + increm > den_max           
      [ 
         user-message "Valores para a densidade minima, maxima ou incremento inconsistentes." 
      ]
      
      set-current-plot "tempo-combustao"   
      clear-plot                           
      set-plot-x-range den_min den_max     
       
      set-current-plot "percent"           
      clear-plot                           
      set-plot-x-range den_min den_max     
      set-plot-y-range 0 100
    
      set estado ceiling ((den_max - den_min) / increm)     
                                                           
      set densidade den_min               
    
      while [ estado > 0 ]
      [ 
          limpa
          set tempo-de-simulacao timer
          incendiar_linha
          set iter-combustao 0
                                                            
          while [ any? fogos ]    
          [ 
             executar                                  
             set iter-combustao iter-combustao + 1     
             set tempo-de-simulacao timer              
          ]
          
          set densidade densidade + increm 
                                                       
          set-current-plot "percent"                                      
          plotxy densidade (arvores-queimadas / arvores-iniciais) * 100   
    
          set-current-plot "tempo-combustao"                               
          plotxy densidade iter-combustao                                 
    
          set estado estado - 1
    
          set tempo-de-simulacao timer
      ]
    end
    

    Primeiro é necessário definir variáveis locais adicionais. As três primeiras são cópias de parâmetros definidos na interface, para impedir que o utilizador as modifique durante a simulação.

    A variável ITER-COMBUSTAO dá o tempo de duração de um fogo.

    Para controlar o tempo de simulação, definiu-se um TEMPO-DE-SIMULACAO, onde é registado o tempo que passou desde que se executou o comando reset-timer. O valor numérico de TEMPO-DE-SIMULACAO é actualizado ao longo das simulações (comando set tempo-de-simulacao timer), sendo apresentado na interface, no monitor correspondente.

    Depois de atribuído o valor numérico dos sliders às variáveis locais, a sua validade é testada através de

      if den_min + increm > den_max     ;;se os parâmetros foram "mal escolhidos" ...     
      [ 
         user-message "Valores para a densidade miníma, máxima ou incremento inconsistentes." 
      ]

    São inicializados os dois gráficos desta secção. O primeiro representa o tempo de simulação vs densidade e o segundo a percentagem de árvores ardidas vs densidade. O NetLogo funciona como se guardasse apenas um gráfico em memória, recebendo este todos os comandos referentes a gráficos (Ver capítulo 0). Para escolher um dos gráficos utiliza-se o comando set-current-plot. Para ambos, definiram-se previamente os limites máximos e mínimos para o eixo das abcissas, utilizando o comando set-plot-x-range e para o segundo definiram-se os limites para o eixo das ordenadas (set-plot-y-range).

    O ciclo while controlado pela variável ESTADO, indica o número de simulações que falta correr. No início temos.

    set estado ceiling ((den_max - den_min) / increm)  
    

    No final de cada simulação, é retirado uma unidade a esta variável. Quando ESTADO for igual a zero, a sequência de simulações termina:

      while [ estado > 0 ]
      [
        (...) 
        
        set estado estado - 1
      ]
    

    Dentro do ciclo while, começa-se por limpar as variáveis, e inicializa-se a variável que conta o número de iterações para cada valor da densidade - ITER-COMBUSTAO.

    Posteriormente, reliza-se o outro ciclo while

    while [ any? fogos ]    ;;enquanto existir turtles da casta fogos
          [ 
             executar
             set iter-combustao iter-combustao + 1
             set tempo-de-simulacao timer
          ]      
    

    Nesta secção, para uma determinada densidade, regista-se o número de iterações necessárias para a extinção (tempo de sustentação), assim como a percentagem de árvores queimadas.

    Resta marcar nos gráficos os resultados desta simulação. Para tal, utiliza-se os comandos set-current-plot e plotxy.

    Início

    Variantes e Extensões

    Considere uma variante do modelo (sem vento) onde o fogo se propaga a 8 vizinhos (4 N,S,E e W e os 4 nas diagonais). Compare os resultados com a versão mais simples.

    Escreva o código para o modelo mais simples sem usar turtles. O programa corre muito mais devagar. Porquê ?

    Início