GRIB API oktatóanyag >> GRIB API Fortran interface >> GRIB szerkesztése

GRIB-et nem csak olvasni, hanem írni is tudunk. A legegyszerűbb eset, ha csak másolatot készítünk a GRIB-ről:

set0.f

program set
implicit none
include 'grib_api_f77.h'
integer err
integer infile,outfile, igrib,iret
character*256 error

infile=15
outfile=16

call grib_check(grib_open_file(infile,'uv500.grb','r'))
call grib_check(grib_open_file(outfile,'out.GRIB','w'))
call grib_check(grib_new_from_file(infile,igrib))

call grib_check(grib_write(igrib,outfile)) ! kiiras
call grib_check(grib_release(igrib))
call grib_check(grib_close_file(infile))
call grib_check(grib_close_file(outfile))
stop
end

Bizonyos jellemzőket módosítani is tudunk. Például a GRIB tartalmazza a létrehozó meteorológiai központ nevét és azonosítószámát (részletes lista).

set1.f

program set
implicit none
include 'grib_api_f77.h'
integer err
integer*4 centre, int_value
character*10 string_value
integer infile,outfile, igrib,iret
character*256 error

infile=15
outfile=16

call grib_check(grib_open_file(infile,'1.GRIB','r'))
call grib_check(grib_open_file(outfile,'out.GRIB','w'))
call grib_check(grib_new_from_file(infile,igrib))
call grib_check(grib_get_int(igrib,'centre',int_value))
call grib_check(grib_get_string(igrib,'centre',string_value))
write(*,*) int_value, string_value

centre=80 ! beallitjuk az uj erteket
call grib_check(grib_set_int(igrib,'centre',centre))

call grib_check(grib_get_int(igrib,'centre',int_value))
call grib_check(grib_get_string(igrib,'centre',string_value))
write(*,*) int_value, string_value

call grib_check(grib_write(igrib,outfile)) ! kiiras
call grib_check(grib_release(igrib))
call grib_check(grib_close_file(infile))
call grib_check(grib_close_file(outfile))
end

A futtatás eredménye:

nimbus:~/GRIBapi/example3$ ./a.out
7 kwbc ! eredeti kozpont
80 cnmc ! modositott kozpont

Tudunk olyat is, hogy valamilyen szempont szerint szűrjük a GRIB-et, így csak egy részét tesszük be az új file-ba. Például az uv500.grb tartalmaz x és y irányú szél adatot is, de ebből csak az egyiket szeretnénk megtartani:

set2.f

program iterator
implicit none
include 'grib_api_f77.h'
integer ifile,outfile
integer iret,iter
real*8 lat,lon,value,missingValue
integer n,flags
character*256 filename,error,nev,nev0
integer igrib
integer szum
open(10,file='output.txt')
ifile=15
outfile=10
nev0='u' ! csak az x iranyu szelkomponensre vagyunk kivancsiak
call grib_check(grib_open_file(ifile,'uv500.grb','r')) ! input
call grib_check(grib_open_file(outfile,'out.grib','w')) ! output
szum = 1

10 iret=grib_new_from_file(ifile,igrib)
if (igrib .eq. -1 ) then
if (iret .ne.0) then
call grib_check(iret)
endif
stop
endif
call grib_check(grib_get_real8(igrib,'missingValue',missingValue))
flags = 0
call grib_check(grib_iterator_new(igrib,iter,flags))
call grib_check(grib_get_string(igrib,'shortName',nev))

if (nev.eq.nev0) then ! ha a parameter neve az altalunk meghatarozott
call grib_check(grib_write(igrib,outfile)) ! akkor kiirjuk a GRIB-be
endif

30 continue
call grib_check(grib_iterator_delete(iter))
goto 10
call grib_check(grib_release(igrib))
call grib_check(grib_close_file(ifile))
call grib_check(grib_close_file(outfile))
close(10)
end

Az így készített új GRIB-et jellemző kontroll fájl:

out.GRIB

* produced by GRIB2ctl v0.9.12.5p33d
dtype GRIB 255
options yrev
ydef 121 linear -90.000000 1.5
xdef 240 linear 0.000000 1.500000
tdef 1 linear 12Z25jul2005 1mo
zdef 1 linear 1 1
vars 1
Uprs 0 131,100,500 ** U velocity [m s**-1]
ENDVARS

Oldal tetejére >> Vissza a főoldalra