! (C) Copyright 2005- ECMWF. ! ! This software is licensed under the terms of the Apache Licence Version 2.0 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. ! ! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by ! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. ! ! Description: How to read data for a given beam from scatterometer BUFR messages. ! ! Please note that scatterometer data can be encoded in various ways in BUFR. Therefore the code ! below might not work directly for other types of messages than the one used in the ! example. It is advised to use bufr_dump first to understand the structure of these messages. program bufr_read_scatterometer use eccodes implicit none integer :: ifile integer :: iret integer :: ibufr integer :: i, count = 0 integer(kind=4) :: numObs, ii real(kind=8), dimension(:), allocatable :: latVal, lonVal, bscatterVal real(kind=8), dimension(:), allocatable :: year call codes_open_file(ifile, '../../data/bufr/asca_139.bufr', 'r') do while (.true.) call codes_bufr_new_from_file(ifile, ibufr, iret) if (iret == CODES_END_OF_FILE) exit write (*, '(A,I3)') 'message: ', count ! We need to instruct ecCodes to expand all the descriptors ! i.e. unpack the data values call codes_set(ibufr, "unpack", 1); ! The BUFR file contains a single message with 2016 subsets in a compressed form. ! It means each subset has exactly the same structure: they store one location with ! several beams and one backscatter value in each beam. ! ! To print the backScatter values for beamIdentifier=2 from all the subsets ! we will simply access the key by condition (see below). ! Read the total number of subsets. call codes_get(ibufr, 'numberOfSubsets', numObs) write (*, '(A,I5)') "Number of values:", numObs ! Get latitude (for all the subsets) call codes_get(ibufr, 'latitude', latVal); ! Get longitude (for all the subsets) call codes_get(ibufr, 'longitude', lonVal); allocate (year(numObs)) call codes_get(ibufr, 'year', year); do ii = 1, size(year) write (*, '(A,I4,A,F8.1)') 'year(', ii, ')=', year(ii) end do ! Get backScatter for beam two. We use an access by condition for this key. ! (for all the subsets) call codes_get(ibufr, '/beamIdentifier=2/backscatter', bscatterVal); ! Check that all arrays are same size if (size(latVal) /= numObs .or. size(lonVal) /= numObs .or. size(bscatterVal) /= numObs) then print *, 'inconsistent array dimension' exit end if ! Print the values write (*, *) 'pixel lat lon backscatter' write (*, *) "--------------------------------------" do i = 1, numObs write (*, '(I4,3F10.5)') i, latVal(i), lonVal(i), bscatterVal(i) end do ! Free arrays deallocate (latVal) deallocate (lonVal) deallocate (bscatterVal) ! Release the BUFR message call codes_release(ibufr) count = count + 1 end do call codes_close_file(ifile) end program bufr_read_scatterometer