mirror of https://github.com/ecmwf/eccodes.git
ECC-523: numberOfMissingValues incorrect with grid_complex_spatial_differencing
This commit is contained in:
parent
e9af73633d
commit
0c5b8c0330
|
@ -45,3 +45,8 @@ meta values data_apply_bitmap(codedValues,
|
||||||
alias data.packedValues = codedValues;
|
alias data.packedValues = codedValues;
|
||||||
|
|
||||||
template statistics "common/statistics_grid.def";
|
template statistics "common/statistics_grid.def";
|
||||||
|
if(missingValueManagementUsed) {
|
||||||
|
remove numberOfMissing;
|
||||||
|
meta numberOfMissing count_missing(bitmap,unusedBitsInBitmap,numberOfDataPoints,missingValueManagementUsed) : dump;
|
||||||
|
alias numberOfMissingValues=numberOfMissing;
|
||||||
|
}
|
||||||
|
|
|
@ -42,3 +42,8 @@ meta values data_apply_bitmap(codedValues,
|
||||||
alias data.packedValues=codedValues;
|
alias data.packedValues=codedValues;
|
||||||
|
|
||||||
template statistics "common/statistics_grid.def";
|
template statistics "common/statistics_grid.def";
|
||||||
|
if(missingValueManagementUsed) {
|
||||||
|
remove numberOfMissing;
|
||||||
|
meta numberOfMissing count_missing(bitmap,unusedBitsInBitmap,numberOfDataPoints,missingValueManagementUsed) : dump;
|
||||||
|
alias numberOfMissingValues=numberOfMissing;
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
MEMBERS = const char* bitmap
|
MEMBERS = const char* bitmap
|
||||||
MEMBERS = const char* unusedBitsInBitmap
|
MEMBERS = const char* unusedBitsInBitmap
|
||||||
MEMBERS = const char* numberOfDataPoints
|
MEMBERS = const char* numberOfDataPoints
|
||||||
|
MEMBERS = const char* missingValueManagementUsed
|
||||||
END_CLASS_DEF
|
END_CLASS_DEF
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@ -49,6 +50,7 @@ typedef struct grib_accessor_count_missing
|
||||||
const char* bitmap;
|
const char* bitmap;
|
||||||
const char* unusedBitsInBitmap;
|
const char* unusedBitsInBitmap;
|
||||||
const char* numberOfDataPoints;
|
const char* numberOfDataPoints;
|
||||||
|
const char* missingValueManagementUsed;
|
||||||
} grib_accessor_count_missing;
|
} grib_accessor_count_missing;
|
||||||
|
|
||||||
extern grib_accessor_class* grib_accessor_class_long;
|
extern grib_accessor_class* grib_accessor_class_long;
|
||||||
|
@ -181,11 +183,13 @@ static void init(grib_accessor* a, const long len, grib_arguments* arg)
|
||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
grib_accessor_count_missing* self = (grib_accessor_count_missing*)a;
|
grib_accessor_count_missing* self = (grib_accessor_count_missing*)a;
|
||||||
|
grib_handle* h = grib_handle_of_accessor(a);
|
||||||
a->length = 0;
|
a->length = 0;
|
||||||
a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY;
|
a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY;
|
||||||
self->bitmap = grib_arguments_get_name(grib_handle_of_accessor(a), arg, n++);
|
self->bitmap = grib_arguments_get_name(h, arg, n++);
|
||||||
self->unusedBitsInBitmap = grib_arguments_get_name(grib_handle_of_accessor(a), arg, n++);
|
self->unusedBitsInBitmap = grib_arguments_get_name(h, arg, n++);
|
||||||
self->numberOfDataPoints = grib_arguments_get_name(grib_handle_of_accessor(a), arg, n++);
|
self->numberOfDataPoints = grib_arguments_get_name(h, arg, n++);
|
||||||
|
self->missingValueManagementUsed = grib_arguments_get_name(h, arg, n++); /* Can be NULL */
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int used[] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
|
static const int used[] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
|
||||||
|
@ -202,10 +206,29 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len)
|
||||||
grib_handle* h = grib_handle_of_accessor(a);
|
grib_handle* h = grib_handle_of_accessor(a);
|
||||||
grib_accessor* bitmap = grib_find_accessor(h, self->bitmap);
|
grib_accessor* bitmap = grib_find_accessor(h, self->bitmap);
|
||||||
|
|
||||||
*val = 0;
|
*val = 0; /* By default assume none are missing */
|
||||||
*len = 1;
|
*len = 1;
|
||||||
if (!bitmap)
|
if (!bitmap) {
|
||||||
|
long mvmu = 0;
|
||||||
|
if (self->missingValueManagementUsed &&
|
||||||
|
grib_get_long(h, self->missingValueManagementUsed, &mvmu) == GRIB_SUCCESS && mvmu != 0)
|
||||||
|
{
|
||||||
|
long count_of_missing = 0;
|
||||||
|
size_t vsize = 0, ii=0;
|
||||||
|
double* values = NULL;
|
||||||
|
double mv = 0;
|
||||||
|
grib_get_double(h, "missingValue", &mv);
|
||||||
|
grib_get_size(h, "values", &vsize);
|
||||||
|
values = (double*)grib_context_malloc(h->context, vsize * sizeof(double));
|
||||||
|
grib_get_double_array(h, "values", values, &vsize);
|
||||||
|
for (ii = 0; ii < vsize; ii++) {
|
||||||
|
if (values[ii] == mv) ++count_of_missing;
|
||||||
|
}
|
||||||
|
grib_context_free(h->context, values);
|
||||||
|
*val = count_of_missing;
|
||||||
|
}
|
||||||
return GRIB_SUCCESS;
|
return GRIB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
size = grib_byte_count(bitmap);
|
size = grib_byte_count(bitmap);
|
||||||
offset = grib_byte_offset(bitmap);
|
offset = grib_byte_offset(bitmap);
|
||||||
|
|
Loading…
Reference in New Issue