Gostaria de ajudar?

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






quinta-feira, 2 de outubro de 2014

Terminator: Dividindo seu terminal em várias janelas


Segue uma excelente sugestão do Mercel José e o Thomas Martin.

Uma "dificuldade" encontrada por algumas pessoas que trabalha com Linux é a necessidade de abrir vários terminais. O terminal atual do Linux possibilita que você abra várias abas e desta forma você precisa migrar para cada aba sempre que precisa efetuar uma atividade e etc. Com um terminal chamado de Terminator você consegue dividir seu terminal em vários terminais e isto pode ser de grande ajuda.

O Terminator é um software leve não ocupa muita memoria, no entanto em telas de computadores pequenas deve ficar um pouco difícil de enxergar. O grande diferencial é ter uma janela dividida em vários terminais.


Para instalar é fácil:

Ubuntu ou Debian:

>sudo apt-get install terminator

Fedora:

>sudo yum install terminator 

Para utilizar também é simples:

Ctrl+Shift+X -  Alterna entre mostrar todos os terminais ou apenas um;
Ctrl+Shift+O - Divide a janela em terminais horizontais;
Ctrl+Shift+E - Divide a janela em terminais verticais;
Ctrl+Shift+Right - Redimensiona o terminal para direita;
Ctrl+Shift+Left - Redimensiona o terminal para esquerda;
Ctrl+Shift+Up - Redimensiona o terminal para cima;
Ctrl+Shift+Down - Redimensiona o terminal para baixo;
Ctrl+Shift+W - Fecha o terminal que esta sendo utilizado;
Ctrl+Shift+T -   Abre uma nova aba;
Ctrl+Plus (+) -  Aumenta o tamanho da fonte;
Ctrl+Minus (-) - Diminui o tamanho da fonte;
Ctrl+Zero (0) - Restaura o tamanho original da fonte;

Boa Sorte e Bom Trabalho a Todos!!

Cristiano

quarta-feira, 24 de setembro de 2014

O ifort agora é Pago!

Quem aproveitou, aproveitou!

Recentemente descobrimos que o Compilador fortran e C++ da intel ifort e icc agora são pagos. Seguramente o compilador fortran mais rápido e eficiente já lançado. Diz a lenda que o desenvolvimento do ifort evoluiu junto ao desenvolvimento do Modelo Regional WRF. A lenda conta que ao desenvolver o ifort a intel necessitava de executar um processamento ao qual exigisse o máximo de performance e eles conseguiram ao executar o modelo WRF.

No entanto o desenvolvimento do ifort foi aos poucos migrando para programação orientada ao objeto e muitas funções de programação em C++ foram adicionadas. A utilização do sistema via terminal (modo texto) foi sendo abandonada aos poucos e desde 2011 a intel vinha desenvolvendo o intell Studio XE (modo gráfico) que combinava em um mesmo software o ifort e o icc. O inevitável acabou acontecendo o investimento no software foi aumentando cada vez mais o software foi ficando cada vez mais robusto, consequentemente o intel studio foi adquirindo cada vez mais adepto. A consequência disso tudo é que a partir de 2014 os compiladores ifort e icc se tornarão pagos.

O software pode ser encontrado em 3 níveis de desenvolvimento Cluster Edition, Professional Edition e Composer Edition. O valor varia de acordo com o tipo de comprador (Individual, empresa e etc, Estudante, profissional e etc). A licença individual mais barata e mais simples para fins acadêmico custa 249 dólares a mais cara e mais completa e para fins comerciais 1699 dólares. É possível baixar uma versão trial com duração de 30 dias.

É uma pena, mas já era esperado. Portanto, se você possui uma versão free do ifort e do icc na sua maquina zele por ela :)

Segue o link da página para compra do ifort.

Boa Sorte e Bom Trabalho a Todos!

Cristiano

quinta-feira, 11 de setembro de 2014

Barra de cores "pulando" intervalos

Está é mais uma sugestão de barra de cores (shaded) para usuários Grads. O interessante desta barra é que é possível "saltar" os valores (números) referentes aos contornos da variável.

O autor deste script chama-se Stephen R. McMillan


*
*  Script to plot a colorbar
*
*  The script will assume a colorbar is wanted even if there is
*  not room -- it will plot on the side or the bottom if there is
*  room in either place, otherwise it will plot along the bottom and
*  overlay labels there if any.  This can be dealt with via
*  the 'set parea' command.  In version 2 the default parea will
*  be changed, but we want to guarantee upward compatibility in
*  sub-releases.
*
*       modifications by mike fiorino 940614
*       rvp added by diane stokes 20040729
*       cinc added by diane stokes 20050130
*
*       - the extreme colors are plotted as triangles
*       - the colors are boxed in white
*       - input arguments in during a run execution:
*
*       run cbarn cinc sf vert xmid ymid rvp
*
*       cinc - increment for labels
*       sf   - scale the whole bar 1.0 = original 0.5 half the size, etc.
*       vert - 0 FORCES a horizontal bar = 1 a vertical bar
*       xmid - the x position on the virtual page the center the bar
*       ymid - the x position on the virtual page the center the bar
*       rvp  - 1 resets virtual page (one colorbar for several plots)
*
*       if cinc is not specified, every color interval is labeled
*       if vert,xmid,ymid are not specified, they are selected
*       as in the original algorithm
*
*       if rvp is not specified, it is 0 (do not reset virtual page)

function colorbar (args)

*  Parse command line arguments
*  ----------------------------
   cinc=subwrd(args,1)
   sf=subwrd(args,2)
   vert=subwrd(args,3)
   xmid=subwrd(args,4)
   ymid=subwrd(args,5)
   rvp=subwrd(args,6)
   if(cinc=''|cinc=0);cinc=1;endif
   if(sf='');sf=1.0;endif

*  Check shading information
*  -------------------------
   'query shades'
   shdinfo = result
   if (subwrd(shdinfo,1)='None')
      say 'Cannot plot color bar: No shading information'
      return
   endif

* Check if reset of virtual page is desired
* -----------------------------------------
  if(rvp = 1)
     say 'Colorbar based on colors from last plot drawn'
     'set vpage off'
  endif

* Get plot size info
* ------------------
  'query gxinfo'
  rec2 = sublin(result,2)
  rec3 = sublin(result,3)
  rec4 = sublin(result,4)
  xsiz = subwrd(rec2,4)
  ysiz = subwrd(rec2,6)
  ylo = subwrd(rec4,4)
  xhi = subwrd(rec3,6)
  xd = xsiz - xhi

  ylolim=0.6*sf
  xdlim1=1.0*sf
  xdlim2=1.5*sf
  barsf=0.8*sf
  yoffset=0.2*sf
  stroff=0.05*sf
  strxsiz=0.12*sf
  strysiz=0.13*sf

*  Decide if horizontal or vertical color bar
*  and set up constants.
*  ------------------------------------------
   if (ylo<ylolim & xd<xdlim1)
      say "Not enough room in plot for a colorbar"
      return
   endif
   cnum = subwrd(shdinfo,5)

*  Logic for setting the bar orientation with user overides
*  --------------------------------------------------------
   if (ylo<ylolim | xd>xdlim1)
       vchk = 1
       if(vert = 0) ; vchk = 0 ; endif
   else
       vchk = 0
       if(vert = 1) ; vchk = 1 ; endif
   endif

*  Vertical bar
*  ------------
   if (vchk = 1 )
     if(xmid = '') ; xmid = xhi+xd/2 ; endif
     xwid = 0.2*sf
     ywid = 0.5*sf
     xl = xmid-xwid/2
     xr = xl + xwid
     if (ywid*cnum > ysiz*barsf)
        ywid = ysiz*barsf/cnum
     endif
     if(ymid = '') ; ymid = ysiz/2 ; endif
     yb = ymid - ywid*cnum/2
     'set string 1 l 5'
     vert = 1

*  Horizontal bar
*  --------------
   else

     ywid = 0.4
     xwid = 0.8
     if(ymid = '') ; ymid = ylo/2-ywid/2 ; endif
     yt = ymid + yoffset
     yb = ymid
     if(xmid = '') ; xmid = xsiz/2 ; endif
     if (xwid*cnum > xsiz*barsf)
         xwid = xsiz*barsf/cnum
     endif
     xl = xmid - xwid*cnum/2
     'set string 1 tc 5'
     vert = 0
   endif

*  Plot colorbar
*  -------------
   'set strsiz 'strxsiz' 'strysiz
   num = 0
   while (num<cnum)
     rec = sublin(shdinfo,num+2)
     col = subwrd(rec,1)
     hi = subwrd(rec,3)
     if (vert)
        yt = yb + ywid
     else
        xr = xl + xwid
     endif

*   Draw the left/bottom triangle
*   -----------------------------
    if (num = 0)
       if(vert = 1)
          xm = (xl+xr)*0.5
          'set line 'col
          'draw polyf 'xl' 'yt' 'xm' 'yb' 'xr' 'yt' 'xl' 'yt
          'set line 1 1 5'
          'draw line 'xl' 'yt' 'xm' 'yb
          'draw line 'xm' 'yb' 'xr' 'yt
          'draw line 'xr' 'yt' 'xl' 'yt
       else
          ym = (yb+yt)*0.5
          'set line 'col
          'draw polyf 'xl' 'ym' 'xr' 'yb' 'xr' 'yt' 'xl' 'ym
          'set line 1 1 5'
          'draw line 'xl' 'ym' 'xr' 'yb
          'draw line 'xr' 'yb' 'xr' 'yt
          'draw line 'xr' 'yt' 'xl' 'ym
       endif
   endif

*  Draw the middle boxes
*  ---------------------
   if (num!=0 & num!= cnum-1)
      'set line 'col
      'draw recf 'xl' 'yb' 'xr' 'yt
      'set line 1 1 5'
      'draw rec  'xl' 'yb' 'xr' 'yt
   endif

*  Draw the right/top triangle
*  --------------------------- 
   if (num = cnum-1)
      if (vert = 1)
         'set line 'col
         'draw polyf 'xl' 'yb' 'xm' 'yt' 'xr' 'yb' 'xl' 'yb
         'set line 1 1 5'
         'draw line 'xl' 'yb' 'xm' 'yt
         'draw line 'xm' 'yt' 'xr' 'yb
         'draw line 'xr' 'yb' 'xl' 'yb
      else
         'set line 'col
         'draw polyf 'xr' 'ym' 'xl' 'yb' 'xl' 'yt' 'xr' 'ym
         'set line 1 1 5'
         'draw line 'xr' 'ym' 'xl' 'yb
         'draw line 'xl' 'yb' 'xl' 'yt
         'draw line 'xl' 'yt' 'xr' 'ym
      endif
   endif

*  Put numbers under each segment of the color key
*  but only if this level is to be printed (based on cinc)
*  -------------------------------------------------------
   if(num < cnum-1)
*     base prt on hi if increment is based on data value (less reliable)
*     prt = math_fmod(hi,cinc);
*     ------------------------------------------------------------------
      prt = math_fmod(num,cinc);
      if(prt = 0)
         if (vert)
            xp=xr+stroff
            'draw string 'xp' 'yt' 'hi
         else
            yp=yb-stroff
            'draw string 'xr' 'yp' 'hi
         endif
      endif
    endif

*   Reset variables for next loop execution
*   ---------------------------------------
    if (vert)
      yb = yt
    else
      xl = xr
    endif
    num = num + 1

  endwhile
  return

Para utilizar é fácil:

Após abrir o arquivo desejado, definir a função gxout shaded e exibir (display) a variável, basta digitar:

ga-> run cbarnskip.gs 2

Eu chamei de cbarnskip.gs você escolhe o nome que achar melhor. O número 2 está relacionado aos valores que serão "removidos" ou alternados.

O resultado pode ser algo do tipo:



Boa Sorte e Bom Trabalho a Todos!

quinta-feira, 6 de fevereiro de 2014

GxYAT um comando para gerar Figuras com alta resolução

A pedido de Luana Pampuch segue um exemplo para salvar no GrADS figuras em .pdf ou .eps e etc.

No OpenGrADS existe um comando chamado GxYAT que você pode criar figuras em PDF, PNG, Postscript e SVG.

Para quem escreve textos em Latex (meu caso) é excelente pois as figuras ficam com excelente resolução e durante a impressão as figuras não perdem qualidade.

Portanto, para quem esta escrevendo TCC, Dissertação ou Tese fica a dica, aprendam Latex salvem suas figuras em PDF e se livrem de serem cobrados pela má qualidade das figuras durante as defesas :).

como usar no GrADS:

'enable print nome_da_figura.gmf'
.
.
.
'print'
'disable print'


'quit'

No Terminal Linux digite:

> gxyat -o nome_da_figura.pdf nome_da_figura.gmf
É isso!!

Boa Sorte e Bom Trabalho a Todos

terça-feira, 4 de fevereiro de 2014

Script GrADS Barra em formato de Diamante


Olha o GrADS surpreendendo novamente. Recentemente encontrei um script que plota uma barra de cores em formato de diamante e irei compartilhar com vocês. Acredito que fazer figuras para apresentações com este tipo de barra pode ser interessante, vamos lá:


Para usar as opções são as seguintes:

'run diamondbar.gs -r -marg 0.1 -font 0.09 -fs 2'

Este comando serve para plotar a figura acima seguindo o exemplo disponibilizado abaixo.

Opções:

-help                = Ajuda;
-loc                  = Escolhe um local para a colorbar (r=direita-vertical, l=esquerda-vertical,
                           b=base-horizontal, t=topo-horizontal),
                           você também pode chamar o comando através de (-l, -r, -b, -t);
-size/s              = Escolha o tamanho dos diamantes;
-marg              = Escolha a margem para o eixo;
-fs/int              = Escolha o intervalo para cada número plotado ao longo da colorbar;
-font/fontsize   = Escolha o tamanho da fonte dos números;
-scol                 = Escolha a cor dos números;
-line                 = Desenha o contorno de cada diamante caso deseje.

Scripts utilizados:

barradiamante.gs
Exemplo.gs

Simples assim, espero que funcione.

Boa Sorte e Bom Trabalho a Todos!!