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