Added tools for bufr metar taf etc

This commit is contained in:
Shahram Najm 2014-07-06 14:18:40 +01:00
parent 9e197aa84e
commit a47a8ba7f4
19 changed files with 4207 additions and 1 deletions

View File

@ -11,13 +11,18 @@ noinst_LTLIBRARIES = libgrib_tools.la
libgrib_tools_la_SOURCES = grib_tools.c \
grib_options.c
bin_SCRIPTS = bufr_compare_dir
bin_PROGRAMS = grib_keys grib_histogram grib_error grib_add big2gribex \
grib_debug grib_info grib_filter grib_ls grib_dump \
grib2ppm grib_set grib_get grib_get_data grib_copy grib_repair \
grib_packing grib_cmp grib_convert grib_distance grib_corruption_check\
grib_compare grib_list_keys parser grib_count grib_index_build grib1to2 \
gg_sub_area_check grib_moments grib_to_netcdf grib_to_json
gg_sub_area_check grib_moments grib_to_netcdf grib_to_json \
bufr_filter bufr_ls bufr_dump bufr_set bufr_get \
bufr_copy bufr_compare bufr_index_build \
taf_dump taf_ls taf_get taf_filter \
metar_dump metar_ls metar_get metar_filter
noinst_PROGRAMS = gaussian grib_diff mars_request xref all_keys #compile #dumpload grib_compare_old
@ -63,6 +68,25 @@ gaussian_SOURCES = gaussian.c
gg_sub_area_check_SOURCES = gg_sub_area_check.c
grib1to2_SOURCES = grib1to2.txt
bufr_filter_SOURCES = bufr_filter.c
bufr_ls_SOURCES = bufr_ls.c
bufr_dump_SOURCES = bufr_dump.c
bufr_set_SOURCES = bufr_set.c
bufr_get_SOURCES = bufr_get.c
bufr_copy_SOURCES = bufr_copy.c
bufr_compare_SOURCES = bufr_compare.c
bufr_index_build_SOURCES = bufr_index_build.c
metar_dump_SOURCES = metar_dump.c
metar_ls_SOURCES = metar_ls.c
metar_get_SOURCES = metar_get.c
metar_filter_SOURCES = metar_filter.c
taf_dump_SOURCES = taf_dump.c
taf_ls_SOURCES = taf_ls.c
taf_get_SOURCES = taf_get.c
taf_filter_SOURCES = taf_filter.c
INCLUDES = -I$(top_builddir)/src
LDADD = libgrib_tools.la $(top_builddir)/src/libgrib_api.la

97
tools/bufr_3to4.c Normal file
View File

@ -0,0 +1,97 @@
/*
* Copyright 2005-2014 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.
*/
#include "ecCodes_internal.h"
void usage(char* prog) {
printf("usage: %s infile outfile \n",prog);
exit(1);
}
int main(int argc,char* argv[]) {
FILE* infh;
FILE* outfh;
char* filename;
char* ofilename;
void* mesg=NULL;
void* mesgo=NULL;
size_t size=0;
size_t osize=0;
off_t offset=0;
int write;
int err=0;
int error=0;
int count=0;
int edition=0;
grib_context* c=grib_context_get_default();
if (argc !=3) usage(argv[0]);
n=0;
filename=argv[1];
infh=fopen(filename,"r");
if (!infh) {
perror(filename);
exit(1);
}
ofilename=argv[1];
outfh=fopen(ofilename,"w");
if (!outfh) {
perror(ofilename);
exit(1);
}
count=0;
while ( (mesg=wmo_read_bufr_from_file_malloc ( infh,0, &size,&offset,&err))!=NULL ) {
if (err && err!=GRIB_END_OF_FILE) {
grib_context_log(c,GRIB_LOG_ERROR,
"unable to decode message: %s \n",grib_get_error_message(err));
error=err;
}
edition=mesg[7];
write=1;
switch (edition ) {
case 3:
omesg=grib_context_malloc_clear(c,size+4);
memcpy(omesg,mesg,7);
omesg[7]=4;
osize=8;
break;
case 4:
omesg=mesg;
break;
default :
error=1;
write=0;
grib_context_log(c,GRIB_LOG_ERROR,
"wrong edition %d, skipping message",edition);
}
if (write) {
if(fwrite(omesg,1,osize,outfh) != osize) {
perror(ofilename);
exit(1);
}
}
if (mesg) {grib_context_free(c,mesg);mesg=NULL;}
if (omesg) {grib_context_free(c,omesg);omesg=NULL;}
count++;
}
fclose(infh);
fclose(outfh);
return error;
}

1136
tools/bufr_compare.c Normal file

File diff suppressed because it is too large Load Diff

30
tools/bufr_compare_dir Executable file
View File

@ -0,0 +1,30 @@
#!/bin/ksh
keys="md5Structure,md5Data,typicalDate,typicalTime,rdbType,rdbSubtype,ident,satelliteID,localLatitude,localLongitude,localLatitude1,localLongitude1,localLatitude2,localLongitude2"
opt=""
if [[ $# -eq 3 ]]
then
opt=$1
dir1=$2
dir2=$3
fi
if [[ $# -eq 2 ]]
then
dir1=$1
dir2=$2
fi
if [[ $# -gt 3 ]] || [[ $# -lt 2 ]]
then
echo usage: [bufr_compare options] bufr_compare_dir directory1 directory2
exit 1
fi
bufr_index_build -k $keys -o 1.idx $dir1/* > /dev/null
bufr_index_build -k $keys -o 2.idx $dir2/* > /dev/null
bufr_compare -f $opt 1.idx 2.idx
rm -f 1.idx 2.idx

117
tools/bufr_copy.c Normal file
View File

@ -0,0 +1,117 @@
/*
* Copyright 2005-2014 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_copy
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
char* grib_tool_description="Copies the content of grib files printing"
" values of some keys.";
char* grib_tool_name="bufr_copy";
char* grib_tool_usage="[options] file file ... output_file";
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value */
{"f",0,0,0,1,0},
{"c",0,0,1,0,0},
{"r",0,0,0,1,0},
{"q",0,0,1,0,0},
{"p:",0,0,1,1,0},
{"s:",0,0,0,1,0},
{"P:",0,0,0,1,0},
{"w:","key[:{s/d/l}]=value,key[:{s/d/l}]=value,...","\n\t\tWhere clause."
"\n\t\tOnly grib messages matching the key/value constraints are "
"copied to the\n\t\toutput_grib_file.\n\t\tFor each key a string (key:s) or a "
"double (key:d) or a long (key:l)\n\t\ttype can be defined. Default type "
"is string.\n",0,1,0},
{"B:",0,0,0,1,0},
{"V",0,0,0,1,0},
{"W:",0,0,0,1,0},
{"M",0,0,0,1,0},
{"U",0,0,1,0,0},
{"H",0,0,1,0,0},
{"T:",0,0,1,0,"B"},
{"S",0,0,1,0,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"7",0,0,0,1,0},
{"v",0,0,0,1,0}
};
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
int main(int argc, char *argv[]) {
int ret=grib_tool(argc,argv);
return ret;
}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
#if 0
if (options->outfile && options->outfile->name) {
options->outfile->file = fopen(options->outfile->name,"w");
if(!options->outfile->file) {
perror(options->outfile->name);
exit(1);
}
}
#endif
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
int err=0;
if (!options->skip) {
if (options->set_values_count != 0)
err=grib_set_values(h,options->set_values,options->set_values_count);
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
grib_tools_write_message(options,h);
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
/*
if (options->outfile->file) {
fclose(options->outfile->file);
}
*/
return 0;
}

170
tools/bufr_dump.c Normal file
View File

@ -0,0 +1,170 @@
/*
* Copyright 2005-2014 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_dump
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"j",0,0,0,1,0},
{"S",0,0,1,0,0},
{"O",0,"Octet mode. WMO documentation style dump.\n",0,1,0},
{"D",0,0,0,1,0},
{"d",0,"Print all data values.\n",1,1,0},
{"u",0,"Print only some values.\n",0,1,0},
{"C",0,0,0,1,0},
{"t",0,0,0,1,0},
{"H",0,0,0,1,0},
{"a",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"M",0,0,0,1,0},
{"T:",0,0,1,0,"B"},
{"7",0,0,0,1,0},
{"V",0,0,0,1,0},
{"q",0,0,1,0,0},
{"x",0,0,0,1,0}
};
char* grib_tool_description="Dump the content of a grib file in different formats.";
char* grib_tool_name="bufr_dump";
char* grib_tool_usage="[options] file file ...";
static int json=0;
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
/**
*grib_dump
*Dump the content of a grib file
*
*/
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
int opt=grib_options_on("C")+grib_options_on("O")+grib_options_on("D");
options->dump_mode = "default";
if (opt > 1) {
printf("%s: simultaneous j/C/O/D options not allowed\n",grib_tool_name);
exit(1);
}
if (grib_options_on("j")) {
options->dump_mode = "json";
json=1;
}
if (grib_options_on("C")) {
options->dump_mode = "c_code";
if (grib_options_on("d"))
options->dump_flags = 0;
else
options->dump_flags = GRIB_DUMP_FLAG_NO_DATA;
}
if (grib_options_on("O")) {
options->dump_mode = "wmo";
options->dump_flags = GRIB_DUMP_FLAG_CODED
| GRIB_DUMP_FLAG_OCTECT
| GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("D")) {
options->dump_mode = "debug";
options->dump_flags = GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("a"))
options->dump_flags |= GRIB_DUMP_FLAG_ALIASES;
if (grib_options_on("t"))
options->dump_flags |= GRIB_DUMP_FLAG_TYPE;
if (grib_options_on("H"))
options->dump_flags |= GRIB_DUMP_FLAG_HEXADECIMAL;
if (grib_options_on("d") && !grib_options_on("u"))
options->dump_flags |= GRIB_DUMP_FLAG_ALL_DATA;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
char tmp[1024];
if (!options->current_infile->name) return 0;
if (json) return 0;
sprintf(tmp,"FILE: %s ",options->current_infile->name);
if (!grib_options_on("C"))
fprintf(stdout,"***** %s\n",tmp);
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
long length=0;
char tmp[1024];
char identifier[100];
size_t idlen=100;
int i;
if (grib_get_long(h,"totalLength",&length) != GRIB_SUCCESS)
length=-9999;
for (i=0;i<options->print_keys_count;i++)
grib_set_flag(h,options->print_keys[i].name,GRIB_ACCESSOR_FLAG_DUMP);
if (json) {
} else {
sprintf(tmp,"MESSAGE %d ( length=%ld )",options->handle_count,length);
if (!grib_options_on("C"))
fprintf(stdout,"#============== %-38s ==============\n",tmp);
if (!strcmp(options->dump_mode,"default")) {
GRIB_CHECK_NOLINE(grib_get_string(h,"identifier",identifier,&idlen),0);
printf("%s {\n",identifier);
}
}
grib_dump_content(h,stdout,options->dump_mode,options->dump_flags,0);
if (!strcmp(options->dump_mode,"default"))
printf("}\n");
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
return 0;
}

102
tools/bufr_filter.c Normal file
View File

@ -0,0 +1,102 @@
/*
* Copyright 2005-2014 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_filter
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value */
{"f",0,0,0,1,0},
{"f",0,0,1,0,0},
{"F",0,0,1,0,0},
{"o:",0,0,1,1,"filter.out"},
{"q",0,0,1,0,0},
{"M",0,0,0,1,0},
{"I",0,0,1,0,0},
{"V",0,0,0,1,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"T:",0,0,1,0,"B"},
{"7",0,0,0,1,0},
{"v",0,0,0,1,0}
};
char* grib_tool_description="Apply the rules defined in rules_file to each grib "
"message\n\tin the grib files provided as arguments.";
char* grib_tool_name="bufr_filter";
char* grib_tool_usage="[options] rules_file "
"file file ...";
int fail=0;
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
options->action = grib_action_from_filter(options->infile_extra->name);
if (!options->action) {
fprintf(stderr,"%s: error unable to create action\n",options->infile_extra->name);
exit(1);
}
if ( options->outfile && options->outfile->name )
options->action->context->outfilename=options->outfile->name;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
int err=0;
if (options->current_infile->name) {
size_t len=strlen(options->current_infile->name);
grib_set_string(h,"file",options->current_infile->name,&len);
}
err=grib_handle_apply_action(h,options->action);
if (err != GRIB_SUCCESS && options->fail && err!=GRIB_NOT_FOUND) {
printf("ERROR: %s\n",grib_get_error_message(err));
exit(err);
}
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
grib_file_pool_clean();
return 0;
}

212
tools/bufr_get.c Normal file
View File

@ -0,0 +1,212 @@
/*
* Copyright 2005-2014 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
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"f",0,0,0,1,0},
{"p:",0,0,0,1,0},
{"F:",0,0,1,1,"%g"},
{"l:",0,0,0,1,0},
{"P:",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"n:",0,0,1,1,0},
{"s:",0,0,0,1,0},
{"V",0,0,0,1,0},
{"W:",0,0,1,1,"8"},
{"m",0,0,0,1,0},
{"M",0,0,0,1,0},
{"S",0,0,1,0,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"T:",0,0,1,0,"B"},
{"7",0,0,0,1,0},
{"v",0,0,1,0,0},
{"i:",0,0,0,1,0}
};
char* grib_tool_description="Get values of some keys from a grib file."
"\n\tIt is similar to grib_ls, but fails returning an error code "
"\n\twhen an error occurs (e.g. key not found).";
char* grib_tool_name="bufr_get";
char* grib_tool_usage="[options] file file ...";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
double lat=0;
double lon=0;
int mode=0;
grib_nearest* n=NULL;
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
options->print_keys_count=-1;
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
char *end = NULL, *end1=NULL;
size_t size=4;
int ret=0;
double min=0,max=0;
int i=0,idx=0;
char* p=NULL;
options->print_header=0;
options->print_statistics=0;
options->default_print_width=-1;
if (options->latlon) {
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
lon= strtod(++end,&end1);
mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID;
if (end1 && *end1 == ',') {
end1++;
if (*end1 != '0') {
p=end1;
while (*p != ',' && *p !='\0') p++;
if (*end1 == '4') {
options->latlon_mode=4;
} else if (*end1 == '1') {
options->latlon_mode=1;
} else {
printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name);
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
}
}
if (options->latlon && options->latlon_mask) {
FILE* f=NULL;
grib_handle* hh;
f=fopen(options->latlon_mask,"r");
if(!f) {
perror(options->latlon_mask);
exit(1);
}
hh=grib_handle_new_from_file(0,f,&ret);
fclose(f);
GRIB_CHECK_NOLINE(ret,0);
n=grib_nearest_new(hh,&ret);
GRIB_CHECK_NOLINE(ret,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode,
options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0);
grib_nearest_delete(n);
n=NULL;
grib_handle_delete( hh);
options->latlon_idx=-1;
max=options->distances[0];
for (i=0;i<4;i++)
if (max<options->distances[i]) {max=options->distances[i];idx=i;}
min=max;
for (i=0;i<4;i++) {
if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) {
options->latlon_idx=i;
min = options->distances[i];
}
}
if (options->latlon_idx<0){
min=0;
options->latlon_idx=0;
for (i=1;i<4;i++)
if (min>options->distances[i]) {
min = options->distances[i];
options->latlon_idx=i;
}
}
}
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options,grib_handle* h) {
size_t size=4;
int err = 0;
if (!options->skip) {
if (options->set_values_count != 0) {
err=grib_set_values(h,options->set_values,options->set_values_count);
}
if (err != GRIB_SUCCESS && options->fail) exit(err);
}
if (options->latlon) {
int err=0;
double min;
int i;
if (!n) n=grib_nearest_new(h,&err);
GRIB_CHECK_NOLINE(err,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,mode,
options->lats,options->lons,options->values,
options->distances,options->indexes,&size),0);
min=options->distances[0];
options->latlon_idx=0;
i=0;
for (i=1;i<4;i++) {
if (min>options->distances[i]) {
min=options->distances[i];
options->latlon_idx=i;
}
}
}
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
if (n) grib_nearest_delete(n);
return 0;
}

140
tools/bufr_index_build.c Normal file
View File

@ -0,0 +1,140 @@
/*
* Copyright 2005-2014 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_copy
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
char* grib_tool_description="Build an index file for a set of input grib files.";
char* grib_tool_name="bufr_index_build";
char* grib_tool_usage="[options] file file ... ";
grib_index* idx=NULL;
char* keys;
char* default_keys = "mars";
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value */
{"f",0,0,0,1,0},
{"o:",0,0,1,1,"gribidx"},
{"k:",0,0,0,1,0},
{"V",0,0,0,1,0},
{"T:",0,0,1,0,"B"},
{"M",0,0,0,1,0},
{"N",0,0,0,1,0}
};
int compress_index;
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
int main(int argc, char *argv[]) {
int ret=grib_tool(argc,argv);
return ret;
}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
int ret=0;
grib_context* c=grib_context_get_default();
if (grib_options_on("N")) compress_index=0;
else compress_index=1;
if (grib_options_on("k:"))
keys=grib_options_get_option("k:");
else
keys=default_keys;
options->onlyfiles=1;
idx=grib_index_new(c,keys,&ret);
if (!idx || ret)
grib_context_log(c,GRIB_LOG_FATAL,
"Unable to create index %s",grib_get_error_message(ret));
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
int ret=0;
printf("--- %s: processing %s\n",grib_tool_name,file);
ret=codes_index_add_file(idx,file,CODES_BUFR);
if (ret) {printf("error: %s\n",grib_get_error_message(ret)); exit(ret);}
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
}
int grib_tool_finalise_action(grib_runtime_options* options) {
grib_index_key* keys;
grib_string_list* values;
int first;
if (compress_index) {
grib_index_compress(idx);
}
printf("--- %s: keys included in the index file %s:\n",
grib_tool_name,options->outfile->name);
printf("--- ");
first=1;
keys=idx->keys;
while (keys) {
if (!first) printf(", ");
printf("%s",keys->name);
keys=keys->next;
first=0;
}
printf("\n");
keys=idx->keys;
while (keys) {
printf("--- %s = { ",keys->name);
values=keys->values;
first=1;
while (values) {
if (!first) printf(", ");
printf("%s",values->value);
first=0;
values=values->next;
}
printf(" }\n");
keys=keys->next;
}
printf("--- %d messages indexed\n",idx->count);
if (idx->count)
grib_index_write(idx,options->outfile->name);
grib_index_delete(idx);
return 0;
}

350
tools/bufr_ls.c Normal file
View File

@ -0,0 +1,350 @@
/*
* Copyright 2005-2014 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_ls
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"f",0,0,1,0,0},
{"p:",0,0,0,1,0},
{"F:",0,0,1,1,"%g"},
{"P:",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"j",0,"json output\n",0,1,0},
{"B:",0,0,0,1,0},
{"l:",0,0,0,1,0},
{"s:",0,0,0,1,0},
{"i:",0,0,0,1,0},
{"n:",0,0,1,1,"ls"},
{"m",0,0,0,1,0},
{"V",0,0,0,1,0},
{"W:",0,0,1,1,"10"},
{"S",0,0,1,0,0},
{"M",0,0,0,1,0},
{"H",0,0,1,0,0},
{"g",0,0,0,1,0},
{"P",0,0,1,0,0},
{"T:",0,0,1,0,"B"},
{"7",0,0,0,1,0},
{"v",0,0,1,0,0},
{"x",0,0,0,1,0}
};
char* grib_tool_description="List content of grib files printing values of "
"some keys.\n\tIt does not fail when a key is not found.";
char* grib_tool_name="bufr_ls";
char* grib_tool_usage="[options] file file ...";
static char* new_handle="";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
double lat=0;
double lon=0;
int mode=0;
static int json=0;
grib_nearest* n=NULL;
/*double *outlats,*outlons,*values,*lsm_values,*distances;*/
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
/*
This is executed before processing the options with i
getopt and therfore it is the right place for hacking
the arguments if needed
*/
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
/*
The options have been parsed and the structure
grib_runtime_options* options has been loaded.
Initialization and startup can be done here
*/
int grib_tool_init(grib_runtime_options* options) {
char *end = NULL, *end1=NULL;
size_t size=4;
int ret=0;
double min=0,max=0;
int i=0,idx=0;
char* p=NULL;
if (grib_options_on("j")) {
options->verbose=0;
json=1;
}
if (options->latlon) {
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
lon= strtod(++end,&end1);
mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID;
if (end1 && *end1 == ',') {
end1++;
if (*end1 != '0') {
p=end1;
while (*p != ',' && *p !='\0') p++;
if (*end1 == '4') {
options->latlon_mode=4;
} else if (*end1 == '1') {
options->latlon_mode=1;
} else {
printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name);
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
}
}
if (options->latlon && options->latlon_mask) {
FILE* f=NULL;
grib_handle* hh;
f=fopen(options->latlon_mask,"r");
if(!f) {
perror(options->latlon_mask);
exit(1);
}
hh=grib_handle_new_from_file(0,f,&ret);
fclose(f);
GRIB_CHECK_NOLINE(ret,0);
n=grib_nearest_new(hh,&ret);
GRIB_CHECK_NOLINE(ret,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode,
options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0);
grib_nearest_delete(n);
n=NULL;
grib_handle_delete( hh);
options->latlon_idx=-1;
max=options->distances[0];
for (i=0;i<4;i++)
if (max<options->distances[i]) {max=options->distances[i];idx=i;}
min=max;
for (i=0;i<4;i++) {
if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) {
options->latlon_idx=i;
min = options->distances[i];
}
}
if (options->latlon_idx<0){
min=0;
options->latlon_idx=0;
for (i=1;i<4;i++)
if (min>options->distances[i]) {
min = options->distances[i];
options->latlon_idx=i;
}
}
}
if (json) printf("[\n");
return 0;
}
/*
A new file is being parsed. The file name is file. This function is called every time
a new input file name is processed, before opening the file.
*/
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
static void print_key_values(grib_runtime_options* options,grib_handle* h) {
int i;
int ret=0;
char* s="\"keys\" : {";
double dvalue=0;
long lvalue=0;
char value[MAX_STRING_LEN];
size_t len=MAX_STRING_LEN;
for (i=0;i<options->print_keys_count;i++) {
ret=GRIB_SUCCESS;
printf("%s",s);
len=MAX_STRING_LEN;
printf("\"%s\" : ",options->print_keys[i].name);
if (grib_is_missing(h,options->print_keys[i].name,&ret) && ret==GRIB_SUCCESS)
printf("\"missing\"");
else if ( ret == GRIB_SUCCESS ) {
if (options->print_keys[i].type == GRIB_TYPE_UNDEFINED)
grib_get_native_type(h,options->print_keys[i].name,&(options->print_keys[i].type));
switch (options->print_keys[i].type) {
case GRIB_TYPE_STRING:
ret=grib_get_string( h,options->print_keys[i].name,value,&len);
printf("\"%s\"",value);
break;
case GRIB_TYPE_DOUBLE:
ret=grib_get_double( h,options->print_keys[i].name,&dvalue);
printf("%g",dvalue);
break;
case GRIB_TYPE_LONG:
ret=grib_get_long( h,options->print_keys[i].name,&lvalue);
printf("%ld",lvalue);
break;
default:
printf("invalid_type");
}
}
if (ret == GRIB_NOT_FOUND) printf("null");
s=", ";
}
printf("}");
}
/* A new handle is available from the current input file and can be processed here.
The handle available in this function is in the set of messages satisfying the constrant of the
-w option. They are not to be skipped.
*/
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
size_t size=4;
double v=0;
int err=0;
int i;
if (!options->skip) {
if (options->set_values_count != 0)
err=grib_set_values(h,options->set_values,options->set_values_count);
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
if (options->latlon) {
int err=0;
double min;
if (!n) n=grib_nearest_new(h,&err);
GRIB_CHECK_NOLINE(err,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,0,
options->lats,options->lons,options->values,
options->distances,options->indexes,&size),0);
if (!options->latlon_mask) {
min=options->distances[0];
options->latlon_idx=0;
i=0;
for (i=1;i<4;i++) {
if (min>options->distances[i]) {
min=options->distances[i];
options->latlon_idx=i;
}
}
}
if (json) {
char* s="\n[\n";
double missingValue=9999;
char value[MAX_STRING_LEN];
size_t len=MAX_STRING_LEN;
printf("%s",new_handle);
printf( "{\n");
print_key_values(options,h);
printf("\n, \"selected\" : %d",options->latlon_idx);
printf(", \"method\" : ");
if (options->latlon_mask) printf("\"nearest_land\"");
else printf("\"nearest\"");
printf("\n, \"neighbours\" : ");
for (i=0;i<4;i++) {
printf("%s",s);
len=MAX_STRING_LEN;
printf("{\"index\" : %d, \"latitude\" : %g, \"longitude\" : %g, \"distance\" : %g, "
"\"distance_unit\" : \"km\", ",
(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i]);
if (grib_get_double_element(h,"values",options->indexes[i],&v) == GRIB_SUCCESS) {
if (v==missingValue) printf("\"value\" : null ");
else printf("\"value\" : %g ",v);
}
if (grib_get_string( h,"units",value,&len)==GRIB_SUCCESS)
printf(", \"unit\" : \"%s\"",value);
if (options->latlon_mask)
printf(", \"mask_value\"=%.2f",options->mask_values[i]);
printf("}");
s="\n,";
}
printf("\n]");
printf("\n}");
}
}
new_handle="\n,";
return 0;
}
/* A new handle to skip is available. At this point something can be done
with the message to be skipped before deleting the handle. */
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
/* key values can be printed in this function. Headers are already printed if requested.*/
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
/* this is executed after the last message in the last file is processed */
int grib_tool_finalise_action(grib_runtime_options* options) {
int i=0;
if (options->latlon && options->verbose) {
printf("Input Point: latitude=%.2f longitude=%.2f\n",lat,lon);
printf("Grid Point chosen #%d index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n",
options->latlon_idx+1,(int)options->indexes[options->latlon_idx],
options->lats[options->latlon_idx],
options->lons[options->latlon_idx],
options->distances[options->latlon_idx]);
if (options->latlon_mask) {
printf("Mask values:\n");
for (i=0;i<4;i++) {
printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km) value=%.2f\n",
i+1,(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i],options->mask_values[i]);
}
} else {
printf("Other grid Points\n");
for (i=0;i<4;i++) {
printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n",
i+1,(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i]);
}
}
}
if (n) grib_nearest_delete(n);
if (json) printf("\n]\n");
return 0;
}

161
tools/bufr_set.c Normal file
View File

@ -0,0 +1,161 @@
/*
* Copyright 2005-2014 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_set
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"s:",0,0,1,1,0},
{"r",0,0,0,1,0},
{"d:",0,0,0,1,0},
/*{"n:","noise percentage","\n\t\tAdd noise to the data values. The noise added is the given percentage of the data value.\n",0,1,0},*/
{"p:",0,0,1,1,0},
{"P:",0,0,0,1,0},
{"w:","key[:{s/d/l}]=value,key[:{s/d/l}]=value,...",
"\n\t\tWhere clause.\n\t\tSet is only executed for grib messages matching all the "
"key/value constraints.\n\t\tIf a grib message does not match the constraints it is"
" copied unchanged\n\t\tto the output_grib_file. This behaviour can be changed "
"setting the option -S.\n\t\tFor each key a string (key:s) or a double (key:d) or"
" a long (key:l)\n\t\ttype can be defined. Default type is string.\n",0,1,0},
{"q",0,0,1,0,0},
{"7",0,0,0,1,0},
{"S",0,0,0,1,0},
{"U",0,0,1,0,0},
{"V",0,0,0,1,0},
{"M",0,0,0,1,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"T:",0,0,1,0,"B"},
{"f",0,0,0,1,0},
{"v",0,0,0,1,0}
};
char* grib_tool_description="Sets key/value pairs in the input grib file and writes"
"\n\teach message to the output_grib_file."
"\n\tIt fails when an error occurs (e.g. key not found).";
char* grib_tool_name="bufr_set";
char* grib_tool_usage="[options] file file ... output_file";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
if (options->set_values_count == 0 && !options->repack && !options->constant) {
printf("ERROR: please provide some keys to set through the -s option or use the -r/-d options\n");
exit(1);
}
if (options->verbose) options->print_header=1;
/*if (grib_options_on("n:")) {
noise=atof(grib_options_get_option("n:"));
options->repack=1;
}*/
if (grib_options_on("n:") && grib_options_on("d:")) {
printf("Error: -n and -d options are incompatible. Choose one of the two please.\n");
exit(1);
}
#if 0
if (options->outfile && options->outfile->name) {
options->outfile->file = fopen(options->outfile->name,"w");
if(!options->outfile->file) {
perror(options->outfile->name);
exit(1);
}
}
#endif
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
int i=0;
int err=0;
if (!options->skip) {
double* v=NULL;
size_t size=0;
if ( options->repack ) {
GRIB_CHECK_NOLINE(grib_get_size(h,"values",&size),0);
v = (double*)calloc(size,sizeof(double));
if(!v) {
fprintf(stderr,"failed to allocate %d bytes\n",(int)(size*sizeof(double)));
exit(1);
}
GRIB_CHECK_NOLINE(grib_get_double_array(h,"values",v,&size),0);
}
if (options->set_values_count != 0)
err=grib_set_values(h,options->set_values,options->set_values_count);
if ( options->repack ) {
if (grib_options_on("d:")) {
for(i = 0; i< size; i++)
v[i] = options->constant;
}
#if 0
if (grib_options_on("n:")) {
for(i = 0; i< size; i++)
v[i] = options->constant;
}
#endif
GRIB_CHECK_NOLINE(grib_set_double_array(h,"values",v,size),0);
free(v);
}
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
if (!options->skip || !options->strict) grib_tools_write_message(options,h);
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
return 0;
}

170
tools/metar_dump.c Normal file
View File

@ -0,0 +1,170 @@
/*
* Copyright 2005-2014 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_dump
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"S",0,0,1,0,0},
{"O",0,"Octet mode. WMO documentation style dump.\n",0,1,0},
{"D",0,0,0,1,0},
{"d",0,"Print all data values.\n",0,1,0},
{"C",0,0,0,1,0},
{"t",0,0,0,1,0},
{"j",0,0,0,1,0},
{"H",0,0,0,1,0},
{"a",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"M",0,0,0,1,0},
{"T:",0,0,1,0,"M"},
{"7",0,0,0,1,0},
{"V",0,0,0,1,0},
{"q",0,0,1,0,0},
{"x",0,0,0,1,0}
};
char* grib_tool_description="Dump the content of a grib file in different formats.";
char* grib_tool_name="metar_dump";
char* grib_tool_usage="[options] file file ...";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
/**
*grib_dump
*Dump the content of a grib file
*
*/
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
int opt=grib_options_on("C")+grib_options_on("O")+grib_options_on("D");
options->dump_mode = "default";
if (opt > 1) {
printf("%s: simultaneous C/O/D options not allowed\n",grib_tool_name);
exit(1);
}
if (grib_options_on("C")) {
options->dump_mode = "c_code";
if (grib_options_on("d"))
options->dump_flags = 0;
else
options->dump_flags = GRIB_DUMP_FLAG_NO_DATA;
}
if (grib_options_on("O")) {
options->dump_mode = "wmo";
options->dump_flags = GRIB_DUMP_FLAG_CODED
| GRIB_DUMP_FLAG_OCTECT
| GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("D")) {
options->dump_mode = "debug";
options->dump_flags = GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("J")) {
options->dump_mode = "json";
options->dump_flags = GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("X")) {
options->dump_mode = "xml";
options->dump_flags = GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("a"))
options->dump_flags |= GRIB_DUMP_FLAG_ALIASES;
if (grib_options_on("t"))
options->dump_flags |= GRIB_DUMP_FLAG_TYPE;
if (grib_options_on("H"))
options->dump_flags |= GRIB_DUMP_FLAG_HEXADECIMAL;
if (grib_options_on("d"))
options->dump_flags |= GRIB_DUMP_FLAG_ALL_DATA;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
char tmp[1024];
if (!options->current_infile->name) return 0;
sprintf(tmp,"FILE: %s ",options->current_infile->name);
if (!grib_options_on("C") && !grib_options_on("J") && !grib_options_on("X") )
fprintf(stdout,"***** %s\n",tmp);
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
long length=0;
char tmp[1024];
char identifier[100];
size_t idlen=100;
int i;
if (grib_get_long(h,"totalLength",&length) != GRIB_SUCCESS)
length=-9999;
for (i=0;i<options->print_keys_count;i++)
grib_set_flag(h,options->print_keys[i].name,GRIB_ACCESSOR_FLAG_DUMP);
sprintf(tmp,"MESSAGE %d ( length=%ld )",options->handle_count,length);
if (!grib_options_on("C") && !grib_options_on("X") && !grib_options_on("J") )
fprintf(stdout,"#============== %-38s ==============\n",tmp);
if (!strcmp(options->dump_mode,"default")) {
GRIB_CHECK_NOLINE(grib_get_string(h,"identifier",identifier,&idlen),0);
printf("%s {\n",identifier);
}
grib_dump_content(h,stdout,options->dump_mode,options->dump_flags,0);
if (!strcmp(options->dump_mode,"default"))
printf("}\n");
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
return 0;
}

102
tools/metar_filter.c Normal file
View File

@ -0,0 +1,102 @@
/*
* Copyright 2005-2014 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_filter
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value */
{"f",0,0,0,1,0},
{"f",0,0,1,0,0},
{"F",0,0,1,0,0},
{"o:",0,0,1,1,"filter.out"},
{"q",0,0,1,0,0},
{"M",0,0,0,1,0},
{"I",0,0,1,0,0},
{"V",0,0,0,1,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"T:",0,0,1,0,"M"},
{"7",0,0,0,1,0},
{"v",0,0,0,1,0}
};
char* grib_tool_description="Apply the rules defined in rules_file to each metar "
"message\n\tin the files provided as arguments.";
char* grib_tool_name="metar_filter";
char* grib_tool_usage="[options] rules_file "
"file file ...";
int fail=0;
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
options->action = grib_action_from_filter(options->infile_extra->name);
if (!options->action) {
fprintf(stderr,"%s: error unable to create action\n",options->infile_extra->name);
exit(1);
}
if ( options->outfile && options->outfile->name )
options->action->context->outfilename=options->outfile->name;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
int err=0;
if (options->current_infile->name) {
size_t len=strlen(options->current_infile->name);
grib_set_string(h,"file",options->current_infile->name,&len);
}
err=grib_handle_apply_action(h,options->action);
if (err != GRIB_SUCCESS && options->fail && err!=GRIB_NOT_FOUND) {
printf("ERROR: %s\n",grib_get_error_message(err));
exit(err);
}
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
grib_file_pool_clean();
return 0;
}

212
tools/metar_get.c Normal file
View File

@ -0,0 +1,212 @@
/*
* Copyright 2005-2014 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
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"f",0,0,0,1,0},
{"p:",0,0,0,1,0},
{"F:",0,0,1,1,"%g"},
{"l:",0,0,0,1,0},
{"P:",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"n:",0,0,1,1,0},
{"s:",0,0,0,1,0},
{"V",0,0,0,1,0},
{"W:",0,0,1,1,"8"},
{"m",0,0,0,1,0},
{"M",0,0,0,1,0},
{"S",0,0,1,0,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"T:",0,0,1,0,"M"},
{"7",0,0,0,1,0},
{"v",0,0,1,0,0},
{"i:",0,0,0,1,0}
};
char* grib_tool_description="Get values of some keys from a metar file."
"\n\tIt is similar to metar_ls, but fails returning an error code "
"\n\twhen an error occurs (e.g. key not found).";
char* grib_tool_name="metar_get";
char* grib_tool_usage="[options] file file ...";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
double lat=0;
double lon=0;
int mode=0;
grib_nearest* n=NULL;
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
options->print_keys_count=-1;
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
char *end = NULL, *end1=NULL;
size_t size=4;
int ret=0;
double min=0,max=0;
int i=0,idx=0;
char* p=NULL;
options->print_header=0;
options->print_statistics=0;
options->default_print_width=-1;
if (options->latlon) {
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
lon= strtod(++end,&end1);
mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID;
if (end1 && *end1 == ',') {
end1++;
if (*end1 != '0') {
p=end1;
while (*p != ',' && *p !='\0') p++;
if (*end1 == '4') {
options->latlon_mode=4;
} else if (*end1 == '1') {
options->latlon_mode=1;
} else {
printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name);
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
}
}
if (options->latlon && options->latlon_mask) {
FILE* f=NULL;
grib_handle* hh;
f=fopen(options->latlon_mask,"r");
if(!f) {
perror(options->latlon_mask);
exit(1);
}
hh=grib_handle_new_from_file(0,f,&ret);
fclose(f);
GRIB_CHECK_NOLINE(ret,0);
n=grib_nearest_new(hh,&ret);
GRIB_CHECK_NOLINE(ret,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode,
options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0);
grib_nearest_delete(n);
n=NULL;
grib_handle_delete( hh);
options->latlon_idx=-1;
max=options->distances[0];
for (i=0;i<4;i++)
if (max<options->distances[i]) {max=options->distances[i];idx=i;}
min=max;
for (i=0;i<4;i++) {
if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) {
options->latlon_idx=i;
min = options->distances[i];
}
}
if (options->latlon_idx<0){
min=0;
options->latlon_idx=0;
for (i=1;i<4;i++)
if (min>options->distances[i]) {
min = options->distances[i];
options->latlon_idx=i;
}
}
}
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options,grib_handle* h) {
size_t size=4;
int err = 0;
if (!options->skip) {
if (options->set_values_count != 0) {
err=grib_set_values(h,options->set_values,options->set_values_count);
}
if (err != GRIB_SUCCESS && options->fail) exit(err);
}
if (options->latlon) {
int err=0;
double min;
int i;
if (!n) n=grib_nearest_new(h,&err);
GRIB_CHECK_NOLINE(err,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,mode,
options->lats,options->lons,options->values,
options->distances,options->indexes,&size),0);
min=options->distances[0];
options->latlon_idx=0;
i=0;
for (i=1;i<4;i++) {
if (min>options->distances[i]) {
min=options->distances[i];
options->latlon_idx=i;
}
}
}
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
if (n) grib_nearest_delete(n);
return 0;
}

350
tools/metar_ls.c Normal file
View File

@ -0,0 +1,350 @@
/*
* Copyright 2005-2014 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_ls
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"f",0,0,1,0,0},
{"p:",0,0,0,1,0},
{"F:",0,0,1,1,"%g"},
{"P:",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"j",0,"json output\n",0,1,0},
{"B:",0,0,0,1,0},
{"l:",0,0,0,1,0},
{"s:",0,0,0,1,0},
{"i:",0,0,0,1,0},
{"n:",0,0,1,1,"ls"},
{"m",0,0,0,1,0},
{"V",0,0,0,1,0},
{"W:",0,0,1,1,"10"},
{"S",0,0,1,0,0},
{"M",0,0,0,1,0},
{"H",0,0,1,0,0},
{"g",0,0,0,1,0},
{"P",0,0,1,0,0},
{"T:",0,0,1,0,"M"},
{"7",0,0,0,1,0},
{"v",0,0,1,0,0},
{"x",0,0,0,1,0}
};
char* grib_tool_description="List content of metar files printing values of "
"some keys.\n\tIt does not fail when a key is not found.";
char* grib_tool_name="metar_ls";
char* grib_tool_usage="[options] file file ...";
static char* new_handle="";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
double lat=0;
double lon=0;
int mode=0;
static int json=0;
grib_nearest* n=NULL;
/*double *outlats,*outlons,*values,*lsm_values,*distances;*/
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
/*
This is executed before processing the options with i
getopt and therfore it is the right place for hacking
the arguments if needed
*/
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
/*
The options have been parsed and the structure
grib_runtime_options* options has been loaded.
Initialization and startup can be done here
*/
int grib_tool_init(grib_runtime_options* options) {
char *end = NULL, *end1=NULL;
size_t size=4;
int ret=0;
double min=0,max=0;
int i=0,idx=0;
char* p=NULL;
if (grib_options_on("j")) {
options->verbose=0;
json=1;
}
if (options->latlon) {
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
lon= strtod(++end,&end1);
mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID;
if (end1 && *end1 == ',') {
end1++;
if (*end1 != '0') {
p=end1;
while (*p != ',' && *p !='\0') p++;
if (*end1 == '4') {
options->latlon_mode=4;
} else if (*end1 == '1') {
options->latlon_mode=1;
} else {
printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name);
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
}
}
if (options->latlon && options->latlon_mask) {
FILE* f=NULL;
grib_handle* hh;
f=fopen(options->latlon_mask,"r");
if(!f) {
perror(options->latlon_mask);
exit(1);
}
hh=grib_handle_new_from_file(0,f,&ret);
fclose(f);
GRIB_CHECK_NOLINE(ret,0);
n=grib_nearest_new(hh,&ret);
GRIB_CHECK_NOLINE(ret,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode,
options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0);
grib_nearest_delete(n);
n=NULL;
grib_handle_delete( hh);
options->latlon_idx=-1;
max=options->distances[0];
for (i=0;i<4;i++)
if (max<options->distances[i]) {max=options->distances[i];idx=i;}
min=max;
for (i=0;i<4;i++) {
if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) {
options->latlon_idx=i;
min = options->distances[i];
}
}
if (options->latlon_idx<0){
min=0;
options->latlon_idx=0;
for (i=1;i<4;i++)
if (min>options->distances[i]) {
min = options->distances[i];
options->latlon_idx=i;
}
}
}
if (json) printf("[\n");
return 0;
}
/*
A new file is being parsed. The file name is file. This function is called every time
a new input file name is processed, before opening the file.
*/
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
static void print_key_values(grib_runtime_options* options,grib_handle* h) {
int i;
int ret=0;
char* s="\"keys\" : {";
double dvalue=0;
long lvalue=0;
char value[MAX_STRING_LEN];
size_t len=MAX_STRING_LEN;
for (i=0;i<options->print_keys_count;i++) {
ret=GRIB_SUCCESS;
printf("%s",s);
len=MAX_STRING_LEN;
printf("\"%s\" : ",options->print_keys[i].name);
if (grib_is_missing(h,options->print_keys[i].name,&ret) && ret==GRIB_SUCCESS)
printf("\"missing\"");
else if ( ret == GRIB_SUCCESS ) {
if (options->print_keys[i].type == GRIB_TYPE_UNDEFINED)
grib_get_native_type(h,options->print_keys[i].name,&(options->print_keys[i].type));
switch (options->print_keys[i].type) {
case GRIB_TYPE_STRING:
ret=grib_get_string( h,options->print_keys[i].name,value,&len);
printf("\"%s\"",value);
break;
case GRIB_TYPE_DOUBLE:
ret=grib_get_double( h,options->print_keys[i].name,&dvalue);
printf("%g",dvalue);
break;
case GRIB_TYPE_LONG:
ret=grib_get_long( h,options->print_keys[i].name,&lvalue);
printf("%ld",lvalue);
break;
default:
printf("invalid_type");
}
}
if (ret == GRIB_NOT_FOUND) printf("null");
s=", ";
}
printf("}");
}
/* A new handle is available from the current input file and can be processed here.
The handle available in this function is in the set of messages satisfying the constrant of the
-w option. They are not to be skipped.
*/
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
size_t size=4;
double v=0;
int err=0;
int i;
if (!options->skip) {
if (options->set_values_count != 0)
err=grib_set_values(h,options->set_values,options->set_values_count);
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
if (options->latlon) {
int err=0;
double min;
if (!n) n=grib_nearest_new(h,&err);
GRIB_CHECK_NOLINE(err,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,0,
options->lats,options->lons,options->values,
options->distances,options->indexes,&size),0);
if (!options->latlon_mask) {
min=options->distances[0];
options->latlon_idx=0;
i=0;
for (i=1;i<4;i++) {
if (min>options->distances[i]) {
min=options->distances[i];
options->latlon_idx=i;
}
}
}
if (json) {
char* s="\n[\n";
double missingValue=9999;
char value[MAX_STRING_LEN];
size_t len=MAX_STRING_LEN;
printf("%s",new_handle);
printf( "{\n");
print_key_values(options,h);
printf("\n, \"selected\" : %d",options->latlon_idx);
printf(", \"method\" : ");
if (options->latlon_mask) printf("\"nearest_land\"");
else printf("\"nearest\"");
printf("\n, \"neighbours\" : ");
for (i=0;i<4;i++) {
printf("%s",s);
len=MAX_STRING_LEN;
printf("{\"index\" : %d, \"latitude\" : %g, \"longitude\" : %g, \"distance\" : %g, "
"\"distance_unit\" : \"km\", ",
(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i]);
if (grib_get_double_element(h,"values",options->indexes[i],&v) == GRIB_SUCCESS) {
if (v==missingValue) printf("\"value\" : null ");
else printf("\"value\" : %g ",v);
}
if (grib_get_string( h,"units",value,&len)==GRIB_SUCCESS)
printf(", \"unit\" : \"%s\"",value);
if (options->latlon_mask)
printf(", \"mask_value\"=%.2f",options->mask_values[i]);
printf("}");
s="\n,";
}
printf("\n]");
printf("\n}");
}
}
new_handle="\n,";
return 0;
}
/* A new handle to skip is available. At this point something can be done
with the message to be skipped before deleting the handle. */
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
/* key values can be printed in this function. Headers are already printed if requested.*/
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
/* this is executed after the last message in the last file is processed */
int grib_tool_finalise_action(grib_runtime_options* options) {
int i=0;
if (options->latlon && options->verbose) {
printf("Input Point: latitude=%.2f longitude=%.2f\n",lat,lon);
printf("Grid Point chosen #%d index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n",
options->latlon_idx+1,(int)options->indexes[options->latlon_idx],
options->lats[options->latlon_idx],
options->lons[options->latlon_idx],
options->distances[options->latlon_idx]);
if (options->latlon_mask) {
printf("Mask values:\n");
for (i=0;i<4;i++) {
printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km) value=%.2f\n",
i+1,(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i],options->mask_values[i]);
}
} else {
printf("Other grid Points\n");
for (i=0;i<4;i++) {
printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n",
i+1,(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i]);
}
}
}
if (n) grib_nearest_delete(n);
if (json) printf("\n]\n");
return 0;
}

169
tools/taf_dump.c Normal file
View File

@ -0,0 +1,169 @@
/*
* Copyright 2005-2014 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_dump
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"S",0,0,1,0,0},
{"O",0,"Octet mode. WMO documentation style dump.\n",0,1,0},
{"D",0,0,0,1,0},
{"d",0,"Print all data values.\n",0,1,0},
{"C",0,0,0,1,0},
{"t",0,0,0,1,0},
{"H",0,0,0,1,0},
{"a",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"M",0,0,0,1,0},
{"T:",0,0,1,0,"F"},
{"7",0,0,0,1,0},
{"V",0,0,0,1,0},
{"q",0,0,1,0,0},
{"x",0,0,0,1,0}
};
char* grib_tool_description="Dump the content of a grib file in different formats.";
char* grib_tool_name="taf_dump";
char* grib_tool_usage="[options] file file ...";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
/**
*grib_dump
*Dump the content of a grib file
*
*/
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
int opt=grib_options_on("C")+grib_options_on("O")+grib_options_on("D");
options->dump_mode = "default";
if (opt > 1) {
printf("%s: simultaneous C/O/D options not allowed\n",grib_tool_name);
exit(1);
}
if (grib_options_on("C")) {
options->dump_mode = "c_code";
if (grib_options_on("d"))
options->dump_flags = 0;
else
options->dump_flags = GRIB_DUMP_FLAG_NO_DATA;
}
if (grib_options_on("O")) {
options->dump_mode = "wmo";
options->dump_flags = GRIB_DUMP_FLAG_CODED
| GRIB_DUMP_FLAG_OCTECT
| GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("D")) {
options->dump_mode = "debug";
options->dump_flags = GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("J")) {
options->dump_mode = "json";
options->dump_flags = GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("X")) {
options->dump_mode = "xml";
options->dump_flags = GRIB_DUMP_FLAG_VALUES
| GRIB_DUMP_FLAG_READ_ONLY;
}
if (grib_options_on("a"))
options->dump_flags |= GRIB_DUMP_FLAG_ALIASES;
if (grib_options_on("t"))
options->dump_flags |= GRIB_DUMP_FLAG_TYPE;
if (grib_options_on("H"))
options->dump_flags |= GRIB_DUMP_FLAG_HEXADECIMAL;
if (grib_options_on("d"))
options->dump_flags |= GRIB_DUMP_FLAG_ALL_DATA;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
char tmp[1024];
if (!options->current_infile->name) return 0;
sprintf(tmp,"FILE: %s ",options->current_infile->name);
if (!grib_options_on("C") && !grib_options_on("J") && !grib_options_on("X") )
fprintf(stdout,"***** %s\n",tmp);
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
long length=0;
char tmp[1024];
char identifier[100];
size_t idlen=100;
int i;
if (grib_get_long(h,"totalLength",&length) != GRIB_SUCCESS)
length=-9999;
for (i=0;i<options->print_keys_count;i++)
grib_set_flag(h,options->print_keys[i].name,GRIB_ACCESSOR_FLAG_DUMP);
sprintf(tmp,"MESSAGE %d ( length=%ld )",options->handle_count,length);
if (!grib_options_on("C") && !grib_options_on("X") && !grib_options_on("J") )
fprintf(stdout,"#============== %-38s ==============\n",tmp);
if (!strcmp(options->dump_mode,"default")) {
GRIB_CHECK_NOLINE(grib_get_string(h,"identifier",identifier,&idlen),0);
printf("%s {\n",identifier);
}
grib_dump_content(h,stdout,options->dump_mode,options->dump_flags,0);
if (!strcmp(options->dump_mode,"default"))
printf("}\n");
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
return 0;
}

102
tools/taf_filter.c Normal file
View File

@ -0,0 +1,102 @@
/*
* Copyright 2005-2014 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_filter
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value */
{"f",0,0,0,1,0},
{"f",0,0,1,0,0},
{"F",0,0,1,0,0},
{"o:",0,0,1,1,"filter.out"},
{"q",0,0,1,0,0},
{"M",0,0,0,1,0},
{"I",0,0,1,0,0},
{"V",0,0,0,1,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"T:",0,0,1,0,"F"},
{"7",0,0,0,1,0},
{"v",0,0,0,1,0}
};
char* grib_tool_description="Apply the rules defined in rules_file to each taf "
"message\n\tin the files provided as arguments.";
char* grib_tool_name="taf_filter";
char* grib_tool_usage="[options] rules_file "
"file file ...";
int fail=0;
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
options->action = grib_action_from_filter(options->infile_extra->name);
if (!options->action) {
fprintf(stderr,"%s: error unable to create action\n",options->infile_extra->name);
exit(1);
}
if ( options->outfile && options->outfile->name )
options->action->context->outfilename=options->outfile->name;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
int err=0;
if (options->current_infile->name) {
size_t len=strlen(options->current_infile->name);
grib_set_string(h,"file",options->current_infile->name,&len);
}
err=grib_handle_apply_action(h,options->action);
if (err != GRIB_SUCCESS && options->fail && err!=GRIB_NOT_FOUND) {
printf("ERROR: %s\n",grib_get_error_message(err));
exit(err);
}
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
grib_file_pool_clean();
return 0;
}

212
tools/taf_get.c Normal file
View File

@ -0,0 +1,212 @@
/*
* Copyright 2005-2014 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
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"f",0,0,0,1,0},
{"p:",0,0,0,1,0},
{"F:",0,0,1,1,"%g"},
{"l:",0,0,0,1,0},
{"P:",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"n:",0,0,1,1,0},
{"s:",0,0,0,1,0},
{"V",0,0,0,1,0},
{"W:",0,0,1,1,"8"},
{"m",0,0,0,1,0},
{"M",0,0,0,1,0},
{"S",0,0,1,0,0},
{"g",0,0,0,1,0},
{"G",0,0,0,1,0},
{"T:",0,0,1,0,"F"},
{"7",0,0,0,1,0},
{"v",0,0,1,0,0},
{"i:",0,0,0,1,0}
};
char* grib_tool_description="Get values of some keys from a taf file."
"\n\tIt is similar to taf_ls, but fails returning an error code "
"\n\twhen an error occurs (e.g. key not found).";
char* grib_tool_name="taf_get";
char* grib_tool_usage="[options] file file ...";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
double lat=0;
double lon=0;
int mode=0;
grib_nearest* n=NULL;
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
options->print_keys_count=-1;
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
char *end = NULL, *end1=NULL;
size_t size=4;
int ret=0;
double min=0,max=0;
int i=0,idx=0;
char* p=NULL;
options->print_header=0;
options->print_statistics=0;
options->default_print_width=-1;
if (options->latlon) {
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
lon= strtod(++end,&end1);
mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID;
if (end1 && *end1 == ',') {
end1++;
if (*end1 != '0') {
p=end1;
while (*p != ',' && *p !='\0') p++;
if (*end1 == '4') {
options->latlon_mode=4;
} else if (*end1 == '1') {
options->latlon_mode=1;
} else {
printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name);
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
}
}
if (options->latlon && options->latlon_mask) {
FILE* f=NULL;
grib_handle* hh;
f=fopen(options->latlon_mask,"r");
if(!f) {
perror(options->latlon_mask);
exit(1);
}
hh=grib_handle_new_from_file(0,f,&ret);
fclose(f);
GRIB_CHECK_NOLINE(ret,0);
n=grib_nearest_new(hh,&ret);
GRIB_CHECK_NOLINE(ret,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode,
options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0);
grib_nearest_delete(n);
n=NULL;
grib_handle_delete( hh);
options->latlon_idx=-1;
max=options->distances[0];
for (i=0;i<4;i++)
if (max<options->distances[i]) {max=options->distances[i];idx=i;}
min=max;
for (i=0;i<4;i++) {
if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) {
options->latlon_idx=i;
min = options->distances[i];
}
}
if (options->latlon_idx<0){
min=0;
options->latlon_idx=0;
for (i=1;i<4;i++)
if (min>options->distances[i]) {
min = options->distances[i];
options->latlon_idx=i;
}
}
}
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options,grib_handle* h) {
size_t size=4;
int err = 0;
if (!options->skip) {
if (options->set_values_count != 0) {
err=grib_set_values(h,options->set_values,options->set_values_count);
}
if (err != GRIB_SUCCESS && options->fail) exit(err);
}
if (options->latlon) {
int err=0;
double min;
int i;
if (!n) n=grib_nearest_new(h,&err);
GRIB_CHECK_NOLINE(err,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,mode,
options->lats,options->lons,options->values,
options->distances,options->indexes,&size),0);
min=options->distances[0];
options->latlon_idx=0;
i=0;
for (i=1;i<4;i++) {
if (min>options->distances[i]) {
min=options->distances[i];
options->latlon_idx=i;
}
}
}
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
if (n) grib_nearest_delete(n);
return 0;
}

350
tools/taf_ls.c Normal file
View File

@ -0,0 +1,350 @@
/*
* Copyright 2005-2014 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_ls
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
grib_option grib_options[]={
/* {id, args, help}, on, command_line, value*/
{"f",0,0,1,0,0},
{"p:",0,0,0,1,0},
{"F:",0,0,1,1,"%g"},
{"P:",0,0,0,1,0},
{"w:",0,0,0,1,0},
{"j",0,"json output\n",0,1,0},
{"B:",0,0,0,1,0},
{"l:",0,0,0,1,0},
{"s:",0,0,0,1,0},
{"i:",0,0,0,1,0},
{"n:",0,0,1,1,"ls"},
{"m",0,0,0,1,0},
{"V",0,0,0,1,0},
{"W:",0,0,1,1,"10"},
{"S",0,0,1,0,0},
{"M",0,0,0,1,0},
{"H",0,0,1,0,0},
{"g",0,0,0,1,0},
{"P",0,0,1,0,0},
{"T:",0,0,1,0,"F"},
{"7",0,0,0,1,0},
{"v",0,0,1,0,0},
{"x",0,0,0,1,0}
};
char* grib_tool_description="List content of taf files printing values of "
"some keys.\n\tIt does not fail when a key is not found.";
char* grib_tool_name="taf_ls";
char* grib_tool_usage="[options] file file ...";
static char* new_handle="";
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
double lat=0;
double lon=0;
int mode=0;
static int json=0;
grib_nearest* n=NULL;
/*double *outlats,*outlons,*values,*lsm_values,*distances;*/
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
/*
This is executed before processing the options with i
getopt and therfore it is the right place for hacking
the arguments if needed
*/
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
}
/*
The options have been parsed and the structure
grib_runtime_options* options has been loaded.
Initialization and startup can be done here
*/
int grib_tool_init(grib_runtime_options* options) {
char *end = NULL, *end1=NULL;
size_t size=4;
int ret=0;
double min=0,max=0;
int i=0,idx=0;
char* p=NULL;
if (grib_options_on("j")) {
options->verbose=0;
json=1;
}
if (options->latlon) {
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
lon= strtod(++end,&end1);
mode=GRIB_NEAREST_SAME_POINT | GRIB_NEAREST_SAME_GRID;
if (end1 && *end1 == ',') {
end1++;
if (*end1 != '0') {
p=end1;
while (*p != ',' && *p !='\0') p++;
if (*end1 == '4') {
options->latlon_mode=4;
} else if (*end1 == '1') {
options->latlon_mode=1;
} else {
printf("ERROR %s: wrong mode given in option -l\n",grib_tool_name);
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
}
}
if (options->latlon && options->latlon_mask) {
FILE* f=NULL;
grib_handle* hh;
f=fopen(options->latlon_mask,"r");
if(!f) {
perror(options->latlon_mask);
exit(1);
}
hh=grib_handle_new_from_file(0,f,&ret);
fclose(f);
GRIB_CHECK_NOLINE(ret,0);
n=grib_nearest_new(hh,&ret);
GRIB_CHECK_NOLINE(ret,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,hh,lat,lon,mode,
options->lats,options->lons,options->mask_values,options->distances,options->indexes,&size),0);
grib_nearest_delete(n);
n=NULL;
grib_handle_delete( hh);
options->latlon_idx=-1;
max=options->distances[0];
for (i=0;i<4;i++)
if (max<options->distances[i]) {max=options->distances[i];idx=i;}
min=max;
for (i=0;i<4;i++) {
if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) {
options->latlon_idx=i;
min = options->distances[i];
}
}
if (options->latlon_idx<0){
min=0;
options->latlon_idx=0;
for (i=1;i<4;i++)
if (min>options->distances[i]) {
min = options->distances[i];
options->latlon_idx=i;
}
}
}
if (json) printf("[\n");
return 0;
}
/*
A new file is being parsed. The file name is file. This function is called every time
a new input file name is processed, before opening the file.
*/
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
}
static void print_key_values(grib_runtime_options* options,grib_handle* h) {
int i;
int ret=0;
char* s="\"keys\" : {";
double dvalue=0;
long lvalue=0;
char value[MAX_STRING_LEN];
size_t len=MAX_STRING_LEN;
for (i=0;i<options->print_keys_count;i++) {
ret=GRIB_SUCCESS;
printf("%s",s);
len=MAX_STRING_LEN;
printf("\"%s\" : ",options->print_keys[i].name);
if (grib_is_missing(h,options->print_keys[i].name,&ret) && ret==GRIB_SUCCESS)
printf("\"missing\"");
else if ( ret == GRIB_SUCCESS ) {
if (options->print_keys[i].type == GRIB_TYPE_UNDEFINED)
grib_get_native_type(h,options->print_keys[i].name,&(options->print_keys[i].type));
switch (options->print_keys[i].type) {
case GRIB_TYPE_STRING:
ret=grib_get_string( h,options->print_keys[i].name,value,&len);
printf("\"%s\"",value);
break;
case GRIB_TYPE_DOUBLE:
ret=grib_get_double( h,options->print_keys[i].name,&dvalue);
printf("%g",dvalue);
break;
case GRIB_TYPE_LONG:
ret=grib_get_long( h,options->print_keys[i].name,&lvalue);
printf("%ld",lvalue);
break;
default:
printf("invalid_type");
}
}
if (ret == GRIB_NOT_FOUND) printf("null");
s=", ";
}
printf("}");
}
/* A new handle is available from the current input file and can be processed here.
The handle available in this function is in the set of messages satisfying the constrant of the
-w option. They are not to be skipped.
*/
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
size_t size=4;
double v=0;
int err=0;
int i;
if (!options->skip) {
if (options->set_values_count != 0)
err=grib_set_values(h,options->set_values,options->set_values_count);
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
if (options->latlon) {
int err=0;
double min;
if (!n) n=grib_nearest_new(h,&err);
GRIB_CHECK_NOLINE(err,0);
GRIB_CHECK_NOLINE(grib_nearest_find(n,h,lat,lon,0,
options->lats,options->lons,options->values,
options->distances,options->indexes,&size),0);
if (!options->latlon_mask) {
min=options->distances[0];
options->latlon_idx=0;
i=0;
for (i=1;i<4;i++) {
if (min>options->distances[i]) {
min=options->distances[i];
options->latlon_idx=i;
}
}
}
if (json) {
char* s="\n[\n";
double missingValue=9999;
char value[MAX_STRING_LEN];
size_t len=MAX_STRING_LEN;
printf("%s",new_handle);
printf( "{\n");
print_key_values(options,h);
printf("\n, \"selected\" : %d",options->latlon_idx);
printf(", \"method\" : ");
if (options->latlon_mask) printf("\"nearest_land\"");
else printf("\"nearest\"");
printf("\n, \"neighbours\" : ");
for (i=0;i<4;i++) {
printf("%s",s);
len=MAX_STRING_LEN;
printf("{\"index\" : %d, \"latitude\" : %g, \"longitude\" : %g, \"distance\" : %g, "
"\"distance_unit\" : \"km\", ",
(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i]);
if (grib_get_double_element(h,"values",options->indexes[i],&v) == GRIB_SUCCESS) {
if (v==missingValue) printf("\"value\" : null ");
else printf("\"value\" : %g ",v);
}
if (grib_get_string( h,"units",value,&len)==GRIB_SUCCESS)
printf(", \"unit\" : \"%s\"",value);
if (options->latlon_mask)
printf(", \"mask_value\"=%.2f",options->mask_values[i]);
printf("}");
s="\n,";
}
printf("\n]");
printf("\n}");
}
}
new_handle="\n,";
return 0;
}
/* A new handle to skip is available. At this point something can be done
with the message to be skipped before deleting the handle. */
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
}
/* key values can be printed in this function. Headers are already printed if requested.*/
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
grib_print_key_values(options,h);
}
/* this is executed after the last message in the last file is processed */
int grib_tool_finalise_action(grib_runtime_options* options) {
int i=0;
if (options->latlon && options->verbose) {
printf("Input Point: latitude=%.2f longitude=%.2f\n",lat,lon);
printf("Grid Point chosen #%d index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n",
options->latlon_idx+1,(int)options->indexes[options->latlon_idx],
options->lats[options->latlon_idx],
options->lons[options->latlon_idx],
options->distances[options->latlon_idx]);
if (options->latlon_mask) {
printf("Mask values:\n");
for (i=0;i<4;i++) {
printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km) value=%.2f\n",
i+1,(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i],options->mask_values[i]);
}
} else {
printf("Other grid Points\n");
for (i=0;i<4;i++) {
printf("- %d - index=%d latitude=%.2f longitude=%.2f distance=%.2f (Km)\n",
i+1,(int)options->indexes[i],options->lats[i],options->lons[i],
options->distances[i]);
}
}
}
if (n) grib_nearest_delete(n);
if (json) printf("\n]\n");
return 0;
}