Gostaria de ajudar?

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!!

Nenhum comentário :

Postar um comentário