Remove grib related options from bufr tools

This commit is contained in:
Shahram Najm 2015-01-31 21:58:30 +00:00
parent 5df45e06b3
commit 54ee668d9b
8 changed files with 1583 additions and 1600 deletions

File diff suppressed because it is too large Load Diff

View File

@ -9,109 +9,107 @@
*/
/*
* C Implementation: grib_copy
* C Implementation: bufr_copy
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
*
*/
#include "grib_tools.h"
char* grib_tool_description="Copies the content of BUFR files printing"
" values of some keys.";
" 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 BUFR messages matching the key/value constraints are "
"copied to the\n\t\toutput_bufr_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}
/* {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 BUFR messages matching the key/value constraints are "
"copied to the\n\t\toutput_bufr_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},
{"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 ret=grib_tool(argc,argv);
return ret;
}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
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);
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;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
int err=0;
if (!options->skip) {
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 (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( err != GRIB_SUCCESS && options->fail) exit(err);
}
grib_tools_write_message(options,h);
return 0;
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;
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);
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;
*/
return 0;
}

View File

@ -9,34 +9,33 @@
*/
/*
* C Implementation: grib_dump
* C Implementation: bufr_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}
/* {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 BUFR file in different formats.";
@ -47,130 +46,130 @@ static int json=0;
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
/**
*grib_dump
*Dump the content of a BUFR file
*
*/
*grib_dump
*Dump the content of a BUFR file
*
*/
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
int opt=grib_options_on("C")+grib_options_on("O")+grib_options_on("D");
int opt=grib_options_on("C")+grib_options_on("O")+grib_options_on("D");
options->dump_mode = "default";
options->dump_mode = "default";
if (opt > 1) {
printf("%s: simultaneous j/C/O/D options not allowed\n",grib_tool_name);
exit(1);
}
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("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("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("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("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("a"))
options->dump_flags |= GRIB_DUMP_FLAG_ALIASES;
if (grib_options_on("t"))
options->dump_flags |= GRIB_DUMP_FLAG_TYPE;
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("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;
if (grib_options_on("d") && !grib_options_on("u"))
options->dump_flags |= GRIB_DUMP_FLAG_ALL_DATA;
if (json) fprintf(stdout,"{\n");
if (json) fprintf(stdout,"{\n");
return 0;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
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;
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;
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;
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);
for (i=0;i<options->print_keys_count;i++)
grib_set_flag(h,options->print_keys[i].name,GRIB_ACCESSOR_FLAG_DUMP);
if (json) {
grib_set_long(h,"unpack",1);
if (options->handle_count>1) fprintf(stdout,",\n");
fprintf(stdout,"\"message%d\" : ",options->handle_count);
} 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);
if (json) {
grib_set_long(h,"unpack",1);
if (options->handle_count>1) fprintf(stdout,",\n");
fprintf(stdout,"\"message%d\" : ",options->handle_count);
} 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);
grib_dump_content(h,stdout,options->dump_mode,options->dump_flags,0);
if (!strcmp(options->dump_mode,"default"))
printf("}\n");
return 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;
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);
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
if (json) fprintf(stdout,"\n}\n");
return 0;
if (json) fprintf(stdout,"\n}\n");
return 0;
}

View File

@ -9,7 +9,7 @@
*/
/*
* C Implementation: grib_filter
* C Implementation: bufr_filter
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
@ -18,85 +18,83 @@
#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}
/* {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},
{"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 BUFR "
"message\n\tin the BUFR files provided as arguments.";
"message\n\tin the BUFR files provided as arguments.";
char* grib_tool_name="bufr_filter";
char* grib_tool_usage="[options] rules_file "
"file 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;
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);
}
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;
if ( options->outfile && options->outfile->name )
options->action->context->outfilename=options->outfile->name;
return 0;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
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);
}
int err=0;
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;
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;
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);
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
grib_file_pool_clean();
return 0;
grib_file_pool_clean();
return 0;
}

View File

@ -9,41 +9,39 @@
*/
/*
* C Implementation: grib_get
* C Implementation: bufr_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}
/* {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},
{"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 BUFR file."
"\n\tIt is similar to bufr_ls, but fails returning an error code "
"\n\twhen an error occurs (e.g. key not found).";
"\n\tIt is similar to bufr_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 ...";
@ -56,157 +54,157 @@ 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;
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;
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 (options->latlon) {
options->print_header=0;
options->print_statistics=0;
options->default_print_width=-1;
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 (options->latlon) {
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);
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
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 && 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 (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;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options,grib_handle* h) {
size_t size=4;
int err = 0;
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 (!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 (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;
}
}
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;
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
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);
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
if (n) grib_nearest_delete(n);
return 0;
if (n) grib_nearest_delete(n);
return 0;
}

View File

@ -9,7 +9,7 @@
*/
/*
* C Implementation: grib_copy
* C Implementation: bufr_index_build
*
* Author: Enrico Fucile <enrico.fucile@ecmwf.int>
*
@ -26,14 +26,13 @@ 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}
/* {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"},
{"N",0,0,0,1,0}
};
int compress_index;
@ -41,100 +40,100 @@ 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 ret=grib_tool(argc,argv);
return ret;
}
int grib_tool_before_getopt(grib_runtime_options* options) {
return 0;
return 0;
}
int grib_tool_init(grib_runtime_options* options) {
int ret=0;
grib_context* c=grib_context_get_default();
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("N")) compress_index=0;
else compress_index=1;
if (grib_options_on("k:"))
keys=grib_options_get_option("k:");
else
keys=default_keys;
if (grib_options_on("k:"))
keys=grib_options_get_option("k:");
else
keys=default_keys;
options->onlyfiles=1;
options->onlyfiles=1;
idx=grib_index_new(c,keys,&ret);
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));
if (!idx || ret)
grib_context_log(c,GRIB_LOG_FATAL,
"Unable to create index %s",grib_get_error_message(ret));
return 0;
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 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;
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
return 0;
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
return 0;
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;
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 (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;
if (idx->count)
grib_index_write(idx,options->outfile->name);
grib_index_delete(idx);
return 0;
}

View File

@ -9,43 +9,41 @@
*/
/*
* C Implementation: grib_ls
* C Implementation: bufr_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}
/* {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},
{"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 BUFR files printing values of "
"some keys.\n\tIt does not fail when a key is not found.";
"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="";
@ -65,286 +63,286 @@ 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;
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);
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;
}
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 (options->latlon) {
lat = strtod(options->latlon,&end);
if (*end != ',') {
printf("ERROR: wrong latitude value\n");
exit(1);
}
}
if (*p == ',') {
p++;
options->latlon_mask=strdup(p);
}
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);
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];
}
}
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 (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");
if (json) printf("[\n");
return 0;
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;
}
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
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("}");
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) {
size_t size=4;
double v=0;
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);
int i;
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 (!options->skip) {
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,";
}
if (options->set_values_count != 0)
err=grib_set_values(h,options->set_values,options->set_values_count);
printf("\n]");
printf("\n}");
}
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
}
new_handle="\n,";
return 0;
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;
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);
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]);
int i=0;
if (options->latlon && options->verbose) {
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]);
}
}
}
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;
if (json) printf("\n]\n");
return 0;
}

View File

@ -9,44 +9,42 @@
*/
/*
* C Implementation: grib_set
* C Implementation: bufr_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}
/* {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},
{"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 BUFR file and writes"
"\n\teach message to the output_bufr_file."
"\n\tIt fails when an error occurs (e.g. key not found).";
"\n\teach message to the output_bufr_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";
@ -55,107 +53,103 @@ 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;
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:")) {
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);
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;
return 0;
}
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
return 0;
}
return 0;
}
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
return 0;
return 0;
}
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
int i=0;
int err=0;
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);
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);
}
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);
}
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->set_values_count != 0)
err=grib_set_values(h,options->set_values,options->set_values_count);
if ( options->repack ) {
if ( options->repack ) {
if (grib_options_on("d:")) {
for(i = 0; i< size; i++)
v[i] = options->constant;
}
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;
}
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);
GRIB_CHECK_NOLINE(grib_set_double_array(h,"values",v,size),0);
free(v);
}
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
if( err != GRIB_SUCCESS && options->fail) exit(err);
}
if (!options->skip || !options->strict) grib_tools_write_message(options,h);
if (!options->skip || !options->strict) grib_tools_write_message(options,h);
return 0;
return 0;
}
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
grib_handle_delete(h);
return 0;
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);
grib_print_key_values(options,h);
}
int grib_tool_finalise_action(grib_runtime_options* options) {
return 0;
return 0;
}