Tabs Page |
---|
|
Code Block |
---|
language | none |
---|
title | bufr_copy_data.f90 |
---|
linenumbers | false |
---|
| !
!Copyright 2005-2017 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 |
---|
|
Code Block |
---|
language | python |
---|
title | bufr_copy_data.py |
---|
linenumbers | false |
---|
| # Copyright 2005-2017 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, 'wwb') as outfile:
codes_write(ibufr, outfile)
codes_release(ibufr)
codes_release(ibufrin)
def main():
if len(sys.argv) < 3:
print >>sys.stderr, ('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 |
---|
|
Code Block |
---|
language | cpp |
---|
title | bufr_copy_data.c |
---|
linenumbers | false |
---|
| /*
* Copyright 2005-2017 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],"rrb");
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 = %ld%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);
}
|
|
|