terça-feira, 26 de julho de 2011

Controlando eixos no NCL - Parte 2

Olá,

Agora, vamos ver como é possível alterar valores dos eixos de um gráfico no NCL. Para isso, também se usam os recursos para Tick marks.

Quem controla os valores dos eixos são os recursos (para cada um dos eixos) que terminam com Mode, ou seja, determinam o modo de atribuição de valores aos eixos do gráfico. Similarmente aos recursos usados para ligar/desligar eixos, temos:

tmXBMode, tmXTMode, tmYLMode e tmYRMode, que determinam os modos de atribuição de valores aos eixos X inferior, X superior, Y da esquerda e Y da direita, respectivamente.

Esses recursos aceitam três opções: Automatic, Manual ou Explicit. Para cada uma dessas opções, outros recursos devem ser definidos para que possamos alterar apropriadamente os valores dos eixos. Para simplificar a explicação, vamos nos fixar apenas no eixo X inferior, ou seja, em XB.

Definindo (novamente, suponha que temos uma variável lógica opcao, que receberá os recursos):

opcao@tmXBMode = "Automatic"

o NCL determinará os valores do eixo automaticamente. Este é o comportamento padrão. Como vocês já puderam notar, quando plotamos algum gráfico no NCL, ele já atribui valores aos eixos.

Agora, definindo

opcao@tmXBMode = "Manual"

informamos que a atribuição dos valores ao eixo X inferior será feita manualmente. Para isso, precisamos definir mais alguns recursos, que determinarão o valor inicial, o valor final, e o espaçamento entre os valores do eixo:

tmXBTickStartF: informa ao NCL o valor inicial (TickStart) para o eixo X inferior (XB)
tmXBTickEndF: informa ao NCL o valor final (TickEnd) para o eixo X inferior (XB)
tmXBTickSpacingF: informa ao NCL o intervalo entre os valores (TickSpacing) do eixo X inferior (XB)

Notem que ao final destes recursos há um F, que indica que o valor passado ao recurso pode ser real. Quando não há este F no final, deve-se passar um número inteiro, um valor lógico ou uma palavra (string).

Por fim, definindo

opcao@tmXBMode = "Explicit"

informamos que a atribuição dos valores ao eixo X inferior será feita explicitamente. Isto significa que determinaremos a quantidade de valores e quais valores (rótulos) serão atribuídos. Como no caso anterior, devemos usar outros recursos para esta forma de controle:

tmXBValues: informa ao NCL as posições coordenadas do eixo X inferior as quais serão atribuídos os rótulos deste eixo
tmXBLabels: informa ao NCL os rótulos que serão impressos no gráfico, nas posições informadas no recurso anterior.

A estes dois recursos normalmente se atribuem vetores, que indicam as coordenadas e os rótulos a serem impressos, respectivamente.

Vamos a exemplos práticos:

a) tmXBMode definido como Manual

opcao@tmXBMode = "Manual"
opcao@tmXBTickStartF = 1950
opcao@tmXBTickEndF = 2005
opcao@tmXBTickSpacingF = 5

b) tmXBMode definido como Explicit

opcao@tmXBMode = "Explicit"
opcao@tmXBValues = (/1950,1960,1970,1980,1990,2000,2005/)
opcao@tmXBLabels = (/"1950","1960","1970","1980","1990","2000","2005"/)

Notem que os vetores passados a tmXBValues e a tmXBLabels têm o mesmo número de elementos. Se isto não ocorrer, o NCL retorna um erro.

Estes exemplos foram retirados do Exemplo 2 da página dos exemplos do NCL referentes aos Tick Marks (http://www.ncl.ucar.edu/Applications/tickmarks.shtml). Tente executá-lo para entender o funcionamento dos recursos.

Lembrem-se que o apresentado acima vale para qualquer um dos eixos.

Abraços.

Controlando eixos no NCL - Parte 1

Olá,

Neste post vou falar um pouco sobre o controle de eixos em gráficos do NCL. Os recursos usados para alterar os eixos dos gráficos referem-se aos Tick marks (veja alguns exemplos disponíveis na página do NCL: http://www.ncl.ucar.edu/Applications/tickmarks.shtml). Esses recursos começam sempre com tm e os demais caracteres indicam o que eles fazem. Por exemplo, tmYROn retira ou coloca o eixo Y da direita. Vamos desmembrá-lo:

tm: indica que este recurso permite o controle dos eixos
YR: indica que o eixo Y que fica à direita (R) será alterado
On: indica que este recurso serve para colocar ou retirar o eixo, dependendo do valor passado ao recurso.

Vamos aos exemplos. Suponha que temos a variável lógica opcao definida para receber os recursos. Assim,

opcao@tmYROn = False

retira o eixo Y da direita, enquanto que

opcao@tmYROn = True

coloca o eixo Y da direita.

Usando da mesma lógica descrita acima, é possível retirar e colocar qualquer um dos eixos, bastando usar L para escolher o outro eixo Y, T ou B para escolher o eixo X superior ou inferior, respectivamente. É claro, no caso do eixo X, troca-se o Y do recurso por X. Portanto, temos os seguintes recursos para colocar ou retirar os eixos do gráfico:

tmYROn: retira/coloca o eixo Y da direita
tmYLOn: retira/coloca o eixo Y da esquerda
tmXTOn: retira/coloca o eixo X superior
tmXBOn: retira/coloca o eixo X inferior

Como mostrado acima, esses recursos são como chaves, ou seja, desligamos ou ligamos estes eixos usando True (verdadeiro) ou False (falso). O Exemplo 3 da página de exemplos do NCL apresentada acima ilustra o uso destes recursos.

Espero que tenha sido útil.

sábado, 14 de maio de 2011

Makefiles (arquivos make)

O make é um programa geral que constrói destinos a partir de pré-requisitos. O destino pode ser um programa executável, um documento ou uma outra coisa. Os pré-requisitos poderão ser o código Fortran, um arquivo de texto TEX, etc.

Embora você possa escrever scripts do shell simples para executar os comandos do fxx construindo um programa executável, o make é especial pelo fato de conhecer quais destinos precisam ser reconstruídos e quais não precisam.

Por exemplo: digamos que você tem um programa que consiste em três arquivos de origem Fortran. Se você construir o executável usando o comando:

$ gfortran -o teste.exe teste.f90 sub1.f90 sub2.f90

sempre que alterar qualquer um dos arquivos de origem, todos os três serão recompilados, gerando o executável. Se você alterou apenas um arquivo de origem, isto será uma verdadeira perda de tempo (especialmente se o programa em questão for muito maior). O que você deseja fazer de fato é recompilar apenas o arquivo de origem que foi alterado em um arquivo-objeto e ligar todos os arquivos-objeto no programa para formar o executável. O make pode automatizar este processo para você.

O que o make faz

O objetivo básico do make é permitir que você construa um arquivo em pequenas etapas. Se muitos arquivos de origem compuserem o executável final, você poderá alterar um e reconstruir o executável sem ter que recompilar tudo. Para fornecer tal flexibilidade, o make registrará quais arquivos você precisará para fazer a sua construção.

O texto abaixo é um exemplo de arquivo make comum. Denomine-o como makefile ou Makefile e mantenha-o no mesmo diretório dos arquivos de origem.

programa: teste.o sub1.o sub2.o
 gfortran -o teste.exe teste.o sub1.o sub2.o

teste.o: teste.f90
 gfortran -c teste.f90

sub1.o: sub1.f90
 gfortran -c sub1.f90

sub2.o: sub2.f90
 gfortran -c sub2.f90


Este arquivo irá construir um programa denominado teste.exe a partir de três arquivos de origem, teste.f90, sub1.f90 e sub2.f90. Você não está restrito à programação Fortran 90 em um arquivo make.

Quatro entradas aparecem no arquivo. Cada uma contém uma linha de dependência que mostra como um arquivo é construído. Assim, a primeira linha informa que o programa (nome antes dos dois pontos) é construído a partir dos três arquivos-objeto teste.o, sub1.o e sub2.o (os nomes depois dos dois pontos). O que esta linha informa ao make é que ele deverá executar a linha gfortran seguinte sempre que um destes arquivos-objeto for alterado. As linhas que contêm os comandos precisam começar com tabulações (não espaços).

Os arquivos depois dos dois pontos são chamados de dependentes ou de pré-requisitos. Os arquivos objeto serão construídos se eles não existirem ou se algum dos arquivos de origem associado for mais recente.

Como o make saberá se um arquivo é novo? Ele analisará o instante de modificação, que o sistema de arquivos associa a todo arquivo. Você pode ver esta informação executando o comando ls -l. Como a informação de instante de tempo tem uma precisão de um segundo, ele informará precisamente ao make se você editou um arquivo de origem desde a última compilação ou se compilou um arquivo objeto desde a última vez que o executável foi construído.

Numa primeira execução, teremos:

$ make programa
gfortran -c teste.f90
gfortran -c sub1.f90
gfortran -c sub2.f90
gfortran -o teste.exe teste.o sub1.o sub2.o


Se editarmos o sub1.f90 e executarmos de novo o comando make programa, ele irá reconstruir apenas os arquivos necessários, economizando tempo, ou seja,

$ make programa
gfortran -c sub1.f90
gfortran -o teste.exe teste.o sub1.o sub2.o


Não importa a ordem na qual as entradas estão no arquivo makefile. O make descobrirá quais arquivos dependem de quais e executará todos os comandos na ordem correta. Colocar uma entrada primeiro para o programa será conveniente, pois se tornará o arquivo construído por padrão (default). Em outras palavras, digitar make será o mesmo que digitar make programa.

Veja agora este outro exemplo:

programa: teste.o sub1.o sub2.o
 gfortran -o teste.exe teste.o sub1.o sub2.o

teste.o: teste.f90
 gfortran -c teste.f90

sub1.o: sub1.f90
 gfortran -c sub1.f90

sub2.o: sub2.f90
 gfortran -c sub2.f90

clean:
 rm -rf teste.exe teste.o sub1.o sub2.o

install:
 mkdir ./testeProg
 cp teste.exe testeProg


Neste exemplo, duas regras são adicionadas: clean e install. É comum encontrar regras de mesmo nome em códigos fontes de programas em Linux.

Algumas regras da sintaxe

A coisa mais difícil sobre manter os arquivos make, pelo menos se você não tiver experiência com eles, é ter a sintaxe correta. Se você usar espaços onde deveria colocar tabulações ou vice-versa, o seu arquivo make irá paralisar. E as mensagens de erro serão totalmente confusas.

Sempre coloque tabulação no começo de um comando, não espaços. E não use uma tabulação antes de qualquer outra linha.

Você poderá colocar uma cerquilha (#) em qualquer lugar em uma linha para iniciar um comentário. Tudo depois da cerquilha será ignorado.

Se você colocar uma barra invertida no final de uma linha, ela irá prosseguir na próxima linha. Isto funcionará em comandos longos e também em outros tipos de linhas do arquivo make.

Seção Mãos na Massa

Abaixo estão programas simples em Fortran 90 para você mesmo testar o que foi apresentado acima.

Salve o programa abaixo num arquivo chamado teste.f90:

program teste
implicit none

integer :: i,j
real :: x,y,resultado

x=1
y=2

call soma(x,y,resultado)
call imprime(resultado)

end program teste


O programa abaixo deverá ser salvo num arquivo chamado sub1.f90:

subroutine soma(valor1,valor2,resultado)
implicit none
real :: valor1,valor2,resultado

resultado = valor1 + valor2

end subroutine


E, por fim, salve o programa abaixo num arquivo chamado sub2.f90:

subroutine imprime(valor)
implicit none
real :: valor

print *,valor

end subroutine


Pronto! Com estes arquivos você pode testar a funcionalidade dos arquivos makefile.