mirror of https://github.com/ecmwf/eccodes.git
grib_util_set_spec: Refactoring
This commit is contained in:
parent
796f4bc177
commit
dcde9eeb75
|
@ -826,16 +826,16 @@ static int is_constant_field(const double missingValue, const double* data_value
|
||||||
return constant;
|
return constant;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Utility function for when we fail to set the GRIB data values.
|
||||||
|
// Write out a text file called error.data containing the count of values
|
||||||
|
// and the actual values as doubles
|
||||||
static int write_out_error_data_file(const double* data_values, size_t data_values_count)
|
static int write_out_error_data_file(const double* data_values, size_t data_values_count)
|
||||||
{
|
{
|
||||||
FILE* ferror;
|
FILE* ferror = fopen("error.data", "w");
|
||||||
size_t ii, lcount;
|
size_t lcount = 0;
|
||||||
|
|
||||||
ferror = fopen("error.data", "w");
|
|
||||||
lcount = 0;
|
|
||||||
fprintf(ferror, "# data_values_count=%zu\n", data_values_count);
|
fprintf(ferror, "# data_values_count=%zu\n", data_values_count);
|
||||||
fprintf(ferror, "set values={ ");
|
fprintf(ferror, "set values={ ");
|
||||||
for (ii = 0; ii < data_values_count - 1; ii++) {
|
for (size_t ii = 0; ii < data_values_count - 1; ii++) {
|
||||||
fprintf(ferror, "%g, ", data_values[ii]);
|
fprintf(ferror, "%g, ", data_values[ii]);
|
||||||
if (lcount > 10) {
|
if (lcount > 10) {
|
||||||
fprintf(ferror, "\n");
|
fprintf(ferror, "\n");
|
||||||
|
@ -848,6 +848,41 @@ static int write_out_error_data_file(const double* data_values, size_t data_valu
|
||||||
return GRIB_SUCCESS;
|
return GRIB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_grib_sample_name(grib_handle* h, long editionNumber,
|
||||||
|
const grib_util_grid_spec2* spec, const char* grid_type, char* sample_name)
|
||||||
|
{
|
||||||
|
const size_t sample_name_len = 1024;
|
||||||
|
switch (spec->grid_type) {
|
||||||
|
case GRIB_UTIL_GRID_SPEC_REDUCED_GG:
|
||||||
|
case GRIB_UTIL_GRID_SPEC_REDUCED_ROTATED_GG:
|
||||||
|
/* Choose a sample with the right Gaussian number and edition */
|
||||||
|
snprintf(sample_name, sample_name_len, "%s_pl_%ld_grib%ld", grid_type, spec->N, editionNumber);
|
||||||
|
if (spec->pl && spec->pl_size) {
|
||||||
|
/* GRIB-834: pl is given so can use any of the reduced_gg_pl samples */
|
||||||
|
snprintf(sample_name, sample_name_len, "%s_pl_grib%ld", grid_type, editionNumber);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GRIB_UTIL_GRID_SPEC_LAMBERT_AZIMUTHAL_EQUAL_AREA:
|
||||||
|
case GRIB_UTIL_GRID_SPEC_UNSTRUCTURED:
|
||||||
|
case GRIB_UTIL_GRID_SPEC_LAMBERT_CONFORMAL:
|
||||||
|
snprintf(sample_name, sample_name_len, "GRIB%ld", editionNumber);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
snprintf(sample_name, sample_name_len, "%s_pl_grib%ld", grid_type, editionNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spec->pl && spec->grid_name) {
|
||||||
|
/* Cannot have BOTH pl and grid name specified */
|
||||||
|
fprintf(stderr, "GRIB_UTIL_SET_SPEC: Cannot set BOTH spec.pl and spec.grid_name!\n");
|
||||||
|
return GRIB_INTERNAL_ERROR;
|
||||||
|
}
|
||||||
|
if (spec->grid_name) {
|
||||||
|
snprintf(sample_name, sample_name_len, "%s_grib%ld", spec->grid_name, editionNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRIB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
grib_handle* grib_util_set_spec(grib_handle* h,
|
grib_handle* grib_util_set_spec(grib_handle* h,
|
||||||
const grib_util_grid_spec* spec,
|
const grib_util_grid_spec* spec,
|
||||||
const grib_util_packing_spec* packing_spec,
|
const grib_util_packing_spec* packing_spec,
|
||||||
|
@ -957,8 +992,7 @@ grib_handle* grib_util_set_spec2(grib_handle* h,
|
||||||
char input_grid_type[100];
|
char input_grid_type[100];
|
||||||
char input_packing_type[100];
|
char input_packing_type[100];
|
||||||
long input_bits_per_value = 0, editionNumber = 0, input_decimal_scale_factor = 0;
|
long input_bits_per_value = 0, editionNumber = 0, input_decimal_scale_factor = 0;
|
||||||
size_t count = 0, len = 100, slen = 20;
|
size_t count = 0, len = 100, slen = 20, input_grid_type_len = 100;
|
||||||
size_t input_grid_type_len = 100;
|
|
||||||
double laplacianOperator;
|
double laplacianOperator;
|
||||||
int i = 0, packingTypeIsSet = 0, setSecondOrder = 0, setJpegPacking = 0, setCcsdsPacking = 0;
|
int i = 0, packingTypeIsSet = 0, setSecondOrder = 0, setJpegPacking = 0, setCcsdsPacking = 0;
|
||||||
int convertEditionEarlier = 0; /* For cases when we cannot set some keys without converting */
|
int convertEditionEarlier = 0; /* For cases when we cannot set some keys without converting */
|
||||||
|
@ -1027,42 +1061,19 @@ grib_handle* grib_util_set_spec2(grib_handle* h,
|
||||||
SET_STRING_VALUE("gridType", grid_type);
|
SET_STRING_VALUE("gridType", grid_type);
|
||||||
|
|
||||||
/* The "pl" is given from the template, but "section_copy" will take care of setting the right headers */
|
/* The "pl" is given from the template, but "section_copy" will take care of setting the right headers */
|
||||||
{
|
if (get_grib_sample_name(h, editionNumber, spec, grid_type, sample_name) != GRIB_SUCCESS) {
|
||||||
switch (spec->grid_type) {
|
goto cleanup;
|
||||||
case GRIB_UTIL_GRID_SPEC_REDUCED_GG:
|
}
|
||||||
case GRIB_UTIL_GRID_SPEC_REDUCED_ROTATED_GG:
|
|
||||||
/* Choose a sample with the right Gaussian number and edition */
|
|
||||||
snprintf(sample_name, sizeof(sample_name), "%s_pl_%ld_grib%ld", grid_type, spec->N, editionNumber);
|
|
||||||
if (spec->pl && spec->pl_size) {
|
|
||||||
/* GRIB-834: pl is given so can use any of the reduced_gg_pl samples */
|
|
||||||
snprintf(sample_name, sizeof(sample_name), "%s_pl_grib%ld", grid_type, editionNumber);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GRIB_UTIL_GRID_SPEC_LAMBERT_AZIMUTHAL_EQUAL_AREA:
|
|
||||||
case GRIB_UTIL_GRID_SPEC_UNSTRUCTURED:
|
|
||||||
if (editionNumber == 1) { /* This grid type is not available in edition 1 */
|
|
||||||
if (h->context->debug == -1)
|
|
||||||
fprintf(stderr, "ECCODES DEBUG grib_util: '%s' specified "
|
|
||||||
"but input is GRIB1. Output must be a higher edition!\n",
|
|
||||||
grid_type);
|
|
||||||
convertEditionEarlier = 1;
|
|
||||||
}
|
|
||||||
snprintf(sample_name, sizeof(sample_name), "GRIB%ld", editionNumber);
|
|
||||||
break;
|
|
||||||
case GRIB_UTIL_GRID_SPEC_LAMBERT_CONFORMAL:
|
|
||||||
snprintf(sample_name, sizeof(sample_name), "GRIB%ld", editionNumber);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
snprintf(sample_name, sizeof(sample_name), "%s_pl_grib%ld", grid_type, editionNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spec->pl && spec->grid_name) {
|
if (spec->grid_type == GRIB_UTIL_GRID_SPEC_LAMBERT_AZIMUTHAL_EQUAL_AREA ||
|
||||||
/* Cannot have BOTH pl and grid name specified */
|
spec->grid_type == GRIB_UTIL_GRID_SPEC_UNSTRUCTURED) {
|
||||||
fprintf(stderr, "GRIB_UTIL_SET_SPEC: Cannot set BOTH spec.pl and spec.grid_name!\n");
|
if (editionNumber == 1) { /* These grid types are not available in edition 1 */
|
||||||
goto cleanup;
|
if (h->context->debug == -1)
|
||||||
}
|
fprintf(stderr,
|
||||||
if (spec->grid_name) {
|
"ECCODES DEBUG grib_util: '%s' specified "
|
||||||
snprintf(sample_name,sizeof(sample_name), "%s_grib%ld", spec->grid_name, editionNumber);
|
"but input is GRIB1. Output must be a higher edition!\n",
|
||||||
|
grid_type);
|
||||||
|
convertEditionEarlier = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue