00001 C Copyright 2005-2007 ECMWF 00002 C 00003 C Licensed under the GNU Lesser General Public License which 00004 C incorporates the terms and conditions of version 3 of the GNU 00005 C General Public License. 00006 C See LICENSE and gpl-3.0.txt for details. 00007 C 00008 C 00009 C Fortran 77 Implementation: iterator_fortran 00010 C 00011 C Description: how to use an iterator on lat/lon/values. 00012 C 00013 C 00014 C Author: Enrico Fucile <enrico.fucile@ecmwf.int> 00015 C 00016 C 00017 C 00018 program iterator 00019 implicit none 00020 include 'grib_api_f77.h' 00021 integer ifile 00022 integer iret,iter 00023 real*8 lat,lon,value,missingValue 00024 integer n,flags 00025 character*256 filename 00026 character*256 error 00027 00028 C Message identifier. 00029 integer igrib 00030 00031 ifile=5 00032 00033 call grib_check(grib_open_file(ifile, 00034 X'../../data/regular_latlon_surface.grib1','r')) 00035 00036 C Loop on all the messages in a file. 00037 10 iret=grib_new_from_file(ifile,igrib) 00038 if (igrib .eq. -1 ) then 00039 if (iret .ne.0) then 00040 call grib_check(iret) 00041 endif 00042 stop 00043 endif 00044 00045 C get as a real8 00046 call grib_check(grib_get_real8(igrib 00047 X,'missingValue',missingValue)) 00048 write(*,*) 'missingValue=',missingValue 00049 00050 C A new iterator on lat/lon/values is created from the message igrib 00051 flags = 0 00052 call grib_check(grib_iterator_new(igrib,iter,flags)) 00053 00054 n = 0 00055 C Loop on all the lat/lon/values. 00056 20 iret = grib_iterator_next(iter,lat,lon,value) 00057 if ( iret .eq. 0 ) goto 30 00058 C You can now print lat and lon, 00059 if ( value .eq. missingValue ) then 00060 C decide what to print if a missing value is found. 00061 write(*,*) "- ",n," - lat=",lat," lon=",lon," value=missing" 00062 else 00063 C or print the value if is not missing. 00064 write(*,*) " ",n," lat=",lat," lon=",lon," value=",value 00065 endif 00066 00067 n=n+1 00068 00069 goto 20 00070 30 continue 00071 00072 C At the end the iterator is deleted to free memory. 00073 call grib_check(grib_iterator_delete(iter)) 00074 00075 goto 10 00076 00077 call grib_check(grib_release(igrib)) 00078 00079 call grib_check(grib_close_file(ifile)) 00080 00081 end