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