Page tree

GRIB-API support has now been discontinued.

Please upgrade to ecCodes

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 7 Next »

 !
 !  Description: How to create and use and index to access messages from a file.
 !               Demo also loading and writing an index from a file.
 !
 !
 program index
   use grib_api
   implicit none
   
   integer              :: iret
   character(len = 256) :: error
   integer,dimension(:),allocatable :: step,level,number
   character(len=20),dimension(:),allocatable :: shortName
   integer                          :: ostep,olevel,onumber
   character(len=20)                :: oshortName
   integer                          :: shortNameSize,numberSize,levelSize,stepSize
   integer              :: i,j,k,l
   integer              :: idx,igrib,count
   logical              :: index_exists
   character(len=10)    :: index_file='index.idx'
 
   ! uncomment following line to load index from file
   !call grib_index_read(idx,index_file)
 
   ! create an index from a grib file using some keys
   call grib_index_create(idx,'../../data/index.grib','shortName,number,level,step')
 
   ! get the number of distinct values of shortName in the index
   call grib_index_get_size(idx,'shortName',shortNameSize)
   ! allocate the array to contain the list of distinct shortName
   allocate(shortName(shortNameSize))
   ! get the list of distinct shortName from the index
   call grib_index_get(idx,'shortName',shortName)
   write(*,'(a,i3)') 'shortNameSize=',shortNameSize
 
   ! get the number of distinct values of number in the index
   call grib_index_get_size(idx,'number',numberSize)
   ! allocate the array to contain the list of distinct numbers
   allocate(number(numberSize))
   ! get the list of distinct numbers from the index
   call grib_index_get(idx,'number',number)
   write(*,'(a,i3)') 'numberSize=',numberSize
 
   ! get the number of distinct values of level in the index
   call grib_index_get_size(idx,'level',levelSize)
   ! allocate the array to contain the list of distinct levels
   allocate(level(levelSize))
   ! get the list of distinct levels from the index
   call grib_index_get(idx,'level',level)
   write(*,'(a,i3)') 'levelSize=',levelSize
 
   ! get the number of distinct values of step in the index
   call grib_index_get_size(idx,'step',stepSize)
   ! allocate the array to contain the list of distinct steps
   allocate(step(stepSize))
   ! get the list of distinct steps from the index
   call grib_index_get(idx,'step',step)
   write(*,'(a,i3)') 'stepSize=',stepSize
 
   count=0
   do l=1,stepSize ! loop on step
     ! select step=step(l)
     call grib_index_select(idx,'step',step(l))
 
     do j=1,numberSize ! loop on number
       ! select number=number(j)
       call grib_index_select(idx,'number',number(j))
 
       do k=1,levelSize ! loop on level
         ! select level=level(k)
         call grib_index_select(idx,'level',level(k))
 
         do i=1,shortNameSize ! loop on shortName
           ! select shortName=shortName(i)
           call grib_index_select(idx,'shortName',shortName(i))
 
           call grib_new_from_index(idx,igrib, iret)
           do while (iret /= GRIB_END_OF_INDEX)
              count=count+1
              call grib_get(igrib,'shortName',oshortName)
              call grib_get(igrib,'number',onumber)
              call grib_get(igrib,'level',olevel)
              call grib_get(igrib,'step',ostep)
              write(*,'(A,A,A,i3,A,i4,A,i3)') 'shortName=',trim(oshortName),&
                      '   number=',onumber,&
                      '   level=' ,olevel, &
                      '   step='  ,ostep
   
              call grib_release(igrib)
              call grib_new_from_index(idx,igrib, iret)
           end do
           call grib_release(igrib)
 
         end do ! loop on step
       end do ! loop on level
     end do ! loop on number
   end do ! loop on shortName
   write(*,'(i4,a)') count,' messages selected'
 
   ! save the index to a file for later reuse
   call grib_index_write(idx,index_file)
 
   call grib_index_release(idx)
 
 end program index
  • No labels