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, 28 de outubro de 2014
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:
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!
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:
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
Assinar:
Postagens
(
Atom
)