Decomposição Cholesky

A decomposição (ou fatoração) Cholesky (pronuncia-se “Colesqui”) permite a solução de problemas que envolvam matrizes grandes em que há a necessidade de se fracionar a solução do problema (geralmente a solução de um ou mais sistemas de equações lineares), em que os fatores obtidos a partir da decomposição da matriz original, resulta em matrizes (os fatores) triangulares superior e inferior.

Continue Lendo “Decomposição Cholesky”

Anúncios

Markdown + MathJax: Uma alternativa ao LaTeX

Recentemente o Markdown vem demonstrando – com sua simplicidade (e elegância), como uma sintaxe de texto puro pode ser objetiva e produtiva. Exemplos de sua aplicação vão desde editores de texto estilo desktop até os mais simplificados editores embarcados em smartphones e tablets. Além disso, alguns serviços disponibilizam o Markdown como alternativa a outras linguagens. Como exemplo, pode-se citar Scriptogr.am,  GitHub Pages e WordPress. Marcar um texto ao invés de formatá-lo é uma tarefa muito mais simples, pois escreve-se o texto na forma como ele deve ser apresentado. Nada de ter que escrever e depois formatar, basta “marcar”. O LaTeX é uma destas linguagens que facilitam a vida de quem escreve textos científicos, principalmente quando há a necessidade de se inserir equações. Mas muitas vezes, a sua complexidade acaba contradizendo o seu principal mote: o de manter o foco no conteúdo, e não na aplicação. Textos muito grandes em editores WYSIWYG é uma tarefa que demanda paciência, e digitar equações, demanda mais paciência ainda.

Continue Lendo “Markdown + MathJax: Uma alternativa ao LaTeX”

Instalando a suite Free PGI no OS X (e mais um pouco)

Esta semana a Portland Group – empresa desenvolvera de compiladores fortran e C (e outros produtos), lançou uma versão gratuita de seus compiladores para o OS X (exceto o compilador C++). Infelizmente, uma versão gratuita ainda não parece estar disponível para o Linux ou Windows. A instalação é bastante simples e direta: basta abrir uma imagem DMG e arrastar o aplicativo para a pasta Applications do OS X. Mas acontece que a utilização dos compiladores fica restrita apenas ao Terminal.app! Isto significa dizer que, caso você utilize outro emulador de terminal, como o iTerm2.app, você simplesmente não consegue invocar os compiladores! Isto acontece porque para utilizar os compiladores, você não deve abrir o Terminal.app, mas você precisa clicar no ícone do programa instalado (Free PGI.app) e aí sim ele abre um terminal e então os compiladores podem ser utilizados. Mas que bobagem…

Continue Lendo “Instalando a suite Free PGI no OS X (e mais um pouco)”

Comando weather no OS X (condições do tempo)

Você sabia que é possível verificar as condições observadas de tempo a partir de estações meteorológicas pela linha de comando? No Linux é simples: basta instalar o programa “weather”.

Continue Lendo “Comando weather no OS X (condições do tempo)”

Derivaçao da Equação de Análise a partir da Função Custo Variacional Tridimensional

Abaixo apresento uma derivação da equação de análise utilizada em assimilação de dados para a determinação da condição inicial dos modelos de previsão numérica de tempo. Esta equação é obtida a partir da função custo variacional tridimensional (3DVar), sem considerar a dimensão temporal das observações. Logo, todos os elementos do vetor observação \mathbf{y^{o}} são considerados em um mesmo t=t_{0}, enquanto que o background \mathbf{x_{b}} é considerado no tempo t=t_{0}-1 e a análise \mathbf{x_{a}} é obtida para o mesmo tempo das observações (t=t_{0}).

Apesar de parecer um tanto quanto enfadonho (principalmente porque este é um passo a passo), acho interessante apresentar as idéias relacionadas à derivação porque não se tem textos semelhantes em português. Para um texto científico, a maioria das passagens abaixo seriam descartadas, reduzindo esta derivação a poucas equações. De antemão, acrescento que sugestões e correções são bem vindas, visto que algumas imprecisões podem existir.

Seja (1) a função custo variacional tridimensional:

J(\mathbf{x}) = \frac{1}{2}(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + \frac{1}{2}(\mathbf{y^o} - \textit{H}(\mathbf{x}))^{T}\mathbf{R}^{-1}(\mathbf{y^o} - \textit{H}(\mathbf{x}))
(1)

Onde:

  • \mathbf{x} é o vetor de estado a ser analisado de dimensão \textit{p}
  • \mathbf{x_{b}} é o vetor de estado do background de dimensão \textit{p}
  • \mathbf{B} é a matriz de covariâncias dos erros de background de dimensão \textit{p}\times\textit{p}
  • \mathbf{y^{o}} é o vetor observação de dimensão \textit{n}
  • \mathbf{R} é a matriz de covariâncias dos erros de observação de dimensão \textit{n}\times\textit{n}
  • \textit{H} é o operador observação não linear

Oservação: Em geral \textit{H} é um modelo linearizado (portanto sob a forma \mathbf{H}) que mapeia os valores do background para os pontos em que estão as observações.

Na Eq. (1), o termo (\mathbf{x} - \mathbf{x_{b}}) representa o vetor incremento de análise e o termo (\mathbf{y^{o}} - \textit{H}(\mathbf{x})) representa o vetor inovação.

Para derivar a equação de análise a partir de (1), consideramos (por simplicidade) apenas uma observação e que o vetor incremento de análise é pequeno o suficiente para que possamos linearizar o operador observação:

\mathbf{x} = \mathbf{x_{b}} + (\mathbf{x} - \mathbf{x_{b}})
(2)

Ou seja, em (2) expressamos que o vetor de estado a ser analisado (a análise) é igual ao vetor de estado do background somado ao incremento de análise. Substituindo \mathbf{x} da Eq. (2) na relação do vetor inovação:

\mathbf{y^{o}} - \textit{H}(\mathbf{x}) = \mathbf{y^{o}} - \textit{H}[\mathbf{x_{b}} + (\mathbf{x} - \mathbf{x_{b}})]
(3)

\mathbf{y^{o}} - \textit{H}(\mathbf{x}) = \mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \textit{H}(\mathbf{x} - \mathbf{x_{b}})
(4)

Na Eq. (4) o operador observação não linear \textit{H} é aplicado sobre o incremento de análise (\mathbf{x} - \mathbf{x_{b}}), o qual é muito pequeno. Sendo assim, considera-se que o operador observação a ser aplicado sobre o incremento de análise pode ser linearizado. Isto significa que pequenas variações do vetor incremento de análise fazem com que \textit{H} varie muito pouco. Portanto, a Eq. (4) pode ser reescrita como:

\mathbf{y^{o}} - \textit{H}(\mathbf{x}) = \mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})
(5)

Onde:

  • \mathbf{H} é a versão linearizada do operador observação não linear (\textit{H}).

Substituindo a Eq. (5) na Eq. (1):

J(\mathbf{x}) = \frac{1}{2}(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + \frac{1}{2}[\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]^{T}\mathbf{R}^{-1}[\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]
(6)

Fatorando e desenvolvendo a Eq. (6):

J(\mathbf{x}) = \frac{1}{2}\lbrace(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + [\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]^{T}\mathbf{R}^{-1}[\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]\rbrace
(7)

2J(\mathbf{x}) = (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + [\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]^{T}\mathbf{R}^{-1}[\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]
(8)

2J(\mathbf{x}) = (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + [(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T} - (\mathbf{H}(\mathbf{x} - \mathbf{x_{b}}))^{T}]\mathbf{R}^{-1}[\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]
(9)

2J(\mathbf{x}) = (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + [(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T} - \mathbf{H}^{T}(\mathbf{x} - \mathbf{x_{b}})^{T}]\mathbf{R}^{-1}[\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]
(10)

2J(\mathbf{x}) = (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + [(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1} - \mathbf{H}^{T}(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{R}^{-1}][\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}) - \mathbf{H}(\mathbf{x} - \mathbf{x_{b}})]
(11)

2J(\mathbf{x}) = (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + (\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}})) - (\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}}) - \mathbf{H}^{T}(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}})) + \mathbf{H}^{T}(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}})
(12)

Reorganizando a Eq. (12) – aqui serão fatorados os termos 1 e 5 do lado direito:

2J(\mathbf{x}) = (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{B}^{-1}(\mathbf{x} - \mathbf{x_{b}}) + (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}}) - (\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}}) - (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{H}^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}})) + (\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))
(13)

Combinando os dois primeiros termos do lado direito de (13), obtemos:

2J(\mathbf{x}) = (\mathbf{x} - \mathbf{x_{b}})^{T}[\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H}](\mathbf{x} - \mathbf{x_{b}}) - (\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}}) - (\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{H}^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}})) + (\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))
(14)

A forma da Eq. (14) é a forma em que será aplicado o operador gradiente. O gradiente é aplicado na função custo variacional para se determinar o vetor de estado de análise \mathbf{x_{a}} tal que \nabla_{x}{J(\mathbf{x})} = 0. Ou seja, o mínimo de J(\mathbf{x}) fornece os valores do vetor de estado analisado.

Teorema (1):
Dada a função quadrática F(\mathbf{x}) = \frac{1}{2}\mathbf{x}^{T}\mathbf{A}\mathbf{x} + \mathbf{d} + c, onde \mathbf{A} é uma matriz simétrica (ou seja, é igual à sua transposta), \mathbf{x} e \mathbf{d} são vetores e c é um escalar, o gradiente de F(\mathbf{x}) é dado por \nabla_{x}{F(\mathbf{x})} = \mathbf{A}\mathbf{x} + \mathbf{d}.

Demonstração (1):

F(\mathbf{x}) = \frac{1}{2}\mathbf{x}^{T}\mathbf{A}\mathbf{x} + \mathbf{d} + c \\  \frac{\partial F}{\partial x} = \frac{1}{2}(\mathbf{A}\mathbf{x} + \mathbf{A}^{T}\mathbf{x}) + \mathbf{d}
(15)

Se \mathbf{A} é simétrica, então \mathbf{A}^{T} = \mathbf{A}, logo:

\frac{\partial F}{\partial x} = \frac{1}{2}(\mathbf{A}\mathbf{x} + \mathbf{A}\mathbf{x}) + \mathbf{d} \\  \frac{\partial F}{\partial x} = \frac{1}{2}(2\mathbf{A}\mathbf{x}) + \mathbf{d} \\  \frac{\partial F}{\partial x} = \mathbf{A}\mathbf{x} + \mathbf{d}
(16)

Aplicando o operador gradiente na Eq. (14), obtem-se:

\nabla_{x}{2J(\mathbf{x})} = \frac{\partial \lbrace(\mathbf{x} - \mathbf{x_{b}})^{T}[\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H}](\mathbf{x} - \mathbf{x_{b}})\rbrace}{\partial x} - \frac{\partial \lbrace(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}})\rbrace}{\partial x} - \frac{\partial \lbrace(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{H}^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))\rbrace}{\partial x} + \frac{\partial \lbrace(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))\rbrace}{\partial x}
(17)

Na Eq. (17) observamos que o termo 4 do lado direito não depende do vetor de estado analisado \mathbf{x} e que portanto \frac{\partial \lbrace(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))\rbrace}{\partial x} = 0, logo:

2\nabla_{x}{J(\mathbf{x})} = \frac{\partial \lbrace(\mathbf{x} - \mathbf{x_{b}})^{T}[\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H}](\mathbf{x} - \mathbf{x_{b}})\rbrace}{\partial x} - \frac{\partial \lbrace(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}})\rbrace}{\partial x} - \frac{\partial \lbrace(\mathbf{x} - \mathbf{x_{b}})^{T}\mathbf{H}^{T}\mathbf{R}^{-1}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))\rbrace}{\partial x}
(18)

Utilizando o Teorema (1), obtem-se:

2\nabla_{x}{J(\mathbf{x})} = [(\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})^{T}(\mathbf{x} - \mathbf{x_{b}}) + (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})(\mathbf{x} - \mathbf{x_{b}})] - \frac{\partial \lbrace(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))^{T}\mathbf{R}^{-1}\mathbf{H}(\mathbf{x} - \mathbf{x_{b}})\rbrace}{\partial x} - [(\mathbf{H}^{T}\mathbf{R}^{-1})^{T}(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}})) + (\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))]
(19)

O segundo termo da Eq. (19) resulta em zero, pois a derivada da constante (\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))\mathbf{R}^{-1}\mathbf{H} é zero.

Utilizando-se do fato de que as relações entre as matrizes nos termos 1-3 do lado direito da Eq. (18) geram matrizes simétricas (e.g., (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})^{T}= (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})), a Eq. (19) reduz-se a:

2\nabla_{x}{J(\mathbf{x})} = 2[(\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})(\mathbf{x} - \mathbf{x_{b}})] - 2[(\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))]
(20)

e,

\nabla_{x}{J(\mathbf{x})} = (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})(\mathbf{x} - \mathbf{x_{b}}) - (\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))
(21)

No inicio foi feita consideração de que o vetor de estados analisado \mathbf{x} é a própria análise quando \nabla_{x}{J(\mathbf{x})} = 0, logo iguala-se a Eq. (21) a zero, de forma que \mathbf{x} = \mathbf{x_{a}}:

0 = (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})(\mathbf{x_{a}} - \mathbf{x_{b}}) - (\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))
(22)

Reorganizando a Eq. (22):

(\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})(\mathbf{x_{a}} - \mathbf{x_{b}}) - (\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}})) = 0 \\  (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})(\mathbf{x_{a}} - \mathbf{x_{b}}) = (\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}})) \\  (\mathbf{x_{a}} - \mathbf{x_{b}}) = (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})^{-1}[(\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))]
(23)

A partir da Eq. (23), obtemos a Equação de Análise:

\mathbf{x_{a}} = \mathbf{x_{b}} + (\mathbf{B}^{-1} + \mathbf{H}^{T}\mathbf{R}^{-1}\mathbf{H})^{-1}[(\mathbf{H}^{T}\mathbf{R}^{-1})(\mathbf{y^{o}} - \textit{H}(\mathbf{x_{b}}))]
(24)

Panoply: Software de Visualização de Dados em Ponto de Grade

O Panoply (pronuncia-se PA.NO.PLI) é um poderoso e completo software de visualização de dados geofísicos (meteorológicos e oceanográficos) em ponto de grade, capaz de ler e plotar dados nos formatos netCDF, HDF e GRIB desenvolvido pela NASA. Assim como outros softwares do gênero (GrADS, FERRET, NCVIEW, Metview e outros), ele decodifica as informações dos dados e, por meio de uma lista, permite o usuário selecionar as variáveis que quer visualizar e as plota na projeção desejada. Diferentemente do GrADS, por exemplo, ele possui uma interface gráfica simples, sendo – neste aspecto, semelhante ao Metview. Neste post, vou mostrar como fazer a instalação do Panoply no Mac OS X e um exemplo de uso.

Obtendo o pacote de instalação do Panoply

O pacote de instalação para Mac do Panoply pode ser obtido na página do projeto:

Instalação do Panoply no Mac OS X

Abra o arquivo .dmg baixado no seu computador e arraste a pasta “PanoplyOSX” para a pasta Applications (ou qualquer outra pasta que você queira):

Instalação do Panoply no Mac OS X.
Instalação do Panoply no Mac OS X.

Depois disso, você terá uma cópia do Panoply instalada no seu Mac OS X e pronta para uso. Mas antes de abrir o programa pela promeira vez, vamos criar uma aliase do app principal para fora da pasta PanoplyOSX – assim mantém-se as coisas mais organizadas e no seu devido lugar (isso pode evitar que o programa principal deixe de encontrar os arquivos auxiliares de mapas, projeções etc):

Criando uma aliase do programa principal (Panoply.app) e colocando-o na pasta Applications.
Criando uma aliase do programa principal (Panoply.app) e colocando-o na pasta Applications.

Utilizando o Panoply

Para abrir e utilizar o Panoply, é trivial: basta dar um duplo clique no executável principal (abra a aliase que você criou), ou pesquise por ele no Spotlight do Mac OS X, ou mesmo no Launchpad.

Quando se abre o Panoply, uma splash screen é mostrada e, logo em seguida, é perguntado ao usuário qual arquivo abrir:

Splash screen e file browser do Panoply.
Splash screen e file browser do Panoply.

No exemplo que vou mostrar, vou abrir um arquivo netCDF de umidade específica da Reanálise 2 do NCEP, recortado para o domínio da América do Sul:

Abrindo um arquivo netCDF no Panoply.
Abrindo um arquivo netCDF no Panoply.

Observe na figura acima, que no lado esquerdo da interface gráfica do Panoply, é mostrado o conteúdo do arquivo. As camadas contidas nesse arquivo são: latitudes, níveis, longitudes, variável(is) e tempo. Já no lado direito, são mostradas as informações mais detalhadas sobre o conteúdo do arquivo netCDF, tal como se estivéssemos utilizando o comando ncdump.

Para plotar o campo de umidade específica desse arquivo, basta selecionar (clicar sobre) o nome da variável – neste caso, “shum” (de specific humidity) e clicar no botão “Create Plot”. Fazendo-se isso, será perguntado ao usuário qual o tipo de plot se deseja criar:  Tempo X Latitude ou Latitude X Longitude. A escolha aqui (para efeito de ilustração, foi Lat/Lon, assim podemos ver um campo bidimensional da variável):

Criando um plot espacial no Panoply.
Criando um plot espacial no Panoply.

Screen Shot 2013-02-17 at 4.46.13 PM

Na figura acima, a imagem na parte de baixo é a janela de plotagem do Panoply. Nela, através das diversas abas, é possível ajustar os parâmetros de plotagem. Pode-se modificar, entre outros, as cores, a posição da barra de legendas, a projeção, os títulos dos eixos e legenda, a data do campo plotado, a escala, incluir linhas de contorno etc. Inclusive, dá para criar animações!

Depois de instalar o Panoply, plote um campo espacial, modifique os parâmetros, faça um Diagrama de Hovmöller (para isso, escolha a opção Latitude X Tempo). O programa é bastante interessante e rápido, principalmente porque não é necessário programar suas ações!

Vórtices de Von Kármán

Nuvens em vórtice alinhadas.
Nuvens em vórtice alinhadas.

Essas nuvens frequentemente podem ser observadas sobre o oceano, principalmente sobre ilhas. Elas ocorrem quando o vento espalha as nuvens estratiformes e este interage com a topografia da(s) ilha(s) possibilitando a formação dos vórtices. Tais vórtices são também denominados de Vórtices de von Kármán. Neste caso, estas nuvens foram observadas sobre as Ilhas Canárias (do arquipélago espanhol) em 14 de agosto de 2010, pelo satélite Aqua/NASA.

Original em http://www.flickr.com/photos/gsfc/4897631523/

Instalando GCC, GFORTRAN, ZLIB, HDF5, NETCDF4 e OpenMPI no Mac OS X

Quem trabalha com programas compilados a partir do código fonte sem ter a disposição um gerenciador de pacotes tal como o apt-get ou o port sabe o trabalho que dá instalar os pré-requisitos e dependências para preparar o ambiente de execução do programa principal. Muitas vezes, os gerenciadores de pacotes facilitam, automatizando as tarefas e principalmente, tratando automaticamente as dependências dos pacotes. Mas nem tudo são vantagens: muitas vezes, há a necessidade de se instalar um novo compilador e nem sempre será possível fazer com que todos os outros pacotes instalados sejam recompilados utilizando as bibliotecas e utilitários do novo compilador; ou ainda, pode ser que seja mais complicado fazer com que o gerenciador de pacotes utilize o novo compilador para recriar os novos executáveis etc (para ver como fazer com que o HomeBrew do Mac OS X trabalhe com um compilador diferente do gfortran clique aqui).

O objetivo deste post é tentar mostrar uma forma objetiva de se utilizar o MacPorts para a instalação de alguns programas, mantendo-se mais de um compilador fortran instalado na máquina. Com isso, pode-se pensar na vantagem de se instalar um programa pelo MacPorts ou manualmente. Em ambos os casos a instalação é feita a partir do código fonte, mas com a diferença de que pode-se especificar o local, o compilador e as bibliotecas (versões) a serem utilizadas.

Para exemplificar, serão instalados os pacotes gcc, gfortran, zlib, hdf5, netcdf4 e openmpi no Mac OS X. É possível pensar da mesma forma em qualquer sistema tipo UNIX em que se tem (ou não) um gerenciador de pacotes. Salienta-se, no entanto, que a instalação de alguns pacotes pode levar algumas horas, como é o caso da compilação do pacote gcc.

O gcc é um conjunto de programas essenciais para um sistema em que serão compilados quaisquer tipos de programas a partir do código fonte. Este pacote possui compiladores para as linguagens C, C++ e fortran. Há diversas versões disponíveis do gcc e a que será utilizada será a versão 4.4, sendo que a última versão mais recente (até outubro de 2012, pelo menos) é a versão 4.8. Sua compilação não é muito complicada, sendo feita com a utilização típica dos comandos configure, make e make install. Mas como o gcc é o pacote base para a instalação dos demais, ele será instalado primeiro e isso será feito a partir do MacPorts (se você não tem o MacPorts instalado, baixe o instalador correto para o seu Mac OS X aqui), que já ajusta todas as flags de compilação e otimização automaticamente.

Para instalar o gcc4.4 no Mac OS X utilizando o MacPorts, basta fazer:

$ sudo port install gcc44

Como mencionado acima, o gcc é um pacote que traz os compiladores das linguagens C, C++ e fortran. Este comando poderá demorar várias horas para terminar de ser executado, portanto é uma boa idéia deixar esta tarefa para ser feita durante a noite. A compilação do gcc4.4 é feita através do compilador nativo do Mac OS X, uma versão do gcc (versão 4.2.1 no OS X Mountain Lion) fornecida pela Apple, que vem junto com o Xcode4.X.

Depois da instalação do gcc4.4, é necessário fazer com que toda a suíte trazida pelo gcc4.4 esteja disponível no shell do Mac OS X por padrão. Para isso, basta fazer:

$ sudo port select gcc mp-gcc44

Este comando fará com que as versões dos compiladores do gcc não conflitem (eg, gcc4.2 nativo com o gfortran4.4 instalado pelo port) e que tudo passe a ser compilado com a mesma versão dos programas da suíte do gcc. Para testar os comandos, basta abrir uma nova aba ou um novo terminal e digitar os comandos:

$ gcc -v
$ g++ -v
$ gfortran -v

Em todos os casos, as versões devem ser identificadas como “gcc version 4.4.7 (MacPorts gcc44 4.4.7_6)”. É possível que algum número de versão se altere caso alguma atualização do port seja feita.

Com o gcc4.4 instalado e configurado, é possível começar a instalação dos programas zlib, hdf5, netcdf4 e openmpi. O programa zlib é um software de compressão, uma espécie de “zip”, que pode ser utilizado por qualquer outro programa que trabalhe com algum formato padronizado que utilize compressão; o hdf e o netcdf são bibliotecas utilizadas para armazenamento de dados geofísicos. Eles serão instalados por uma necessidade específica, e este pode não ser o seu caso. O openmpi é uma implementação aberta do mpi (Message Passing Interface) e é utilizado para executar programas em paralelo. Entre estes quatro programas, o openmpi é o único que tem dependência apenas do compilador C, C++ e fortran instalados na máquina; os demais possuem uma ordem específica de compilação, a qual será abordada mais adiante. É importante ressaltar que todos estes programas estão disponíveis na árvore de programas do MacPorts. No entanto, eles serão compilados manualmente com o gcc4.4 para permitir, porteriormente, que sejam também compilados com outros compiladores (eg., pgi, intel), caso haja necessidade.

Para a instalação do openmpi, é necessário obter o pacote da última versão do openmpi (atualmente na versão 1.6.2), descompactar e executar o comando:

$ wget -c http://repository.timesys.com/buildsources/o/openmpi/openmpi-1.6.2/openmpi-1.6.2.tar.bz2
$ tar -xvf openmpi-1.6.2.tar.bz2
$ cd openmpi-1.6.2
$ ./configure CC=gcc CXX=g++ F77=gfortran FC=gfortran \ 
--prefix=/opt/openmpi-gcc_gfortran4.4

O último comando irá compilar o openmpi com as flags CC, CXX, F77 e FC que indicam, respectivamente, os compiladores que serão utilizados no processo (gcc, g++ e gfortran). Observe que não foi necessário especificar a versão do gcc, pois isso já foi feito anteriormente com um comando interno do MacPorts (port select). O argumento “–prefix” permite especificar o local em que serão instalados os executáveis e demais arquivos criados na compilação do openmpi. É importante escolher um nome que reflita a configuração escolhida para a compilação do pacote, por exemplo, “openmpi-gcc_gfortran4.4”. Caso seja necessário instalar uma nova versão do gcc, uma nova compilação do openmpi será necessária para que se possa utilizar os comando mpif90, mpicc, mpicpp etc com a versão correta dos compiladores C, C++ e fortran. Isso é necessário porque nem sempre os módulos e bibliotecas são compatíveis entre as diferentes versões dos compiladores.

Depois de configurar o openmpi, basta executar os dois comandos abaixo para iniciar a compilação do pacote e finalizar a instalação, respectivamente:

$ make all
$ sudo make install

Com isso, o programa openmpi estará instalado. Os executáveis estarão em /opt/openmpi-gcc_gfortran4.4/bin. Para fazer com que esta versão seja a versão padrão disponível no seu Mac OS X, basta exportar as variáveis de ambiente necessárias, conforme este post. Caso você tenha outras versões do openmpi instalada, basta ajustar as variáveis de ambiente (PATH, MANPATH, C_INCLUDE_PATH e LIBRARY_PATH) para refletir os caminhos da instalação desejada.

Para a instalação do netcdf4, é necessário instalar o hdf5. Mas para instalar o hdf5, é necessário instalar primeiro a zlib.

A instalação da zlib é bastante simples e rápida também. Para baixar, configurar e instalar, execute:

$ wget -c http://zlib.net/zlib-1.2.7.tar.gz
$ tar -zxvf zlib-1.2.7.tar.gz
$ cd zlib-1.2.7
$ ./configure --prefix=/opt/zlib-gcc_gfortran-4.4 
$ sudo make check install

Com a zlib instalada, o próximo passo é a compilação do hdf5. Para baixar, configurar e instalar, basta fazer:

$ wget -c http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.9/src/hdf5-1.8.9.tar.gz
$ tar -zxvf hdf5-1.8.9.tar.gz
$ cd hdf5-1.8.9
$ ./configure --with-zlib=/opt/zlib-gcc_gfortran-4.4 \ 
--prefix=/opt/hdf5-1.8.9-gcc_gfortran-4.4
$ sudo make check install

Com o hdf5 instalado, finalmente pode-se instalar o netcdf4. Para baixar, configurar e instalar, basta fazer:

$ wget -c http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-4.0.1.tar.gz
$ tar -zxvf netcdf-4.0.1.tar.gz
$ cd netcdf-4.0.1
$ ./configure CPPFLAGS="-I/opt/zlib-gcc_gfortran-4.4/include \
-I/opt/hdf5-1.8.9-gcc_gfortran-4.4/include" \ 
LDFLAGS="-L/opt/zlib-gcc_gfortran-4.4/lib \ 
-L/opt/hdf5-1.8.9-gcc_gfortran-4.4/lib" \ 
--prefix=/opt/netcdf-4.0.1-gcc_gfortran-4.4
$ sudo make check install

Observe que na instalação do netcdf4, foram especificadas as flags CPPFLAGS e LDFLAGS que representam, respectivamente, as pastas include e lib das instalações da zlib e do hdf5.

Feito isto, seu sistema estará pronto para utilizar o netcdf4, hdf5, zlib e openmpi. Estas mesmas instruções podem ser aplicadas em um sistema Linux ou BSD.

Referências

Removendo GCC e GFORTRAN (pacote HPC, não nativo) do Mac OS X

Se você instalou os pacotes do gcc e do gfortran no seu Mac OS X disponíveis no site http://hpc.sourceforge.net deve ter percebido que a instalação é bastante simples, mas a desinstalação é um pouco mais complicada. Como os pacotes estão no formato .tar.gz, então não é um desinstalador que remova todos os arquivos que foram instaladas. No site http://web.mit.edu/mfloyd/www/computing/mac/gfortran/ é uma dica que é a seguinte:

$ sudo rm -f `tar tfz [tar-file]`

Este comando lista todo o conteúdo do arquivo [tar-file] (eg., gcc-mtlion.tar.gz) e executa o comando rm -rf com permissão de superusuário. Mas há uma falha: o comando não é bem executado porque a listagem dos arquivos que estão dentro do arquivo tar não inclui a barra “/” no início, fazendo com que o arquivo “usr/local/bin/gcc” seja apagado ao invés do arquivo “/usr/local/bin/gcc”. Portanto, esse comando não funciona porque o arquivo “/usr/local/bin/gcc” não existe!

Para resolver isso, utilize o comando abaixo:

$ for i in `tar tfz [tar-file]`; do sudo rm -rf '/'$i; done

No comando acima, listamos o conteúdo do arquivo [tar-file] (eg., gcc-mtlion.tar.gz) e utilizamos o comando for para executar o comando “sudo rm -rf ‘/’$i” em todos os arquivos que forem listados, incluindo a barra “/” no início.

Referências

Erro: no such instruction: `vzeroupper’ do PGF90 12.8-1

Recentemente instalei a versão trial do compilador fortran do Portland Group (PGI) para compilar um pacote. No primeiro teste (com um programa Hello World), ocorreu o seguinte erro:

$ pgf90 teste.f90
NOTE: your trial license will expire in 14 days, 0.939 hours.
NOTE: your trial license will expire in 14 days, 0.939 hours.
teste.f90:74:no such instruction: `vzeroupper'
teste.f90:83:no such instruction: `vzeroupper'
teste.f90:90:no such instruction: `vzeroupper'
teste.f90:97:no such instruction: `vzeroupper'
teste.f90:101:no such instruction: `vzeroupper'
teste.f90:107:no such instruction: `vzeroupper'
teste.f90:234:no such instruction: `vzeroupper'

O que é muito estranho, pois o programa hello world contém apenas uma instrução para imprimir uma linha na tela. Dando uma olhada aqui e alí, encontrei a solução aqui, e a sugestão foi acrescentar a opção  “-tp=nehalem-64” na compilação:

$ pgf90 -tp=nehalem-64 teste.f90
NOTE: your trial license will expire in 14 days, 0.901 hours.
NOTE: your trial license will expire in 14 days, 0.901 hours.

Ou seja, o “a.out” (programa compilado) foi criado e funciona sem problemas. Este problema pode afetar máquinas Linux ou Mac OS X com processador Intel, especialmente com o chip SandyBridge. Meu Macbook Pro é de 2011 e tem processador Intel com chip Sandybridge e a Apple não atualizou (ainda…) o Xcode (que fornece acesso a algumas instruções básicas do processador) para suportar as instruções AVX presentes a partir dos chips SandyBridge (o que é ridículo, pois já temos os novos chips IvyBridge…). Então, esta solução força o compilador a interpretar o chip como um modelo mais antigo, ou mais ou menos isso 🙂

Referência:

http://www.pgroup.com/userforum/viewtopic.php?t=2794&sid=3fb09a8305d263e7694c5c20887035b8