program demo1 !**** !* Este programa demostrativo, acesa um arquivo BUFR (SYNOP), !* E obtem valores de !* 1 ano !* 2 mes !* 3 dia !* 4 hora !* 5 Latitude (0-05-001) !* 6 Longitude (0-06-001) !* 7 Altitude da estacao (0-07-001) !* 8 Pressao de superficie (0-10-004) !* 9 Presao resduzida ao Nivel medio do mar (0-10-051) !* 10 Temperatura do bulbo seco (0-12-004) !* !* !* !* USE MBUFR USE MSFLIB ! Para compilacao em Windows ( Microsoft Power Station ) USE MFORMATS implicit none !{ * Declaracao das variaveis utilizadas em read_mbufr integer :: nss type(sec1type)::sec1 type(sec3type)::sec3 type(sec4type)::sec4 integer :: NBYTES,BUFR_ED integer :: err Real,parameter :: Null=-340282300 !valor nulo !} !{ * Declaracao das variaveis utilizadas em format_tab integer,dimension(10)::desc_cols ! Codigo descritores de cada uma das colunas das tabelas integer:: ncols ! Numero de colunas de desc_cols integer:: nrows ! Numero de linhas de obs (retornado pelo format_tab) real,dimension(1:50,1:10):: obs ! Tabela de observacoes. Cada colunas corresponde a um dos 10 descritores integer::nqcexc ! Numero de valores meteorologicos excluidos pelo flag de confiabilidade integer :: totalqcexc ! Total de nqcexc !} !{ variaveis auxiliares do progrma principal integer ::i,f,J,nsubsets,IYEAR,IMONTH,IDAY,IHOUR integer*2 ::argc integer :: iargc character(len=255)::infile,outfile integer :: nm ! Numero de mensagens bufr integer,parameter::minqc=60 integer::npslp,npsup !} !{ Inicio do programa ! Inicializa variaveis ncols=10 desc_cols( 1)=004001 ! YEAR desc_cols( 2)=004002 ! MONTH desc_cols( 3)=004003 ! DAY desc_cols( 4)=004004 ! HOUR desc_cols( 5)=005001 ! LATITUDE desc_cols( 6)=006001 ! LONGITUDE desc_cols( 7)=007001 ! ALTITUDE desc_cols( 8)=010004 ! PRESSURE (SEA LEVEL PRESSURE) desc_cols( 9)=010051 ! PRESSURE (SURFACE) desc_cols(10)=012004 ! TEMPERATURE (DRY BULB TEMPERATURE) !} !{ Pega os argumentos de Entrada: Data e Nomes dos arquivos de entrada e saida argc = iargc() if ((argc==1)) then i=1;call GetArg(i,infile) print *,"Processando leitura de ",infile else print *,"-------------------------------------------------------------------" print *," demo1 - Programa de demostracao de extracao de variaveis do BUFR " print *," INPE-CPTEC Versao v1r0" print *," Sergio H. S. Ferreira" print *,"-------------------------------------------------------------------" PRINT *," USE: demo1 infile " print *," infile = Bufr input file name " print *,"---------------------------------------------------------------------" !infile="c:\sergio\profissional\desenvolvimento\bufr\dados_exemplo\synop.bufr" !outfile=trim(infile)//".tab" stop endif !} !{ * Inicia variaveis e abre o arquivo BUFR NBYTES = 0 nm=0 totalqcexc=0 npslp=0 npsup=0 Call OPEN_MBUFR(1, infile,46,11,0) open(2,file=outfile,status="unknown") write(2,'(1X,a)')"YYYYMMDDHH LAT LON ALT PSUP PNMM TEMP" !} !{ * Processa o ciclo de leitura do arquivo bufr aberto ! a) A subrotina READ_MBUFR (modulo MBUFR), é usada para fazer a leitura do BUFr ! b) A subrotina FORMAT_TAB (modulo mtemplates) é usada pra extrai os valores desejados ! da secao 4 colocando-os em uma tabela de observacoes (obs) ! 10 CONTINUE Call READ_MBUFR(1, 2000,-99,sec1,sec3,sec4, BUFR_ED, NBYTES,err) If ((NBYTES > 0).and.(IOERR(1)==0)) Then nm=nm+1 print *,"mensagem=",nm call format_tabqc(sec4,sec3%nsubsets,minqc,desc_cols,ncols,nrows,obs,nqcexc) totalqcexc=totalqcexc+nqcexc do j=1,nrows IYEAR=OBS(J,1) IMONTH=OBS(J,2) IDAY=OBS(J,3) IHOUR=OBS(J,4) if(obs(j,8)>0)npsup=npsup+1 if(obs(j,9)>0)npslp=npslp+1 obs(j,8)=obs(j,8)/100 ! Converte Pressao reduzida de Pa para hPa obs(j,9)=obs(j,9)/100 ! Converte Pressao de superficie de Pa para hPa obs(j,10)=obs(j,10)-273.2 ! Converte Temperarura de Kelvin para Ceusius write(2,100)iyear,imonth,iday,ihour,obs(j,5:ncols) end do goto 10 end if !} Close (1) close (2) print *,"Numero de variaveis excluidas p/ flag de confiabilidade=",totalqcexc print *,"Numero de valores de pressao de superficie=",npsup print *,"Numero de valores de pressao reduzida =",npslp !} 100 format (1X,I4,3I2,2(1x,f10.4),4(1x,f6.1)) End