Converta arquivos em NetCDF para GRIB com o CDO

O CDO (Climate Data Operators) é um conjunto de rotinas para manipulação de dados meteorológicos bastante poderoso. Entre suas rotinas, há uma bastante interessante que permite a conversão de um arquivo NetCDF para GRIB (se você quer saber como fazer o contrário, ou seja, converter de GRIB para NetCDF, clique aqui). Ele funciona em linha de comando e poder ser utilizado em scripts, sendo bastante prático por isso. Vejamos:

1) Instalação:

Para instalar no Ubuntu, digite no terminal:

$ sudo apt-get install cdo

Se você estiver no Mac OS X, instale o cdo pelo port:

$ sudo port install cdo

2) Utilização:

Com o cdo instalado, basta executar o comando abaixo para converter um arquivo NetCDF para GRIB:

$ cdo -f grb copy arquivo.nc arquivo.grib

Com isso, será criado o arquivo arquivo.grib, mas apenas ele. Ainda nos falta o arquivo descritor (ctl) e o respectivo arquivo de índice (idx). Para gerá-los numa tacada só, utilize o comando abaixo:

$ cdo gradsdes arquivo.grib

Feito isto, você poderá abrir o arquivo.grib no GrADS utilizando o ctl criado com o comando anterior! O único inconveniente nesse processo, é que o ctl criado não herda as informações como o nome das variáveis do arquivos grib – elas são renomeadas para var1, var1 etc.

Referência:

http://www.mpimet.mpg.de/fileadmin/software/cdo/cdo.pdf

Anúncios

Converta arquivos em GRIB para NetCDF com o NCL

Essa é rápida:

Para converter um arquivo em GRIB para NetCDF utilizando o NCL (para a instalação no Mac OS X Lion, clique aqui), basta fazer:

$ ncl_convert2nc arquivo.grib

Exemplo:

Neste exemplo, utilizamos o arquivo “ERAInter.10u.1.5×1.5-19790101_19790102.grib” (um arquivo GRIB comum) para gerarmos o arquivo “ERAInter.10u.1.5×1.5-19790101_19790102.nc”, um arquivo NetCDF. Ambos podem ser abertos no GrADS, sendo que o GRIB precisa de um arquivo descritor (ctl) e o NetCDF não, pois ele contém um cabeçalho com as informações que estão no ctl do GRIB.

Para abrir o NetCDF no GrADS (versão 2.0+):

$ grads -blc "sdfopen arquivo.nc"

Para abrir o GRIB no GrADS (versão 2.0+):

$ grads -blc "open arquivo.ctl"

É isso!

PS.: Para fazer o contrário, ou seja, converter de NetCDF para GRIB, clique aqui.

NCARG/NCL no Mac OS X

O NCARG é um poderoso software de visualização de arquivos em ponto de grade (GRIB, NetCDF, HDF) com linguagem própria. Para instalá-lo no Mac OS X, você tem duas alternativas:

  1. Utilizando o port do Mac OS X pela linha de comando
  2. Baixando o pacote de binários pré-compilados no site do Earth System Grid

Na primeia opção, obtive o seguinte erro:

$ sudo port install ncarg
 Password:
 --->  Computing dependencies for ncarg
 --->  Dependencies to be installed: hdfeos hdfeos5 lesstif xorg-libXp xorg-printproto triangle vis5d mesa xorg-dri2proto xorg-glproto tcl
 --->  Configuring hdfeos
 Error: org.macports.configure for port hdfeos returned: configure failure: command execution failed
 Error: Failed to install hdfeos
 Please see the log file for port hdfeos for details:
 /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_science_hdfeos/hdfeos/main.log
 Error: The following dependencies were not installed: hdfeos hdfeos5 lesstif xorg-libXp xorg-printproto triangle vis5d mesa xorg-dri2proto xorg-glproto tcl
 To report a bug, follow the instructions in the guide:
 http://guide.macports.org/#project.tickets
 Error: Processing of port ncarg failed

Ou seja, entre várias outras dependências que precisam ser instaladas, o programa hdfeos não pode ser corretamente configurado para compilação porque o script de configuração tenta utilizar o programa szip para a compilação e não consegue encontrá-lo:

$ more /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_science_hdfeos/hdfeos/main.log
info:configure configure: error: HDF4 was linked without SZIP, but --with-szlib was given
:info:configure Command failed:  cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_science_hdfeos/hdfeos/work/hdfeos" && ./configure --prefix=/opt/local --with-hdf4=/opt/local --with-zlib=/opt/local --with-szlib=/opt/local --disable-dependency-tracking 
:info:configure Exit code: 1

Por isto, vamos utilizar a segunda opção, que é baixar o pacote com os binários pré-compilados para o Mac OS X. No meu caso, estou no Mac OS X Lion com gcc 4.2.1. Para baixar o arquivo com os executáveis, antes você irá precisar de uma OpenID e uma senha para poder logar no site do Earth System Grid e baixar o seguinte pacote:

Com o pacote já baixado, vamos às etapas de instalação:

1) Crie uma pasta para o NCARG em /opt (pode ser em outro local, mas adapte as etapas seguintes):

$ sudo mkdir -p /opt/ncl_ncarg-6.1.0-beta

2) Desempacote o pacote baixado na pasta criada:

$ sudo tar -zxvf ncl_ncarg-6.1.0-beta.MacOS_10.7_x86_64_gcc421.tar.gz -C /opt/ncl_ncarg-6.1.0-beta

3) Inclua as seguintes variáveis de ambiente no seu .bash_profile (caso não tenha um, basta criá-lo):

export NCARG_ROOT="/opt/ncl-ncarg-6.1.0-beta"
export NDV_COLORMAP_PATH="${NCARG_ROOT}/lib/ncarg/colormaps"
export PATH="${NCARG_ROOT}/bin":${PATH}
export C_INCLUDE_PATH="${NCARG_ROOT}/include":${C_INCLUDE_PATH}
export LIBRARY_PATH="${NCARG_ROOT}/lib":${LIBRARY_PATH}

Feito isto, basta reabrir o terminal e executar o ncl:

NCARG/NCL no Mac OS X Lion!

Utilize o script grib2ctl.pl para gerar ctl’s a partir de arquivos GRIB

Um arquivo GRIB (Grid In Binary) é um arquivo binário em ponto de grade padrão recomendado pela OMM (Organização Meteorológica Mundial) para armazenamento de dados meteorológicos em ponto de grade. É um arquivo sequencial binário e que pode ser aberto pelo software GrADS (Gridpoint Analysis and Display System) por meio de um arquivo descritor, o ctl. Se você tem um arquivo GRIB mas não tem o seu respectivo descritor (ctl), você pode tentar utilizar o script grib2ctl.pl do NCEP (National Centers for Environmental Predictions) para gerar os seus ctl’s. Veja como:

1) Baixe o script grib2ctl.pl do servidor ftp do NCEP:

$ wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib.scripts/grib2ctl.pl

2) Copie o script grib2ctl.pl para a pasta /usr/local/bin do seu Linux (ou Mac OS X):

$ sudo cp grib2ctl.pl /usr/local/bin

3) Dê permissão de execução:

$ sudo chmod +x /usr/local/bin/grib2ctl.pl

Para utilizar, basta fazer o seguinte:

$ grib2ctl.pl arquivo.grib > arquivo.ctl

Com este comando, o script grib2ctl.pl irá ler as informações do arquivo GRIB que serão escritas no arquivo “arquivo.ctl”. Com isso, já temos um arquivo descritor. Mas ainda, nos falta um arquivo de índice, que mapeia a grade do arquivo binário. Para criá-lo, podemos utilizar o programa “gribmap”do GrADS para gerar o arquivo de índice, geralmente com a extensão idx ou gmp. Para isto, podemos fazer:

$ gribmap -v -i arquivo.ctl

As opções “v”,  e “i” são opções para, respectivamente, “verbose” e “input”. Feito isto, podemos abrir o arquivo no GrADS e visualizar as informações:

$ grads -blc "open arquivo.ctl"

Referência:

http://www.cpc.ncep.noaa.gov/products/wesley/grib2ctl.html

Baixe a reanálise ERA Interim do ECMWF utilizando um script Perl

Recentemente precisei baixar alguns dados da Renálise do ERA Interim para estudo. No site, é oferecido um formulário onde pode-se selecionar o período, variáveis, níveis etc. Com essa seleção, um script server-side processa o seu pedido, gera um arquivo em GRIB e, dependendo do seu pedido, converte o GRIB em NETCDF. Perfeito! Mas e se você quiser baixar tudo? e uma quantidade colossal de dados e com certeza vai demandar uma quantidade colossal de espaço e tempo. Portanto, vamos considerar que você queira baixar um período grande, contendo alguns anos, níveis e variáveis, algo suficiente para que você queira e precise fazer um script.

O primeiro passo, portanto, é entrar em http://data-portal.ecmwf.int/data/d/interim_daily/ e depois clicar no link indicado na imagem abaixo:

Você será redirecionado para uma nova página contendo um script simples em Python e outras duas opções em Perl, que são as opções que nós iremos usar.

Os scripts que nos interessam estão mais ao final da página. Mas para utilizá-los, nós necessitaremos de alguns softwares instalados no computador. Vamos precisar do Perl (uma linguagem de programação em scripts modular) e de dois módulos básicos: o libdate-calc-perl e o DataServer do ECMWF que deve ser baixado no link indicado pelo retângulo vermelho da imagem acima.

Para instalar estes pacotes no seu Linux (vou considerar o Ubuntu), faça o seguinte:

1) Instale o Perl:

$ sudo apt-get install perl

2) Instale o módulo libdate-calc-perl:

$ sudo apt-get install libdate-calc-perl

3) Baixe o módulo DataServer do ECMWF em http://tigge.ecmwf.int/ECMWF_DataServer.tar

4) Desempacote o arquivo ECMWF_DataServer.tar na pasta /usr/share/perl/<versao_do_seu_perl>:

$ sudo tar -xvf ECMWF_DataServer.tar -C /usr/share/perl/<versao_do_seu_perl>

Se você estiver utilizando o Mac OS X (vou considerar o Lion), você precisará apenas instalar o módulo DataServer do ECMWF na pasta /System/Library/Perl/5.12:

$ sudo tar -xvf ECMWF_DataServer.tar -C /System/Library/Perl/5.12

Feito isto, copie o segundo script em Perl (é o último script da página) da página que você abriu (a página que contém os scripts) e cole em um arquivo vazio no seu computador:

#!/usr/bin/perl -Ipath_to_where_ECMWF::DataServer_is_installed
use ECMWF::DataServer;
use Date::Calc qw(Add_Delta_Days Delta_Days);
use strict;

my $client = ECMWF::DataServer->new(
    portal => 'http://data-portal.ecmwf.int/data/d/dataserver/',
    token  => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    email  => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
);

# This is the start date. Modify as required
my ($year, $month, $day) = (2009, 01, 01);
# This is the end date. Modify as required
my @enddate = (2009, 01, 02);

while (Delta_Days(@date, @enddate) >= 0) {

  my $date = sprintf("%d-%02d-%02d", $year, $month, $day);

  $client->retrieve( 
    dataset  => "interim_daily",
    step     => "0",
    levtype  => "pl",
    type     => "an",
    param    => "130.128",
    levelist => "500/1000",
    area     => "60/-120/30/-60",
    date     => "$date",
    time     => "00/12",
    target   => "data_${date}.grib",
    );

  # move to next day
  ($year, $month, $day) = Add_Delta_Days($year, $month, $day, 1);

}

Para este script, devem ser observadas as sequências ‘xxxxxx…’ e ‘yyyyy…’ para as variáveis “token” e “email”, respectivamente. Estas são variáveis utilizadas pelo módulo DataServer do ECMWF para autenticar a sua conexão ao servidor do centro. Quando você abrir esta página, será gerada automaticamente um token (uma espécie de senha) específica para o email que você forneceu anteriormente. Portanto, esses ‘yyyyy…’ e esses ‘xxxxx…’ não aparecem na página, mas sim o seu email (que você de ter informado) e um token gerado automaticamente. Uma outra informação importante, é que para executar corretamente o script, você precisar corrigir uma falha. Veja:

$ ./script_perl.pl
Global symbol "@date" requires explicit package name at ./script_perl.pl line 17.
Execution of ./script_perl.pl aborted due to compilation errors.

Ou seja, a variável “@date” é usada, mas não está declarada. Então, para consertarmos isso, basta acrescentar a linha em negrito abaixo dentro do seu script:

my ($year, $month, $day) = (2009, 01, 01);
my @date = (2009, 01, 01);

Com isso, será possível executar novamente o script e baixar os seus dados. Você pode alterar o script de acordo com as suas necessidades, bastando seguir a sintaxe do MARS, que é um programa com linguagem própria criado para coletar os dados dentro do banco de dados do ECMWF.

O script corrigido fica assim:

#!/usr/bin/perl -Ipath_to_where_ECMWF::DataServer_is_installed
use ECMWF::DataServer;
use Date::Calc qw(Add_Delta_Days Delta_Days);
use strict;

my $client = ECMWF::DataServer->new(
    portal => 'http://data-portal.ecmwf.int/data/d/dataserver/',
    token  => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    email  => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
);

# This is the start date. Modify as required
my ($year, $month, $day) = (2009, 01, 01);
my @date = (2009, 01, 01);
# This is the end date. Modify as required
my @enddate = (2009, 01, 02);

while (Delta_Days(@date, @enddate) >= 0) {

  my $date = sprintf("%d-%02d-%02d", $year, $month, $day);

  $client->retrieve( 
    dataset  => "interim_daily",
    step     => "0",
    levtype  => "pl",
    type     => "an",
    param    => "130.128",
    levelist => "500/1000",
    area     => "60/-120/30/-60",
    date     => "$date",
    time     => "00/12",
    target   => "data_${date}.grib",
    );

  # move to next day
  ($year, $month, $day) = Add_Delta_Days($year, $month, $day, 1);

}

Com tudo corrigido, o script mostra as seguintes saídas:

(Clique para ampliar)

Em meus testes, notei que o servidor do ECMWF é um pouco instável, portanto você poderá experimentar alguns “Connection Timeout”, por parte do módulo DataServer do ECMWF, responsável pela autenticação da conexão entre o seu computador e o servidor do ECMWF.

500 read timeout at ECMWF/DataServer.pm line 35.

É isso!