Tabs Page |
---|
|
Code Block |
---|
language | none |
---|
title | grib_get_keys.f90 |
---|
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.
!
!
! Description: how to get values using keys from GRIB messages
!
!
program grib_get_keys
use eccodes
implicit none
integer :: ifile
integer :: iret
integer :: igrib
real :: latitudeOfFirstPointInDegrees
real :: longitudeOfFirstPointInDegrees
real :: latitudeOfLastPointInDegrees
real :: longitudeOfLastPointInDegrees
integer :: numberOfPointsAlongAParallel
integer :: numberOfPointsAlongAMeridian
real, dimension(:), allocatable :: values
integer :: numberOfValues
real :: average,min_val, max_val
integer :: is_missing
character(len=10) :: open_mode='r'
call codes_open_file(ifile, &
'../../data/reduced_latlon_surface.grib1','r' open_mode)
! Loop on all the messages in a file.
! A a new gribGRIB 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)
! For debugging
call grib_dump(igrib)
!check if 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
! Key value is not missing so get as aan integer
call codes_get(igrib,'Ni',numberOfPointsAlongAParallel)
write(*,*) 'numberOfPointsAlongAParallel=', &
numberOfPointsAlongAParallel
else
write(*,*) 'numberOfPointsAlongAParallel is missing'
endif
! getGet as aan integer
call codes_get(igrib,'Nj',numberOfPointsAlongAMeridian)
write(*,*) 'numberOfPointsAlongAMeridian=', &
numberOfPointsAlongAMeridian
! Get get as a real
call codes_get(igrib, 'latitudeOfFirstGridPointInDegrees', &
latitudeOfFirstPointInDegrees)
write(*,*) 'latitudeOfFirstGridPointInDegrees=', &
latitudeOfFirstPointInDegrees
! Get get as a real
call codes_get(igrib, 'longitudeOfFirstGridPointInDegrees', &
longitudeOfFirstPointInDegrees)
write(*,*) 'longitudeOfFirstGridPointInDegrees=', &
longitudeOfFirstPointInDegrees
! getGet as a real
call codes_get(igrib, 'latitudeOfLastGridPointInDegrees', &
latitudeOfLastPointInDegrees)
write(*,*) 'latitudeOfLastGridPointInDegrees=', &
latitudeOfLastPointInDegrees
! Get get as a real
call codes_get(igrib, 'longitudeOfLastGridPointInDegrees', &
longitudeOfLastPointInDegrees)
write(*,*) 'longitudeOfLastGridPointInDegrees=', &
longitudeOfLastPointInDegrees
! Get get the size of the values array
call codes_get_size(igrib,'values',numberOfValues)
write(*,*) 'numberOfValues=',numberOfValues
allocate(values(numberOfValues), stat=iret)
! Get 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
|
|
Tabs Page |
---|
|
Code Block |
---|
language | python |
---|
title | grib_get_keys.py |
---|
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.
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',
'latitudeOfFirstGridPointInDegrees',
'longitudeOfFirstGridPointInDegrees',
'latitudeOfLastGridPointInDegrees',
'longitudeOfLastGridPointInDegrees',
]
while 1:
gid = codes_grib_new_from_file(f)
if gid is None:
break
for key in keys:
try:
print (' %s: %s' % (key, codes_get(gid, key)))
except KeyValueNotFoundError CodesInternalError,as err:
print# 'ErrorFull with key="%s" : %s' % (key, err.msg)
list of exceptions here:
print 'There are %d# values, average is %f, min is %f, max is %f' % (
https://confluence.ecmwf.int/display/ECC/Python+exception+classes
print(' Key="%s" was codes_get_size(gid, 'values'),not found: %s' % (key, err.msg))
codes_get(gid, 'average'),
except CodesInternalError as err:
codes_get(gid, 'min'),
print('Error with key="%s" : %s' % codes_get(gid, 'max')
(key, err.msg))
)
codes_release(gid)
f.close()
def main():print('There are %d values, average is %f, min is %f, max is %f' % (
try:
example()codes_get_size(gid, 'values'),
except CodesInternalError, err:
if VERBOSE:codes_get(gid, 'average'),
traceback.printcodes_exc(file=sys.stderr)get(gid, 'min'),
else: codes_get(gid, 'max')
))
print >>sys.stderr, err.msg codes_release(gid)
f.close()
def main():
return 1try:
if __name__ == "__main__":
sys.exitexample(main())
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 | 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 |
| Tabs Page |
---|
| Code Block |
---|
language | cpp |
---|
title | grib_get_keys.c |
---|
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.
*/
/*
* 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 (h == NULL) {
printf("ERRORError: unable to opencreate handle from file %s\n",filename);
return 1;
}
fclose(in);
/* createStore newthe handlefilename fromin the first message in the filekey "file" for this handle */
hlen = strlen(filename);
CODES_CHECK(codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err);set_string(h, "file", filename, &len), 0);
if/* (hget ==as NULL) {a long*/
CODES_CHECK(codes_get_long(h,"Ni",&numberOfPointsAlongAParallel),0);
printf("Error: unable to create handle from file %snumberOfPointsAlongAParallel=%ld\n",filenamenumberOfPointsAlongAParallel);
/* get as return 1;a long*/
}CODES_CHECK(codes_get_long(h,"Nj",&numberOfPointsAlongAMeridian),0);
fclose(in printf("numberOfPointsAlongAMeridian=%ld\n",numberOfPointsAlongAMeridian);
/* get Storeas the filename in the key "file" for this handle */
len = strlen(filename);a double*/
CODES_CHECK(codes_get_double(h,"latitudeOfFirstGridPointInDegrees",&latitudeOfFirstGridPointInDegrees),0);
printf("latitudeOfFirstGridPointInDegrees=%g\n",latitudeOfFirstGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_setget_stringdouble(h, "filelongitudeOfFirstGridPointInDegrees", filename, &lenlongitudeOfFirstGridPointInDegrees), 00);
printf("longitudeOfFirstGridPointInDegrees=%g\n",longitudeOfFirstGridPointInDegrees);
/* get as a longdouble*/
CODES_CHECK(codes_get_longdouble(h,"NilatitudeOfLastGridPointInDegrees",&numberOfPointsAlongAParallellatitudeOfLastGridPointInDegrees),0);
printf("numberOfPointsAlongAParallellatitudeOfLastGridPointInDegrees=%ld%g\n",numberOfPointsAlongAParallellatitudeOfLastGridPointInDegrees);
/* get as a longdouble*/
CODES_CHECK(codes_get_longdouble(h,"NjlongitudeOfLastGridPointInDegrees",&numberOfPointsAlongAMeridianlongitudeOfLastGridPointInDegrees),0);
printf("numberOfPointsAlongAMeridianlongitudeOfLastGridPointInDegrees=%ld%g\n",numberOfPointsAlongAMeridianlongitudeOfLastGridPointInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"latitudeOfFirstGridPointInDegreesjDirectionIncrementInDegrees",&latitudeOfFirstGridPointInDegreesjDirectionIncrementInDegrees),0);
printf("latitudeOfFirstGridPointInDegreesjDirectionIncrementInDegrees=%g\n",latitudeOfFirstGridPointInDegreesjDirectionIncrementInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"longitudeOfFirstGridPointInDegreesiDirectionIncrementInDegrees",&longitudeOfFirstGridPointInDegreesiDirectionIncrementInDegrees),0);
printf("longitudeOfFirstGridPointInDegreesiDirectionIncrementInDegrees=%g\n",longitudeOfFirstGridPointInDegreesiDirectionIncrementInDegrees);
/* get as astring double*/
CODES_CHECK((codes_get_length(h, "packingType", &len), 0);
packingType = (char*)malloc(len*sizeof(char));
codes_get_doublestring(h, "latitudeOfLastGridPointInDegreespackingType", packingType, &latitudeOfLastGridPointInDegreeslen),0);
printf("latitudeOfLastGridPointInDegreespackingType=%g%s\n",latitudeOfLastGridPointInDegrees packingType);
free(packingType);
/* get as a double the size of the values array*/
CODES_CHECK(codes_get_doublesize(h,"longitudeOfLastGridPointInDegreesvalues",&longitudeOfLastGridPointInDegreesvalues_len),0);
printf("longitudeOfLastGridPointInDegrees=%g\n",longitudeOfLastGridPointInDegreesvalues = (double*)malloc(values_len*sizeof(double));
/* get asdata a doublevalues*/
CODES_CHECK(codes_get_double_array(h,"jDirectionIncrementInDegreesvalues",values,&jDirectionIncrementInDegreesvalues_len),0);
average = 0;
printffor("jDirectionIncrementInDegrees=%g\n",jDirectionIncrementInDegrees);
/* get as a double*/
CODES_CHECK(codes_get_double(h,"iDirectionIncrementInDegrees",&iDirectionIncrementInDegrees),0);
printf("iDirectionIncrementInDegrees=%g\n",iDirectionIncrementInDegrees)i = 0; i < values_len; i++)
average += values[i];
average /=(double)values_len;
/* get as string */free(values);
CODES_CHECK(codes_get_length(h, "packingType", &len), 0);printf("There are %d values, average is %g\n",(int)values_len,average);
packingType = (char*)malloc(len*sizeof(char));{
codes_get_string(h, "packingType", packingType, &len);
int eq printf("packingType=%s\n", packingType) 0;
free(packingType);
/* Now getretrieve the sizevalue of the values array*/
CODES_CHECK(codes_get_size(h,"values",&values_len),0);
key "file" */
values = (double*)malloc(values_len*sizeof(double));
char /* get data values*/
file[256]={0,};
CODES_CHECK(codes_get_double_arraylength(h, "valuesfile",values, &values_len),0);
average = 00);
for(i = 0; i < values_len; i++)assert(len == 1+strlen(filename));
average += values[i];
codes_get_string(h, "file", file, &len);
averageeq /=(double)values_len strcmp(file, filename);
free(values);
if printf("There are %d values, average is %g\n",(int)values_len,average);
(eq != 0) assert(!"file and filename not equal");
{}
int eq = 0;{
/* Now retrieve the valueExample of the key "file"getting bytes */
const char file[256]={0,}* name = "reservedNeedNotBePresent";
CODES_CHECK(codes_get_length(h, "file", &len),0)unsigned char* byte_val = NULL ;
assert(len == 1+strlen(filename))size_t keySize = 0;
CODES_CHECK(codes_get_stringsize(h, "file"name, file&keySize), &len0);
eqbyte_val = strcmp(file, filenameunsigned char*)malloc(keySize*sizeof(char));
assert( eq == 0 GRIB_CHECK(codes_get_bytes(h, name, byte_val, &keySize), name);
}
codes_handle_delete(h);
return 0;
}
|
|
|