diff --git a/examples/C/bufr_read_temp.c b/examples/C/bufr_read_temp.c index 0ae4b7222..4aaa3ed1b 100644 --- a/examples/C/bufr_read_temp.c +++ b/examples/C/bufr_read_temp.c @@ -11,7 +11,7 @@ /* * C Implementation: bufr_read_temp * - * Description: how to read a temperature significant levels from TEMP BUFR messages. + * Description: how to read temperature significant levels from TEMP BUFR messages. * */ @@ -58,8 +58,8 @@ int main(int argc,char* argv[]) i.e. unpack the data values */ CODES_CHECK(codes_set_long(h,"unpack",1),0); - /* In what follows: we rely on the fact that for - temperature signifcant levels the value of key + /* In what follows we rely on the fact that for + temperature significant levels the value of key verticalSoundingSignificance is 4 (see flag table 8001 for details). We also make use of the fact that in our BUFR message @@ -71,8 +71,8 @@ int main(int argc,char* argv[]) Get the number of the temperature significant levels. ------------------------------------------------------*/ - /* We find out the number of significant temperature levels by - counting how many presssure values we have on these levels. */ + /* We find out the number of temperature significant levels by + counting how many pressure values we have on these levels. */ sprintf(key_name,"/verticalSoundingSignificance=4/pressure"); CODES_CHECK(codes_get_size(h,key_name,&sigt_len),0); @@ -106,7 +106,7 @@ int main(int argc,char* argv[]) CODES_CHECK(codes_get_size(h,key_name,&len),0); if(len != sigt_len) { - printf("incosistent number of geopotential values found!\n"); + printf("inconsistent number of geopotential values found!\n"); return 1; } @@ -122,7 +122,7 @@ int main(int argc,char* argv[]) /* Check the size*/ if(len != sigt_len) { - printf("incosistent number of temperature values found!\n"); + printf("inconsistent number of temperature values found!\n"); return 1; } @@ -139,7 +139,7 @@ int main(int argc,char* argv[]) /* Check the size*/ if(len != sigt_len) { - printf("incosistent number of dewpoint temperature values found!\n"); + printf("inconsistent number of dewpoint temperature values found!\n"); return 1; } diff --git a/examples/F90/CMakeLists.txt b/examples/F90/CMakeLists.txt index 68c9fcbe3..42da3f309 100644 --- a/examples/F90/CMakeLists.txt +++ b/examples/F90/CMakeLists.txt @@ -36,6 +36,7 @@ list( APPEND tests bufr_keys_iterator bufr_print_header bufr_print_data + bufr_read_temp bufr_set_keys bufr_subset get_product_kind diff --git a/examples/F90/Makefile.am b/examples/F90/Makefile.am index ea3ff96f3..fa6f677c0 100644 --- a/examples/F90/Makefile.am +++ b/examples/F90/Makefile.am @@ -5,14 +5,14 @@ TESTS = copy_message.sh get.sh get_data.sh get_pl.sh get_pv.sh keys_iterator.sh nearest.sh precision.sh multi_write.sh multi.sh print_data.sh set.sh set_bitmap.sh set_missing.sh \ set_pv.sh samples.sh count_messages.sh read_message.sh read_from_file.sh index.sh get_set_uuid.sh \ bufr_attributes.sh bufr_clone.sh bufr_expanded.sh bufr_get_keys.sh bufr_print_header.sh bufr_print_data.sh bufr_set_keys.sh \ - bufr_keys_iterator.sh bufr_subset.sh get_product_kind.sh + bufr_keys_iterator.sh bufr_subset.sh get_product_kind.sh bufr_read_temp.sh noinst_PROGRAMS = f_index f_copy_message f_get f_get_data f_get_pl f_get_pv f_keys_iterator \ f_multi_write f_multi f_nearest f_precision f_print_data f_set f_set_bitmap f_set_missing \ f_set_pv f_samples f_count_messages f_read_message f_read_from_file f_new_from_file \ f_copy_namespace f_get_set_uuid f_set_gvc f_clone f_bufr_clone f_bufr_expanded f_bufr_get_keys \ f_bufr_print_header f_bufr_print_data f_bufr_set_keys f_bufr_keys_iterator f_bufr_subset f_bufr_attributes \ - f_get_product_kind + f_get_product_kind f_bufr_read_temp f_index_SOURCES=index.f90 f_copy_message_SOURCES=copy_message.f90 @@ -46,6 +46,7 @@ f_bufr_get_keys_SOURCES=bufr_get_keys.f90 f_bufr_keys_iterator_SOURCES=bufr_keys_iterator.f90 f_bufr_print_header_SOURCES=bufr_print_header.f90 f_bufr_print_data_SOURCES=bufr_print_data.f90 +f_bufr_read_temp_SOURCES=bufr_read_temp.f90 f_bufr_set_keys_SOURCES=bufr_set_keys.f90 f_bufr_subset_SOURCES=bufr_subset.f90 f_get_product_kind_SOURCES=get_product_kind.f90 diff --git a/examples/F90/bufr_read_temp.f90 b/examples/F90/bufr_read_temp.f90 new file mode 100644 index 000000000..ddfec2eb3 --- /dev/null +++ b/examples/F90/bufr_read_temp.f90 @@ -0,0 +1,151 @@ +! +!Copyright 2005-2015 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. +! +! +! FOTRAN 90 Implementation: bufr_read_temp +! +! Description: how to read temperature significant levels from TEMP BUFR messages. +! +! +program bufr_print_data +use eccodes +implicit none +integer :: ifile +integer :: iret +integer :: ibufr +integer :: i, count=0 +integer(kind=4) :: numSigT +integer(kind=4) :: num +real(kind=8), dimension(:), allocatable :: presVal,geoVal,tVal ,tdVal +character(len=128) :: keyName + + call codes_open_file(ifile,'../../data/bufr/temp_101.bufr','r') + +! the first bufr message is loaded from file +! ibufr is the bufr id to be used in subsequent calls + call codes_bufr_new_from_file(ifile,ibufr,iret) + + do while (iret/=CODES_END_OF_FILE) + + write(*,*) 'message: ',count + + ! we need to instruct ecCodes to expand all the descriptors + ! i.e. unpack the data values + call codes_set(ibufr,"unpack",1); + + ! In what follows we rely on the fact that for + ! temperature significant levels the value of key + ! verticalSoundingSignificance is 4 (see flag table 8001 for details). + + ! We also make use of the fact that in our BUFR message + ! verticalSoundingSignificance is always followed by geopotential, + ! airTemperature, dewpointTemperature, + ! windDirection, windSpeed and pressure. + + ! ---- Get the number of the temperature significant levels ---- + + ! We find out the number of temperature significant levels by + ! counting how many pressure values we have on these levels. + + keyName="/verticalSoundingSignificance=4/pressure" + + call codes_get_size(ibufr,keyName,numSigT); + + write(*,*) "Number of temperature significant levels:", numSigT + + ! Allocate memory for the values to be read. Each + ! parameter must have the same number of values. + allocate(presVal(numSigT), stat=iret); + allocate(geoVal(numSigT), stat=iret); + allocate(tVal(numSigT), stat=iret); + allocate(tdVal(numSigT), stat=iret); + + ! ---- Get pressure --------------------------- + + keyName="/verticalSoundingSignificance=4/pressure" + + ! get the value + call codes_get(ibufr,keyName,presVal); + + ! ---- Get gepotential ------------------------ + + keyName="/verticalSoundingSignificance=4/geopotential" + + !Check the size + call codes_get_size(ibufr,keyName,num) + if (num /= numSigT) then + + write(*,*) "inconsistent number of geopotential values found!" + call exit(1) + end if + + ! get the values + call codes_get(ibufr,keyName,geoVal) + + ! ---- Get temperature -------------------------------- + + keyName="/verticalSoundingSignificance=4/airTemperature" + + !Check the size + call codes_get_size(ibufr,keyName,num) + if (num /= numSigT) then + + write(*,*) "inconsistent number of temperature values found!" + call exit(1) + end if + + ! get the values + call codes_get(ibufr,keyName,tVal) + + ! ---- Get dew point temperature ----------------------- + + keyName="/verticalSoundingSignificance=4/dewpointTemperature" + + !Check the size + call codes_get_size(ibufr,keyName,num) + if (num /= numSigT) then + + write(*,*) "inconsistent number of dew point temperature values found!" + call exit(1) + end if + + ! get the values + call codes_get(ibufr,keyName,tdVal) + + ! ---- Print the values -------------------------------- + + write(*,*) 'level pres geo t td' + write(*,*) "--------------------------------------" + + do i=1,numSigT + write(*,*) i,presVal(i),geoVal(i),tVal(i),tdVal(i) + end do + + + ! free arrays + deallocate(presVal) + deallocate(geoVal) + deallocate(tVal) + deallocate(tdVal) + + ! release the bufr message + call codes_release(ibufr) + + ! load the next bufr message + call codes_bufr_new_from_file(ifile,ibufr,iret) + + count=count+1 + + end do + +! close file + call codes_close_file(ifile) + + +end program bufr_print_data diff --git a/examples/F90/bufr_read_temp.sh b/examples/F90/bufr_read_temp.sh new file mode 100755 index 000000000..b8b642856 --- /dev/null +++ b/examples/F90/bufr_read_temp.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# Copyright 2005-2015 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. +# + +. ./include.sh + + +#Define a common label for all the tmp files +label="bufr_read_temp_f" + +#Define tmp file +fTmp=${label}.tmp.txt +rm -f $fTmp | true + +#We check "temp_101.bufr". The path is +#hardcoded in the example + +REDIRECT=/dev/null + +#Write the key values into a file +${examples_dir}/f_bufr_read_temp #2> $REDIRECT > $fTmp + +#TODO: check the results + +#cat $fTmp + +#Clean up +rm -f $fTmp | true + diff --git a/examples/python/CMakeLists.txt b/examples/python/CMakeLists.txt index 225dc96ba..b31f87592 100644 --- a/examples/python/CMakeLists.txt +++ b/examples/python/CMakeLists.txt @@ -46,6 +46,7 @@ list( APPEND tests bufr_keys_iterator bufr_print_header bufr_print_data + bufr_read_temp bufr_set_keys bufr_subset get_product_kind diff --git a/examples/python/Makefile.am b/examples/python/Makefile.am index 9b968a51e..0d2216d94 100644 --- a/examples/python/Makefile.am +++ b/examples/python/Makefile.am @@ -4,7 +4,7 @@ AM_CFLAGS = @WARN_PEDANTIC@ @WERROR@ TESTS = clone.sh count_messages.sh get.sh index.sh iterator.sh keys_iterator.sh multi_write.sh nearest.sh print_data.sh \ samples.sh set.sh set_missing.sh binary_message.sh set_bitmap.sh bufr_print_header.sh bufr_print_data.sh \ bufr_clone.sh bufr_get_keys.sh bufr_set_keys.sh bufr_expanded.sh bufr_keys_iterator.sh bufr_subset.sh \ - bufr_attributes.sh get_product_kind.sh + bufr_attributes.sh get_product_kind.sh bufr_read_temp.sh TESTS_ENVIRONMENT = TOPBUILDDIR=$(top_builddir) PYTHON=$(PYTHON) noinst_PROGRAMS = p_keys_iterator p_print_data p_iterator p_count_messages @@ -20,6 +20,6 @@ EXTRA_DIST = $(TESTS) include.sh clone.py count_messages.py get.py index.py iter nearest.py print_data.py samples.py set.py set_missing.py binary_message.py set_pv.py set_bitmap.py \ bufr_print_header.py bufr_print_data.py bufr_clone.py bufr_get_keys.py bufr_set_keys.py \ bufr_expanded.py bufr_keys_iterator.py bufr_subset.py bufr_attributes.py \ - get_product_kind.py \ + get_product_kind.py bufr_read_temp.py \ CMakeLists.txt include.ctest.sh.in endif diff --git a/examples/python/bufr_read_temp.py b/examples/python/bufr_read_temp.py new file mode 100644 index 000000000..874b5624c --- /dev/null +++ b/examples/python/bufr_read_temp.py @@ -0,0 +1,128 @@ +# Copyright 2005-2015 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. + +# +# Python implementation: bufr_read_temp +# +# Description: how to read temperature significant levels from TEMP BUFR messages. +# +# + +import traceback +import sys + +from eccodes import * + +INPUT='../../data/bufr/temp_101.bufr' +VERBOSE=1 # verbose error reporting + +def example(): + + # open bufr file + f = open(INPUT) + + cnt=0 + + # loop for the messages in the file + while 1: + # get handle for message + gid = codes_bufr_new_from_file(f) + if gid is None: break + + print "message: %s" % cnt + + # we need to instruct ecCodes to expand all the descriptors + # i.e. unpack the data values + codes_set(gid,'unpack',1); + + # In what follows we rely on the fact that for + # temperature significant levels the value of key + # verticalSoundingSignificance is 4 (see flag table 8001 for details). + + # We also make use of the fact that in our BUFR message + # verticalSoundingSignificance is always followed by geopotential, + # airTemperature, dewpointTemperature, + # windDirection, windSpeed and pressure. + + #------------------------------------------------------- + # Get the number of the temperature significant levels. + #------------------------------------------------------ + + # We find out the number of temperature significant levels by + # counting how many pressure values we have on these levels. + + numSigT=codes_get_size(gid,"/verticalSoundingSignificance=4/pressure") + print ' Number of temperature significant levels %ld' % (numSigT) + + # ---------------------------- + # Get pressure + # ---------------------------- + + sigt_pres=codes_get_array(gid,"/verticalSoundingSignificance=4/pressure") + + #-------------------------------- + # Get gepotential + #-------------------------------- + + sigt_geo=codes_get_array(gid,"/verticalSoundingSignificance=4/geopotential") + + if len(sigt_geo) != sigTNum : + print "inconstitent number of geopotential values found!" + return 1 + + #-------------------------------- + # Get temperature + #-------------------------------- + + sigt_t=codes_get_array(gid,"/verticalSoundingSignificance=4/airTemperature") + + if len(sigt_t) != sigTNum : + print "inconstitent number of temprature values found!" + return 1 + + #-------------------------------- + # Get dew point + #-------------------------------- + + sigt_td=codes_get_array(gid,"/verticalSoundingSignificance=4/dewpointTemperature") + + if len(sigt_td) != sigTNum : + print "inconstitent number of dewpoint temperature values found!" + return 1 + + #------------------------------------ + # Print the values + # ----------------------------------- + + print "lev pres geo t td" + print "-------------------------------" + + for i in xrange(sigTNum): + print "%3d %6.0f %6.0f %.1f %.1f" % (i+1,sigt_pres[i],sigt_geo[i],sigt_t[i],sigt_td[i]) + + cnt+=1 + + # delete handle + codes_release(gid) + + # close the file + f.close() + +def main(): + try: + example() + except CodesInternalError,err: + if VERBOSE: + traceback.print_exc(file=sys.stderr) + else: + print >>sys.stderr,err.msg + + return 1 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/examples/python/bufr_read_temp.sh b/examples/python/bufr_read_temp.sh new file mode 100755 index 000000000..d1d3a8c4a --- /dev/null +++ b/examples/python/bufr_read_temp.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# Copyright 2005-2015 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. +# + +. ./include.sh + + +#Define a common label for all the tmp files +label="bufr_read_temp_p" + +#Define tmp file +fTmp=${label}.tmp.txt +rm -f $fTmp | true + +#We check "temp_101.bufr". The path is +#hardcoded in the example + +REDIRECT=/dev/null + +#Write the key values into a file +$PYTHON bufr_read_temp.py #2> $REDIRECT > $fTmp + +#TODO: check the results + +#cat $fTmp + +#Clean up +rm -f $fTmp | true