Gostaria de ajudar?
Mostrando postagens com marcador Programa. Mostrar todas as postagens
Mostrando postagens com marcador Programa. Mostrar todas as postagens

segunda-feira, 22 de junho de 2015

Plot TSM, Gelo Marinho e Cobertura de Neve - GrADS


Você dificilmente vai fazer uma determinada figura se você não precisa dela. Recentemente eu precisei plotar a cobertura de Gelo Marinho a partir de dados de TSM. Vasculhando a internet encontrei um exemplo de um plot bem legal:

Os dados utilizados neste exemplo são do GFS e para ler os dados mais recentes eu irei utilizar o exemplo mostrado aqui no blog no post anterior.

Para que este script funcione perfeitamente é necessário ter as seguinte funções do Kodama em sua maquina: color.gs, xcbar.gs e colormap.gs.

Os primeiros comandos irão pegar a informação de data no sistema e abrir os dados de TSM e Gelo do GFS com resolução 0.25.

'reinit'
'! date +%Y%m%d > date.txt'
date=read('date.txt')
vardate=sublin(date,2)

arqgfs='http://nomads.ncep.noaa.gov:9090/dods/gfs_0p25/gfs'vardate'/gfs_0p25_00z'
arqgelo='http://nomads.ncep.noaa.gov:9090/dods/ice/ice'vardate'/ice.00z'

'sdfopen 'arqgfs
'sdfopen 'arqgelo

'!rm date.txt'

Com os dados lidos iremos "setar" algumas funções para plotar os dados utilizando a projeção robinson.

'set gxout shaded'
'set mpdset hires'
'set lon -180 180'
'set lat -90 90'
'set grads off'
'set map 0 1 6'
'set mproj robinson'
'colormaps -l 272 307 0.5 -map jet'
'd tmpsfc'
'xcbar -fs 4'

Após estes comandos o plot exibido é +/- assim:



Agora iremos criar uma mascara para os continentes:

'set rgb 73 80 80 80'
'basemap L 73 0 M'

O que geramos a partir destes comandos é algo assim:



Em seguida iremos plotar o Gelo Marinho, para isto utilizamos os comandos:

'set gxout shaded'
'set dfile 2'
'set z 1'
'set t 1'
'set map 0 1 6'
'color 0 0.6 0.1 -kind dimgray->seashell->white'
'd maskout(icecmsl,icecmsl-0.05)'

O que iremos obter é o seguinte plot:



Por último iremos plotar a Cobertura de Neve e os últimos comandos do script são os seguintes:

'set dfile 1'
'color 5 100 5 -kind dimgray->seashell->white'
'set z 1'
'set t 1'
'set map 0 1 6'
'd maskout(weasdsfc,weasdsfc-5)'

E a última figura exibida tem o seguinte formato:



Espero que seja útil para vocês. 

Boa Sorte e Bom trabalho a Todos!

quinta-feira, 30 de abril de 2015

Imagem de Satelite no Grads

Pergunta do Arthur Lucas,

Olá Cristiano,

tenho visto em alguns artigos com campos meteorológicos sobrepostos a imagens de Satélites, é possível fazer isso no Grads ?

Obrigado,

É sim possível desde que o dado da imagem de satélite seja disponibilizado no formato que seja possível o Grads ler, por exemplo: Binário, Netcdf e etc.

Alguns Institutos disponibilizam algumas imagens em formato binário. Durante meu doutorado eu utilizei dados de temperatura de brilho e consegui plotar algumas figuras de TB com vento e etc. Segue um exemplo: Eu plotei a temperatura de brilho com o shaded do Grads mas e com um RGB em tons de cinza que fica "quase igual" a uma imagem de satélite.





Abraço e Bom Trabalho a Todos!!


quarta-feira, 18 de fevereiro de 2015

Alterando os níveis verticais com CDO

Sugestão do Guilherme Martins!

O CDO sempre me surpreendendo!!!!
Alterando os níveis verticais com CDO.
Os níveis verticais dos modelos do CMIP5 estão em "Pa", e normalmente utilizamos em "hPa". Vamos usar o operador "setzaxis" para realizar essa alteração.
Carreguei neste tópico o arquivo "exemplo.nc" para vocês fazerem o teste.
Informações vista com "ncdump -h exemplo.nc"
double plev(plev) ;
plev:bounds = "plev_bnds" ;
plev:units = "Pa" ; <===== unidade do nível vertical
plev:axis = "Z" ;
plev:positive = "down" ;
plev:long_name = "pressure" ;
plev:standard_name = "air_pressure" ;
Informações vista com "ncdump arquivo.nc | more"
plev = 100000, 85000, 70000, 50000, 25000, 10000, 5000, 1000 ; => "Pa"
Segue a dica:
Crie um arquivo texto, e adicione as 6 linhas abaixo:
zaxistype = pressure
size = 8
name = lev
longname = pressure
units = hPa
levels = 1000 850 700 500 250 100 50 10
Salve com um nome qualquer, por exemplo, "nivel". Esse arquivo será lido pelo operador "setzaxis":
Utilize o comando abaixo:
cdo setzaxis,nivel exemplo.nc saida.nc
Esse comando altera a estrutura do seu arquivo netCDF com as novas informações em "hPa".
Para visualizar as novas alterações:
ncdump -h saida.nc

Arquivo: exemplo.nc

PS: caso o arquivo tenha dados UNDEF (que é caso), utilize o operador fillmiss ==> cdo -fillmiss -setzaxis,nivel exemplo.nc saida.nc

Boa Sorte e Bom Trabalho a Todos!

terça-feira, 28 de outubro de 2014

cdo merge levels

Olá a Todos,

Recentemente estive tentando usar o comando merge do cdo para criar um arquivo com vários níveis. O problema era o seguinte:

Eu possuo 10 arquivos de vento em formato binário sendo cada arquivo contendo 100 tempos e um nível.

A primeira coisa que eu fiz foi criar arquivos netcdf a partir dos arquivos descritores .ctl através do comando cdo import_binary -f nc *.ctl. No entanto desta forma o cdo não definia o nível referente ao arquivo e sempre atribuía nível 0 (zero). Com os arquivos criados com a descrição de nível 0 (zero) ao juntar (merge) os 10 arquivos o resultado era sempre um arquivo com somente um nível.

Eu não consegui resolver este problema de maneira mais simples o que fiz foi o seguinte:

Utilizei o comando sdfwrite do GrADS para gerar os arquivos netcdf que precisava.

Ex:

set x 1 144
set y 1 73
set t 1 100
set z 1
define uwnd = uwnd
set sdfwrite -4d arquivo1.nc
sdfwrite uwnd
quit

OBS1: É necessário inserir a função -4d do comando sdfwrite, desta forma você força que o arquivo de saída tenha 4 dimensões (lat, lon, tempo, nível)

OBS2: O nível no arquivo ctl precisa ser definido de maneira correta, por exemplo:

          zdef 1 linear 200 1

          Qualquer definição diferente disso deu errado.

Agora que possuía os 10 arquivos .nc utilizei o merge para gerar meu arquivo com os 10 níveis e 100 tempos:

cdo merge arquivo1.nc arquivo2.nc ... arquivo10.nc saida.nc

Boa Sorte e Bom Trabalho a Todos!!

terça-feira, 7 de outubro de 2014

Dado Texto ou ASCII no GrADS

Olá Pessoal,

Através do GrADS é possível escrever e ler arquivos textos e em algum momento isto pode ser de grande utilidade. Recentemente a Giulia de Salve me escreveu com uma dúvida exatamente sobre este contexto.

O Guilherme Martins em sua Apostila já colocou um exemplo bem explicativo e também existe um guia no site do GrADS que é mais explicativo ainda. O que eu vou colocar aqui é exatamente o que esta na página neste guia do site GrADS.

PS. Eu irei utilizar como exemplo o arquivo model.ctl para quem possui o GrADS 2 (opengrads) instalado ele fica na pasta (grads-2.0.1/Contents/Resources/SampleDatasets/).

O GrADS não possui uma função intrínseca para ler arquivos texto como o sdfopen, por exemplo, por isso é necessário alguns ajustes para isso:

Imagine que você possua um arquivo texto/ascii (my_ascii_file.txt) que tenha uma coluna com valores de 1 a 30:

1
2
3
4
...

Você pode transformar este arquivo em um binário e criar um ctl para ler no GrADS.

'open model.ctl'
file = 'my_ascii_file.txt'
datafile = 'my_binary_file.dat'
'set gxout fwrite'
'set fwrite -ap 'datafile
'!/bin/rm -f 'datafile
while (1)
         res = read(file)
         line1 = sublin(res,1)
         line2 = sublin(res,2)
         rc1 = subwrd(line1,1)
         if (rc1); break; endif
              val = subwrd(line2,1)
              'd 'val
endwhile
rc = close(file)
'disable fwrite'

O ctl para ler o dado gerado (my_binary_file.dat), imaginando que você queira plotar os dados com relação ao eixo X, ficaria assim:

dset ^my_binary_file.dat
title Sample of ASCII data converted to binary
undef -9.99e8
xdef 100 linear 1 1
ydef 1 linear 1 1
zdef 1 linear 1 1
tdef 1 linear 01jan0001 1dy
vars 1
a 0 99 ascii variable
endvars

Se você abrir o ctl acima e plotar vai gerar uma figura semelhante a esta:

Uma outra opção é criar arquivos textos a partir de qualquer dado binário através da função 'set gxout print'. A formatação desta função pode ser feita através da função 'set prnopts'. A saída é plotada no terminal mas pode ser armazenada em uma variável e posteriormente através do script ser escrita em um arquivo. O exemplo a seguir escreve 72 números por linha que representa os 72 pontos de grade em X.

'open model.ctl'
'set x 1 72'
outfile = my_ascii_file.txt'
'set gxout print'
'set prnopts %7.3f 72 1'
'd ts'
rc = write(outfile,result)

Desta forma o arquivo my_ascii_file.txt irá conter algo como isso:

Printing Grid -- 3312 Values -- Undef = -9.99e+08
258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 258.493 <etc.>

No caso anterior, observe que a primeira linha do arquivo de saída contem algumas informações sobre o número de valores escritos e valores indefinidos que você pode não querer que seja escrito. O exemplo a seguir omiti essa linha, ou seja, pula a primeira linha de informações de diagnóstico. Além disso neste exemplo a saída será delimitada por vírgulas para importar para uma planilha (excell) por fim a variável apresentada agora é uma expressão em vez de um nome. 

'open model.ctl'
'set x 1 72'
outfile='my_ascii_file.txt'
'!/bin/rm -f 'outfile
'set gxout print'
'set prnopts %g, 72 0'
'd ts-273.15'
i=1
while (1)
    line = sublin(result,i)
    if (line = ''); break; endif
    if (i>1)
    rc = write(outfile,line,append)
    endif
    i=i+1
endwhile

Neste caso o arquivo my_ascii_file.txt conterá algo como:

-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,-14.6567,<etc.>

Obs. A função append serve para inserir os dados no final do arquivo caso ele exista. Se você não utilizar a função append e existir um arquivo de mesmo nome ele será sobrescrito. Para mais informações leia "append".

Por fim é possível escrever informações sobre a grade (lat x lon) além dos dados de mais de uma variável, para isso é necessário salvar o resultado da exibição de cada variável/expressão (incluindo longitude e latitude), para cada ponto de grade individualmente, organizar a estrutura que será escrito no arquivo texto de saída e depois escrevê-lo. Neste exemplo será escrito a longitude, latitude, temperatura da superfície, pressão de superfície e precipitação:

'open model.ctl'
'set x 1 72'
outfile='my_ascii_file.txt'
'!/bin/rm -f 'outfile
'set gxout print'
fmt='%8.3f'
numcols=72
'set prnopts 'fmt' 'numcols' 1'
'd lon'
lon_data = result
'd lat'
lat_data = result
'd ts'
v1_data = result
'd ps'
v2_data = result
'd p'
v3_data = result
i=1
while (1)
    lons = sublin(lon_data,i)
    lats = sublin(lat_data,i)
    line1 = sublin(v1_data,i)
    line2 = sublin(v2_data,i)
    line3 = sublin(v3_data,i)
    if (lons='' | lats='' | line1='' | line2='' | line3=''); break; endif
    if (i>1)
        j=1
        while (j<=numcols)
            str = subwrd(lons,j); lon = math_format(fmt,str)
            str = subwrd(lats,j); lat = math_format(fmt,str)
            str = subwrd(line1,j); v1 = math_format(fmt,str)
            str = subwrd(line2,j); v2 = math_format(fmt,str)
            str = subwrd(line3,j); v3 = math_format(fmt,str)
            record = lon' 'lat' 'v1' 'v2' 'v3
            rc = write(outfile,record,append)
        j=j+1
        endwhile
    endif
i=i+1
endwhile

Obs. A função append serve para inserir os dados no final do arquivo caso ele exista. Se você não utilizar a função append e existir um arquivo de mesmo nome ele será sobrescrito. Para mais informações leia "append".

Neste caso a saída my_ascii_file.txt apresentará a seguinte estrutura:

0.000     -90.000     258.493     669.911     0.000
5.000     -90.000     258.493     669.911     0.000
10.000   -90.000     258.493     669.911     0.000
15.000   -90.000     258.493     669.911     0.000
20.000   -90.000     258.493     669.911     0.000
25.000   -90.000     258.493     669.911     0.000
30.000   -90.000     258.493     669.911     0.000
35.000   -90.000     258.493     669.911     0.000
40.000   -90.000     258.493     669.911     0.000

A um tempo atrás coloquei a disposição uma função que ajuda a escrever um arquivo texto sem muitas complicações. No entanto o arquivo de saída não possui formatação, veja aqui.

Boa Sorte e Bom Trabalho a Todos!

Cristiano






sexta-feira, 22 de novembro de 2013

Instalação PyFerret com Python 2.6


Mais uma contribuição do Paulo Henrique e Marcelo Rodrigues, encaminhada pelo Dr. Antonio Carlos Santana dos Santos - Prof. Adjunto Vice-Coordenador do Curso de Física da Universidade Estadual do Ceará.

Um Tutorial da instalação do PyFerret para Debian 7 com o Python 2.6.

PS. Segundo os autores esta instalação funcionará para qualquer distribuição Linux desde que tenha o Python 2.6 instalado.

Clique aqui.

Mai uma vez obrigado ao Paulo Henrique e Marcelo Rodrigues pelo desenvolvimento e ao Dr. Antonio Carlos Santana dos Santos pela divulgação e contribuição.

Boa Sorte e Bom Trabalho a Todos!!




quarta-feira, 30 de outubro de 2013

Salvando arquivo texto no GrADS

A pedidos de Camila Carpenedo, segue uma dica de como salvar uma ou mais variável em um arquivo texto (.txt, ascii e etc) no GrADS.

A solução para isso é utilizar o comando 'set gxout print' e 'set prnopts ' format ' ' numl ' ' numb ' ' u ' '. No entanto, para que não tenhamos grandes dificuldades irei disponibilizar para vocês o script/função desenvolvida no OpenGrADS Cookbooks

A função é a seguinte:

function fprintf(args)
* Command line argumets
* ---------------------
  expr = subwrd(args,1)
  file = subwrd(args,2)
  format = subwrd(args,3)
  numl = subwrd(args,4)
  numb = subwrd(args,5)
  u = subwrd(args,6)
  if ( file='' )
    say ''
    say 'NAME'
    say '     fprintf - print GrADS variables to a text file'
    say ''
    say 'SYNOPSIS'
    say '     fprintf  expr  txtFile  [format numl numb [u]]'
    say ''
    say 'DESCRIPTION'
    say '     Evaluates the contents of the GrADS expression *expr* writing'
    say '     its values to a formatted text file *txtFile*. On output, the'
    say '     number of values and the undef values are returned; a negative'
    say '     number of values signals an error condition.'
    say ''
    say '     Unlike the output of *set gxout print*, the resulting ASCII'
    say '     file has only the data values and *no header*.'
    say ''
    say 'OPTIONS'
    say '     The optional parameters are the same as the ones required by'
    say '     the GrADS command *set prnopts*, namely'
    say '     format   a C language template for formatting ASCII output.'
    say '              Default is %g.'
    say '     numl     number of values to print per record. Default is 8.'
    say '     numb     number of blanks to insert between values. Default is 1.'
    say '     u        print "Undef" instead of the numerical value for'
    say '              missing data.'
    say 'BUGS'
    say '     The GrADS expression cannot have spaces in it.'
    say ''    
    say 'COPYRIGHT'
    say '     This script has been placed in the public domain'
    say ''
    return
  endif
* Set the display environment and produce buffered ASCII output
* -------------------------------------------------------------
  'set gxout print'
  if ( format != '' )
    'set prnopts ' format ' ' numl ' ' numb ' ' u ' '
  endif
  'display ' expr
   if ( rc!=0 ); return -1; endif
*  Get rid of header line: Printing Grid -- 3358 Values -- Undef = 1e+20
*  but record number of values and undef values for later reference
*  ---------------------------------------------------------------------
   buffer = result
   i = 1; line = sublin(buffer,i)
   n = subwrd(line,4)
   undef = subwrd(line,9)
* Now write the data values to text file: first line...
* -----------------------------------------------------
  i = 2; line = sublin(buffer,i)
  if ( write_(file,line) > 0 ); return -2; endif
* Append subsequent lines
* -----------------------
  i = i + 1; line = sublin(buffer,i)
  while ( line != '' )
    if ( write_(file,line,append) != 0 ); return -3; endif 
    i = i + 1; line = sublin(buffer,i)
  endwhile
  if ( close(file) != 0 ); return -4; endif
* All done
* --------
  say 'wrote ' n ' values to file "' file '"'
  return n ' ' undef ' ' 
function write_(file,line)
   rc = write(file,line)
   return subwrd(rc,1)

Para utilizar a função é simples:

Você deve criar um arquivo .gs contendo a função descrita acima chamada de fprintf.gs. Você pode salvar a função no diretório script do GrADS e desta forma você poderá "chamar" a função da mesma forma que você chamas as funções de barra (cbar, cbarn e etc) somente pelo nome.

Após criar a variável que pode ser uma média, anomalia, serie temporal e etc, basta executar o seguinte comando:

ga -> fprintf variável arquivo.txt

No Cookbooks existe umas outras funcionalidade interessantes que vocês podem aproveitar.

Boa Sorte e Bom Trabalho a Todos!!

terça-feira, 27 de novembro de 2012

Compilando a Lib FFTPACK

Sempre que migro de maquina ou processador preciso compilar a lib FFTPACK (Fortran para Transformada de Fourrier) e sempre esqueço como compilar, por isso segue uma maneira fácil (não sei se a ideial) de compilar esta lib:

Baixe todos os arquivos .f (FORTRAN) desta página:

http://www.netlib.org/fftpack/

Eu usei o compilador ifort para compilar:

>ifort -c *.f

Desta forma criei todos os arquivos objetos (.o) necessários, em seguida:

>ar cr libfftpack.a *.o (é isso mesmo ar rc estes programas já são comuns ao Linux)

Desta forma a lib já esta criada, para testar:

>ranlib libfftpack.a

Se não apresentar erro a lib foi compilada com sucesso.

Boa Sorte e Bom Trabalho a Todos!!

Cristiano

quinta-feira, 6 de setembro de 2012

Script Shell Dados Bissextos

Me perguntaram hoje:

Tenho um conjunto de dados Netcdf do ERA interim (horário) e cada arquivo corresponde a um ano de dados, ou seja, (1460 tempos anos normais e 1464 para anos bissextos). Preciso de um script Shell/Grads para transformar todos os arquivos Netcdf em binário, levando em consideração a referente quantidade de tempo para o referido ano.

Minha sugestão de solução:

#!/bin/sh

 yy="1989"
 while [ $yy -le "2009" ] ; do

if [ \( $(expr "$yy" % 4) -eq 0 -a $(expr "$yy" % 100) -ne 0 \) -o \( $(expr "$yy" % 400) -eq 0 \) ];then
nd=1464
echo "$yy ano bissexto t_total: $nd"
else
nd=1460
echo "$yy ano normal t_total: $nd"
fi
/usr/local/grads-2.0.1.oga.1/Contents/opengrads -blc "/usr/local/grads-2.0.1.oga.1/Contents/Resources/Scripts/lats4d.gs -i shum."$yy".nc -o shum."$yy" -format stream -mxtimes $nd -time 00Z01JAN"$yy" 18Z31DEC"$yy" -q"

yy=$((yy+1))

done

exit 0

Bom acho que é isso tem 'n' formas de fazer a mesma coisa se alguem tiver uma sugestão é só falar.

Boa Sorte e Bom Trabalho a Todos!

segunda-feira, 2 de julho de 2012

Comandos úteis do editor de Texto Vi

Algumas pessoas utilisam editores de texto com parte gráfica (nedit, gedit, kate e etc) para desenvolver seus scripts, programs e etc. No entanto, muitos desenvolvedores preferem utilizar o editor vi que não possui parte gráfica e é utilizado diretamente no terminal do Linux. Na minha opinião a vantagem de se utilizar o vi é devido ao fato de não ser necessário abrir mais um programa para editar/criar seus scripts. Sem falar no fato de que fazer tudo através de linhas de comando da a sensação de dominar ainda mais o sistema :). Bom segue alguns comandos escenciais para quem usa o vi.

Para fazer uma pesquisa por alguma palavra no texto utilize:

/read -> o comando /read irá procurar a palavra read a partir do começo de seu script/programa/texto/arquivo;
?read -> o comando ?read irá procurar a palavra read a partir do fim de seu script/programa/texto/arquivo;
n -> após encontrar a palavra read se você digitar "n" ele irá procurar a proxíma;
N -> Irá inverter o sentido da pesquisa.

Para mover ou inserir texto utilize:

:1,4d      -> este comando irá apagar as linhas de 1 a 4;
:1,4m 8 -> este comando irá mover as linhas de 1 a 4 para a linha 8;
:1,4t 8  -> diferente do comando acima este copia as linhas de 1 a 4 para a linha 8;
:1,4w <teste>-> agora as linhas de 1 a 4 serão escritas no arquivo "teste";
:r <teste> -> lê o arquivo 'teste' e insere seu conteúdo no documento atual.

Para adicionar texto a um arquivo já existente utilize:

a -> para inserir texto depois do cursor;
A -> para inserir texto no final da linha;
i  -> para inserir texto antes do cursor;
I  -> para inserir texto no começo da linha.

Para substituir um texto já escrito utilize:

cw   -> para mudar uma palavra;
4cw -> para mudar 4 palavras;
C     -> para mudar uma linha;
r      -> para sobrescrever um caractere;
R     -> para sobrescrever a linha inteira;
:%s/existente/nova/g -> este comando serve para substituir todas as palavras "existente" pela palavra "nova".
 
Para cancelar uma função/operação e voltar atrás utilize:

u -> para desfazer a última operação;
.  -> para repetir a última operação.

Para salvar os arquivos ou sair dos arquivos já editados/finalizados utilize:

:w   -> para salvar o que esta na memória em um arquivo/disco;
:q    -> para sair do editor;
:wq -> para salvar e sair do editor;
:x    -> para salvar e sair do editor;
:e!   -> para reeditar, desprezando as mudanças;
ZZ   -> para salvar e sair do editor.
 
Para movimentar o cursor pelo texto (tela/linha) utilize:

0 -> para ir direto para o começo da linha;
$ -> para ir direto para o final da linha;
g -> para ir para a primeira linha do arquivo;
G -> para ir para a última linha do arquivo;
5G -> para ir vai para a linha 5.
 
Para copiar e inserir textos utilize:

yy   -> para copiar uma linha inteira;
5yy -> para copiar 5 linhas;
p     -> para colar logo abaixo do cursor;
P     -> para colar logo acima do cursor.


Para inserir uma linha em branco utilize:

o -> para inserir uma linha logo abaixo do cursor;
O -> para inserir uma linha logo acima do cursor.
 
Para apagar caracter/texto/linha e etc utilize:

x     -> para apagar um caractere;
dw  -> para apagar uma palavra;
dd   -> para apagar uma linha;
5dd -> para apagar 5 linhas;
dG  -> para apagar do cursor até o final do arquivo.
 
Para configurar a sua sessão utilize:

:set nu      -> para mostrar o número de linhas;
:set nonu -> para desligar o comando acima;
:set all      -> para mostrar todas as configurações;
:set list     -> para mostrar os caracteres ocultos.
 
Para rolar o texto/página utilize:

CTRL+f -> para rolar uma tela para baixo;
CTRL+b -> para rolar uma tela atrás;
CTRL+d -> para rolar meia-tela (1/2) para baixo;
CTRL+u -> para rolar meia-tela (1/2) atrás.

Bom galera espero que seja útil.

Boa Sorte e Bom Trabalho a Todos!!

sexta-feira, 29 de junho de 2012

Programa Shell/Fortran que cria .ctl

Uma vez me deparei com o seguinte problema: Eu tinha um arquivo binário para cada dia/mes/ano/nivel de dados, ou seja, 365/366 arquivos por ano multiplicado pela quantidade de níveis. No meu caso 3068 arquivos, sendo que este arquivos não possuiam arquivos descritores do GrADS os chamados CTL. Para resolver tal problema eu criei um script Shel que cria e compila um arquivo fortran que escreve os arquivos.ctl.

Existe formas de você fazer um programa em linguagem Shell ou Fortran somente com a mesma funcionalidade, escrever os arquivos .ctl, mas decidi colocar os dois juntos pois servirá para outras funções. Segue o exemplo:

#!/bin/sh

for var in uwnd vwnd;do
      for level in 200 500 700 850;do
            for ano in $(seq 1989 2009);do
                  for mes in $(seq -f %02g 1 12);do
                        ultimo_dia=`echo $(cal $mes $ano) | awk '{print $NF}'`;
                        mess=`echo $(cal $mes $ano) | cut -c1-03`
                        for dia in $(seq -f %02g 1 $ultimo_dia);do

cat << EOF > gera_ctl.f90


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Este script gera os ctl para os arquivos .bin                                             
!!! Desenvolvedor: Cristiano Prestrelo email: prestrelo@model.iag.usp.br  
!!! Data: 27/06/2012                                                                                       
!!! Alterado: 27/06/2012                                                                                 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

PROGRAM geractl

OPEN (1, FILE='/home/prestrelo/data/merra/$var/$var.$level.$ano$mes$dia.ctl', &STATUS='UNKNOWN')

 WRITE(1,*)'DSET ^$var.$level.$ano$mes$dia.bin'
 WRITE(1,*)'TITLE Vento Zonal $var $level hPa Horario Sinotico Merra'
 WRITE(1,*)'UNDEF -999.'
 WRITE(1,*)'XDEF 540 linear -180 0.5'
 WRITE(1,*)'YDEF 361 linear -90 0.5'
 WRITE(1,*)'ZDEF 1 LINEAR 1 10000'
 WRITE(1,*)'TDEF 4 linear 00Z$dia$mess$ano 360mn'
 WRITE(1,*)'VARS 1'
 WRITE(1,*)'p  1  t,z,y,x  Eastward wind component'
 WRITE(1,*)'ENDVARS'

 CLOSE(1)
END PROGRAM geractl

EOF

ifort -o gera_ctl gera_ctl.f90
./gera_ctl

done
done
done
done
done
exit
#!!!!!!!!!!!!!! fim do programa!!!!!!!!!!!!!!!!!!!!!!!!

Desta forma você terá uma lista de arquivos ctl:

uwnd.200.19890101.ctl
uwnd.200.19890102.ctl
                 .
                 .
                 .
uwnd.850.20091231.ctl
vwnd.200.19890101.ctl
vwnd.200.19890102.ctl
                 .
                 .

                 .

 vwnd.850.20091231.ctl

Lembrando que você precisa mudas as dimensões (lat X lon X tempo X delta) de seus arquivos de dados. 

Boa Sorte e Bom Trabalho a Todos!!

quinta-feira, 7 de junho de 2012

Utilizando o Cron (Crontab)

O "cron" é um software do sistema Unix (linux) que é responsável por efetuar tarefas agendadas pelo usuário, este sistema vem instalado em todas as distribuições Linux e é ativado logo no boot do sistema. Sua utilização é apropriada para quem deseja que alguma atividade/tarefa seja executada automaticamente pelo sistema no minuto/hora/dia/dia da semana/mês desejado pelo usuário. Você poderá por exemplo agendar a limpeza dos arquivos temporários para toda segunda feira, por exemplo, o o "cron" faz uma verificação a cada minuto para identificar alguma tarefa agendada e desta forma ele executa tal tarefa sempre no período determinado.

Para usar o "cron" você pode usar editores como vi, vim ou simplesmente digitar no terminal crontab -e e editar como se estivesse no vi, por exemplo. O crontab tem a seguinte estrutura de execução:

MM HH DD mm SS US tarefa
  |      |    |      |     |    |      |
  |      |    |      |     |    |      |___tarefa
  |      |    |      |     |    |______usuário
  |      |    |      |     |_________dia da semana
  |      |    |      |____________mês
  |      |    |_______________dia do mês
  |      |__________________hora
  |______________________minuto

A sintaxe é a seguinte:

MM: digite aqui minuto (0-59);
HH: digite aqui hora (0-23);
DD: digite aqui dia do mês (0-31);
mm: digite aqui mês (1-12);
SS: digite aqui dia da semana (0-7) vê Obs 1;
US: digite aqui o usuário responsável pela execução (não coloque nada caso o executor seja o usuário que esta criando a lista no crontab);
tarefa: digite aqui a tarefa a ser executada (script).

Obs 1: Em dia_da_Semana, 0 refere-se a domingo; e 6, ao sábado.
       No caso de dia da semana funciona também as três primeiras letras
       (em inglês) do dia da semana (SUN,MON,TUE,WED,THU,FRI,SAT)
Obs 2: Em qualquer posição pode-se usar o * (asterisco) quando não se
       importar com o campo em questão.
Obs 3: Pode-se utilizar intervalos nesses campos. O caracter para intervalo
       é o - (hifen).
Obs 4: Pode-se utilizar lista de valores nesses campos. O caracter para a
       lista é a , (vírgula).
Obs 5: Qualquer texto colocado após o programa que será executado será
       considerado comentário e não será interpretado pelo cron


Três comandos importantes de edição do crontab vocês precisam saber:

crontab -e usado para editar;
crontab -l usado para listar tarefas agendadas;
crontab -r usado para remover o arquivo ou lista existente no crontab.

Segue alguns exemplos de estrutura do crontab:

0       12      *       *       * /home/usuario/tarefa.sh

O exemplo acima significa que em qualquer mês, dia da semana, dia do mês sempre as 4 horas em ponto o programa tarefa.sh será executado.

Quando você quer que a tarefa seja executada sempre, por exemplo, todos os dias, você digita "*" no local reservado para que dia do mÊs e desta forma todos os dias do mês a tarefa será executada. Isto serve para todas as outras  condições.

Exemplo:

*          *          *          *           * /home/usuario/tarefa.sh

O exemplo acima significa que em qaulquer dia do mês ou da semana, qualquer mês, qualquer hora e minuto o programa tarefa.sh será executado, ou seja, a cada minuto que se passa o programa será executado.

Exemplo:

0       12      *       *       * /home/usuario/tarefa1.sh
0        4      15      *       * /home/usuario/tarefa2.sh 

Observe que no exemplo acima existem duas tarefas agendadas e é desta forma que tem que ser feito uma tarefa logo abaixo da outra, sendo que cada uma com sua configuração temporal especifica, obviamente que as duas tarefas poderiam ser executadas no mesmo momento.

Boa Sorte e Bom Trabalho a Todos!!

terça-feira, 5 de junho de 2012

Comando "date" Linux

Durante o desenvolvimento de alguns programas eu precisei criar uma data formatada, as vezes para baixar dados, gerar título de figuras ou nome de imagens e etc você precisa de uma data formatada para inserir no teu programa/script e etc. Difícil de entender? Eu explico. Imagina que você criou um script .sh que executa um script GrADS para gerar algumas imagens de precpitação por exemplo e você quer que cada imagem seja salva com a seguinte estrutura (prec_anomesdia.gif) sendo que neste caso especifico o parâmetro dia vamos dizer assim seja variável, uma forma de conseguir esta data é utilizando o comando "date" do linux.

Com o comando "date" é possível Exibir e Alterar a data/hora do Sistema, Exibir a data/hora Formatada e Efetuar cálculos com Data e Hora.

A utilização deste comando é fácil basta utilizar alguns parâmetros disponiveis:

%%   um % literal
%a    nome abreviado do dia da semana do idioma (ex.: Dom)
%A    nome completo do dia de semana na localidade (por exemplo, Sábado)
%b
    nome abreviado do mês na localidade (por exemplo, Jan)
%B    nome completo do mês na localidade (por exemplo, Janeiro)
%c    data e hora na localidade (por exemplo, Sáb 08 Mar 2008 18:34:17 BRT)
%C   século; como %Y, exceto a omissão dos dois últimos dígitos (ex.: 20)
%d   dia do mês (ex.: 01)
%D   data; o mesmo que %m/%d/%y
%e   dia do mês, preenchido por espaço; o mesmo que %_d
%F   data completa; o mesmo que %Y-%m-%d
%g   os últimos dois dígitos do ano do número ISO da semana (veja %G)
%G   ano do número ISO da semana ISO (veja %V); normalmente útil só com %V
%h   o mesmo que %b
%H   hora (00..23)
%I    hora (01..12)
%j    dia do ano (001..366)
%k   hora ( 0..23)
%l    hora ( 1..12)
%m   mês (01..12)
%M   minuto (00..59)
%n    um caractere de nova-linha
%N   nanosegundos (000000000..999999999)
%p   o equivalente na localidade para AM ou PM; em branco se desconhecido
%P   como %p, mas em minúsculas
%r    a hora no relógio de 12 horas na localidade (por exemplo, 11:11:04 PM)
%R   hora e minuto no estilo 24 horas; o mesmo que %H:%M
%s    segundos desde 1970-01-01 00:00:00 UTC
%S   segundo (00..60)
%t    uma tabulação
%T   as horas; o mesmo que %H:%M:%S
%u   dia da semana (1..7); 1 é segunda-feira
%U   número da semana no ano, sendo domingo o início da semana (00..53)
%V   número ISO da semana, sendo segunda-feira o início da semana (01..53)
%w   dia da semana (0..6); 0 é domingo
%W   número da semana no ano, sendo segunda-feira o início da semana (00..53)
%x    representação da data na localidade (por exemplo, 31/12/99)
%X    representação da hora na localidade (por exemplo, 23:13:48)
%y    os últimos dois dígitos do ano (00..99)
%Y    ano quatro digitos (por exemplo 2012)
%z    fuso horário numérico +hhmm (por exemplo, -0300)
%:z   fuso horário numérico +hh:mm (por exemplo, -03:00)
%::z  fuso horário numérico +hh:mm:ss (por exemplo, -03:00:00)
%:::z  fuso horário numérico com : para a precisão necessária (por exemplo, -04, +05:30)
%Z   abreviação alfabética do fuso horário (por exemplo, BRT)

Se você for agora (05/06/2012 16:42) e digitar date em seu terminal o sistema te retornará:

>date
>Ter Jun  5 16:42:49 BRT 2012

Existem algumas formas de você combinar os parâmetros listados acima e ter como resultado uma data na estrutura/ordem que você deseja, segue alguns exemplos:

>date +%d%m%Y
>05062012

Caso você queira separar com uma"/" cada informação é só inserir uma barra antes de cada simbolo de "%":

>date +%d/%m/%Y
>05/06/2012 

Para o ano apenas com dois dígitos:

>date +%d/%m/%y
>05/06/12 

É possível manipular apenas a horas: (observe que precisamos inserir ":" para separar horas, minutos e segundos)

>date +%H:%M:%S
>16:42:49

Se você desejar inserir o nome do mês e não o número também é possível: (observe que este comando é preciso esta entre aspas "" e existe um espaço entre um parâmetro e outro caso contrario a informação virá junta).

>date "+%d %B %Y"
>05 Junho 2012

Uma outra informação referente a estrutura anterior é que você pode inserir o "de" em sua data, para isso digite:

>date "+%d "de" %B "de" %Y"
>05 de junho de 2012

Caso precise inserir o dia da semana o comando seria o seguinte:

>date "+%d "de" %B "de" %Y, %A"
>05 de junho de 2012, terça

Este comando é sensacional, se soubermos utilizá-lo bem tiramos bastante proveito dele, para quem trabalha operacionalmente ou quem costuma baixar dados diariamente, fazer imagens/figuras diariamente ou executar um determinado script operacionalmente vai fazer bom proveito dele.

Com o comando date também é possível conseguir datas anteriores ou posteriores. Exemplos:

Em meu script eu preciso de uma data de cinco dias atrás e cinco dias para frente, para isso:

>date +%d/%m/%Y -d "5 days ago"
>31/05/2012

>date +%d/%m/%Y -d "5 days"
>10/06/2012

Também é possivel por exemplo saber a data um mês e dois dias atrás, uma semana e um dia, ou que dia nós teremos caso adicionarssemos 49 horas a nossa data atual?

Um mês e dois dias atrás:

>date -d "1 month ago 2 day ago"
>Qui Mai  3 16:42:49 BRT 2012

Um mês e dois dias a frente:

>date -d "1 month 2 day"
>Sab Jul  7 16:42:49 BRT 2012

Uma semana e um dia atrás:

>date -d "1 week ago 1 day ago"
> Seg Mai 28 16:42:49 BRT 2012

Que dia teremos se adicionarmos 49 horas na data atual?

>date --date "49 hours"
>Qui Jun 7 17:42:49 BRT 2012

Existe uma serie de combinações possíveis, segue alguns exemplos:

Se usarmos o comando:
>date
ou
>date --date=now
ou
>date --date=today
o resultado é o mesmo

>date --date='10 minutes'
>Ter Jun 5 16:52:49 BRT 2012


>date --date='10 seconds ago'
>Ter Jun 5 16:42:39 BRT 2012

>date --date='10 hours'
>Ter Jun 5 02:42:39 BRT 2012

>date --date='tomorrow'
>Qua Jun 6 16:42:49 BRT 2012

>date --date='10 day'
>Sex Jun 15 16:42:49 BRT 2012

>date --date='yesterday'
>Seg Jun 4 16:42:49 BRT 2012

>date --date='1 fortnight'
>Ter Jun 19 16:42:49 BRT 2012

>date --date='1 year'
>Ter Jun 5 16:42:49 BRT 2013

Bom galera é isso, depois eu irei inserir aqui um script que manipula essas datas. Tem um post em um forum de altoria do Rafael Brianezi da Silva no qual eu tomei base para escrever este, segue.

Boa Sorte e Bom Trabalho a Todos!!

quinta-feira, 17 de maio de 2012

Template no GrADS para ler Netcdf

Algumas pessoas me perguntaram como fazer um Template para ler vários arquivoc Netcdf (.nc) segue duas dicas fáceis de fazer isso:

Você pode criar um arquivo .ctl :
Suponha que você tenha sete arquivos netcdf, cada arquivo contendo a média mensal de uma década:

pr.1880_1889.nc
pr.1890_1899.nc
pr.1900_1909.nc
pr.1910_1919.nc
pr.1920_1929.nc
pr.1940_1949.nc

O arquivo .ctl ficaria assim:

DSET ^pr.%x30_%x39.nc
OPTIONS template
DTYPE netcdf
TDEF 840 linear jan1980 1m0
.
.
.

Você pode usar um comando direto no Grads, ou simplesmente colocar este comando no seu arquivo .gs:

Suponha que você tenha dois arquivos uwnd.1989.nc e uwnd.1990.nc para abrir os dois de uma só vez digite:

> sdfopen uwnd.1989.nc uwnd.%y4.nc 73

Boa Sorte e Bom Trabalho a Todos!!