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); }