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ícioUtilizaçã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ícioQuestõ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ícioBreve 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
limpa | inicializa 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-cinzas | Tem 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ícioVariantes 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ícioO programa utilizado é uma adaptação do programa implementado em 2000 pelo Cambridge, Ma: MIT Press.
©opyright 2004, Centro de Física Teórica e Computacional