Esempio n. 1
0
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h)
{
    size_t 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( err != GRIB_SUCCESS && options->fail) exit(err);
        }

        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

            if (err == GRIB_SUCCESS) {
                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;
}
Esempio n. 2
0
static grib_values* get_key_values(grib_runtime_options* options,grib_handle* h) {
  int i=0;
  int ret=0;
  char value[MAX_STRING_LEN]={0,};
  char* notfound="not found";

  for (i=0;i<options->print_keys_count;i++) {
    size_t len=MAX_STRING_LEN;
    ret=GRIB_SUCCESS;

    if (grib_is_missing(h,options->print_keys[i].name,&ret) && ret==GRIB_SUCCESS) {
      options->print_keys[i].type=GRIB_TYPE_MISSING;
      sprintf(value,"MISSING");

    } else if ( ret != GRIB_NOT_FOUND ){
      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);
          break;
        case GRIB_TYPE_DOUBLE:
          ret=grib_get_double( h,options->print_keys[i].name,
                  &(options->print_keys[i].double_value));
          sprintf(value,"%g",options->print_keys[i].double_value);
          break;
        case GRIB_TYPE_LONG:
          ret=grib_get_long( h,options->print_keys[i].name,
                  &(options->print_keys[i].long_value));
          sprintf(value,"%ld",(long)options->print_keys[i].long_value);
          break;
		default:
		  fprintf(dump_file,"invalid type for %s\n",options->print_keys[i].name);
		  exit(1);

      }
    }

    if (ret != GRIB_SUCCESS) {
      if (options->fail) GRIB_CHECK_NOLINE(ret,options->print_keys[i].name);
        if (ret == GRIB_NOT_FOUND) strcpy(value,notfound);
        else {
          fprintf(dump_file,"%s %s\n",grib_get_error_message(ret),options->print_keys[i].name);
          exit(ret);
        }
    }
    options->print_keys[i].string_value=strdup(value);
  }
  return options->print_keys;

}
Esempio n. 3
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;
}
Esempio n. 4
0
int grib_tool_init(grib_runtime_options* options) {
  int set=0;
  grib_rule* r=NULL;

  options->rules = grib_parse_rules_file(NULL,options->infile_extra->name);

  if(!options->rules) {
    printf("Unable to build rules from %s\n",options->infile_extra->name);
    exit(1);
  }
  r = options->rules;
  set = 0;
  while(r)  {
    if(!r->condition) {
      grib_rule_entry* e = r->entries;
      while(e)  {
        Assert(set < (sizeof(options->set_values)/sizeof(options->set_values[0])));
        options->set_values[set].name = e->name;
        GRIB_CHECK_NOLINE(grib_expression_set_value(NULL,e->value,&(options->set_values[set])),NULL);
        set++;
        e = e->next;
      }
    }
    r = r->next;
  }
  options->set_values_count=set;

  if(options->verbose)
  {
    printf("Fixed rules:\n");
    printf("------------\n");
    grib_print_values(options->set_values,
        options->set_values_count);
    printf("\n");
  }
/*
  if (options->outfile && options->outfile->name) {
    options->outfile->file = fopen(options->outfile->name,"w");
    if(!options->outfile->file) {
      perror(options->outfile->name);
      exit(1);
    }
  }
*/
  return 0;
}
Esempio n. 5
0
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
  grib_rule* r = options->rules;
  int i;
  int err=0;
  double scale = 1;
  double offset = 0;

  int set = options->set_values_count;

  while(r) {
    if(r->condition)  {
      long ok = 0;
      GRIB_CHECK_NOLINE(grib_expression_evaluate_long(h,r->condition,&ok),NULL);
      if(ok) {
        grib_rule_entry* e = r->entries;
        while(e) {
          if (!strcmp(e->name,"skip")) return 0;
          Assert(set < (sizeof(options->set_values)/sizeof(options->set_values[0])));
          options->set_values[set].name = e->name;
          options->set_values[set].error=grib_expression_set_value(h,
                                              e->value,&(options->set_values[set]));
          set++;
          e = e->next;
        }

      }
    }
    r = r->next;
  }

  if(options->verbose)
  {
    printf("Applying %d:\n",options->infile->handle_count);
    grib_print_values(options->set_values, set);
    printf("\n");
  }

  err=grib_set_values(h,options->set_values, set);

  if( err != GRIB_SUCCESS) {
      for(i = 0; i < options->set_values_count ; i++) {
        if(options->set_values[i].error != GRIB_SUCCESS &&
           options->set_values[i].error != GRIB_CONCEPT_NO_MATCH && options->fail)
           grib_context_log(h->context,GRIB_LOG_ERROR,"unable to set key \"%s\" (%s)",
              options->set_values[i].name,grib_get_error_message( options->set_values[i].error));
      }
  }

  grib_get_double(h,"scaleValuesBy",&scale);
  grib_get_double(h,"offsetValuesBy",&offset);

  if(scale != 1 || offset != 0)
  {
    double *v;
    size_t size;
    int i;

    GRIB_CHECK_NOLINE(grib_get_size(h,"values",&size),0);

    v    = (double*)calloc(size,sizeof(double));
    if(!v) {
      fprintf(stderr,"failed to allocate %ld bytes\n",(long)(size*sizeof(double)));
      exit(1);
    }

    GRIB_CHECK_NOLINE(grib_get_double_array(h,"values",v,&size),0);

    if(options->verbose)
    {
      printf("Applying scale=%g/offset=%g\n",scale,offset);
    }

    for(i = 0; i< size; i++)
      v[i] =  v[i] * scale + offset;

    GRIB_CHECK_NOLINE(grib_set_double_array(h,"values",v,size),0);
    free(v);
  }

  grib_tools_write_message(options,h);

  return 0;
}
Esempio n. 6
0
/*
 The options have been parsed and the structure
 grib_runtime_options* options has been loaded.
 Initialisation and startup can be done here
*/
int grib_tool_init(grib_runtime_options* options)
{
    char  *theEnd = NULL, *end1=NULL;
    size_t size=4;
    int ret=0;
    double min=0,max=0;
    int i=0;
    char* p=NULL;
    if (options->latlon && grib_options_on("j")) {
        options->verbose=0;
        json_latlon=1;
    }

    if (options->latlon) {

        lat = strtod(options->latlon,&theEnd);
        if (*theEnd != ',') {
            printf("ERROR: wrong latitude value\n");
            exit(1);
        }
        lon= strtod(++theEnd,&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;
        int idx=0, land_found=0;
        double min_overall = 0.0;
        int idx_overall = -1;
        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];}
        min=max;
        min_overall=max;
        /* See GRIB-213 */
        for (i=0;i<4;i++) {
            if (min_overall >= options->distances[i]) { /* find overall min and index ignoring mask */
                min_overall = options->distances[i];
                idx_overall = i;
            }
            if ((min >= options->distances[i]) && (options->mask_values[i] >= 0.5)) {
                land_found=1; /* found at least one point which is land */
                min = options->distances[i];
                idx = i;
            }
        }
        if (land_found) {
            options->latlon_idx=idx;
        } else {
            options->latlon_idx=idx_overall; /* all points were sea, so pick the min overall */
        }

        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_latlon) printf("[\n");

    return 0;
}
Esempio n. 7
0
/*
 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 constraint
 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);
        if (err == GRIB_NOT_IMPLEMENTED) {
            char grid_type[100];
            size_t grid_type_len=100;
            int err1=grib_get_string(h, "gridType", grid_type, &grid_type_len);
            if (err1 == GRIB_SUCCESS) {
                fprintf(stderr,"Nearest neighbour functionality is not supported for grid type: %s\n", grid_type);
            }
        }
        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_latlon) {
            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;
}
Esempio n. 8
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;
    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];}
        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;
}