index.f90

How access a grib file through and index.

00001 ! Copyright 2005-2007 ECMWF
00002 ! 
00003 ! Licensed under the GNU Lesser General Public License which
00004 ! incorporates the terms and conditions of version 3 of the GNU
00005 ! General Public License.
00006 ! See LICENSE and gpl-3.0.txt for details.
00007 !
00008 !
00009 !  Description: How to create and use and index to access messages from a file
00010 !
00011 !
00012 !  Author: Enrico Fucile 
00013 !
00014 !
00015 program index
00016   use grib_api
00017   implicit none
00018   
00019   integer              :: iret
00020   character(len = 256) :: error
00021   integer,dimension(:),allocatable :: step,level,number
00022   character(len=20),dimension(:),allocatable :: shortName
00023   integer                          :: ostep,olevel,onumber
00024   character(len=20)                :: oshortName
00025   integer                          :: shortNameSize,numberSize,levelSize,stepSize
00026   integer              :: i,j,k,l
00027   integer              :: idx,igrib,count
00028 
00029   ! create an index from a grib file using some keys
00030   call grib_index_create(idx,'../../data/index.grib','shortName,number,level,step')
00031 
00032   ! get the number of distinct values of shortName in the index
00033   call grib_index_get_size(idx,'shortName',shortNameSize)
00034   ! allocate the array to contain the list of distinct shortName
00035   allocate(shortName(shortNameSize))
00036   ! get the list of distinct shortName from the index
00037   call grib_index_get(idx,'shortName',shortName)
00038   write(*,'(a,i3)') 'shortNameSize=',shortNameSize
00039 
00040   ! get the number of distinct values of number in the index
00041   call grib_index_get_size(idx,'number',numberSize)
00042   ! allocate the array to contain the list of distinct numbers
00043   allocate(number(numberSize))
00044   ! get the list of distinct numbers from the index
00045   call grib_index_get(idx,'number',number)
00046   write(*,'(a,i3)') 'numberSize=',numberSize
00047 
00048   ! get the number of distinct values of level in the index
00049   call grib_index_get_size(idx,'level',levelSize)
00050   ! allocate the array to contain the list of distinct levels
00051   allocate(level(levelSize))
00052   ! get the list of distinct levels from the index
00053   call grib_index_get(idx,'level',level)
00054   write(*,'(a,i3)') 'levelSize=',levelSize
00055 
00056   ! get the number of distinct values of step in the index
00057   call grib_index_get_size(idx,'step',stepSize)
00058   ! allocate the array to contain the list of distinct steps
00059   allocate(step(stepSize))
00060   ! get the list of distinct steps from the index
00061   call grib_index_get(idx,'step',step)
00062   write(*,'(a,i3)') 'stepSize=',stepSize
00063 
00064   count=0
00065   do l=1,stepSize ! loop on step
00066     ! select step=step(l)
00067     call grib_index_select(idx,'step',step(l))
00068 
00069     do j=1,numberSize ! loop on number
00070       ! select number=number(j)
00071       call grib_index_select(idx,'number',number(j))
00072 
00073       do k=1,levelSize ! loop on level
00074         ! select level=level(k)
00075         call grib_index_select(idx,'level',level(k))
00076 
00077         do i=1,shortNameSize ! loop on shortName
00078           ! select shortName=shortName(i)
00079           call grib_index_select(idx,'shortName',shortName(i))
00080 
00081           call grib_new_from_index(idx,igrib, iret)
00082           do while (iret /= GRIB_END_OF_INDEX)
00083              count=count+1
00084              call grib_get(igrib,'shortName',oshortName)
00085              call grib_get(igrib,'number',onumber)
00086              call grib_get(igrib,'level',olevel)
00087              call grib_get(igrib,'step',ostep)
00088              write(*,'(A,A,A,i3,A,i4,A,i3)') 'shortName=',trim(oshortName),&
00089                      '   number=',onumber,&
00090                      '   level=' ,olevel, &
00091                      '   step='  ,ostep
00092   
00093              call grib_new_from_index(idx,igrib, iret)
00094           end do
00095 
00096         end do ! loop on step
00097       end do ! loop on level
00098     end do ! loop on number
00099   end do ! loop on shortName
00100   write(*,'(i4,a)') count,' messages selected'
00101   call grib_index_release(idx)
00102 
00103 end program index
00104 

Generated on Tue Sep 22 15:18:21 2009 for grib_api by  doxygen 1.5.3