Example #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;
}
Example #2
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;
}