Description
This example shows: How to copy all the values in the data section that are present in the same position in the data tree and with the same number of values to the output handle
Source code
bufr_copy_data.f90
!
!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.
!
!
! FORTRAN 90 implementation: bufr_copy_data
!
! Description: How to copy all the values in the data section that are present in the same
! position in the data tree and with the same number of values to the output handle
!
!
program bufr_encode
use eccodes
implicit none
integer :: iret
integer :: outfile
integer :: ifile
integer :: ibufr
integer :: ibufrin
integer(kind=4), dimension(:), allocatable :: ivalues
integer, parameter :: max_strsize = 200
character(len=max_strsize) :: infile_name
character(len=max_strsize) :: outfile_name
call codes_bufr_new_from_samples(ibufr,'BUFR3',iret)
call getarg(1, infile_name)
call getarg(2, outfile_name)
call codes_open_file(ifile, infile_name, 'r')
call codes_bufr_new_from_file(ifile, ibufrin)
if (iret/=CODES_SUCCESS) then
print *,'ERROR creating BUFR from BUFR3'
stop 1
endif
if(allocated(ivalues)) deallocate(ivalues)
allocate(ivalues(69))
ivalues=(/ &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, &
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, &
1, 1, 1, 1, 1, 0, 1, 1, 1, 1, &
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, &
1, 1, 1, 1, 1, 1, 1, 1, 0 /)
call codes_set(ibufr,'inputDataPresentIndicator',ivalues)
call codes_set(ibufr,'edition',3)
call codes_set(ibufr,'masterTableNumber',0)
call codes_set(ibufr,'bufrHeaderSubCentre',0)
call codes_set(ibufr,'bufrHeaderCentre',98)
call codes_set(ibufr,'updateSequenceNumber',1)
call codes_set(ibufr,'dataCategory',0)
call codes_set(ibufr,'dataSubCategory',140)
call codes_set(ibufr,'masterTablesVersionNumber',13)
call codes_set(ibufr,'localTablesVersionNumber',1)
call codes_set(ibufr,'typicalYearOfCentury',15)
call codes_set(ibufr,'typicalMonth',5)
call codes_set(ibufr,'typicalDay',4)
call codes_set(ibufr,'typicalHour',9)
call codes_set(ibufr,'typicalMinute',30)
call codes_set(ibufr,'numberOfSubsets',1)
call codes_set(ibufr,'observedData',1)
call codes_set(ibufr,'compressedData',0)
if(allocated(ivalues)) deallocate(ivalues)
allocate(ivalues(43))
ivalues=(/ &
307011,7006,10004,222000,101023,31031,1031,1032,101023,33007, &
225000,236000,101023,31031,1031,1032,8024,101001,225255,225000, &
236000,101023,31031,1031,1032,8024,101001,225255, &
1063,2001,4001,4002,4003,4004,4005,5002, &
6002,7001,7006,11001,11016,11017,11002 /)
call codes_set(ibufr,'unexpandedDescriptors',ivalues)
call codes_set(ibufrin,'unpack',1)
call codes_bufr_copy_data(ibufrin, ibufr)
call codes_open_file(outfile,outfile_name,'w')
call codes_write(ibufr,outfile)
call codes_close_file(outfile)
call codes_release(ibufr)
end program bufr_encode
bufr_copy_data.py
# 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.
#
# Python implementation: bufr_copy_data
#
# Description: How to copy all the values in the data section that are present in the same
# position in the data tree and with the same number of values to the output handle
#
import sys
import traceback
from eccodes import *
VERBOSE = 1 # verbose error reporting
def example(input_filename, output_filename):
ibufr = codes_new_from_samples('BUFR3', CODES_PRODUCT_BUFR)
f = open(input_filename, 'rb')
ibufrin = codes_bufr_new_from_file(f)
ivalues = (
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0)
codes_set_array(ibufr, 'inputDataPresentIndicator', ivalues)
codes_set(ibufr, 'edition', 3)
codes_set(ibufr, 'masterTableNumber', 0)
codes_set(ibufr, 'bufrHeaderSubCentre', 0)
codes_set(ibufr, 'bufrHeaderCentre', 98)
codes_set(ibufr, 'updateSequenceNumber', 1)
codes_set(ibufr, 'dataCategory', 0)
codes_set(ibufr, 'dataSubCategory', 140)
codes_set(ibufr, 'masterTablesVersionNumber', 13)
codes_set(ibufr, 'localTablesVersionNumber', 1)
codes_set(ibufr, 'typicalYearOfCentury', 15)
codes_set(ibufr, 'typicalMonth', 5)
codes_set(ibufr, 'typicalDay', 4)
codes_set(ibufr, 'typicalHour', 9)
codes_set(ibufr, 'typicalMinute', 30)
codes_set(ibufr, 'numberOfSubsets', 1)
codes_set(ibufr, 'observedData', 1)
codes_set(ibufr, 'compressedData', 0)
ivalues = (
307011, 7006, 10004, 222000, 101023, 31031, 1031, 1032, 101023, 33007,
225000, 236000, 101023, 31031, 1031, 1032, 8024, 101001, 225255, 225000,
236000, 101023, 31031, 1031, 1032, 8024, 101001, 225255,
1063, 2001, 4001, 4002, 4003, 4004, 4005, 5002,
6002, 7001, 7006, 11001, 11016, 11017, 11002)
codes_set_array(ibufr, 'unexpandedDescriptors', ivalues)
codes_set(ibufrin, 'unpack', 1)
codes_bufr_copy_data(ibufrin, ibufr) # Copy data across
with open(output_filename, 'wb') as outfile:
codes_write(ibufr, outfile)
codes_release(ibufr)
codes_release(ibufrin)
def main():
if len(sys.argv) < 3:
print('Usage: ', sys.argv[0], ' bufr_in bufr_out', file=sys.stderr)
sys.exit(1)
input_filename = sys.argv[1]
output_filename = sys.argv[2]
try:
example(input_filename, output_filename)
except CodesInternalError as err:
if VERBOSE:
traceback.print_exc(file=sys.stderr)
else:
sys.stderr.write(err.msg + '\n')
return 1
if __name__ == "__main__":
sys.exit(main())
bufr_copy_data.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.
*/
/*
* C Implementation: bufr_copy_data
*
* Description: How to copy all the values in the data section that are present in the same
* position in the data tree and with the same number of values to the output handle
*
*/
#include "eccodes.h"
static void usage(const char* progname);
int main(int argc, char *argv[])
{
FILE* f = NULL;
codes_handle* h = NULL;
codes_handle* ho = NULL;
long size;
char** keys = NULL;
size_t nkeys=0,i;
int err=0;
char* outfile = NULL;
const char* sampleName = "BUFR3";
const long ibitmap[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,0};
const long ud[]={307011,7006,10004,222000,101023,31031,1031,1032,101023,33007,
225000,236000,101023,31031,1031,1032,8024,101001,225255,225000,
236000,101023,31031,1031,1032,8024,101001,225255,
1063,2001,4001,4002,4003,4004,4005,5002,
6002,7001,7006,11001,11016,11017,11002};
if (argc != 3) usage(argv[0]);
outfile=argv[2];
f = fopen(argv[1],"rb");
if(!f) {
perror(argv[1]);
exit(1);
}
ho = codes_bufr_handle_new_from_samples(NULL, sampleName);
if (ho == NULL) {
fprintf(stderr, "ERROR creating BUFR from %s\n", sampleName);
fclose(f);
return 1;
}
size = sizeof(ibitmap)/sizeof(ibitmap[0]);
CODES_CHECK(codes_set_long_array(ho, "inputDataPresentIndicator", ibitmap, size), 0);
CODES_CHECK(codes_set_long(ho, "bufrHeaderCentre", 98), 0);
CODES_CHECK(codes_set_long(ho, "updateSequenceNumber", 1), 0);
CODES_CHECK(codes_set_long(ho, "dataCategory", 0), 0);
CODES_CHECK(codes_set_long(ho, "dataSubCategory", 140), 0);
CODES_CHECK(codes_set_long(ho, "masterTablesVersionNumber", 13), 0);
CODES_CHECK(codes_set_long(ho, "localTablesVersionNumber", 1), 0);
CODES_CHECK(codes_set_long(ho, "typicalYearOfCentury", 15), 0);
CODES_CHECK(codes_set_long(ho, "typicalMonth", 5), 0);
CODES_CHECK(codes_set_long(ho, "typicalDay", 4), 0);
CODES_CHECK(codes_set_long(ho, "typicalHour", 9), 0);
CODES_CHECK(codes_set_long(ho, "typicalMinute", 30), 0);
CODES_CHECK(codes_set_long(ho, "numberOfSubsets", 1), 0);
CODES_CHECK(codes_set_long(ho, "observedData", 1), 0);
CODES_CHECK(codes_set_long(ho, "compressedData", 0), 0);
size = sizeof(ud)/sizeof(ud[0]);
codes_set_long_array(ho,"unexpandedDescriptors",ud,size);
while((h = codes_handle_new_from_file(0,f,PRODUCT_BUFR,&err)) != NULL)
{
if(!h) {
printf("ERROR: Unable to create BUFR handle\n");
return 1;
}
/* codes_copy_key(h,ho,"unexpandedDescriptors",0); */
err = codes_set_long(h,"unpack",1);
if (err) {
printf("ERROR: Unable to unpack BUFR message. Quitting\n");
printf(" %s\n", codes_get_error_message(err));
return 1;
}
/* err=codes_bufr_copy_data(h,ho); */
keys=codes_bufr_copy_data_return_copied_keys(h,ho,&nkeys,&err);
for (i=0;i<nkeys;i++) {
printf("Copied %s\n",keys[i]);
free(keys[i]);
}
printf("Total number of copied keys = %lu\n", nkeys);
free(keys);
codes_handle_delete(h);
}
fclose(f);
codes_write_message(ho,outfile,"w");
codes_handle_delete(ho);
return err;
}
static void usage(const char* progname)
{
printf("\nUsage: %s bufr_in bufr_out\n",progname);
exit(1);
}