Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Tabs Container
directionhorizontal


Tabs Page
titleFortran 90


Code Block
languagenone
titlebufr_copy_data.f90
linenumbersfalse
!
!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



Tabs Page
titlePython


Code Block
languagepython
titlebufr_copy_data.py
linenumbersfalse
# 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 tracebacksys
import systraceback

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())



Tabs Page
titleC


Code Block
languagecpp
titlebufr_copy_data.c
linenumbersfalse
/*
 * 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);
}



...