#!/usr/bin/perl ######################################################## # Autor(a): Ana Lucia T. Ferreira # #------------------------------------------------------# # Data: 26/06/2006 # #------------------------------------------------------# # Descricao: Ler arquivo CSV com dados das estacoes # # da EPAGRI e gerar arquivo ".gem" para ser # # visualizado no GEMPAK # #------------------------------------------------------# # Modificacoes: # # Marcelo R. de Moraes para os dados das estacoes da # # EPAGRI # # # ######################################################## # Bibliotecas Utilizadas #----------------------- use strict; # Obriga a declarar todas as variaveis # Definicao de Constantes # ------------------------- my $dir_work = "$ENV{HOME}/CIRAMV2GEMPAK/"; # Diretorio de Trabalho my $dir_out = "/data/ldm/gempak/crm/"; # Diretorio de Saida - onde serao gerados os .gem # Variaveis Utilizadas # --------------------- my $data =""; # Recupera Data do Arquivo de Entrada para inserir no Arquivo de Saida my $arq_saida; # Nome do Arquivo de Saida ( formato GEMPAK ".gem" ) my $OutFile; # Concatena Diretorio com Arquivo de Saida (.gem) my $arq_temp; # Nome do Arquivo Temporario ( formato GEMPAK ) my $TempFile; # Concatena Diretorio com Arquivo Temporario my $arquivo; # Nome do Arquivo de Entrada my $InFile; # Concatena Diretorio com Arquivo de Entrada my $Stations = $dir_work."PCD_STNS.TBL";# Tabela de Estacoes das PCDs my $Pack = $dir_work."pcd.pack"; # Variaveis e Limites para o GEMPAK my $linha = ""; # Buffer de leitura my @campos = ""; # Array para as Variaveis do Cabecalho my @valor = ""; # Array para os valores das variaveis my $Temp = ""; # Variaveis Temporarias my $TempId = ""; my $TempData = ""; my $i; # Contadores my $cont; my $vento; my $vento_max; my $missing=-9999; #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #= PROGRAMA PRINCIPAL # #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# # Entra no Diretorio de Trabalho chdir ($dir_out) || die "\n *** Erro no diretorio $dir_out ***"; # Loop para Abrir Arquivos # de Entrada e criar arquivo # .GEM para visualizar no GEMPAK # -------------------------------- while ($arquivo = <*.dat>) { $data=$arquivo; $data=~ s/AUT_//; $data=~ s/.dat//; $arq_temp = $dir_out."GEMPAK_$data.dat"; # Nome do Arquivo Temporario ( formato GEMPAK ) $InFile = $dir_out.$arquivo; open(Arq_IN,$InFile) || die "\n Erro na leitura de $InFile \n"; # Abre Arquivo de Entrada open(Arq_OUT,">$arq_temp") || die "\n Erro na escrita de $arq_temp \n"; # Abre Arquivo Temporario # Leitura do Cabecalho # -------------------- $linha = ; # Le e descarta a linha de variaveis $linha = ; # A segunda linha tras os parametros # Gravacao do cabecalho no # arquivo Temporario # Formato GEMPAK (SFEDIT) # -------------------------- print Arq_OUT "PARM = TMPC;TDNC;TDXC;SKNT;DRCT;GUST;PRES;PMSL;RELH;P03M;ALTM\n\n"; # Grava linha de parametros # Separa campos do Cabecalho # --------------------------- @campos = qw(TMPC TDNC TDXC SKNT DRCT GUST PRES PMSL RELH P03M ALTM); # Array com as Variaveis Cabecalho # Grava campos do Cabecalho # ------------------------- print Arq_OUT " STN YYMMDD/HHMM "; foreach $Temp (@campos) { print Arq_OUT sprintf(" %9s",$Temp); } # Leitura e Gravacao dos Dados # Loop para todas as linhas do arquivo # ------------------------------------- while ( $linha= ) # Loop de leitura das linhas { chomp($linha); # Elimina o \n # Separa Variaveis # ---------------- @valor = split(/,/,$linha); # Converte Data formato GEMPAK (SFEDIT) # ------------------------------------ $valor[1] =~ /\d\d(\d\d)\/(\d\d)\/(\d\d) (\d\d):(\d\d):(\d\d)/; # Extrai campo Data $valor[1] = "$1$2$3/$4$5"; # Data no Formato GEMPAK # Checa a consistencia dos dados antes de gravar # ---------------------------------------------- if ($valor[0]=~ /^[1-9]/ ) { $TempId = shift @valor; # Apaga a Variavel Id , para Formatacao do restante das variaveis $TempData = shift @valor; # Apaga a Variavel Data , para Formatacao do restante das variaveis print Arq_OUT "$TempId $TempData "; # Chama as subrotinas para # transformar m/s para nos # ------------------------- $vento=&calcula_Vento($valor[3]); $vento_max=&calcula_VentoMax($valor[6]); print Arq_OUT sprintf(" %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f", $valor[0],$valor[1],$valor[2],$vento,$valor[5],$vento_max,$valor[7],$valor[8],$valor[9],$valor[10],$valor[11]); } print Arq_OUT "\n"; } # Fim do Loop para todas as linhas do arquivo #-------------------------------------------- $arq_saida =$data."_crm.gem"; # Arquivo Destino (GEMPAK) # Cria arquivo de superficie # --------------------------- system(` $ENV{'GEMEXE'}/sfcfil << EOF SFOUTF = $arq_saida SFPRMF = $Pack STNFIL = $Stations SHIPFL = NO TIMSTN = 24 r e EOF`); # Insere os dados no GEMPAK # -------------------------- system(` $ENV{'GEMEXE'}/sfedit << EOF SFFILE = $arq_saida SFEFIL = $arq_temp r e EOF`); # Apaga o arquivo temporario # -------------------------- unlink("$arq_temp"); unlink("$arquivo"); } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #= FIM PROGRAMA PRINCIPAL # #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #---------------------------------------# # SUB ROTINA - CONVERSAO M/S para Nos # #---------------------------------------# sub calcula_Vento { my ($vento) = @_; my ($calcula); if ($vento == $missing || $vento eq "") { return ($missing); } else { $calcula= $vento * 1.9425; if($calcula ==$missing || $calcula <=3) { $calcula=0; return($calcula); } else { return($calcula); } } } sub calcula_VentoMax { my ($vento_max) = @_; my ($calcula); if ($vento_max == $missing || $vento_max eq "") { return ($missing); } else { $calcula= $vento_max * 1.9425; return($calcula); } }