Tabs Page |
---|
|
Code Block |
---|
language | cppnone |
---|
title | grib_get_keys.cf90 |
---|
linenumbers | false |
---|
| /*
*! (C) Copyright 2005-2015 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: grib_get_keys
*
* Description: how to get values using keys from GRIB messages
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "eccodes.h"
int main(int argc, char** argv)
{
int err = 0;
double *values = NULL;
size_t values_len= 0;
size_t i = 0, len = 0;
double latitudeOfFirstGridPointInDegrees;
double longitudeOfFirstGridPointInDegrees;
double latitudeOfLastGridPointInDegrees;
double longitudeOfLastGridPointInDegrees;
double jDirectionIncrementInDegrees;
double iDirectionIncrementInDegrees;
long numberOfPointsAlongAParallel;
long numberOfPointsAlongAMeridian;
double average = 0;
char* packingType = NULL;
FILE* in = NULL;
const char* filename = "../../data/regular_latlon_surface.grib1";
codes_handle *h = NULL;
in = fopen(filename,"r");
if(!in) {
!
!
program grib_get_keys
use eccodes
implicit none
integer :: ifile
integer :: iret
integer :: igrib
real printf("ERROR: unable to open file %s\n",filename);:: latitudeOfFirstPointInDegrees
real return 1;
}
/* create new handle from a message in a file*/
h = codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err); :: longitudeOfFirstPointInDegrees
real if (h == NULL) {
printf("Error: unable to create handle from file %s\n",filename);
}
:: /*latitudeOfLastPointInDegrees
Store thereal filename in the key "file" for this handle */
len = strlen(filename);
CODES_CHECK(codes_set_string(h, "file", filename, &len), 0);
/* get as:: a long*/longitudeOfLastPointInDegrees
integer CODES_CHECK(codes_get_long(h,"Ni",&numberOfPointsAlongAParallel),0);
printf("numberOfPointsAlongAParallel=%ld\n",numberOfPointsAlongAParallel);
/* get as a long*/
CODES_CHECK(codes_get_long(h,"Nj",&numberOfPointsAlongAMeridian),0);
printf("numberOfPointsAlongAMeridian=%ld\n",numberOfPointsAlongAMeridian);
:: numberOfPointsAlongAParallel
integer /* get as a double*/
CODES_CHECK(codes_get_double(h,"latitudeOfFirstGridPointInDegrees",&latitudeOfFirstGridPointInDegrees),0);
printf("latitudeOfFirstGridPointInDegrees=%g\n",latitudeOfFirstGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"longitudeOfFirstGridPointInDegrees",&longitudeOfFirstGridPointInDegrees),0);:: numberOfPointsAlongAMeridian
real, printf("longitudeOfFirstGridPointInDegrees=%g\n",longitudeOfFirstGridPointInDegrees);
dimension(:), allocatable /* get:: as a double*/values
integer CODES_CHECK(codes_get_double(h,"latitudeOfLastGridPointInDegrees",&latitudeOfLastGridPointInDegrees),0);
printf("latitudeOfLastGridPointInDegrees=%g\n",latitudeOfLastGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"longitudeOfLastGridPointInDegrees",&longitudeOfLastGridPointInDegrees),0);
:: printf("longitudeOfLastGridPointInDegrees=%g\n",longitudeOfLastGridPointInDegrees);
numberOfValues
real /* get as a double*/
CODES_CHECK(codes_get_double(h,"jDirectionIncrementInDegrees",&jDirectionIncrementInDegrees),0);
printf("jDirectionIncrementInDegrees=%g\n",jDirectionIncrementInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"iDirectionIncrementInDegrees",&iDirectionIncrementInDegrees),0);
printf("iDirectionIncrementInDegrees=%g\n",iDirectionIncrementInDegrees);
/* get as string */
CODES_CHECK(codes_get_length(h, "packingType", &len), 0);
packingType = (char*)malloc(len*sizeof(char));
codes_get_string(h, "packingType", packingType, &len);
printf("packingType=%s\n", packingType);
free(packingType);
/* get the size of the values array*/
CODES_CHECK(codes_get_size(h,"values",&values_len),0);
values = (double*)malloc(values_len*sizeof(double));
/* get data values*/
CODES_CHECK(codes_get_double_array(h,"values",values,&values_len),0);
average = 0;
for(i = 0; i < values_len; i++)
average += values[i];
average /=(double)values_len;
free(values);
printf("There are %d values, average is %g\n",(int)values_len,average);
{
int eq = 0;:: average,min_val, max_val
integer :: is_missing
character(len=10) :: open_mode='r'
call codes_open_file(ifile, &
'../../data/reduced_latlon_surface.grib1', open_mode)
! Loop on all the messages in a file.
! A new GRIB message is loaded from file
! igrib is the grib id to be used in subsequent calls
call codes_grib_new_from_file(ifile,igrib, iret)
LOOP: DO WHILE (iret /= CODES_END_OF_FILE)
! Check if the value of the key is MISSING
is_missing=0;
call codes_is_missing(igrib,'Ni',is_missing);
if ( is_missing /= 1 ) then
/* Now retrieve the value of the key "file" */! Key value is not missing so get as an integer
char file[256]={0,};call codes_get(igrib,'Ni',numberOfPointsAlongAParallel)
CODES_CHECK(codes_get_length(h, "file", &len),0);write(*,*) 'numberOfPointsAlongAParallel=', &
numberOfPointsAlongAParallel
assert(len == 1+strlen(filename)); else
codes_get_string(h, "file", file, &len);write(*,*) 'numberOfPointsAlongAParallel is missing'
endif
eq! Get = strcmp(file, filename);as an integer
call codes_get(igrib,'Nj',numberOfPointsAlongAMeridian)
assertwrite( eq == 0 );
*,*) 'numberOfPointsAlongAMeridian=', &
}
codes_handle_delete(h);numberOfPointsAlongAMeridian
fclose(in);
return 0;
}
|
| Tabs Page |
---|
| Code Block |
---|
language | none |
---|
title | grib_get_keys.f90 |
---|
linenumbers | false |
---|
| ! Copyright 2005-2015 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.
!
!
! Description: how to get values using keys from GRIB messages
!
!
program grib_get_keys
use eccodes
implicit none
integer ! Get as a real
call codes_get(igrib, 'latitudeOfFirstGridPointInDegrees', &
latitudeOfFirstPointInDegrees)
write(*,*) 'latitudeOfFirstGridPointInDegrees=', &
latitudeOfFirstPointInDegrees
! Get as a real
call codes_get(igrib, 'longitudeOfFirstGridPointInDegrees', &
longitudeOfFirstPointInDegrees)
write(*,*) 'longitudeOfFirstGridPointInDegrees=', &
longitudeOfFirstPointInDegrees
! Get as a real
call codes_get(igrib, 'latitudeOfLastGridPointInDegrees', &
latitudeOfLastPointInDegrees)
write(*,*) 'latitudeOfLastGridPointInDegrees=', &
:: ifilelatitudeOfLastPointInDegrees
integer ! Get as a real
call codes_get(igrib, 'longitudeOfLastGridPointInDegrees', &
:: iretlongitudeOfLastPointInDegrees)
integer write(*,*) 'longitudeOfLastGridPointInDegrees=', &
longitudeOfLastPointInDegrees
! Get the size of the values array
:: call codes_get_size(igrib,'values',numberOfValues)
real write(*,*) 'numberOfValues=',numberOfValues
allocate(values(numberOfValues), stat=iret)
! Get data values
call codes_get(igrib,'values',values)
call codes_get(igrib,'min',min_val) ! can also be ::obtained through latitudeOfFirstPointInDegreesminval(values)
real call codes_get(igrib,'max',max_val) ! can also be obtained through maxval(values)
call codes_get(igrib,'average',average) ! can also be obtained through maxval(values)
deallocate(values)
:: longitudeOfFirstPointInDegrees
realwrite(*,*)'There are ',numberOfValues, &
' average is ',average, &
' min is ', min_val, &
:: latitudeOfLastPointInDegrees
real ' max is ', max_val
call codes_release(igrib)
call codes_grib_new_from_file(ifile,igrib, iret)
end do LOOP
call codes_close_file(ifile)
end program grib_get_keys
|
|
Tabs Page |
---|
|
Code Block |
---|
language | python |
---|
title | grib_get_keys.py |
---|
linenumbers | false |
---|
| # (C) ::Copyright longitudeOfLastPointInDegrees
integer :: numberOfPointsAlongAParallel
integer :: numberOfPointsAlongAMeridian
real, dimension(:), allocatable :: values
integer 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.
import traceback
import sys
from eccodes import *
INPUT = '../../data/reduced_latlon_surface.grib1'
VERBOSE = 1 # verbose error reporting
def example():
f = open(INPUT, 'rb')
keys = [
'Ni',
'Nj',
:: numberOfValues'latitudeOfFirstGridPointInDegrees',
real 'longitudeOfFirstGridPointInDegrees',
'latitudeOfLastGridPointInDegrees',
'longitudeOfLastGridPointInDegrees',
]
while :: average,min_val, max_val1:
integer gid = codes_grib_new_from_file(f)
if gid is None:
:: is_missing, is_defined
break
call codes_open_file(ifile, &
for key '../../data/reduced_latlon_surface.grib1','r')in keys:
! Loop on all the messages in a file.
try:
! aprint(' new grib%s: message%s' is% loaded from file(key, codes_get(gid, key)))
! igrib is the grib id toexcept beKeyValueNotFoundError usedas inerr:
subsequent calls
call codes_grib_new_from_file(ifile,igrib, iret)
LOOP: DO WHILE (iret /= CODES_END_OF_FILE)
!check if the value of the key is MISSING
# Full list of exceptions here:
is_missing=0;
# call codes_is_missing(igrib,'Ni',is_missing);https://confluence.ecmwf.int/display/ECC/Python+exception+classes
if ( is_missing /= 1 ) then
print(' Key="%s" was !not found: %s' % get as a integer
(key, err.msg))
call codes_get(igrib,'Ni',numberOfPointsAlongAParallel) except CodesInternalError as err:
write(*,*) 'numberOfPointsAlongAParallel=', &
print('Error with key="%s" : %s' % numberOfPointsAlongAParallel(key, err.msg))
else
print('There are %d values, average is write(*%f,*) 'numberOfPointsAlongAParallelmin is missing'
%f, max is %f' endif % (
!check for existence of keys
codes_get_size(gid, 'values'),
is_defined=0;
call codes_is_definedget(igribgid, 'editionaverage'),is_defined);
if ( is_defined == 0 ) then
codes_get(gid, 'min'),
writecodes_get(0gid,*) 'ERROR: An expected key was not defined!!'
max')
))
call exitcodes_release(1gid)
endif
f.close()
def main():
call codes_is_defined(igrib,'ThisIsNoLoveSong',is_defined);try:
if ( is_defined == 1 ) then
example()
except CodesInternalError as err:
write(0,*) 'ERROR: An unexpectedif keyVERBOSE:
was defined!!'
call exit(1 traceback.print_exc(file=sys.stderr)
endif
else:
! get as a integer
call codes_get(igrib,'Nj',numberOfPointsAlongAMeridian) sys.stderr.write(err.msg + '\n')
write(*,*) 'numberOfPointsAlongAMeridian=', &
return numberOfPointsAlongAMeridian
! get as a real
call codes_get(igrib, 'latitudeOfFirstGridPointInDegrees', &
latitudeOfFirstPointInDegrees)
write(*,*) 'latitudeOfFirstGridPointInDegrees=', &
latitudeOfFirstPointInDegrees
! get as a real
call codes_get(igrib, 'longitudeOfFirstGridPointInDegrees', &
longitudeOfFirstPointInDegrees)
write(*,*) 'longitudeOfFirstGridPointInDegrees=', &
longitudeOfFirstPointInDegrees
! get as a real
call codes_get(igrib, 'latitudeOfLastGridPointInDegrees', &
latitudeOfLastPointInDegrees)
write(*,*) 'latitudeOfLastGridPointInDegrees=', &
latitudeOfLastPointInDegrees
! get as a real
call codes_get(igrib, 'longitudeOfLastGridPointInDegrees', &
longitudeOfLastPointInDegrees)
write(*,*) 'longitudeOfLastGridPointInDegrees=', &
longitudeOfLastPointInDegrees
! get the size of the values array
call codes_get_size(igrib,'values',numberOfValues)
write(*,*) 'numberOfValues=',numberOfValues
allocate(values(numberOfValues), stat=iret)
! get data values
call codes_get(igrib,'values',values)
call codes_get(igrib,'min',min_val) ! can also be obtained through minval(values)
call codes_get(igrib,'max',max_val) ! can also be obtained through maxval(values)
call codes_get(igrib,'average',average) ! can also be obtained through maxval(values)
deallocate(values)
write(*,*)'There are ',numberOfValues, &
' average is ',average, &
' min is ', min_val, &
' max is ', max_val
call codes_release(igrib)
call codes_grib_new_from_file(ifile,igrib, iret)
end do LOOP
call codes_close_file(ifile)
end program grib_get_keys
1
if __name__ == "__main__":
sys.exit(main())
|
|
Tabs Page |
---|
|
Code Block |
---|
language | cpp |
---|
title | grib_get_keys.c |
---|
linenumbers | false |
---|
| /*
* (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: grib_get_keys
*
* Description: how to get values using keys from GRIB messages
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "eccodes.h"
int main(int argc, char** argv)
{
int err = 0;
double *values = NULL;
size_t values_len= 0;
size_t i = 0, len = 0;
double latitudeOfFirstGridPointInDegrees;
double longitudeOfFirstGridPointInDegrees;
double latitudeOfLastGridPointInDegrees;
double longitudeOfLastGridPointInDegrees;
double jDirectionIncrementInDegrees;
double iDirectionIncrementInDegrees;
long numberOfPointsAlongAParallel;
long numberOfPointsAlongAMeridian;
double average = 0;
char* packingType = NULL;
FILE* in = NULL;
const char* filename = "../../data/regular_latlon_surface.grib1";
codes_handle *h = NULL;
in = fopen(filename,"r");
if(!in) {
printf("ERROR: unable to open file %s\n",filename);
return 1;
}
/* create new handle from the first message in the file*/
h = codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err);
if (h == NULL) {
printf("Error: unable to create handle from file %s\n",filename);
return 1;
}
fclose(in);
/* Store the filename in the key "file" for this handle */
len = strlen(filename);
CODES_CHECK(codes_set_string(h, "file", filename, &len), 0);
/* get as a long*/
CODES_CHECK(codes_get_long(h,"Ni",&numberOfPointsAlongAParallel),0);
printf("numberOfPointsAlongAParallel=%ld\n",numberOfPointsAlongAParallel);
/* get as a long*/
CODES_CHECK(codes_get_long(h,"Nj",&numberOfPointsAlongAMeridian),0);
printf("numberOfPointsAlongAMeridian=%ld\n",numberOfPointsAlongAMeridian);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"latitudeOfFirstGridPointInDegrees",&latitudeOfFirstGridPointInDegrees),0);
printf("latitudeOfFirstGridPointInDegrees=%g\n",latitudeOfFirstGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"longitudeOfFirstGridPointInDegrees",&longitudeOfFirstGridPointInDegrees),0);
printf("longitudeOfFirstGridPointInDegrees=%g\n",longitudeOfFirstGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"latitudeOfLastGridPointInDegrees",&latitudeOfLastGridPointInDegrees),0);
printf("latitudeOfLastGridPointInDegrees=%g\n",latitudeOfLastGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"longitudeOfLastGridPointInDegrees",&longitudeOfLastGridPointInDegrees),0);
printf("longitudeOfLastGridPointInDegrees=%g\n",longitudeOfLastGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"jDirectionIncrementInDegrees",&jDirectionIncrementInDegrees),0);
printf("jDirectionIncrementInDegrees=%g\n",jDirectionIncrementInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"iDirectionIncrementInDegrees",&iDirectionIncrementInDegrees),0);
printf("iDirectionIncrementInDegrees=%g\n",iDirectionIncrementInDegrees);
/* get as string */
CODES_CHECK(codes_get_length(h, "packingType", &len), 0);
packingType = (char*)malloc(len*sizeof(char));
codes_get_string(h, "packingType", packingType, &len);
printf("packingType=%s\n", packingType);
free(packingType);
/* get the size of the values array*/
CODES_CHECK(codes_get_size(h,"values",&values_len),0);
values = (double*)malloc(values_len*sizeof(double));
/* get data values*/
CODES_CHECK(codes_get_double_array(h,"values",values,&values_len),0);
average = 0;
for(i = 0; i < values_len; i++ |
| Tabs Page |
---|
| Code Block |
---|
language | python |
---|
title | grib_get_keys.py |
---|
linenumbers | false |
---|
| # Copyright 2005-2015 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.
import traceback
import sys
from eccodes import *
INPUT='../../data/reduced_latlon_surface.grib1'
VERBOSE=1 # verbose error reporting
def example():
f = open(INPUT)
keys = [
'Ni',
'Nj',
'latitudeOfFirstGridPointInDegrees',
'longitudeOfFirstGridPointInDegrees',
'latitudeOfLastGridPointInDegrees',
'longitudeOfLastGridPointInDegrees',
]
while 1:
gid = codes_grib_new_from_file(f)
if gid is None: break
for key in keys:
if not codes_is_defined(gid,key): raise Exception("Key was not defined")
average += values[i];
print '%s=%s' %average (key,codes_get(gid,key))
if codes_is_defined(gid,"A_very_silly_girl"): raise Exception("Key was defined")/=(double)values_len;
free(values);
printf("There are %d values, average is %g\n",(int)values_len,average);
{
int eq = 0;
print 'There are %d values, average is %f, min is %f, max is %f' % (/* Now retrieve the value of the key "file" */
char file[256]={0,};
CODES_CHECK(codes_get_size(gid,'values'),length(h, "file", &len),0);
assert(len == 1+strlen(filename));
codes_get_string(gid,'average'),
h, "file", file, &len);
eq codes_get(gid,'min'),= strcmp(file, filename);
if (eq != 0) assert(!"file and filename codes_get(gid,'max')not equal");
}
{
)
/* Example of getting bytes */
codes_release(gid)
f.close()
def main():
try: const char* name = "reservedNeedNotBePresent";
example()
except CodesInternalError,err:
unsigned char* byte_val = NULL ;
size_t keySize if= VERBOSE:0;
CODES_CHECK(codes_get_size(h, name, traceback.print_exc(file=sys.stderr)&keySize), 0);
else:
byte_val = (unsigned char*)malloc(keySize*sizeof(char));
print >>sys.stderr,err.msg
GRIB_CHECK(codes_get_bytes(h, name, byte_val, &keySize), name);
return 1}
if __name__ == "codes__main__":handle_delete(h);
sys.exit(main())return 0;
}
|
|
|