Documentação do GrADS

GrADS O que há de novo Downloads Grupo de Usuários Documentação GDS
Guia do Usuário Tutorial Índice Instalação
   

Criando GRIB no GrADS

Introdução
O que é GRIB?
O Problema
Sinceras Limitações
A solução - Parte 1
A solução - Parte 2
Conclusões


Introdução

    Uma das mais poderosas características do GrADS é a habilidade para trabalhar DIRETAMENTE com os dados GRIB. Infelizmente, "Criando GRIB no GrADS" não é simples, isto requer um entendimento do GRIB e como funciona este tipo de dado.

    Este texto tenta fornecer um necessário entendimento para o uso dos dados GRIB no GrADS.

O Que é GRIB?

    GRIB (GRIdded Binary - Grade Binária) é um formato internacional, público de formato binário para um eficiente arquivamento de variáveis meteorológicas/oceanográficas. Normalmente os dados GRIB consistem de uma seqüência 2-D (lon,lat) de pedaços de uma (na maior parte dos casos) variável 4-D (i.e., componente u do vento = f(lon,lat,nível,tempo)). A seqüência é comumente organizada em arquivos contendo todas as variáveis em um tempo particular (i.e., volume 3-D (lon,lat,nível) ).

O Problema

Sinceras Limitações

    Há algumas limitações com relação aos tipos de dados GRIB que podem ser interfaceadas/exibidas no GrADS:

      a) lon,lat grids (NÃO lat,lon)
      b) empacotamento simples
      c) dados em ponto de grade
      d) grades devem ser contínuas (nenhuma grade bloqueada ou octetos)

    Desta forma, grades "finas" (não retangular) e coeficientes espectrais não são suportadas. De qualquer forma, as versões GRIB 1 E 0 são suportadas (GRIB 0 deve ser filtrado para GRIB 1 pelo wgrib (ver wgrib) e a versão 1.7 do GrADS irá suportar tais grades não retilíneas. Além disto, É possível exibir dados GRIB "preprojetados" (i.e., campos estéreo polares, ver eta.ctl).

A Solução - Parte 1

    A primeira, e relativamente direta, e consiste em descobrir o que está no arquivo GRIB. Foram usados dois programas:

    1. gribscan (vem com o GrADS);
    2. wgrib

    A grande virtude do wgrib é que o código foi escrito em ANSI C e funciona na maior parte das plataformas de PC a Cray. Embora o wgrib tenha sido designado para suportar o projeto de reanálises do NCEP, ele foi estendido para lidar com outras fontes de dados GRIB (i.e, ECMWF). Se não for possível a leitura dos dados com o wgrib então o código deve ser modificado e as mudanças fornecidas para Wesley Ebisuzaki, NCEP.

    Uma vez tendo o wgrid funcionando,

    wgrib ncep.reanl.mo.7901.grb

    rende,

      1:0:d=79010100:UGRD:kpds5=33:kpds6=100:kpds7=850: TR=113:P1=0:P2=6:TimeU=1:850 mb:anl:ave@6hr:NAve=124
      2:15852:d=79010100:UGRD:kpds5=33:kpds6=100:kpds7=500: TR=113:P1=0:P2=6:TimeU=1:500 mb:anl:ave@6hr:NAve=124
      3:33018:d=79010100:UGRD:kpds5=33:kpds6=100:kpds7=200: TR=113:P1=0:P2=6:TimeU=1:200 mb:anl:ave@6hr:NAve=124
      4:51498:d=79010100:VGRD:kpds5=34:kpds6=100:kpds7=850: TR=113:P1=0:P2=6:TimeU=1:850 mb:anl:ave@6hr:NAve=124
      5:66036:d=79010100:VGRD:kpds5=34:kpds6=100:kpds7=500: TR=113:P1=0:P2=6:TimeU=1:500 mb:anl:ave@6hr:NAve=124
      6:81888:d=79010100:VGRD:kpds5=34:kpds6=100:kpds7=200: TR=113:P1=0:P2=6:TimeU=1:200 mb:anl:ave@6hr:NAve=124
      7:99054:d=79010100:PRES:kpds5=1:kpds6=102:kpds7=0: TR=113:P1=0:P2=6:TimeU=1:MSL:anl:ave@6hr:NAve=124

    São exibidos 7 campos no arquivo válido em 00Z1jan1979 (d=79010100).

    para,

    wgrib ncep.reanl.mo.7902.grb

    é exibido,

      1:0:d=79020100:UGRD:kpds5=33:kpds6=100:kpds7=850: TR=113:P1=0:P2=6:TimeU=1:850 mb:anl:ave@6hr:NAve=112
      2:15852:d=79020100:UGRD:kpds5=33:kpds6=100:kpds7=500: TR=113:P1=0:P2=6:TimeU=1:500 mb:anl:ave@6hr:NAve=112
      3:33018:d=79020100:UGRD:kpds5=33:kpds6=100:kpds7=200: TR=113:P1=0:P2=6:TimeU=1:200 mb:anl:ave@6hr:NAve=112
      4:50184:d=79020100:VGRD:kpds5=34:kpds6=100:kpds7=850: TR=113:P1=0:P2=6:TimeU=1:850 mb:anl:ave@6hr:NAve=112
      5:64722:d=79020100:VGRD:kpds5=34:kpds6=100:kpds7=500: TR=113:P1=0:P2=6:TimeU=1:500 mb:anl:ave@6hr:NAve=112
      6:80574:d=79020100:VGRD:kpds5=34:kpds6=100:kpds7=200: TR=113:P1=0:P2=6:TimeU=1:200 mb:anl:ave@6hr:NAve=112
      7:96426:d=79020100:PRES:kpds5=1:kpds6=102:kpds7=0: TR=113:P1=0:P2=6:TimeU=1:MSL:anl:ave@6hr:NAve=112

    ou os mesmos campos como anteriormente, exceto que eles são válidos em 00z1feb1979.

    Para descobrir algo sobre dados em grade,

    wgrib -V ncep.reanl.mo.7901.grb

    e para o primeiro registro será mostrado:

      
      rec 1:pos 0:date 79020100 UGRD kpds5=33 kpds6=100 kpds7=850
      
      levels=(3,82) grid=2 850 mb anl:ave@6hr:
      
        timerange 113 P1 0 P2 6  nx 144 ny 73 GDS grid 0 num_in_ave 112 missing 0
      
        center 7 subcenter 0 process 80
      
        latlon: lat  90.000000 to -90.000000 by 2.500000
      
                long 0.000000 to -2.500000 by 2.500000, (144 x 73) scan 0 bdsgrid 1
      
        min/max data -12.29 16.86  num bits 12  BDS_Ref -1229  DecScale 2 BinScale 0
      
      
    A grade é a NCEP #2 (veja o Evangelho Segundo John) a qual é uma global com 2.5 graus. A grade tem 144 pontos em x (lon) e 73 pontos em y (lat). O ponto (1,1) está localizado em 90N e 0E.

A Solução - Parte 2

    Esta é a parte mais difícil -- criar uma relação entre a seqüência de campos GRIB 2-D (lon,lat) em um(uns) arquivo(s) e o GrADS, 4-D, externo aos dados, volume de dados espaço temporal (lon,lat,nível,tempo). No GrADS, a relação volume GRIB para 4-D é definida pelo descritor de dados ou arquivo .ctl. A real relação é criada usando o programa externo ao GrADS chamado gribmap o qual gera um "índice" ou "mapa" entre as variáveis do GrADS no arquivo .ctl e o dado GRIB.

    Antes de descrever os detalhes do gribmap, deve primeiro ser considerado o script em shell do unix, grb2ctl.sh, originalmente escrito por Wesley. Este script usa o wgrib para primeiro criar uma lista de campos no arquivo de dados GRIB e então analisar a lista para tempos, variáveis e níveis para o arquivo .ctl.

    O site abaixo tem mais informações,

    http://wesley.wwb.noaa.gov/grib2ctl.html

    Em outro exemplo,

    grb2ctl.sh ncep.reanl.mo.7901.grb

    apresenta a saída pdrão,

      dset ^ncep.reanl.mo.7901.grb
      dtype grib
      options yrev
      index ^ncep.reanl.mo.7901.grb.gmp
      undef -9.99E+33
      title ncep.reanl.mo.7901.grb
      xdef 144 linear 0 2.5
      ydef 73 linear -90 2.5
      zdef 3 levels
      850 500 200
      tdef 1 linear 00Z01jan79 1mo
      vars 3
        PRES 0 1 ,102,0 Pressão [Pa]
        UGRD 3 33 ,100 componente u do vento [m/s]
        VGRD 3 34 ,100 componente v do vento [m/s]

      endvars

    Como o grb2ctl.sh faz isto? Primeiro, somente UMA grade foi encontrada no arquivo de dados GRIB (definido pelo dset) e o script teve a grade geométrica enbutída. Segundo, as variáveis com níveis múltiplos (3-D ou or lon,lat,nível) onde doi DEFINIDO ter um "indicador de nível" de 100 (mais baixo). Terceiro, houve somente UM tempo no arquivo e o script DEFINIU o incremento de tempo para 1mo.

    Estas condições nem sempre estarão presentes. Desta forma, a saída do grb2ctl.sh terá que ser razoavelmente "conseguida" pelo bom e velho método da tentativa e erro. Em alguns casos o arquivo .ctl terá que ser construído "nas mãos" usando a saída do wgrib, então provavelmente terá que haver um pouco de conhecimento sobre GRIB e como o gribmap trabalha em muitas situações.

    Os ingredientes principais no arquivo .ctl são:

    1. geometria da grade (xdef,ydef)
    2. tempo inicial e incremento de tempo (tdef)
    3. variáveis e parametro de "unidades"
    4. tipo de variável - "nivel" ou 3-D (zdef) ou "superfície" (2-D)

    Os parâmetros de unidade especificam os parâmetros GRIB de cada variável no .ctl para ser usado pelo gribmap para relacionar as variáveis do GrADS com os campos nos arquivos GRIB. Estes parâmetros consistem de 1 a 4 separados por vírgula:

    VV,TIPON,(NÍVEL),(IAT)

    onde,

      VV - (requerido) O número do parâmetro GRIB (33 = comp u do vento, tabela 2 em John:seção 1 página 27, i.e., Edição 1 do GRIB (FM 92))

      TIPON - (requerido) O inidicador do tipo de nível (100 = nível de pressão, na Tabela 3 no John:seção 1 Página 33)

      NÍVEL - (opcional) O valor do TIPON (TIPON 102 está ao nível médio do mar, então NÍVEL é 0 onde os níveis estão localizados (1,102,0, 0 está AO nível médio do mar)

      IAT - (opcional) O "indicador do alcance de tempo" para aplicações especiais (Tabela 5 no John:seção 1 Página 37).

    A dica é ter os parâmetros das unidades, a geometria da grade e os tempos.

    Felizmente, gribmap pod dizer o quanto bem o .ctl mapeou os dados GRIB até a mais alta dimensão. E, o mais importante, o processo do gribmap NÃO depende de como os dados estão ordenados dentro do arquivo GRIB, em nível ou variável.

    Redirecionando a saída do grb2ctl.sh para um arquivo .ctl , i.e.,

    grb2ctl.sh on ncep.reanl.mo.7901.grb > ncep.reanl.mo.ctl

    e então executando o gribmap. Para reiterar, o programa gribmap compara cada campo no arquivo GRIB com cada variável, em cada nível e para todos os tempo no arquivo .ctl e cria um arquivo índice dizendo para o GrADS ONDE os campos estão (ou não estão) localizados nos dados GRIB.

    Com a opção verbose ativada,

    gribmap -v -i ncep.reanl.mo.ctl

    consegue-se,

      
      Scanning binary GRIB file(s):
      
       ncep.reanl.mo.7901.grb
      
      !!!!!MATCH: 1  15852  2  1  0  33 100 850 btim: 1979010100:00 tau: 0 dtim: 1979010100:00
      
      !!!!!MATCH: 2  33018  2  1  0  33 100 500 btim: 1979010100:00 tau: 0 dtim: 1979010100:00
      
      !!!!!MATCH: 3  51498  2  1  0  33 100 200 btim: 1979010100:00 tau: 0 dtim: 1979010100:00
      
      !!!!!MATCH: 4  66036  2  1  0  34 100 850 btim: 1979010100:00 tau: 0 dtim: 1979010100:00
      
      !!!!!MATCH: 5  81888  2  1  0  34 100 500 btim: 1979010100:00 tau: 0 dtim: 1979010100:00
      
      !!!!!MATCH: 6  99054  2  1  0  34 100 200 btim: 1979010100:00 tau: 0 dtim: 1979010100:00
      
      !!!!!MATCH: 7 116220  2  1  0   1 102 0   btim: 1979010100:00 tau: 0 dtim: 1979010100:00
      
      Reached EOF
    Houve sucesso!!! Cada 2-D no arquivo GRIB foi mapeado para a variável no ncep.reanl.mo.ctl. Neste caso de UGRD, uma variável 3-D (lon,lat,nível) a qual pode ser dividida em pedaços na vertical com o GrADS. Como sempre, falhas de mapeamento não irão impedir o GrADS de "funcionar". Se o dado NÃO estiver lá, o GrADS retornará uma grade de valores "indefinidos" na exibição e este estado pode realmente ser testado ...

    Os "ajustes" devem ser feitos com o arquivo .ctl até aparecer !!!!! MATCH para cada campo GRIB no arquivo de dados. Foi adicionado um número de opções que controlam primorosamente os processos de mapeamento no gribmap para o NCEP. Para maiores detalhes ver o documento do GrADS (ftp://sprite.llnl.gov/grads/doc/gadoc151.*).

    Finalmente, é necessário um ajuste no arquivo ncep.reanl.mo.ctl para tomar vantagem da convenção da nomeação de arquivo (template):

      dset ^ncep.reanl.mo.%y2%m2.grb
      dtype grib
      options yrev template
      index ^ncep.reanl.mo.gmp
      undef -9.99E+33
      title ncep.reanl.mo.7901.grb
      xdef 144 linear 0 2.5
      ydef 73 linear -90 2.5
      zdef 3 levels 850 500 200
      tdef 2 linear 00Z01jan79 1mo
      vars 3
        PRES 0 1 ,102,0 Pressure [Pa]
        UGRD 3 33 ,100 u wind [m/s]
        VGRD 3 34 ,100 v wind [m/s]
      endvars
    Foi modificado o número de tempos para dois e foi usada a opção template. Isto diz ao GrADS para localizar o dado no TEMPO pelo nome do arquivo (dset ^ncep.reanl.mo.%y2%m2.grb). Desta forma, há dois (ou mais) arquivos de dados, mas somente UM arquivo .ctl e pode-se agora trabalhar com os dados GRIB 2-D como se eles fossem 4-D (lon,lat,lev,time) no GrADS. Foi modificado também o nome do arquivo de índice para ser refletido na agora estrutura 4-D de dados.

    Resumindo o Processo:

    1. uso do wgrib (ou gribscan) para ver se os dados podem ser utilizados no GrADS;
    2. uso do grb2ctl.sh ou a saída do wgrib para construir um arquivo .ctl;
    3. uso do gribmap no modo verbose (-v) para relacionar os dado GRIB para a estrutura 4-D no arquivo .ctl, e ver como bem o mapeamento trabalhou; e
    4. repetir os paços 2) e 3) até aparecer o !!!! MATCH do gribmap.

Conclusões

    Não há duvidas sobre isto, "Usando GRIB no GrADS" não é muito direto, mas os benefícios são imensos por duas razões. Primeiro, foi evitada a conversão do GRIB para outro formato o qual suporta dados com mais altas dimensões.(i.e.,netCDF). Foi salvo espaço em disco e os erros potenciais técnicosminimizados. Segundo, do ponto de vista de uma performance do GrADS, o GRIB é próximo e tão rápido quanto os outros formatos binários - o custo na descompressão durante o vôo é recompensado pelo reduzido I/O.

    Por fim, a interface GRIB-para-GrADS dá vantagens ao GRIB (eficiente armazenamento, descrição própria e um aberto, formato internacional) enquanto superando as desvantagens do GRIB (dados 2-D e nenhum significado para organizá-los para uma mais alta dimensão) via o modelo 4-D de dados do GrADS. Foi conseguido o melhor de ambos mundos, mas somente se for feito o arquivo .ctl. Espera-se que este documento ajude a fazer esta tarefa.