From 479d5bb4c4b62d02b5c171a5a2c2d65a32886329 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 5 Feb 2024 17:52:08 +0000 Subject: [PATCH 001/244] Rename functions not to use double underscores --- src/eccodes_prototypes.h | 2 +- src/grib_accessor_class_gen.cc | 2 +- src/grib_accessor_class_to_double.cc | 2 +- src/grib_dumper_class_bufr_encode_C.cc | 2 +- src/grib_dumper_class_bufr_encode_filter.cc | 2 +- src/grib_dumper_class_bufr_encode_fortran.cc | 2 +- src/grib_dumper_class_bufr_encode_python.cc | 2 +- src/grib_dumper_class_debug.cc | 2 +- src/grib_dumper_class_default.cc | 2 +- src/grib_dumper_class_json.cc | 2 +- src/grib_dumper_class_wmo.cc | 2 +- src/grib_loader_from_handle.cc | 2 +- src/grib_value.cc | 6 +++--- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 307f29330..050376c86 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1173,7 +1173,7 @@ int grib_get_double_array(const grib_handle* h, const char* name, double* val, s int grib_get_float_array_internal(const grib_handle* h, const char* name, float* val, size_t* length); int grib_get_float_array(const grib_handle* h, const char* name, float* val, size_t* length); -int ecc__grib_get_string_length(grib_accessor* a, size_t* size); +int grib_get_string_length_acc(grib_accessor* a, size_t* size); int grib_get_string_length(const grib_handle* h, const char* name, size_t* size); int ecc__grib_get_size(const grib_handle* h, grib_accessor* a, size_t* size); int grib_get_size(const grib_handle* h, const char* name, size_t* size); diff --git a/src/grib_accessor_class_gen.cc b/src/grib_accessor_class_gen.cc index d74babf19..8b59b3b7a 100644 --- a/src/grib_accessor_class_gen.cc +++ b/src/grib_accessor_class_gen.cc @@ -385,7 +385,7 @@ static int unpack_string_array(grib_accessor* a, char** v, size_t* len) { size_t length = 0; - int err = ecc__grib_get_string_length(a, &length); + int err = grib_get_string_length_acc(a, &length); if (err) return err; v[0] = (char*)grib_context_malloc_clear(a->context, length); diff --git a/src/grib_accessor_class_to_double.cc b/src/grib_accessor_class_to_double.cc index 3f04524c6..c9725e52d 100644 --- a/src/grib_accessor_class_to_double.cc +++ b/src/grib_accessor_class_to_double.cc @@ -150,7 +150,7 @@ static size_t string_length(grib_accessor* a) if (self->length) return self->length; - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); return size; } diff --git a/src/grib_dumper_class_bufr_encode_C.cc b/src/grib_dumper_class_bufr_encode_C.cc index de68b423f..d07825434 100644 --- a/src/grib_dumper_class_bufr_encode_C.cc +++ b/src/grib_dumper_class_bufr_encode_C.cc @@ -675,7 +675,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) grib_handle* h = grib_handle_of_accessor(a); const char* acc_name = a->name; - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); if (size == 0) return; diff --git a/src/grib_dumper_class_bufr_encode_filter.cc b/src/grib_dumper_class_bufr_encode_filter.cc index d55eb767a..49c4d19ef 100644 --- a/src/grib_dumper_class_bufr_encode_filter.cc +++ b/src/grib_dumper_class_bufr_encode_filter.cc @@ -611,7 +611,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0 || (a->flags & GRIB_ACCESSOR_FLAG_READ_ONLY) != 0) return; - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); if (size == 0) return; diff --git a/src/grib_dumper_class_bufr_encode_fortran.cc b/src/grib_dumper_class_bufr_encode_fortran.cc index b0f462019..c689867b8 100644 --- a/src/grib_dumper_class_bufr_encode_fortran.cc +++ b/src/grib_dumper_class_bufr_encode_fortran.cc @@ -724,7 +724,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) grib_handle* h = grib_handle_of_accessor(a); const char* acc_name = a->name; - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); if (size == 0) return; diff --git a/src/grib_dumper_class_bufr_encode_python.cc b/src/grib_dumper_class_bufr_encode_python.cc index f4bcba49b..34367c913 100644 --- a/src/grib_dumper_class_bufr_encode_python.cc +++ b/src/grib_dumper_class_bufr_encode_python.cc @@ -665,7 +665,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) grib_handle* h = grib_handle_of_accessor(a); const char* acc_name = a->name; - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); if (size == 0) return; diff --git a/src/grib_dumper_class_debug.cc b/src/grib_dumper_class_debug.cc index cf92e9e28..77206c829 100644 --- a/src/grib_dumper_class_debug.cc +++ b/src/grib_dumper_class_debug.cc @@ -341,7 +341,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) if (a->length == 0 && (d->option_flags & GRIB_DUMP_FLAG_CODED) != 0) return; - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); if ((size < 2) && grib_is_missing_internal(a)) { /* GRIB-302: transients and missing keys. Need to re-adjust the size */ size = 10; /* big enough to hold the string "missing" */ diff --git a/src/grib_dumper_class_default.cc b/src/grib_dumper_class_default.cc index 61aface7f..e9bfdc702 100644 --- a/src/grib_dumper_class_default.cc +++ b/src/grib_dumper_class_default.cc @@ -410,7 +410,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) return; } - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); if (size == 0) return; diff --git a/src/grib_dumper_class_json.cc b/src/grib_dumper_class_json.cc index 3615595b2..be1b5bcc4 100644 --- a/src/grib_dumper_class_json.cc +++ b/src/grib_dumper_class_json.cc @@ -454,7 +454,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) /* ECC-710: It is MUCH slower determining the string length here * than using a maximum size (and no need for malloc). * Specially for BUFR elements */ - /* err = ecc__grib_get_string_length(a,&size); + /* err = grib_get_string_length_acc(a,&size); * if (size==0) return; * value=(char*)grib_context_malloc_clear(a->context,size); * if (!value) { diff --git a/src/grib_dumper_class_wmo.cc b/src/grib_dumper_class_wmo.cc index 4eab6d91d..814ed016f 100644 --- a/src/grib_dumper_class_wmo.cc +++ b/src/grib_dumper_class_wmo.cc @@ -311,7 +311,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) return; } - ecc__grib_get_string_length(a, &size); + grib_get_string_length_acc(a, &size); value = (char*)grib_context_malloc_clear(a->context, size); if (!value) { grib_context_log(a->context, GRIB_LOG_ERROR, "unable to allocate %zu bytes", size); diff --git a/src/grib_loader_from_handle.cc b/src/grib_loader_from_handle.cc index db2721598..cd5ae8513 100644 --- a/src/grib_loader_from_handle.cc +++ b/src/grib_loader_from_handle.cc @@ -166,7 +166,7 @@ int grib_init_accessor_from_handle(grib_loader* loader, grib_accessor* ga, grib_ switch (ga_type) { case GRIB_TYPE_STRING: - /*ecc__grib_get_string_length(ga,&len); See ECC-490 */ + /*grib_get_string_length_acc(ga,&len); See ECC-490 */ grib_get_string_length(h, name, &len); sval = (char*)grib_context_malloc(h->context, len); ret = grib_get_string_internal(h, name, sval, &len); diff --git a/src/grib_value.cc b/src/grib_value.cc index dba9852fa..e8471db6f 100644 --- a/src/grib_value.cc +++ b/src/grib_value.cc @@ -1358,7 +1358,7 @@ int grib_get_array(const grib_handle* h, const char* name, double* val, return grib_get_double_array(h, name, val, length); } -int ecc__grib_get_string_length(grib_accessor* a, size_t* size) +int grib_get_string_length_acc(grib_accessor* a, size_t* size) { size_t s = 0; @@ -1384,7 +1384,7 @@ int grib_get_string_length(const grib_handle* h, const char* name, size_t* size) al = grib_find_accessors_list(h, name); if (!al) return GRIB_NOT_FOUND; - ret = ecc__grib_get_string_length(al->accessor, size); + ret = grib_get_string_length_acc(al->accessor, size); grib_context_free(h->context, al); return ret; } @@ -1392,7 +1392,7 @@ int grib_get_string_length(const grib_handle* h, const char* name, size_t* size) a = grib_find_accessor(h, name); if (!a) return GRIB_NOT_FOUND; - return ecc__grib_get_string_length(a, size); + return grib_get_string_length_acc(a, size); } } From edf4e5ae27c30dfecd6e1881f24d9ef254635032 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 5 Feb 2024 21:26:35 +0000 Subject: [PATCH 002/244] Rename functions not to use double underscores --- src/eccodes_prototypes.h | 6 +----- src/grib_accessor_class_smart_table_column.cc | 4 ++-- src/grib_index.cc | 6 ++++-- src/grib_parse_utils.cc | 4 ++-- src/grib_value.cc | 12 ++++++------ 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 050376c86..6c8ee54a0 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -642,7 +642,6 @@ int grib_index_write(grib_index* index, const char* filename); grib_index* grib_index_read(grib_context* c, const char* filename, int* err); int grib_index_search_same(grib_index* index, grib_handle* h); int grib_index_add_file(grib_index* index, const char* filename); -int ecc__codes_index_add_file(grib_index* index, const char* filename, int message_type); grib_index* grib_index_new_from_file(grib_context* c, const char* filename, const char* keys, int* err); int grib_index_get_size(const grib_index* index, const char* key, size_t* size); int grib_index_get_string(const grib_index* index, const char* key, char** values, size_t* size); @@ -1166,7 +1165,6 @@ int grib_get_string_internal(grib_handle* h, const char* name, char* val, size_t int grib_get_string(const grib_handle* h, const char* name, char* val, size_t* length); int grib_get_bytes(const grib_handle* h, const char* name, unsigned char* val, size_t* length); int grib_get_native_type(const grib_handle* h, const char* name, int* type); -int ecc__grib_get_double_array_internal(const grib_handle* h, grib_accessor* a, double* val, size_t buffer_len, size_t* decoded_length); int grib_get_double_array_internal(const grib_handle* h, const char* name, double* val, size_t* length); int grib_get_double_array(const grib_handle* h, const char* name, double* val, size_t* length); @@ -1175,13 +1173,11 @@ int grib_get_float_array(const grib_handle* h, const char* name, float* val, siz int grib_get_string_length_acc(grib_accessor* a, size_t* size); int grib_get_string_length(const grib_handle* h, const char* name, size_t* size); -int ecc__grib_get_size(const grib_handle* h, grib_accessor* a, size_t* size); +int grib_get_size_acc(const grib_handle* h, grib_accessor* a, size_t* size); int grib_get_size(const grib_handle* h, const char* name, size_t* size); int grib_get_length(const grib_handle* h, const char* name, size_t* length); int grib_get_offset(const grib_handle* h, const char* key, size_t* val); -int ecc__grib_get_string_array_internal(const grib_handle* h, grib_accessor* a, char** val, size_t buffer_len, size_t* decoded_length); int grib_get_string_array(const grib_handle* h, const char* name, char** val, size_t* length); -int ecc__grib_get_long_array_internal(const grib_handle* h, grib_accessor* a, long* val, size_t buffer_len, size_t* decoded_length); int grib_get_long_array_internal(grib_handle* h, const char* name, long* val, size_t* length); int grib_get_long_array(const grib_handle* h, const char* name, long* val, size_t* length); int grib_set_values(grib_handle* h, grib_values* args, size_t count); diff --git a/src/grib_accessor_class_smart_table_column.cc b/src/grib_accessor_class_smart_table_column.cc index 11ff964d3..28e5a4798 100644 --- a/src/grib_accessor_class_smart_table_column.cc +++ b/src/grib_accessor_class_smart_table_column.cc @@ -173,7 +173,7 @@ static int unpack_string_array(grib_accessor* a, char** buffer, size_t* len) return GRIB_NOT_FOUND; } - err = ecc__grib_get_size(grib_handle_of_accessor(a), (grib_accessor*)tableAccessor, &size); + err = grib_get_size_acc(grib_handle_of_accessor(a), (grib_accessor*)tableAccessor, &size); if (err) return err; if (*len < size) { @@ -230,7 +230,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) return GRIB_NOT_FOUND; } - err = ecc__grib_get_size(grib_handle_of_accessor(a), (grib_accessor*)tableAccessor, &size); + err = grib_get_size_acc(grib_handle_of_accessor(a), (grib_accessor*)tableAccessor, &size); if (err) return err; if (*len < size) { diff --git a/src/grib_index.cc b/src/grib_index.cc index 9998ac843..225e502eb 100644 --- a/src/grib_index.cc +++ b/src/grib_index.cc @@ -62,6 +62,8 @@ static int grib_filesid = -1; static int index_count; static long values_count = 0; +static int codes_index_add_file_internal(grib_index* index, const char* filename, int message_type); + static char* get_key(char** keys, int* type) { char* key = NULL; @@ -1052,7 +1054,7 @@ int grib_index_add_file(grib_index* index, const char* filename) else if (index->product_kind == PRODUCT_BUFR) message_type = CODES_BUFR; else return GRIB_INVALID_ARGUMENT; - return ecc__codes_index_add_file(index, filename, message_type); + return codes_index_add_file_internal(index, filename, message_type); } static grib_handle* new_message_from_file(int message_type, grib_context* c, FILE* f, int* error) @@ -1067,7 +1069,7 @@ static grib_handle* new_message_from_file(int message_type, grib_context* c, FIL #define MAX_NUM_KEYS 40 -int ecc__codes_index_add_file(grib_index* index, const char* filename, int message_type) +static int codes_index_add_file_internal(grib_index* index, const char* filename, int message_type) { double dval; size_t svallen; diff --git a/src/grib_parse_utils.cc b/src/grib_parse_utils.cc index db8897930..2fb771cb7 100644 --- a/src/grib_parse_utils.cc +++ b/src/grib_parse_utils.cc @@ -210,7 +210,7 @@ int grib_recompose_name(grib_handle* h, grib_accessor* observer, const char* una // size = count; // } // else { -// ret = ecc__grib_get_size(h, a, &size); +// ret = grib_get_size_(h, a, &size); // } // if (ret) return ret; // dval = (double*)grib_context_malloc_clear(h->context, sizeof(double) * size); @@ -251,7 +251,7 @@ int grib_recompose_name(grib_handle* h, grib_accessor* observer, const char* una // size = count; // } // else { -// ret = ecc__grib_get_size(h, a, &size); +// ret = grib_get_size_(h, a, &size); // } // if (ret) return ret; // lval = (long*)grib_context_malloc_clear(h->context, sizeof(long) * size); diff --git a/src/grib_value.cc b/src/grib_value.cc index e8471db6f..d3542a02a 100644 --- a/src/grib_value.cc +++ b/src/grib_value.cc @@ -1144,7 +1144,7 @@ int grib_get_double_elements(const grib_handle* h, const char* name, const int* if (!act) return GRIB_NOT_FOUND; - err = ecc__grib_get_size(h, act, &size); + err = grib_get_size_acc(h, act, &size); if (err != GRIB_SUCCESS) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Cannot get size of %s", __func__, name); @@ -1396,7 +1396,7 @@ int grib_get_string_length(const grib_handle* h, const char* name, size_t* size) } } -int ecc__grib_get_size(const grib_handle* h, grib_accessor* a, size_t* size) +int grib_get_size_acc(const grib_handle* h, grib_accessor* a, size_t* size) { long count = 0; int err = 0; @@ -1444,7 +1444,7 @@ int grib_get_size(const grib_handle* ch, const char* name, size_t* size) return ret; } else - return ecc__grib_get_size(h, a, size); + return grib_get_size_acc(h, a, size); } } @@ -1477,10 +1477,10 @@ int grib_get_offset(const grib_handle* ch, const char* key, size_t* val) return GRIB_NOT_FOUND; } -int ecc__grib_get_string_array_internal(const grib_handle* h, grib_accessor* a, char** val, size_t buffer_len, size_t* decoded_length) +static int grib_get_string_array_internal_(const grib_handle* h, grib_accessor* a, char** val, size_t buffer_len, size_t* decoded_length) { if (a) { - int err = ecc__grib_get_string_array_internal(h, a->same, val, buffer_len, decoded_length); + int err = grib_get_string_array_internal_(h, a->same, val, buffer_len, decoded_length); if (err == GRIB_SUCCESS) { size_t len = buffer_len - *decoded_length; @@ -1519,7 +1519,7 @@ int grib_get_string_array(const grib_handle* h, const char* name, char** val, si } else { *length = 0; - return ecc__grib_get_string_array_internal(h, a, val, len, length); + return grib_get_string_array_internal_(h, a, val, len, length); } } } From e461c9e070d20ae94c855a2edc36ade4a39408f3 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 5 Feb 2024 21:36:20 +0000 Subject: [PATCH 003/244] Rename functions not to use double underscores --- src/eccodes_prototypes.h | 4 ++-- src/grib_accessor.cc | 16 ++++++++-------- src/grib_accessor_class.cc | 2 +- src/grib_dependency.cc | 2 +- src/grib_value.cc | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 6c8ee54a0..2d3ddab7d 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -155,7 +155,7 @@ int grib_accessor_replace_attribute(grib_accessor* a, grib_accessor* attr); int grib_accessor_delete_attribute(grib_accessor* a, const char* name); grib_accessor* grib_accessor_get_attribute_by_index(grib_accessor* a, int index); const char* grib_accessor_get_name(grib_accessor* a); -grib_accessor* ecc__grib_accessor_get_attribute(grib_accessor* a, const char* name, int* index); +grib_accessor* grib_accessor_get_attribute_index(grib_accessor* a, const char* name, int* index); int grib_accessor_has_attributes(grib_accessor* a); grib_accessor* grib_accessor_get_attribute(grib_accessor* a, const char* name); grib_accessors_list* grib_accessors_list_create(grib_context* c); @@ -1112,7 +1112,7 @@ char* get_external_template_path(grib_context* c, const char* name); grib_handle* grib_handle_of_accessor(const grib_accessor* a); void grib_dependency_add(grib_accessor* observer, grib_accessor* observed); void grib_dependency_remove_observed(grib_accessor* observed); -int ecc__grib_dependency_notify_change(grib_handle* h, grib_accessor* observed); +int grib_dependency_notify_change_h(grib_handle* h, grib_accessor* observed); int grib_dependency_notify_change(grib_accessor* observed); void grib_dependency_remove_observer(grib_accessor* observer); void grib_dependency_observe_expression(grib_accessor* observer, grib_expression* e); diff --git a/src/grib_accessor.cc b/src/grib_accessor.cc index 58cf51c0e..62d4c5e59 100644 --- a/src/grib_accessor.cc +++ b/src/grib_accessor.cc @@ -703,7 +703,7 @@ int grib_accessor_add_attribute(grib_accessor* a, grib_accessor* attr, int nest_ grib_accessor* aloc = a; if (grib_accessor_has_attributes(a)) { - same = ecc__grib_accessor_get_attribute(a, attr->name, &id); + same = grib_accessor_get_attribute_index(a, attr->name, &id); } if (same) { @@ -718,7 +718,7 @@ int grib_accessor_add_attribute(grib_accessor* a, grib_accessor* attr, int nest_ aloc->attributes[id] = attr; attr->parent_as_attribute = aloc; if (aloc->same) - attr->same = ecc__grib_accessor_get_attribute(aloc->same, attr->name, &idx); + attr->same = grib_accessor_get_attribute_index(aloc->same, attr->name, &idx); grib_context_log(a->context, GRIB_LOG_DEBUG, "added attribute %s->%s", a->name, attr->name); return GRIB_SUCCESS; @@ -731,12 +731,12 @@ int grib_accessor_replace_attribute(grib_accessor* a, grib_accessor* attr) { int id = 0; int idx = 0; - if (ecc__grib_accessor_get_attribute(a, attr->name, &id) != NULL) { + if (grib_accessor_get_attribute_index(a, attr->name, &id) != NULL) { grib_accessor_delete(a->context, a->attributes[id]); a->attributes[id] = attr; attr->parent_as_attribute = a; if (a->same) - attr->same = ecc__grib_accessor_get_attribute(a->same, attr->name, &idx); + attr->same = grib_accessor_get_attribute_index(a->same, attr->name, &idx); } else { grib_accessor_add_attribute(a, attr, 0); @@ -747,7 +747,7 @@ int grib_accessor_replace_attribute(grib_accessor* a, grib_accessor* attr) int grib_accessor_delete_attribute(grib_accessor* a, const char* name) { int id = 0; - if (ecc__grib_accessor_get_attribute(a, name, &id) != NULL) { + if (grib_accessor_get_attribute_index(a, name, &id) != NULL) { grib_accessor_delete(a->context, a->attributes[id]); a->attributes[id] = NULL; return GRIB_SUCCESS; @@ -770,7 +770,7 @@ const char* grib_accessor_get_name(grib_accessor* a) return a->name; } -grib_accessor* ecc__grib_accessor_get_attribute(grib_accessor* a, const char* name, int* index) +grib_accessor* grib_accessor_get_attribute_index(grib_accessor* a, const char* name, int* index) { int i = 0; while (i < MAX_ACCESSOR_ATTRIBUTES && a->attributes[i]) { @@ -799,14 +799,14 @@ grib_accessor* grib_accessor_get_attribute(grib_accessor* a, const char* name) while (*(p + 1) != '\0' && (*p != '-' || *(p + 1) != '>')) p++; if (*(p + 1) == '\0') { - return ecc__grib_accessor_get_attribute(a, name, &index); + return grib_accessor_get_attribute_index(a, name, &index); } else { size_t size = p - name; attribute_name = p + 2; basename = (char*)grib_context_malloc_clear(a->context, size + 1); basename = (char*)memcpy(basename, name, size); - acc = ecc__grib_accessor_get_attribute(a, basename, &index); + acc = grib_accessor_get_attribute_index(a, basename, &index); grib_context_free(a->context, basename); if (acc) return grib_accessor_get_attribute(acc, attribute_name); diff --git a/src/grib_accessor_class.cc b/src/grib_accessor_class.cc index 9de104328..9cdd04b97 100644 --- a/src/grib_accessor_class.cc +++ b/src/grib_accessor_class.cc @@ -226,7 +226,7 @@ static void link_same_attributes(grib_accessor* a, grib_accessor* b) if (!grib_accessor_has_attributes(b)) return; while (i < MAX_ACCESSOR_ATTRIBUTES && a->attributes[i]) { - bAttribute = ecc__grib_accessor_get_attribute(b, a->attributes[i]->name, &idx); + bAttribute = grib_accessor_get_attribute_index(b, a->attributes[i]->name, &idx); if (bAttribute) a->attributes[i]->same = bAttribute; i++; diff --git a/src/grib_dependency.cc b/src/grib_dependency.cc index 769ec49ce..4c417173e 100644 --- a/src/grib_dependency.cc +++ b/src/grib_dependency.cc @@ -134,7 +134,7 @@ int grib_dependency_notify_change(grib_accessor* observed) /* This version takes in the handle so does not need to work it out from the 'observed' */ /* See ECC-778 */ -int ecc__grib_dependency_notify_change(grib_handle* h, grib_accessor* observed) +int grib_dependency_notify_change_h(grib_handle* h, grib_accessor* observed) { grib_dependency* d = h->dependencies; int ret = GRIB_SUCCESS; diff --git a/src/grib_value.cc b/src/grib_value.cc index d3542a02a..1320bc9b7 100644 --- a/src/grib_value.cc +++ b/src/grib_value.cc @@ -701,7 +701,7 @@ static int _grib_set_double_array_internal(grib_handle* h, grib_accessor* a, *encoded_length += len; if (err == GRIB_SUCCESS) { /* See ECC-778 */ - return ecc__grib_dependency_notify_change(h, a); + return grib_dependency_notify_change_h(h, a); } } else { @@ -739,7 +739,7 @@ static int _grib_set_double_array(grib_handle* h, const char* name, err = GRIB_ARRAY_TOO_SMALL; if (err == GRIB_SUCCESS) - return ecc__grib_dependency_notify_change(h, a); /* See ECC-778 */ + return grib_dependency_notify_change_h(h, a); /* See ECC-778 */ return err; } From f5659205f2cd8ccf766f6a303a3f71f6a2efee54 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 6 Feb 2024 19:42:54 +0000 Subject: [PATCH 004/244] Bump up version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index dc1591835..aa5388f63 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.34.0 +2.35.0 From e2aed08b295869be2e7e050be04f588364f584f8 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 6 Feb 2024 19:43:29 +0000 Subject: [PATCH 005/244] Add newline at end of file --- definitions/grib2/combinationOfAttributesOfTileConcept.def | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/definitions/grib2/combinationOfAttributesOfTileConcept.def b/definitions/grib2/combinationOfAttributesOfTileConcept.def index 93d23dd1e..a220e5f32 100644 --- a/definitions/grib2/combinationOfAttributesOfTileConcept.def +++ b/definitions/grib2/combinationOfAttributesOfTileConcept.def @@ -37,4 +37,5 @@ 'SNOW_ICE_ITCW_ITCS' = {attributeOfTile = [2,4,5,6];} 'FLOOD_ICE_ITCW_ITCS' = {attributeOfTile = [3,4,5,6];} -'SNOW_FLOOD_ICE_ITCW_ITCS' = {attributeOfTile = [2,3,4,5,6];} \ No newline at end of file +'SNOW_FLOOD_ICE_ITCW_ITCS' = {attributeOfTile = [2,3,4,5,6];} + From 8a8da1b4abb29d97fec27b88a7c26c61e462c7a0 Mon Sep 17 00:00:00 2001 From: Robert Osinski Date: Wed, 7 Feb 2024 15:24:28 +0000 Subject: [PATCH 006/244] ECC-1762: add GRIB1 key name aliases to wave spectra template with explicit list --- definitions/grib2/template.4.wave.def | 4 ++++ definitions/grib2/template.4.wave_spectra_list.def | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/definitions/grib2/template.4.wave.def b/definitions/grib2/template.4.wave.def index a5bfac03c..37c3f4523 100644 --- a/definitions/grib2/template.4.wave.def +++ b/definitions/grib2/template.4.wave.def @@ -3,16 +3,20 @@ ## Direction part unsigned[2] waveDirectionNumber : dump; alias mars.direction = waveDirectionNumber; +alias directionNumber = waveDirectionNumber; unsigned[2] numberOfWaveDirections = 1 : dump; alias totalNumberOfWaveDirections = numberOfWaveDirections; +alias numberOfDirections = totalNumberOfWaveDirections; ## Frequency part unsigned[2] waveFrequencyNumber : dump; alias mars.frequency = waveFrequencyNumber; +alias frequencyNumber = waveFrequencyNumber; unsigned[2] numberOfWaveFrequencies = 1 : dump; alias totalNumberOfWaveFrequencies = numberOfWaveFrequencies; +alias numberOfFrequencies = totalNumberOfWaveFrequencies; constant waveLevType="sfc"; alias mars.levtype = waveLevType; diff --git a/definitions/grib2/template.4.wave_spectra_list.def b/definitions/grib2/template.4.wave_spectra_list.def index f90e2dc35..85fa6fc7d 100644 --- a/definitions/grib2/template.4.wave_spectra_list.def +++ b/definitions/grib2/template.4.wave_spectra_list.def @@ -3,11 +3,15 @@ ## Direction part signed[1] scaleFactorOfWaveDirections : dump; alias integerScalingFactorAppliedToDirections = scaleFactorOfWaveDirections; +alias directionScalingFactor = integerScalingFactorAppliedToDirections; unsigned[4] scaledValuesOfWaveDirections[numberOfWaveDirections] : dump; +alias scaledDirections = scaledValuesOfWaveDirections ; ## Frequency part signed[1] scaleFactorOfWaveFrequencies : dump; alias integerScalingFactorAppliedToFrequencies = scaleFactorOfWaveFrequencies; +alias frequencyScalingFactor = integerScalingFactorAppliedToFrequencies; unsigned[4] scaledValuesOfWaveFrequencies[numberOfWaveFrequencies] : dump; +alias scaledFrequencies = scaledValuesOfWaveFrequencies; From a8403a78d3d2e8896f4b495a55f2e6d3301769b3 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 7 Feb 2024 17:23:55 +0000 Subject: [PATCH 007/244] Update list of keys and hash --- src/grib_hash_keys.cc | 15115 +++++++++++++++++++--------------------- tests/keys | 4492 ++++++------ 2 files changed, 9544 insertions(+), 10063 deletions(-) diff --git a/src/grib_hash_keys.cc b/src/grib_hash_keys.cc index 72ea01ba8..a71738e88 100644 --- a/src/grib_hash_keys.cc +++ b/src/grib_hash_keys.cc @@ -34,12 +34,12 @@ struct grib_keys_hash { char* name; int id;}; #include -#define TOTAL_KEYWORDS 2515 +#define TOTAL_KEYWORDS 2535 #define MIN_WORD_LENGTH 1 #define MAX_WORD_LENGTH 74 -#define MIN_HASH_VALUE 1 -#define MAX_HASH_VALUE 35025 -/* maximum key range = 35025, duplicates = 0 */ +#define MIN_HASH_VALUE 5 +#define MAX_HASH_VALUE 31933 +/* maximum key range = 31929, duplicates = 0 */ #ifdef __GNUC__ __inline @@ -49,38 +49,38 @@ inline #endif #endif static unsigned int -hash_keys (const char *str, size_t len) +hash_keys ( const char *str, size_t len) { static const unsigned short asso_values[] = { - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 0, 35026, 35026, 0, 35026, 35026, 234, 2699, - 2224, 1675, 1605, 3094, 675, 1950, 12, 8, 0, 0, - 1, 35026, 35026, 35026, 35026, 1804, 4449, 2653, 255, 2074, - 287, 4792, 2756, 1496, 719, 601, 347, 2199, 596, 311, - 988, 96, 321, 172, 102, 5477, 1495, 4148, 2234, 4002, - 2, 0, 2, 35026, 35026, 2631, 35026, 5, 560, 46, - 3, 1, 131, 91, 130, 7, 2778, 3209, 35, 3, - 0, 20, 27, 1086, 3, 7, 2, 85, 267, 184, - 1169, 137, 1006, 70, 1045, 0, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, - 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026, 35026 + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 4, 31934, 31934, 3, 31934, 31934, 128, 2530, + 2404, 2966, 1876, 4070, 2455, 1706, 29, 8, 3, 2, + 2, 31934, 31934, 31934, 31934, 1215, 5157, 2523, 271, 2023, + 345, 5101, 4026, 1640, 545, 118, 46, 2382, 974, 289, + 1046, 28, 528, 161, 96, 4953, 1277, 3682, 373, 5709, + 2, 3, 2, 31934, 31934, 1817, 31934, 2, 372, 30, + 5, 3, 92, 103, 97, 8, 2721, 3959, 75, 3, + 2, 23, 18, 1060, 5, 14, 4, 48, 321, 249, + 1467, 224, 572, 5, 1867, 2, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, + 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934, 31934 }; - unsigned int hval = len; + unsigned int hval = len; switch (hval) { @@ -164,1164 +164,1288 @@ hash_keys (const char *str, size_t len) static const unsigned char lengthtable[] = { - 0, 1, 0, 3, 0, 1, 2, 1, 2, 2, 2, 0, 2, 3, - 4, 2, 4, 0, 4, 0, 5, 0, 0, 0, 4, 3, 0, 0, - 5, 4, 6, 0, 0, 0, 7, 5, 0, 0, 4, 8, 0, 0, - 0, 0, 6, 3, 0, 7, 0, 5, 7, 5, 0, 0, 0, 0, - 9, 9, 4, 0, 6, 9, 9, 0, 0, 0, 8, 0, 4, 0, - 7, 7, 10, 0, 10, 4, 6, 0, 0, 7, 0, 0, 5, 0, - 0, 0, 6, 0, 10, 0, 7, 8, 0, 0, 0, 0, 4, 10, - 9, 2, 0, 0, 5, 0, 5, 6, 5, 6, 0, 10, 0, 4, - 5, 5, 7, 8, 0, 0, 7, 0, 0, 6, 10, 6, 0, 7, - 0, 9, 0, 0, 0, 0, 0, 8, 6, 0, 0, 8, 0, 0, - 10, 0, 0, 5, 0, 0, 0, 5, 3, 8, 0, 10, 0, 4, - 7, 0, 0, 0, 10, 0, 5, 0, 0, 9, 0, 0, 6, 0, - 6, 0, 0, 0, 4, 0, 3, 10, 5, 0, 0, 4, 0, 5, - 15, 1, 0, 5, 0, 0, 0, 9, 10, 4, 0, 13, 0, 7, - 0, 9, 0, 0, 10, 0, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 9, 0, 0, 10, 0, 0, 10, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 3, 14, 0, 0, 0, 7, 7, 0, 8, - 5, 0, 7, 0, 0, 0, 10, 4, 0, 0, 0, 8, 10, 0, - 0, 0, 9, 8, 0, 9, 0, 7, 0, 0, 0, 8, 9, 0, - 0, 0, 10, 0, 4, 2, 0, 0, 11, 2, 0, 0, 0, 2, - 0, 5, 6, 0, 0, 3, 0, 8, 0, 0, 5, 8, 0, 7, - 8, 0, 11, 8, 9, 0, 6, 0, 0, 0, 0, 0, 0, 8, - 2, 0, 0, 6, 7, 8, 10, 0, 10, 0, 10, 0, 5, 0, - 0, 13, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 10, 0, - 0, 11, 0, 0, 0, 0, 6, 9, 0, 0, 8, 9, 0, 0, - 10, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 10, 0, - 10, 8, 5, 0, 0, 0, 0, 0, 0, 5, 0, 0, 12, 0, - 0, 5, 8, 7, 0, 10, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 14, 6, 8, 14, 0, 0, - 0, 0, 0, 3, 9, 0, 0, 6, 9, 11, 0, 8, 0, 0, - 10, 0, 0, 14, 3, 0, 0, 0, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, - 2, 0, 0, 6, 0, 0, 0, 6, 0, 3, 6, 8, 0, 0, - 0, 0, 0, 9, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 11, 0, 0, 13, 0, - 17, 0, 6, 14, 12, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 5, 18, 0, 0, 0, 0, 0, 0, 11, 0, 12, 0, 0, - 8, 15, 0, 10, 0, 10, 24, 8, 0, 0, 0, 0, 0, 2, - 8, 0, 0, 0, 0, 0, 17, 0, 0, 12, 0, 0, 0, 0, - 0, 0, 0, 11, 0, 10, 0, 13, 0, 10, 0, 0, 0, 13, - 11, 0, 0, 2, 0, 0, 0, 11, 14, 0, 0, 0, 10, 3, - 4, 4, 0, 0, 0, 0, 12, 14, 0, 13, 0, 12, 0, 7, - 0, 14, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 17, - 0, 0, 2, 0, 0, 10, 15, 19, 0, 0, 2, 20, 0, 0, - 9, 0, 8, 0, 5, 10, 14, 2, 0, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 13, 0, 0, 0, 12, 0, - 13, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 10, 6, 0, 11, 0, 0, 0, 0, 0, 0, 3, 0, - 10, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 8, 0, 13, - 0, 0, 17, 0, 0, 13, 0, 0, 12, 0, 0, 14, 0, 12, - 12, 0, 0, 0, 0, 0, 0, 18, 0, 3, 0, 0, 0, 9, - 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, 0, 0, 10, 0, - 19, 9, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 13, 0, - 12, 8, 0, 0, 0, 0, 0, 0, 0, 0, 14, 17, 0, 13, - 0, 10, 14, 23, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 9, 12, 0, 0, 0, 12, 0, - 0, 15, 0, 6, 0, 6, 15, 0, 0, 0, 0, 0, 15, 0, - 0, 23, 0, 0, 2, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, - 0, 0, 0, 22, 25, 0, 13, 11, 0, 15, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, - 10, 0, 0, 0, 2, 0, 13, 10, 0, 0, 0, 17, 0, 0, - 0, 0, 14, 0, 0, 15, 0, 17, 0, 0, 0, 0, 0, 0, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 12, 17, 0, 16, 13, 0, 3, 0, 0, 0, 14, - 0, 14, 0, 0, 0, 0, 12, 0, 0, 14, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 10, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 3, 19, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 22, 13, 0, 0, 0, 0, 0, - 0, 27, 0, 11, 0, 21, 0, 0, 22, 0, 0, 0, 0, 18, - 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 39, 40, 0, - 11, 0, 0, 0, 3, 13, 0, 0, 18, 0, 0, 0, 0, 18, - 15, 0, 0, 0, 0, 0, 0, 37, 0, 0, 22, 14, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 5, - 12, 13, 8, 10, 4, 0, 0, 0, 14, 0, 0, 0, 8, 15, - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, - 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 30, 0, 17, 0, - 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 18, 15, 0, - 19, 19, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 15, 0, - 0, 0, 14, 0, 17, 0, 0, 0, 0, 0, 0, 0, 8, 0, - 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 0, 0, 10, 0, 15, 0, 15, 0, 0, - 0, 25, 0, 1, 0, 0, 0, 0, 0, 15, 0, 0, 0, 1, - 8, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 31, 13, - 0, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, 8, 13, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 16, 0, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 2, 1, 0, 3, 2, 0, + 2, 2, 2, 4, 3, 4, 0, 4, 0, 0, 0, 4, 2, 0, + 0, 0, 0, 5, 0, 0, 3, 8, 0, 0, 5, 0, 6, 0, + 4, 5, 5, 7, 0, 0, 0, 0, 5, 6, 3, 0, 4, 0, + 6, 0, 4, 9, 7, 4, 7, 0, 0, 0, 7, 4, 4, 5, + 9, 0, 0, 7, 0, 0, 0, 6, 0, 9, 0, 0, 5, 10, + 0, 7, 9, 3, 6, 6, 10, 0, 0, 7, 2, 5, 10, 4, + 0, 9, 0, 0, 6, 8, 0, 0, 6, 10, 3, 3, 0, 0, + 10, 0, 8, 0, 5, 0, 4, 5, 5, 0, 9, 5, 7, 0, + 10, 3, 7, 0, 4, 0, 7, 0, 8, 8, 0, 0, 9, 0, + 0, 6, 5, 4, 7, 10, 6, 0, 0, 0, 8, 0, 0, 10, + 5, 0, 0, 6, 9, 0, 8, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 2, 0, 0, 9, 0, 10, 0, 7, 0, 0, 0, 0, + 4, 0, 10, 4, 9, 0, 5, 5, 0, 6, 0, 0, 5, 0, + 0, 8, 4, 0, 15, 9, 0, 7, 10, 0, 11, 1, 8, 0, + 0, 0, 0, 0, 0, 10, 0, 10, 6, 10, 0, 7, 6, 0, + 5, 0, 0, 0, 0, 0, 0, 5, 0, 8, 0, 0, 8, 1, + 6, 10, 10, 0, 9, 4, 8, 0, 0, 17, 0, 0, 13, 12, + 0, 7, 0, 10, 4, 0, 0, 10, 0, 0, 0, 0, 0, 8, + 0, 11, 0, 0, 0, 6, 0, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 5, 0, 0, 0, 2, 2, 9, 0, 7, + 0, 0, 0, 0, 0, 5, 0, 0, 3, 0, 8, 5, 0, 0, + 0, 10, 6, 2, 0, 0, 6, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 9, 0, 9, 0, 11, 0, 0, 0, 6, + 0, 9, 0, 0, 0, 0, 9, 0, 8, 10, 0, 0, 0, 6, + 8, 12, 0, 0, 0, 7, 12, 0, 0, 20, 0, 0, 0, 0, + 14, 8, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 0, + 0, 4, 0, 5, 0, 9, 10, 7, 13, 0, 0, 0, 4, 8, + 10, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 12, 0, 10, 7, 2, 10, 8, 0, 6, 0, 0, 0, 13, + 2, 2, 0, 8, 14, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 19, 0, 10, 0, 10, 0, 2, 0, 6, 0, 0, 0, + 0, 7, 0, 0, 9, 0, 0, 2, 0, 0, 3, 0, 0, 18, + 0, 0, 0, 11, 0, 0, 9, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, + 13, 0, 24, 0, 14, 0, 2, 9, 0, 0, 11, 0, 8, 0, + 10, 0, 0, 0, 0, 0, 0, 6, 5, 0, 0, 8, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 0, 0, 11, 0, 14, 0, 0, 0, 17, 11, 11, 3, + 0, 0, 15, 0, 0, 0, 10, 16, 0, 0, 9, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 7, 0, 0, 0, 0, 12, 0, + 0, 0, 8, 0, 0, 11, 14, 0, 11, 0, 0, 0, 10, 0, + 0, 13, 0, 0, 0, 3, 11, 0, 0, 12, 14, 0, 0, 0, + 0, 8, 0, 20, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 8, 11, 15, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 4, 0, 17, 0, 15, 0, 5, 0, 17, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 8, 17, 0, 17, 23, 0, 0, 10, 0, + 7, 8, 14, 0, 2, 18, 0, 0, 12, 0, 7, 0, 0, 0, + 0, 0, 9, 0, 0, 12, 0, 0, 0, 0, 13, 0, 0, 14, + 0, 19, 0, 9, 13, 0, 0, 13, 0, 13, 12, 0, 0, 0, + 23, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 14, 0, 0, 0, 0, 2, 0, 3, 0, 0, 4, 0, + 18, 14, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 0, 10, 11, 0, 0, 0, 0, 0, 0, + 13, 0, 12, 0, 0, 0, 15, 0, 0, 8, 0, 0, 0, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 11, 0, 0, 0, 0, 17, 19, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 17, 0, 0, 24, 0, 0, 0, + 11, 0, 0, 0, 19, 0, 9, 15, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 23, 9, 22, 0, 8, 10, 0, 0, 0, 0, 0, + 12, 0, 9, 0, 0, 7, 0, 14, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 25, 0, 12, 0, + 0, 2, 14, 0, 0, 0, 0, 0, 0, 12, 0, 9, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 7, 0, 0, - 10, 11, 21, 11, 2, 0, 9, 0, 16, 24, 0, 0, 0, 16, - 30, 0, 13, 0, 0, 0, 0, 48, 0, 0, 27, 0, 0, 0, - 11, 0, 0, 0, 15, 0, 16, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, - 0, 24, 9, 0, 23, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 15, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, + 0, 11, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 15, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 27, 2, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 10, 19, + 0, 14, 0, 0, 5, 37, 0, 0, 0, 0, 0, 0, 12, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 11, 0, 0, 0, 18, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 13, 0, 14, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 14, + 0, 0, 12, 0, 2, 17, 22, 9, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 18, 0, 18, 1, + 10, 0, 9, 0, 12, 10, 0, 0, 0, 15, 0, 9, 0, 0, + 0, 3, 0, 0, 0, 15, 11, 6, 8, 21, 21, 0, 0, 0, + 0, 18, 0, 0, 14, 0, 0, 0, 3, 0, 8, 10, 0, 0, + 22, 20, 0, 9, 0, 9, 0, 16, 0, 0, 0, 0, 0, 0, + 0, 16, 0, 0, 0, 0, 8, 39, 40, 0, 0, 0, 2, 3, + 0, 0, 0, 0, 21, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 13, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 30, 0, 8, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 15, 0, 10, 0, 0, 0, 0, 21, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 20, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 10, 16, 0, 0, 0, 12, 0, 0, 0, 0, 16, 12, + 0, 0, 14, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 18, 0, 11, 0, 0, 0, 0, 0, 0, 0, 13, 0, 19, + 0, 0, 0, 21, 0, 0, 0, 0, 13, 0, 0, 6, 0, 0, + 11, 0, 0, 0, 12, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 10, 13, 0, 0, 0, 0, 0, 13, 0, 21, 0, 15, 0, 0, + 0, 30, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 24, 0, 23, 0, 14, 0, 11, 0, 0, 15, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 16, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 48, 8, 0, 0, 0, 0, 2, 15, 30, 30, + 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 15, 27, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 10, 3, + 10, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 31, 16, + 0, 0, 0, 0, 0, 0, 0, 31, 12, 0, 0, 0, 0, 0, + 0, 16, 9, 0, 30, 0, 23, 14, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 12, 0, 23, 0, + 0, 15, 5, 0, 7, 20, 0, 0, 44, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 13, 11, 0, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 11, 0, 0, 0, 0, 0, 11, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 31, 0, 1, 0, 8, - 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 14, 0, 0, 18, - 8, 0, 12, 16, 0, 0, 21, 0, 0, 0, 0, 0, 18, 44, - 12, 0, 0, 0, 0, 0, 0, 6, 0, 0, 11, 0, 0, 6, - 0, 0, 0, 0, 16, 0, 26, 0, 0, 30, 0, 23, 21, 25, - 0, 0, 9, 0, 23, 0, 0, 0, 11, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 6, - 30, 0, 0, 0, 0, 9, 23, 11, 0, 0, 0, 5, 0, 0, - 0, 57, 19, 0, 0, 0, 0, 0, 0, 11, 13, 14, 7, 0, - 0, 0, 19, 12, 0, 0, 0, 10, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 10, 22, 0, 0, 0, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 27, 0, 0, 0, 16, 0, 0, 0, 24, 24, - 0, 0, 13, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 15, 9, 0, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 15, - 0, 18, 18, 0, 0, 16, 0, 0, 10, 0, 18, 17, 0, 0, - 0, 0, 22, 0, 39, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 21, 0, 0, 11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 48, 0, 0, 30, 0, 0, - 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 18, 0, 0, 0, 0, 0, 0, 17, 18, 0, - 0, 0, 0, 0, 19, 0, 0, 0, 0, 13, 13, 0, 0, 19, - 30, 0, 19, 0, 15, 0, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 13, 0, 0, 0, 0, 24, 32, 14, 0, 13, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, - 14, 0, 26, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 21, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 19, 13, 0, 0, 0, 0, 0, 31, 6, - 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 33, 0, 22, 0, 0, 0, 32, 0, 0, - 0, 0, 13, 0, 0, 10, 19, 0, 0, 0, 14, 14, 0, 0, - 0, 0, 26, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 0, 0, 0, 0, 24, 0, 0, 15, 13, 0, - 0, 11, 0, 0, 0, 6, 15, 0, 0, 0, 0, 0, 9, 0, - 16, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, - 16, 14, 0, 1, 14, 11, 0, 0, 0, 0, 0, 23, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 20, 0, - 0, 0, 0, 0, 22, 0, 20, 31, 35, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 9, 14, - 0, 15, 0, 0, 0, 0, 7, 0, 0, 0, 23, 13, 0, 0, - 0, 12, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, - 0, 18, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 35, 11, - 0, 22, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, - 0, 32, 0, 19, 14, 0, 15, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 25, 0, 0, - 0, 25, 0, 0, 12, 0, 0, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 13, 33, 0, - 27, 13, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 19, 0, - 0, 0, 0, 0, 11, 10, 12, 0, 0, 16, 0, 0, 0, 0, - 28, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, - 0, 0, 28, 0, 10, 0, 10, 0, 0, 0, 0, 23, 0, 23, - 20, 0, 19, 0, 15, 11, 13, 0, 15, 0, 0, 0, 0, 0, - 0, 19, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 0, 0, 7, 0, 0, 17, 2, 0, 0, 0, 0, 0, - 27, 0, 18, 0, 27, 0, 0, 0, 2, 0, 0, 0, 28, 9, - 0, 15, 0, 25, 9, 0, 0, 0, 0, 25, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 9, 0, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 25, 0, - 14, 0, 0, 0, 0, 2, 0, 0, 0, 32, 9, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 29, 0, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 13, 0, 17, 0, 11, 16, 23, 0, 0, 0, - 16, 11, 19, 16, 39, 27, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 12, 0, 0, 0, 0, 17, 17, 0, 0, 0, 20, 0, 15, - 15, 20, 15, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 22, 0, 0, 0, 0, 0, 12, 42, 15, 10, 0, - 0, 0, 13, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 15, - 13, 21, 0, 0, 20, 15, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 18, 0, - 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 22, 0, 0, 11, 18, 0, 0, 0, 0, 15, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 0, 0, 0, 22, 0, 0, 2, 14, 0, - 0, 0, 24, 0, 0, 25, 14, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 2, 17, - 11, 9, 0, 12, 0, 0, 21, 0, 0, 14, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 12, 0, 0, 0, 0, 0, 0, 0, 14, - 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 22, - 10, 13, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 19, 0, - 18, 0, 0, 0, 16, 0, 0, 0, 0, 0, 17, 0, 30, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 17, 0, - 0, 0, 28, 0, 0, 11, 0, 0, 0, 0, 0, 22, 0, 2, - 0, 0, 0, 23, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 10, - 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 12, 0, 23, - 14, 16, 0, 0, 3, 0, 0, 0, 0, 0, 19, 9, 0, 0, - 0, 23, 0, 9, 0, 12, 0, 0, 13, 0, 0, 8, 0, 31, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 28, 0, 0, - 0, 3, 14, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, - 0, 16, 23, 0, 0, 0, 12, 3, 0, 13, 21, 0, 0, 0, - 0, 30, 0, 23, 0, 0, 25, 0, 16, 0, 20, 0, 13, 10, - 10, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 12, 0, 13, 2, 0, 0, 0, 0, - 0, 10, 0, 0, 9, 0, 0, 18, 0, 0, 10, 12, 21, 0, - 0, 0, 0, 0, 0, 28, 21, 0, 0, 21, 0, 0, 0, 0, - 12, 0, 8, 0, 0, 9, 0, 0, 2, 0, 22, 0, 10, 15, - 0, 0, 34, 10, 0, 0, 0, 0, 0, 20, 0, 0, 0, 13, - 0, 0, 0, 0, 0, 0, 0, 11, 0, 18, 0, 38, 0, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 15, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 12, 0, 18, 37, 0, 12, 13, 0, - 17, 12, 0, 0, 0, 22, 10, 0, 0, 16, 0, 16, 17, 0, - 10, 3, 0, 0, 18, 29, 0, 0, 0, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 13, 0, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 9, 0, 22, 0, 0, 3, 11, - 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 14, 0, 0, 0, 0, 31, 0, - 9, 0, 0, 10, 0, 0, 0, 0, 12, 0, 0, 16, 0, 0, - 0, 15, 0, 0, 0, 20, 0, 16, 0, 0, 0, 23, 0, 0, - 3, 0, 0, 20, 17, 0, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 0, 0, 0, 0, 28, 32, 0, 0, 17, 19, 22, 0, - 0, 0, 0, 0, 0, 25, 0, 0, 27, 20, 0, 0, 0, 0, - 0, 15, 0, 0, 11, 31, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 24, 13, - 0, 0, 0, 16, 13, 0, 0, 0, 0, 0, 36, 29, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 0, 26, 0, 0, 12, 19, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 6, 0, 0, 11, - 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 17, 0, 14, 0, 0, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 30, 0, 0, 0, 0, - 7, 0, 0, 15, 0, 0, 0, 0, 19, 0, 0, 0, 22, 16, - 9, 0, 0, 0, 15, 0, 0, 19, 22, 0, 0, 8, 0, 0, - 0, 4, 0, 0, 22, 0, 0, 0, 0, 17, 0, 0, 0, 31, - 0, 0, 0, 15, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 24, 0, 0, 15, 2, 0, 0, 8, 16, 0, 0, 0, - 3, 0, 16, 0, 22, 0, 0, 18, 11, 0, 0, 11, 0, 23, - 0, 0, 0, 0, 0, 7, 0, 17, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 25, 0, 21, 0, 0, 0, 0, 6, 0, 0, - 12, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 0, 0, 0, - 21, 0, 0, 16, 0, 22, 0, 0, 18, 5, 11, 0, 0, 0, - 0, 8, 0, 23, 0, 0, 0, 0, 0, 0, 28, 15, 0, 0, - 0, 15, 16, 20, 0, 0, 20, 0, 23, 9, 0, 0, 0, 0, - 22, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, - 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 24, 0, 0, 0, 0, 28, 0, 9, 0, 0, 0, - 0, 18, 0, 0, 0, 7, 0, 0, 0, 16, 0, 0, 0, 0, - 15, 0, 0, 34, 0, 18, 23, 10, 0, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 11, 25, 0, - 0, 0, 16, 0, 15, 0, 15, 31, 0, 0, 0, 0, 0, 0, - 0, 11, 0, 30, 0, 34, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 21, - 0, 15, 0, 0, 2, 4, 0, 23, 0, 0, 40, 0, 0, 14, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 37, 0, 35, 0, 0, 0, 13, 0, 0, - 0, 0, 29, 0, 14, 9, 14, 0, 0, 0, 0, 0, 0, 14, - 0, 0, 0, 17, 0, 0, 0, 0, 0, 20, 0, 0, 38, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, - 18, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 0, 0, 0, 0, 0, 0, 23, 0, 0, 12, 10, - 37, 0, 0, 0, 11, 15, 0, 0, 0, 0, 0, 0, 0, 12, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 25, 0, + 0, 0, 0, 0, 11, 0, 30, 0, 0, 10, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, - 17, 14, 42, 20, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 23, 0, 0, 0, 0, 0, 21, 0, 14, 17, 0, 24, 14, - 0, 15, 0, 0, 0, 0, 0, 48, 0, 25, 15, 0, 30, 11, - 0, 0, 0, 0, 0, 0, 14, 20, 16, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 20, 0, 0, 24, 0, 0, 24, 0, 13, 0, 0, - 27, 0, 0, 14, 0, 15, 0, 0, 0, 0, 0, 17, 0, 36, - 12, 0, 0, 0, 0, 11, 0, 0, 13, 14, 0, 0, 23, 24, - 15, 0, 0, 20, 33, 0, 0, 14, 0, 20, 0, 31, 0, 12, - 0, 0, 14, 0, 16, 0, 15, 0, 0, 0, 15, 0, 0, 0, - 9, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, - 27, 0, 0, 0, 0, 15, 0, 0, 0, 14, 0, 14, 0, 0, - 0, 17, 0, 0, 0, 13, 0, 0, 29, 0, 0, 0, 0, 31, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 0, 19, - 0, 13, 0, 0, 0, 0, 0, 0, 35, 21, 47, 0, 10, 0, - 0, 8, 13, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 50, - 0, 0, 0, 19, 0, 37, 19, 0, 0, 0, 24, 0, 14, 0, - 0, 0, 23, 0, 31, 15, 0, 26, 0, 0, 15, 8, 0, 0, - 18, 0, 0, 0, 16, 0, 15, 12, 0, 0, 11, 0, 2, 0, - 0, 0, 0, 0, 19, 0, 0, 23, 0, 0, 0, 0, 2, 0, - 0, 0, 33, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 9, - 25, 0, 32, 0, 0, 0, 18, 25, 0, 15, 0, 0, 0, 0, - 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 34, 0, 14, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 17, - 0, 16, 10, 0, 0, 0, 0, 0, 0, 12, 13, 25, 0, 0, - 13, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 12, 0, 0, - 20, 0, 0, 0, 28, 16, 19, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 15, 12, 15, 9, 12, 0, 0, 15, 0, 0, 0, - 0, 18, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 21, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12, 0, 0, 0, 0, 0, 14, 0, 10, 0, 0, 22, - 0, 0, 0, 11, 0, 15, 33, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 23, 0, 0, 0, 14, 22, 18, 0, 18, 0, - 0, 14, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 31, 0, 10, 0, 0, 0, 29, 0, 15, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, - 0, 26, 0, 0, 0, 16, 0, 0, 0, 0, 10, 25, 19, 0, - 0, 0, 35, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 13, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 1, 21, 0, 22, 14, 0, 0, 25, 0, 0, 0, - 0, 14, 0, 0, 21, 12, 0, 0, 0, 22, 0, 0, 0, 0, - 0, 35, 24, 19, 31, 0, 0, 0, 0, 0, 0, 0, 26, 22, - 0, 0, 0, 22, 0, 0, 16, 0, 0, 0, 17, 0, 2, 29, - 0, 0, 0, 0, 0, 0, 26, 0, 15, 0, 22, 11, 0, 14, - 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, - 27, 0, 17, 15, 23, 3, 0, 0, 14, 18, 2, 13, 0, 25, - 0, 0, 0, 6, 0, 0, 0, 0, 32, 0, 0, 14, 0, 0, - 23, 0, 0, 0, 29, 16, 0, 18, 0, 11, 0, 11, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 25, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, - 27, 0, 0, 26, 0, 30, 11, 14, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 38, 0, 0, 0, 14, 0, 0, - 0, 14, 0, 18, 0, 14, 0, 9, 0, 26, 0, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 0, 31, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 50, 20, 0, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 23, - 0, 0, 20, 17, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 16, 0, 19, 0, 0, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 0, 0, 11, 15, 0, 6, 11, 13, 15, 22, - 0, 0, 13, 0, 0, 28, 0, 0, 0, 15, 0, 0, 0, 13, - 27, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 30, 35, - 15, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, - 0, 30, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 29, - 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 19, 13, 0, 0, - 12, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 11, - 0, 3, 0, 14, 0, 4, 0, 0, 0, 0, 12, 0, 17, 6, - 0, 0, 3, 21, 0, 0, 4, 0, 0, 21, 15, 0, 0, 0, - 33, 0, 0, 0, 8, 0, 0, 0, 9, 12, 22, 0, 0, 11, - 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 0, 27, 0, 0, 24, 0, 0, 14, 0, 11, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 26, 0, 11, 8, 0, 0, 0, 0, + 21, 0, 0, 17, 15, 13, 0, 0, 0, 23, 0, 25, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 14, 16, 13, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 34, 0, - 12, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, - 0, 0, 0, 0, 0, 18, 15, 15, 0, 0, 0, 14, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 33, 0, 33, 18, 0, 0, 0, 16, 15, 15, 0, - 0, 0, 0, 28, 0, 32, 42, 0, 0, 0, 0, 0, 0, 0, - 0, 35, 20, 0, 15, 0, 0, 0, 0, 11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 0, 14, 23, 0, 0, 0, 37, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 39, 0, 25, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 30, 11, 0, 0, 26, 24, - 0, 0, 18, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 8, 0, 0, 15, 0, 0, - 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 20, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, - 23, 0, 0, 22, 42, 0, 0, 14, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, - 28, 15, 0, 0, 0, 0, 0, 13, 0, 0, 0, 22, 15, 0, - 0, 0, 0, 23, 46, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 17, 0, + 0, 0, 13, 16, 0, 6, 0, 7, 0, 19, 6, 9, 0, 16, + 12, 0, 0, 0, 0, 7, 9, 0, 0, 26, 0, 0, 0, 0, + 0, 23, 0, 0, 0, 0, 10, 0, 0, 57, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 30, 0, 23, + 0, 0, 3, 0, 0, 19, 0, 0, 14, 32, 0, 0, 42, 18, + 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 8, 11, 13, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 18, 0, 34, 0, 22, + 0, 15, 0, 19, 15, 0, 14, 13, 15, 0, 0, 0, 13, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 11, 0, 0, + 0, 12, 0, 0, 0, 0, 0, 0, 6, 0, 11, 0, 12, 0, + 0, 0, 0, 0, 14, 0, 0, 22, 0, 0, 0, 0, 18, 10, + 14, 31, 32, 0, 13, 6, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 20, 13, 0, 0, 0, 0, 0, 26, 35, 0, 12, + 0, 0, 14, 0, 0, 0, 15, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 8, 0, 0, 0, 15, 0, + 0, 0, 11, 0, 23, 0, 0, 0, 0, 0, 29, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 25, 0, 0, 31, 0, 15, 0, 7, 0, 11, 0, - 0, 18, 18, 0, 0, 3, 10, 0, 0, 29, 14, 0, 19, 0, - 0, 0, 33, 27, 0, 19, 0, 0, 0, 0, 0, 0, 37, 0, - 17, 0, 15, 0, 0, 0, 0, 12, 0, 0, 0, 0, 34, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 21, 0, 0, 13, 21, 0, 0, 0, 0, 0, - 0, 18, 0, 11, 0, 50, 0, 12, 12, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 22, 0, 12, 0, 12, 15, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, - 15, 0, 0, 0, 0, 0, 27, 0, 0, 0, 15, 0, 0, 24, - 0, 0, 8, 0, 13, 43, 0, 0, 22, 31, 0, 26, 33, 0, - 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 34, 0, 11, 10, 0, 0, 0, 0, - 0, 0, 0, 3, 0, 12, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 27, 16, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11, 0, 0, 0, 20, 32, 23, 0, 0, 29, 0, - 0, 8, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, - 0, 32, 8, 0, 14, 0, 0, 23, 0, 18, 0, 0, 16, 0, - 43, 0, 30, 0, 0, 0, 27, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 0, 11, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, - 19, 0, 9, 0, 0, 11, 0, 0, 0, 0, 0, 24, 0, 32, - 0, 15, 13, 0, 0, 15, 0, 0, 0, 0, 12, 0, 16, 0, - 0, 0, 27, 0, 11, 0, 7, 0, 0, 0, 19, 0, 0, 0, - 12, 35, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 0, 0, 14, 0, 31, 0, 0, 0, 30, 25, 0, 0, - 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 0, 0, 14, 0, 0, 0, 19, 0, 0, 0, 21, - 0, 0, 0, 0, 0, 0, 31, 16, 0, 0, 0, 0, 0, 23, - 0, 0, 0, 0, 0, 0, 32, 0, 9, 9, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 9, 0, 32, 0, 0, 35, 11, 0, 0, - 24, 0, 43, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 21, 0, 0, 0, 0, - 14, 25, 0, 0, 14, 0, 0, 0, 0, 0, 16, 0, 0, 3, - 0, 0, 0, 4, 0, 0, 0, 0, 30, 0, 0, 6, 0, 0, - 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 21, 0, 0, 0, - 0, 0, 0, 13, 0, 0, 0, 0, 22, 15, 18, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 2, 0, 18, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 12, 16, 14, 0, 0, 0, 73, 74, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 15, 22, 0, 0, 0, 0, 0, 0, 30, - 0, 0, 0, 0, 18, 13, 0, 0, 0, 0, 0, 0, 0, 12, - 0, 14, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 16, - 14, 0, 0, 26, 0, 0, 0, 0, 0, 0, 23, 10, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 13, 0, 19, 0, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 9, 0, 0, - 8, 0, 28, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 22, 0, 0, 0, 0, 15, 0, 0, 18, 24, 0, 0, 6, 0, - 13, 28, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 12, 28, 0, 0, 0, 0, 23, - 12, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, - 0, 0, 0, 6, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 23, 0, 0, 0, 0, 44, 2, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 16, 0, 11, 0, 0, 0, 23, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 22, 2, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 25, 0, 0, 13, - 0, 0, 14, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 11, 0, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 38, 20, 13, 0, 0, 0, 31, 0, 14, 0, 0, - 0, 0, 0, 10, 0, 0, 28, 15, 0, 0, 0, 12, 0, 0, - 0, 0, 14, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 3, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 0, 25, 0, 0, 0, 0, 27, 15, 10, 0, 0, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 15, 0, - 0, 0, 0, 18, 0, 12, 0, 21, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 21, 0, 38, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 36, 0, 0, 0, 27, 0, 0, 0, 0, 18, 0, 0, - 0, 0, 23, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 31, 0, 26, 0, 0, 24, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, - 15, 0, 0, 0, 14, 0, 0, 28, 0, 0, 0, 4, 0, 11, - 0, 0, 36, 0, 0, 0, 0, 30, 0, 0, 0, 18, 0, 0, - 30, 0, 0, 0, 16, 0, 0, 0, 0, 0, 28, 11, 14, 29, - 0, 26, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 26, 0, 13, - 0, 0, 0, 15, 0, 0, 0, 30, 0, 0, 0, 14, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 37, - 0, 31, 0, 0, 0, 0, 24, 6, 0, 11, 0, 0, 0, 23, - 0, 0, 0, 0, 0, 0, 15, 0, 8, 0, 28, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 19, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 19, 0, 0, 0, 0, 0, 0, 43, 0, 24, - 14, 0, 0, 0, 0, 0, 2, 0, 19, 0, 7, 18, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 19, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 24, 37, 0, 0, 0, - 0, 0, 32, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 13, - 0, 13, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14, 0, 0, 24, 0, 0, 10, 0, 0, - 18, 36, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 11, 12, 1, 0, 0, 0, 13, 0, 39, 0, 0, 0, 18, + 0, 22, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 29, 0, + 0, 9, 0, 13, 0, 0, 0, 0, 12, 10, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 19, + 0, 0, 3, 0, 0, 26, 0, 0, 0, 2, 0, 0, 9, 0, + 0, 0, 23, 0, 0, 18, 0, 0, 0, 14, 0, 0, 0, 13, + 15, 0, 2, 0, 0, 0, 0, 0, 26, 8, 0, 16, 0, 0, + 0, 0, 0, 19, 0, 25, 0, 0, 0, 0, 0, 10, 0, 0, + 27, 0, 0, 10, 9, 0, 13, 27, 10, 0, 10, 10, 25, 0, + 9, 0, 19, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 1, 32, 0, 5, 10, 12, 9, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 23, - 0, 0, 0, 0, 0, 0, 43, 0, 5, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 18, 14, 0, 0, 0, - 30, 0, 0, 0, 0, 16, 0, 0, 0, 27, 0, 0, 10, 0, - 8, 0, 0, 0, 19, 0, 0, 23, 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 11, 0, 0, 0, 0, 23, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 34, 26, 19, 0, 18, 0, 0, 0, 35, - 0, 14, 0, 0, 40, 0, 0, 0, 0, 0, 0, 22, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 23, 0, - 0, 0, 13, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 23, 0, 32, 0, 19, 0, 29, 0, 0, 0, 0, 0, - 0, 0, 0, 41, 0, 0, 0, 0, 26, 29, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 14, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 18, 0, 36, 0, 0, 33, 0, 0, 0, 0, 28, - 18, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, - 17, 0, 23, 0, 0, 11, 0, 0, 0, 0, 11, 23, 0, 0, - 0, 0, 0, 17, 16, 0, 15, 16, 0, 29, 0, 0, 0, 0, - 0, 14, 0, 0, 14, 0, 0, 0, 0, 0, 36, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 15, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 22, 0, 0, - 0, 0, 0, 0, 14, 72, 39, 0, 0, 0, 29, 0, 0, 0, - 0, 28, 0, 0, 0, 35, 15, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 15, 29, 23, 29, 0, - 0, 0, 0, 9, 31, 0, 0, 0, 0, 14, 0, 0, 0, 21, - 24, 10, 22, 0, 0, 0, 11, 29, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 26, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 11, 10, 0, 22, 0, 0, 0, + 14, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 31, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 29, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, 28, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 14, 0, 30, 0, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 16, - 24, 0, 24, 0, 0, 0, 22, 0, 0, 0, 0, 0, 26, 0, + 0, 22, 0, 18, 0, 19, 0, 0, 0, 0, 0, 10, 9, 0, + 0, 0, 12, 13, 15, 0, 0, 0, 0, 0, 0, 0, 23, 18, + 0, 0, 15, 0, 0, 0, 30, 0, 0, 0, 0, 25, 0, 0, + 23, 0, 17, 0, 18, 0, 27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 9, 12, 0, 12, 0, 0, 0, 0, 21, 3, 20, + 0, 0, 0, 0, 0, 25, 10, 33, 0, 0, 10, 0, 0, 0, + 16, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 23, 0, + 0, 15, 12, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 26, 0, 28, 0, 19, 0, 0, 0, 0, 24, - 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 13, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 16, 0, - 0, 0, 24, 0, 0, 0, 0, 0, 27, 14, 22, 0, 0, 0, - 10, 0, 0, 28, 0, 0, 15, 0, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 15, 0, 17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 25, + 35, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 0, 15, 0, 10, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 23, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 35, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 23, 0, 14, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 21, 0, 0, 21, 0, 0, 16, + 0, 29, 11, 0, 0, 0, 0, 0, 22, 0, 0, 10, 0, 27, + 0, 24, 0, 0, 0, 0, 11, 0, 0, 0, 0, 21, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 18, + 0, 13, 10, 0, 0, 22, 25, 32, 0, 9, 0, 0, 12, 0, + 0, 0, 0, 0, 0, 22, 13, 0, 10, 0, 0, 28, 10, 0, + 0, 33, 38, 0, 23, 13, 0, 0, 0, 30, 0, 31, 0, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, + 0, 27, 0, 0, 22, 0, 9, 11, 16, 0, 0, 0, 17, 42, + 0, 0, 0, 0, 19, 0, 10, 0, 0, 0, 0, 0, 16, 0, + 0, 15, 17, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 13, 10, 6, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 18, 11, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 20, 0, 0, 0, - 34, 0, 0, 0, 36, 0, 0, 0, 0, 24, 0, 0, 0, 18, + 0, 9, 0, 13, 0, 0, 0, 17, 0, 24, 0, 0, 0, 31, + 0, 0, 0, 0, 12, 0, 0, 13, 0, 0, 0, 23, 0, 0, + 14, 18, 16, 0, 2, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, + 14, 0, 0, 0, 0, 0, 13, 0, 28, 0, 0, 0, 0, 9, + 0, 0, 11, 0, 0, 16, 0, 39, 0, 0, 0, 0, 0, 12, + 0, 0, 13, 15, 0, 0, 0, 15, 0, 0, 0, 12, 0, 31, + 0, 24, 20, 0, 12, 0, 15, 0, 10, 0, 0, 0, 0, 30, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 38, + 42, 0, 18, 0, 21, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 13, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 14, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 11, + 30, 11, 0, 0, 16, 0, 16, 0, 19, 13, 26, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 0, 33, 25, 0, 0, 0, 19, - 0, 0, 0, 0, 0, 36, 0, 13, 0, 0, 0, 0, 31, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 29, 0, + 0, 0, 17, 18, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 15, 0, 15, 0, 0, 16, 0, 0, 0, 22, + 0, 15, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, + 18, 2, 3, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 12, 0, 12, 0, 23, 0, 0, 0, 0, 0, 0, 0, + 2, 23, 7, 20, 9, 0, 0, 0, 0, 17, 0, 37, 0, 0, + 14, 0, 18, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 10, 21, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 16, 15, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 20, 13, 0, 0, 0, 0, 0, 14, 0, + 34, 0, 2, 0, 15, 0, 0, 0, 0, 0, 0, 20, 0, 17, + 0, 0, 0, 0, 0, 12, 0, 13, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 27, 0, 0, 0, 2, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 33, 43, 11, 0, 14, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, - 0, 0, 30, 35, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 3, 0, 28, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 20, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 22, 0, 0, 30, 0, 0, 0, 26, 0, + 0, 0, 22, 0, 13, 0, 0, 0, 0, 0, 18, 16, 23, 10, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 6, 0, 0, 0, 0, + 0, 22, 27, 0, 0, 0, 0, 0, 0, 0, 15, 32, 15, 28, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 24, 0, 17, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 11, 0, + 0, 0, 0, 0, 0, 28, 17, 0, 0, 28, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 14, 0, 0, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 22, 0, 0, 0, 17, 15, + 0, 0, 0, 0, 36, 30, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 28, 31, 0, 0, + 0, 0, 0, 0, 17, 15, 0, 0, 0, 21, 0, 0, 0, 17, + 0, 9, 0, 15, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 22, 0, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 24, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 28, 17, 0, 0, 0, 0, 12, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 9, 0, 24, + 23, 0, 5, 0, 0, 0, 0, 0, 0, 0, 21, 0, 23, 0, + 0, 0, 0, 13, 0, 0, 24, 0, 18, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 24, 0, 0, 0, 0, 0, 17, 0, 31, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 0, 19, 26, 35, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 4, 0, 8, 0, 0, 0, 0, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 13, 22, 2, 0, 0, 0, 40, 0, 14, 0, 16, 0, 21, 0, + 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 0, 0, 20, 0, 0, 30, 0, 0, + 0, 0, 0, 0, 29, 16, 4, 0, 0, 0, 0, 0, 0, 23, + 31, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 26, 0, 24, 0, 0, 0, 0, 0, 0, 38, 31, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 18, 0, + 0, 42, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 11, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 3, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 28, 0, 0, 0, 8, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, 0, 0, 0, 37, 0, 0, 0, 0, 21, 13, 0, + 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 25, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, + 0, 21, 0, 0, 0, 18, 17, 14, 24, 12, 0, 0, 0, 0, + 0, 0, 25, 30, 20, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 14, 0, 0, 6, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 37, 0, 0, 0, 0, 0, 0, 12, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 20, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 30, 0, - 0, 21, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 0, 0, 30, 28, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 0, 0, 0, 28, - 0, 22, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 34, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 34, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 24, 30, 29, 0, 0, 0, 23, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 33, 0, 0, 28, - 0, 29, 0, 0, 0, 12, 0, 0, 30, 15, 0, 0, 0, 21, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 30, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, - 0, 0, 0, 22, 0, 0, 0, 0, 0, 22, 0, 16, 0, 34, - 17, 7, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 35, 0, 0, - 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 22, 0, - 0, 23, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 18, 0, 4, 0, 0, 0, 0, 22, 0, - 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, - 0, 28, 0, 0, 10, 0, 0, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 19, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 0, 0, 0, 0, 20, 22, 0, 0, 15, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 29, 0, - 0, 0, 0, 0, 27, 14, 27, 0, 0, 23, 27, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 33, 0, 0, 0, 0, 0, 0, 25, 0, 0, 2, 0, 25, 0, - 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 25, 0, - 16, 0, 29, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 29, - 19, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 13, 39, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 28, 0, 0, 0, 0, 0, 0, 29, 0, 13, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 11, 0, 0, - 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, - 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, - 0, 32, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 13, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 22, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 27, 16, 0, 19, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 13, 0, 0, 9, 0, 0, 0, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 17, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 11, - 0, 0, 0, 0, 0, 29, 0, 0, 33, 0, 0, 24, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, - 0, 25, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 22, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 0, 0, 10, 0, 0, 0, 0, 0, 22, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, - 0, 0, 29, 0, 0, 0, 15, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 24, 0, 0, 0, 27, 0, 0, 0, - 0, 0, 37, 19, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 22, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 24, 20, - 25, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 17, 0, 0, 0, 29, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 14, 16, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 27, 0, 16, 0, 18, 0, 0, - 25, 0, 0, 0, 25, 0, 0, 0, 0, 22, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 22, 0, 0, 0, 0, 12, 0, 27, 0, 27, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 28, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 14, 0, + 19, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 25, 0, 15, + 21, 0, 16, 18, 0, 0, 30, 14, 0, 0, 0, 14, 0, 0, + 14, 37, 0, 0, 0, 29, 0, 3, 0, 0, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 12, 35, 0, 0, 0, 31, 0, 0, 0, 0, 15, 0, 0, + 0, 15, 0, 0, 23, 0, 0, 0, 0, 15, 25, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 0, 22, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 25, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 24, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, - 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, - 0, 0, 21, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, - 0, 0, 16, 43, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 16, - 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, - 0, 15, 24, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 16, 14, 0, 0, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 0, 22, 0, 27, 0, 33, - 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 28, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 18, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 0, 0, 17, 7, 0, 0, 0, 0, 0, 0, - 0, 37, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 13, - 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 38, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 17, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 31, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 38, 0, 0, 13, 0, 0, 0, 16, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 0, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, 32, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 37, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, 32, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 70, 31, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 22, 17, 0, 0, 8, 37, - 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 0, 0, 0, 36, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 15, 17, 25, 0, 0, 0, 0, 14, 17, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 17, 0, 0, 31, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 14, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, 15, 0, 0, 0, 0, 0, 13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 14, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 13, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, - 0, 0, 23, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 24, 0, 0, 0, 0, 4, 23, 15, 0, 0, 0, 15, 0, + 0, 13, 0, 33, 0, 0, 0, 26, 24, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 20, 13, 0, + 0, 0, 33, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 15, + 0, 0, 0, 15, 0, 0, 22, 0, 0, 26, 0, 0, 14, 0, + 18, 0, 0, 0, 0, 0, 13, 0, 0, 8, 0, 15, 10, 0, + 36, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 18, 21, 0, 0, 0, 0, 0, 10, 0, 16, + 27, 0, 0, 0, 14, 27, 0, 16, 16, 0, 0, 0, 0, 0, + 18, 0, 0, 14, 0, 0, 0, 0, 0, 0, 16, 14, 0, 17, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 14, 0, 33, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 35, 0, 0, 18, 0, 15, 0, 0, 0, + 0, 0, 47, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 26, 0, 29, 18, + 18, 0, 31, 0, 0, 17, 0, 0, 0, 34, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 14, 0, + 13, 0, 0, 0, 0, 15, 20, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 0, 13, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 11, 32, 0, 12, 0, + 0, 0, 0, 0, 17, 0, 18, 0, 31, 9, 0, 0, 22, 0, + 15, 0, 0, 0, 11, 0, 15, 11, 13, 0, 0, 0, 35, 11, + 15, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, + 0, 0, 10, 15, 0, 23, 0, 0, 0, 6, 0, 0, 7, 19, + 0, 0, 14, 31, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, + 0, 0, 0, 12, 0, 0, 23, 0, 0, 0, 0, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 15, 0, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, - 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 14, 0, + 0, 14, 0, 10, 0, 0, 0, 0, 0, 46, 12, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 15, 29, 14, + 17, 14, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 18, 0, 18, 15, 34, 0, 0, 0, 7, 0, 16, 19, 4, 0, + 0, 0, 0, 0, 19, 0, 42, 0, 13, 0, 0, 0, 0, 13, + 0, 16, 25, 0, 15, 0, 0, 0, 0, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 18, 20, 0, 0, 22, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 13, 0, 0, 0, 24, 0, 15, 0, 15, + 0, 0, 12, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 35, + 11, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, 10, 23, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 22, 0, 10, 17, 0, 0, 23, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 0, 0, 19, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 12, + 0, 0, 22, 0, 0, 0, 0, 19, 0, 0, 0, 21, 29, 22, + 27, 0, 0, 0, 25, 0, 29, 9, 14, 11, 0, 0, 14, 0, + 23, 24, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, 13, 0, 0, 0, 28, 0, 0, 0, 13, 0, + 0, 0, 23, 28, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 30, 0, 0, 0, 18, 13, 0, 0, 16, 0, 0, 22, 0, 31, + 32, 39, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 24, 0, 22, 0, 0, 0, + 0, 15, 0, 26, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 0, 24, 0, 2, 0, 26, 0, + 0, 0, 0, 0, 0, 0, 12, 25, 17, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 13, 3, + 0, 0, 0, 0, 0, 0, 15, 0, 32, 15, 0, 0, 6, 0, + 30, 3, 0, 0, 21, 13, 0, 4, 0, 0, 0, 12, 20, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 14, 0, 0, + 4, 0, 0, 0, 0, 25, 0, 12, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 27, 0, 15, 0, 0, 0, + 19, 0, 14, 0, 0, 0, 0, 0, 2, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 27, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 25, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 33, 0, 33, 0, 0, 0, 0, + 0, 0, 12, 0, 14, 0, 0, 0, 0, 0, 14, 0, 0, 13, + 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 3, 0, 0, 0, 0, 0, 4, 0, 0, 0, 28, 0, 13, + 0, 0, 0, 0, 6, 0, 16, 0, 3, 0, 12, 0, 0, 34, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 20, 8, 0, 0, 0, 0, 0, 0, 6, 0, 27, + 17, 0, 9, 0, 0, 0, 17, 0, 0, 0, 9, 0, 0, 73, + 74, 0, 9, 2, 0, 0, 19, 0, 0, 11, 0, 0, 0, 0, + 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 18, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, + 20, 27, 0, 10, 0, 0, 0, 0, 0, 23, 22, 33, 0, 0, + 0, 50, 24, 22, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 9, 0, 0, 20, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 37, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 14, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 15, 0, + 0, 6, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 11, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 11, 29, 15, 0, 0, 9, 0, 13, 0, + 14, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 12, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 15, + 0, 0, 21, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 33, 16, 0, 11, 16, 0, 0, 0, 14, 0, + 0, 0, 22, 11, 0, 34, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 24, + 0, 0, 16, 27, 0, 0, 29, 0, 0, 15, 0, 12, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 9, 0, 0, 8, 0, 0, 31, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 28, 0, 26, 0, 0, 0, 19, 0, 0, 25, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, + 0, 30, 0, 2, 15, 25, 12, 0, 0, 0, 0, 7, 0, 0, + 0, 14, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 25, 0, 11, 0, 2, 0, 0, 23, 0, 0, 0, + 0, 0, 0, 2, 24, 0, 0, 0, 0, 0, 10, 22, 0, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 21, 0, 15, 0, + 28, 0, 2, 0, 0, 0, 0, 15, 24, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 32, 0, 0, 10, 13, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 14, 0, 29, 0, 6, 0, + 13, 0, 0, 0, 34, 0, 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 21, 2, 0, 0, 0, 12, 0, 14, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 12, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, + 0, 38, 0, 0, 0, 0, 0, 21, 0, 0, 32, 0, 24, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 12, 0, 19, + 30, 0, 0, 0, 0, 28, 11, 0, 0, 32, 0, 0, 0, 0, + 2, 18, 9, 0, 0, 0, 0, 0, 19, 0, 11, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 0, + 0, 30, 15, 3, 0, 0, 23, 31, 0, 0, 31, 0, 0, 0, + 21, 0, 6, 0, 18, 30, 0, 0, 0, 0, 18, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 16, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 16, 15, 0, 0, 0, 0, 14, 26, 22, 0, 0, 24, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 11, 23, 0, 6, 14, + 0, 0, 2, 0, 32, 25, 0, 0, 0, 0, 0, 0, 34, 0, + 19, 0, 0, 28, 0, 0, 0, 28, 0, 4, 0, 0, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 0, 14, 0, 0, 30, 0, 8, + 0, 0, 23, 0, 2, 18, 0, 25, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 32, 11, 0, 0, + 6, 12, 0, 19, 22, 13, 0, 11, 0, 0, 0, 13, 25, 0, + 0, 0, 0, 12, 0, 0, 0, 0, 0, 17, 0, 0, 8, 29, + 0, 20, 8, 16, 0, 0, 0, 0, 0, 0, 0, 13, 34, 0, + 0, 27, 0, 0, 11, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 28, 0, 13, 0, 0, 0, 0, 0, 28, 0, 0, + 0, 19, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 30, + 0, 0, 31, 0, 0, 0, 0, 13, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 17, 0, 0, 43, + 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 8, 0, 0, 0, 21, 0, + 0, 11, 0, 0, 0, 25, 0, 0, 0, 0, 38, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 19, 26, + 11, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 39, 30, 0, 0, 0, 0, 0, + 0, 53, 0, 0, 0, 28, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 39, 0, 31, 0, 15, 0, 0, 0, 0, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 16, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 14, 43, 0, 0, 38, 0, 0, 0, 0, + 0, 0, 0, 23, 0, 0, 0, 16, 0, 0, 0, 0, 19, 23, + 29, 0, 0, 18, 0, 23, 31, 0, 0, 13, 7, 0, 0, 0, + 27, 0, 30, 0, 0, 0, 18, 0, 35, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 14, 0, 0, 13, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 12, 0, 0, 0, 22, + 0, 14, 0, 0, 0, 0, 0, 17, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 30, 44, 0, 0, 7, 15, 11, 0, 0, 16, + 0, 0, 10, 33, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 18, 0, 36, 3, 0, 0, 0, 15, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 24, 0, 0, 15, + 14, 0, 0, 0, 0, 0, 0, 21, 15, 0, 17, 28, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 15, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 24, + 11, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 20, 0, 0, + 19, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 28, 0, 0, 0, 15, - 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 0, 2, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 22, 0, 0, 24, 32, 0, 0, 21, 0, 29, 19, 0, + 0, 0, 9, 0, 0, 0, 0, 13, 0, 0, 41, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 27, 0, + 0, 10, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 20, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, + 14, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, + 0, 0, 26, 0, 15, 0, 0, 12, 0, 0, 21, 0, 18, 0, + 0, 0, 0, 3, 15, 10, 0, 8, 0, 19, 0, 0, 23, 24, + 0, 0, 0, 12, 0, 0, 0, 0, 16, 0, 0, 24, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 27, 0, 0, 0, 0, + 11, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 21, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, + 0, 0, 0, 24, 0, 0, 19, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 37, 31, 0, 0, 0, 0, 10, + 14, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, + 35, 12, 15, 0, 0, 0, 15, 23, 14, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 7, 12, 0, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 29, 17, + 0, 0, 0, 0, 0, 8, 0, 24, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 25, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 12, 0, 23, 0, 0, 0, 0, 0, + 0, 11, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 0, 35, 0, 0, 13, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 19, 0, + 24, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, + 14, 0, 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 20, 0, 0, 0, + 22, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 43, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 28, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 72, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 14, 0, 0, 0, 0, 0, + 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 35, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 22, 0, 30, 0, 0, 14, 0, 0, 0, 0, + 12, 34, 0, 23, 0, 33, 22, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 13, 23, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 20, 0, 23, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 35, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 14, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 26, 0, 0, + 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 24, 29, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 29, 0, + 0, 0, 0, 0, 18, 10, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, + 0, 0, 0, 16, 29, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 28, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 21, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 14, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 14, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 29, 21, 31, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 22, + 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 19, 0, 27, + 30, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, + 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, + 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 0, 0, 36, 0, 0, 27, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, + 0, 28, 0, 0, 0, 11, 0, 33, 0, 0, 0, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 13, 7, 0, 0, 29, 0, 0, + 30, 0, 0, 0, 0, 30, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 43, 0, 0, 0, 3, 0, 0, 0, 0, 0, 6, + 43, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 15, 0, 0, 0, 0, 18, 0, 0, 0, 18, 14, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 17, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 13, 0, 0, 0, 0, 18, + 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 30, 0, 0, 0, 17, 0, 0, 0, 0, + 37, 26, 0, 0, 11, 0, 0, 0, 0, 23, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 14, 0, 0, 0, 0, 0, 0, + 16, 16, 0, 0, 0, 0, 0, 0, 0, 35, 27, 0, 0, 0, + 0, 18, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 20, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 17, 25, 19, 0, 0, 23, 20, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 0, 0, 0, 35, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 14, 0, 36, 0, 27, 14, 0, 0, 0, 0, 0, 33, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 0, 0, 0, 0, 24, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, 30, 0, 0, 0, 0, 0, 36, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 35, + 0, 0, 0, 11, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 24, 0, 0, 0, 0, 0, 0, + 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 35, 27, 0, + 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, 14, 0, 0, 4, 0, 23, - 0, 0, 0, 15, 0, 0, 0, 0, 30, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 21, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 11, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 15, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 20, 22, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 17, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 26, 0, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, + 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 20, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 10, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 33, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 0, 26, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 28, 0, 0, + 27, 11, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 14, 0, + 0, 0, 0, 17, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 17, 0, 0, 26, 0, 20, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23, 0, 0, 33, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, + 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 15, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 25, 0, 0, 0, 0, 20, 0, 0, 0, 25, 0, 0, 16, + 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 16, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 28, + 0, 0, 16, 0, 0, 0, 0, 0, 15, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 19, 0, 2, 0, 0, 0, 0, 0, 37, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 24, + 0, 0, 15, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, - 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, - 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 28, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 26, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, - 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, - 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 26, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 24, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 0, 0, 0, 23, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, + 0, 13, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 17, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 24, 0, 0, 0, 17, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 22, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, + 0, 0, 13, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 27, 0, 0, 37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 17, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, + 16, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 15, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 14, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 8, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 27, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 28, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1344,17 +1468,8 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1363,16 +1478,48 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1394,7 +1541,6 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1405,7 +1551,6 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1421,21 +1566,16 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1444,7 +1584,6 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1464,997 +1603,11 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2473,6 +1626,7 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2480,10 +1634,13 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 33, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2559,6 +1716,7 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2608,7 +1766,6 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2665,4719 +1822,5549 @@ static const unsigned char lengthtable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 }; static const struct grib_keys_hash wordlist[] = { + {""}, {""}, {""}, {""}, {""}, + {"n",1368}, {""}, - {"n",1366}, + {"m",1244}, + {"na",1374}, + {"t",2242}, {""}, - {"nnn",1380}, + {"nnn",1385}, + {"nt",1400}, {""}, - {"t",2231}, - {"nt",1395}, - {"m",1242}, - {"nd",1376}, - {"ed",738}, - {"td",2242}, - {""}, - {"na",1369}, - {"min",1325}, - {"name",1370}, - {"sd",2011}, - {"date",654}, - {""}, - {"time",2268}, - {""}, - {"ident",981}, - {""}, {""}, {""}, + {"nd",1381}, + {"ed",737}, + {"td",2253}, + {"name",1375}, + {"min",1327}, {"data",633}, - {"one",1577}, - {""}, {""}, - {"names",1375}, - {"mars",1245}, - {"stream",2203}, + {""}, + {"date",654}, {""}, {""}, {""}, - {"dataset",651}, - {"enorm",780}, - {""}, {""}, - {"sort",2147}, - {"metadata",1321}, + {"time",2283}, + {"sd",2020}, {""}, {""}, {""}, {""}, - {"domain",720}, + {"ident",982}, + {""}, {""}, + {"one",1584}, + {"metadata",1323}, + {""}, {""}, + {"param",1699}, + {""}, + {"stream",2214}, + {""}, + {"mars",1247}, + {"names",1380}, + {"enorm",780}, + {"dataset",651}, + {""}, {""}, {""}, {""}, + {"spare",2173}, + {"domain",719}, {"eps",785}, {""}, - {"edition",739}, + {"sort",2156}, {""}, - {"spare",2164}, - {"present",1745}, - {"param",1692}, - {""}, {""}, {""}, {""}, - {"iteration",1058}, - {"dimension",703}, - {"oper",1588}, + {"centre",406}, {""}, - {"centre",407}, - {"assertion",323}, - {"parameter",1698}, + {"oper",1595}, + {"parameter",1706}, + {"present",1754}, + {"step",2202}, + {"edition",738}, {""}, {""}, {""}, - {"leadtime",1123}, - {""}, - {"step",2192}, - {""}, - {"opttime",1595}, - {"rectime",1833}, - {"timerepres",2282}, - {""}, - {"parameters",1706}, + {"rectime",1842}, + {"true",2322}, {"core",608}, - {"points",1732}, + {"Latin",112}, + {"iteration",1059}, {""}, {""}, - {"radials",1806}, + {"opttime",1602}, + {""}, {""}, {""}, + {"minute",1329}, + {""}, + {"dimension",702}, {""}, {""}, {"const",581}, - {""}, {""}, {""}, - {"second",2012}, + {"parameters",1714}, {""}, - {"restricted",1876}, - {""}, - {"section",2037}, - {"stepZero",2202}, - {""}, {""}, {""}, {""}, - {"true",2305}, - {"partitions",1711}, - {"direction",706}, - {"pl",1729}, + {"minimum",1328}, + {"assertion",322}, + {"Lap",107}, + {"second",2021}, + {"points",1741}, + {"timerepres",2297}, {""}, {""}, - {"model",1346}, + {"section",2046}, + {"Lo",122}, + {"units",2391}, + {"restricted",1885}, + {"tile",2277}, {""}, - {"total",2284}, - {"minute",1327}, - {"range",1812}, - {"normal",1383}, - {""}, - {"statistics",2190}, - {""}, - {"grid",928}, - {"class",435}, - {"units",2373}, - {"million",1324}, - {"section8",2076}, + {"direction",705}, {""}, {""}, - {"minimum",1326}, + {"radius",1816}, + {"stepZero",2212}, {""}, {""}, - {"status",2191}, - {"instrument",1013}, - {"radius",1807}, - {""}, - {"process",1775}, - {""}, - {"precision",1740}, - {""}, {""}, {""}, {""}, {""}, - {"dateTime",664}, - {"origin",1602}, + {"status",2201}, + {"instrument",1014}, + {"Lop",142}, + {"ucs",2382}, {""}, {""}, - {"dataTime",648}, - {""}, {""}, - {"generation",915}, - {""}, {""}, - {"three",2255}, - {""}, {""}, {""}, - {"hdate",951}, - {"ucs",2364}, - {"latitude",1088}, + {"partitions",1720}, {""}, - {"discipline",712}, - {""}, - {"year",2505}, - {"refdate",1839}, - {""}, {""}, {""}, - {"correction",613}, + {"leadtime",1124}, {""}, {"count",622}, - {""}, {""}, - {"latitudes",1119}, - {""}, {""}, - {"system",2229}, {""}, - {"method",1322}, + {"uuid",2423}, + {"hdate",952}, + {"three",2266}, + {""}, + {"precision",1749}, + {"range",1821}, + {"refdate",1848}, + {""}, + {"statistics",2200}, + {"uco",2381}, + {"process",1784}, + {""}, + {"grid",929}, + {""}, + {"radials",1815}, + {""}, + {"dataTime",648}, + {"dateTime",664}, + {""}, {""}, + {"stepunits",2213}, + {""}, {""}, + {"daLoop",632}, + {"phase",1734}, + {"char",431}, + {"product",1786}, + {"correction",613}, + {"method",1324}, {""}, {""}, {""}, - {"type",2316}, - {""}, - {"uco",2363}, - {"identifier",985}, - {"phase",1725}, + {"section8",2085}, {""}, {""}, - {"file",865}, - {""}, - {"local",1165}, - {"datasetTemplate",653}, - {"g",904}, - {""}, - {"false",858}, - {""}, {""}, {""}, - {"consensus",579}, - {"resolution",1867}, - {"char",432}, - {""}, - {"elementsTable",744}, - {""}, - {"product",1777}, - {""}, - {"reference",1840}, + {"identifier",986}, + {"class",434}, {""}, {""}, - {"categories",390}, + {"origin",1609}, + {"reference",1849}, + {""}, + {"latitude",1089}, {""}, {""}, {""}, {""}, {""}, {""}, - {"isSens",1043}, - {""}, {""}, {""}, - {"signature",2130}, + {"generation",916}, {""}, {""}, - {"dataStream",646}, + {"pl",1738}, {""}, {""}, - {"marsStream",1270}, + {"consensus",579}, {""}, - {"landtype",1080}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ordering",1598}, + {"upperLimit",2413}, {""}, - {"two",2314}, - {"partitionTable",1710}, - {""}, {""}, {""}, - {"padding",1621}, - {"hundred",973}, + {"hundred",974}, + {""}, {""}, {""}, {""}, + {"hour",964}, {""}, - {"platform",1730}, - {"eight",743}, + {"discipline",711}, + {"file",865}, + {"latitudes",1120}, {""}, - {"endStep",772}, - {""}, {""}, {""}, - {"diagnostic",699}, - {"hour",963}, - {""}, {""}, {""}, + {"total",2299}, + {"model",1348}, + {""}, + {"normal",1388}, + {""}, {""}, + {"false",858}, + {""}, {""}, {"fcperiod",862}, - {"operStream",1589}, - {""}, {""}, {""}, - {"longitude",1201}, - {"marsStep",1269}, + {"nref",1399}, {""}, - {"startStep",2184}, + {"datasetTemplate",653}, + {"signature",2139}, {""}, - {"channel",430}, - {""}, {""}, {""}, - {"thousand",2254}, - {"localTime",1193}, - {""}, {""}, {""}, - {"longitudes",1232}, + {"million",1326}, + {"dataStream",646}, {""}, - {"nref",1394}, + {"temperature",2255}, + {"g",905}, + {"thousand",2265}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"marsStream",1272}, + {""}, + {"resolution",1876}, + {"nTiles",1373}, + {"categories",389}, + {""}, + {"endStep",771}, + {"isSens",1044}, + {""}, + {"eight",742}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"month",1355}, + {""}, + {"platform",1739}, + {""}, {""}, + {"marsStep",1271}, + {"K",94}, + {"offset",1547}, + {"diagnostic",698}, + {"operStream",1596}, + {""}, + {"startStep",2193}, + {"year",2525}, + {"anoffset",317}, + {""}, {""}, + {"truncateLaplacian",2325}, + {""}, {""}, + {"elementsTable",743}, + {"marsQuantile",1268}, + {""}, + {"padding",1628}, + {""}, + {"offsetdate",1581}, + {"type",2333}, + {""}, {""}, + {"offsettime",1582}, + {""}, {""}, {""}, {""}, {""}, + {"ordering",1605}, + {""}, + {"oceanStream",1545}, + {""}, {""}, {""}, + {"system",2240}, + {""}, + {"partitionTable",1719}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"longitude",1203}, + {""}, + {"local",1167}, + {""}, {""}, {""}, {"Di",30}, - {""}, {""}, - {"temperature",2244}, - {"gg",917}, - {""}, {""}, {""}, - {"dy",727}, + {"TT",240}, + {"paramtype",1716}, {""}, - {"flags",882}, - {"Dstart",38}, + {"channel",429}, + {""}, {""}, {""}, {""}, {""}, + {"yLast",2524}, {""}, {""}, - {"day",666}, + {"two",2331}, {""}, {"dataDate",636}, + {"flags",882}, + {""}, {""}, {""}, + {"longitudes",1234}, + {"Dstart",38}, + {"gg",918}, {""}, {""}, - {"month",1353}, - {"dataType",649}, - {""}, - {"marsDir",1249}, - {"marsType",1273}, - {""}, - {"oceanStream",1538}, - {"reserved",1858}, - {"masterDir",1278}, - {""}, - {"offset",1540}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"anoffset",318}, - {"TT",241}, - {""}, {""}, - {"eleven",746}, - {"version",2428}, - {"stepType",2198}, - {"offsetdate",1574}, - {""}, - {"offsettime",1575}, - {""}, - {"marsDomain",1250}, - {""}, - {"varno",2423}, - {""}, {""}, - {"dataSelection",645}, - {""}, {""}, {""}, {""}, {""}, - {"dummyc",725}, - {""}, {""}, {""}, {""}, - {"reportType",1854}, - {""}, {""}, - {"endTimeStep",774}, - {""}, {""}, {""}, {""}, {"fgTime",864}, - {"threshold",2256}, - {""}, {""}, - {"codeType",559}, - {"elevation",745}, - {""}, {""}, - {"isSpectral",1044}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"flag",877}, - {""}, - {"levels",1146}, - {""}, {""}, - {"countTotal",625}, - {""}, - {"notDecoded",1393}, - {"levelist",1145}, - {"Latin",113}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"dummy",722}, - {""}, {""}, - {"marsQuantile",1266}, - {""}, {""}, - {"level",1140}, - {"gridType",938}, - {"average",327}, - {""}, - {"ieeeFloats",986}, {""}, {""}, {""}, {""}, {""}, - {"Lo",123}, - {""}, {""}, {""}, {""}, - {"matchSort",1285}, - {""}, {""}, {""}, {""}, {""}, - {"aerosolpacking",308}, + {"marsDir",1251}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"localTime",1195}, + {""}, + {"masterDir",1280}, + {""}, + {"endTimeStep",774}, + {""}, {""}, {""}, {"crcrlf",627}, - {"hideThis",956}, - {"forecastperiod",894}, - {""}, {""}, {""}, {""}, {""}, - {"Lap",108}, - {"windSpeed",2475}, - {""}, {""}, - {"values",2411}, - {"localDate",1166}, - {"isSatellite",1041}, {""}, - {"localDir",1174}, - {""}, {""}, - {"conceptDir",571}, - {""}, {""}, - {"selectedSecond",2113}, - {"Lop",143}, + {"threshold",2267}, + {""}, {""}, {""}, {""}, + {"matchSort",1287}, + {""}, + {"landtype",1081}, + {"marsDomain",1252}, {""}, {""}, {""}, - {"additionalParameter",303}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"country",626}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"dataOrigin",640}, - {""}, - {"marsRange",1267}, - {""}, - {"TS",239}, - {""}, {""}, - {"yFirst",2503}, - {""}, {""}, {""}, - {"daLoop",632}, - {""}, - {"avg",331}, - {"TScalc",240}, - {"ccsdsRsi",397}, - {""}, {""}, {""}, {""}, {""}, - {"stepRange",2196}, + {"dummyc",724}, + {"hideThis",957}, + {"marsLatitude",1262}, {""}, {""}, {""}, {"fcmonth",861}, - {""}, - {"efiOrder",742}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"levtype",1147}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"localSecond",1188}, + {"siteLatitude",2147}, {""}, {""}, - {"userTimeStart",2404}, - {""}, - {"standardDeviation",2176}, - {""}, - {"fgDate",863}, - {"destineSection",697}, - {"forecastTime",893}, + {"instrumentIdentifier",1015}, {""}, {""}, {""}, {""}, - {"aerosolType",305}, - {""}, {""}, {""}, {""}, {""}, - {"yLast",2504}, - {"statisticalProcess",2188}, + {"forecastperiod",895}, + {"dataType",649}, {""}, {""}, {""}, {""}, {""}, {""}, - {"typicalTime",2359}, - {""}, - {"spectralType",2174}, + {"reserved",1867}, {""}, {""}, - {"accuracy",297}, - {"satelliteSeries",1941}, - {""}, - {"upperLimit",2395}, - {""}, - {"coefsFirst",563}, - {"statisticalProcessesList",2189}, - {"isFillup",1036}, - {""}, {""}, {""}, {""}, {""}, - {"Dy",42}, - {"dataFlag",637}, - {""}, {""}, {""}, {""}, {""}, - {"centreDescription",408}, + {"dataLength",639}, + {"marsType",1275}, {""}, {""}, - {"logTransform",1200}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"coefsSecond",564}, + {"flag",877}, {""}, - {"ccsdsFlags",396}, + {"varno",2443}, {""}, - {"forecastSteps",892}, - {""}, - {"codeFigure",558}, + {"paramType",1703}, + {"notDecoded",1398}, + {"version",2448}, + {"dataSelection",645}, {""}, {""}, {""}, - {"windDirection",2464}, - {"unitsFactor",2379}, - {""}, {""}, - {"pv",1791}, - {""}, {""}, {""}, - {"recDateTime",1830}, - {"endDescriptors",751}, - {""}, {""}, {""}, - {"upperRange",2396}, - {"lev",1138}, - {"nlev",1379}, - {"band",335}, - {""}, {""}, {""}, {""}, - {"optionalData",1594}, - {"offsetSection9",1571}, + {"band",334}, + {"stepType",2208}, + {"countTotal",625}, {""}, - {"localDateTime",1167}, - {""}, - {"isOctahedral",1039}, - {""}, - {"rdbtime",1818}, - {""}, - {"offsetSection8",1570}, - {""}, {""}, {""}, {""}, - {"productType",1782}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"truncateLaplacian",2308}, - {""}, {""}, - {"Nr",201}, - {""}, {""}, - {"rectimeDay",1834}, - {"aerosolTypeName",306}, - {"latitudeSexagesimal",1116}, - {""}, {""}, - {"Ni",199}, - {"instrumentIdentifier",1014}, - {""}, {""}, - {"levelType",1142}, - {""}, - {"activity",299}, - {""}, - {"Nside",204}, - {"lowerLimit",1235}, - {"longitudesList",1233}, - {"Ly",154}, - {""}, - {"overlayTemplate",1615}, + {"dataKeys",638}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"bitmap",373}, - {"userDateStart",2400}, + {""}, + {"isSpectral",1045}, + {""}, + {"forecastTime",894}, + {""}, + {"conceptDir",571}, + {"rdbtime",1827}, + {"Xp",274}, + {"reportType",1863}, + {"codeType",558}, + {""}, + {"eleven",745}, {""}, {""}, {""}, + {"userTimeStart",2422}, + {"TS",238}, + {"Xo",273}, + {""}, + {"efiOrder",741}, + {"selectedSecond",2122}, + {""}, {""}, {""}, {""}, {""}, + {"TScalc",239}, + {"bitmap",372}, + {""}, {""}, {""}, {""}, + {"additionalParameter",302}, + {""}, + {"lowerLimit",1237}, + {""}, + {"dataOrigin",640}, + {""}, + {"KS",95}, + {""}, + {"number",1401}, + {""}, {""}, {""}, {""}, + {"average",326}, + {""}, {""}, + {"elevation",744}, + {""}, {""}, + {"dy",726}, + {""}, {""}, + {"day",666}, + {""}, {""}, + {"statisticalProcess",2198}, + {""}, {""}, {""}, + {"isSatellite",1042}, + {""}, {""}, + {"windSpeed",2495}, + {""}, {""}, {""}, {""}, + {"gridType",939}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"values",2431}, + {"fgDate",863}, + {""}, {""}, {""}, {""}, {""}, + {"forecastSteps",893}, + {""}, + {"statisticalProcessesList",2199}, + {""}, + {"aerosolpacking",307}, + {""}, + {"Ly",153}, + {"localDate",1168}, + {""}, {""}, + {"coefsSecond",563}, + {""}, + {"localDir",1176}, + {""}, + {"ieeeFloats",987}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"levels",1147}, + {"dummy",721}, + {""}, {""}, + {"levelist",1146}, + {"logTransform",1202}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"Lcy",119}, + {""}, {""}, {""}, {""}, + {"avg",330}, + {""}, {""}, {""}, + {"recDateTime",1839}, + {""}, + {"offsetSection9",1578}, + {""}, {""}, {""}, + {"centreDescription",407}, + {"localSecond",1190}, + {"unitsFactor",2397}, + {"Luy",149}, + {""}, {""}, + {"satelliteSeries",1950}, + {""}, {""}, {""}, + {"coefsFirst",562}, + {"forecastLeadTime",886}, + {""}, {""}, + {"marsLevel",1263}, + {"level",1141}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"unitOfTime",2388}, + {"country",626}, + {""}, {""}, {""}, {""}, + {"isOctahedral",1040}, + {""}, {""}, {""}, + {"topLevel",2298}, + {""}, {""}, + {"typicalTime",2377}, + {"offsetSection8",1577}, + {""}, + {"productType",1791}, + {""}, {""}, {""}, + {"codeFigure",557}, + {""}, {""}, + {"userDateStart",2418}, + {""}, {""}, {""}, + {"LaD",104}, + {"aerosolType",304}, + {""}, {""}, + {"spectralType",2183}, + {"destineSection",696}, + {""}, {""}, {""}, {""}, + {"accuracy",296}, + {""}, + {"indicatorOfParameter",1000}, + {""}, {""}, {""}, {""}, + {"yFirst",2523}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"isFillup",1037}, + {"rdbtimeTime",1834}, + {"centreLongitude",412}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"latitudesList",1121}, + {""}, {""}, {""}, + {"zero",2534}, + {""}, + {"distinctLatitudes",713}, + {""}, + {"aerosolTypeName",305}, + {""}, + {"zeros",2535}, + {""}, + {"gridSpecification",938}, + {""}, {""}, {""}, {""}, + {"pressureLevel",1774}, + {""}, {""}, {""}, {""}, {""}, + {"dataFlag",637}, + {"standardDeviation",2185}, + {""}, + {"laplacianOperator",1082}, + {"referenceSampleInterval",1857}, + {""}, {""}, + {"ccsdsFlags",395}, + {""}, + {"levtype",1148}, + {"ccsdsRsi",396}, + {"endDescriptors",750}, + {""}, + {"pv",1800}, + {"setLocalDefinition",2129}, + {""}, {""}, {"fireTemplate",867}, {""}, - {"referenceDate",1841}, - {""}, - {"laplacianOperator",1081}, - {""}, {""}, {""}, - {"indicatorOfParameter",999}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"localFlag",1176}, - {"unitOfTime",2370}, - {"number",1396}, - {""}, - {"typicalDate",2352}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Lcy",120}, - {""}, - {"lowerRange",1236}, - {""}, {""}, {""}, {""}, - {"modelName",1349}, + {"obstype",1542}, {""}, {""}, {""}, {""}, {""}, - {"localDay",1168}, + {"marsRange",1269}, + {""}, {""}, + {"periodOfTime",1730}, + {""}, {""}, {""}, {""}, + {"windDirection",2484}, + {""}, {""}, + {"longitudesList",1235}, {""}, - {"startTimeStep",2186}, - {""}, {""}, - {"gridSpecification",937}, - {""}, {""}, - {"parameterName",1703}, - {""}, {""}, - {"categoryType",391}, - {""}, {""}, - {"pointsOrdering",1733}, + {"latitudeSexagesimal",1117}, + {""}, + {"stepRange",2206}, + {"referenceDate",1850}, + {""}, {""}, + {"localDateTime",1169}, + {""}, + {"startTimeStep",2196}, + {"optionalData",1601}, + {""}, {""}, {""}, + {"unitsDecimalScaleFactor",2395}, + {""}, + {"referenceStep",1858}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"templatesLocalDir",2257}, + {""}, + {"pointsOrdering",1742}, + {""}, {""}, {""}, {""}, + {"Dy",42}, + {""}, + {"lev",1139}, + {""}, {""}, + {"nlev",1384}, {""}, - {"siteLatitude",2138}, - {"marsLatitude",1260}, - {""}, {""}, {""}, {""}, {""}, {""}, {"coordinatesPresent",607}, + {"centreForLocal",408}, {""}, - {"Luy",150}, - {""}, {""}, {""}, - {"marsLevel",1261}, - {""}, {""}, {""}, - {"suiteName",2222}, - {"gridName",935}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"dataLength",639}, + {"global",919}, {""}, - {"parameterDiscipline",1701}, - {"Nassigned",194}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayState",1935}, - {""}, {""}, - {"referenceStep",1849}, - {""}, - {"validityTime",2410}, - {"topLevel",2283}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"firstDimension",868}, - {"computeStatistics",570}, - {""}, - {"marsStartStep",1268}, - {""}, - {"waveDomain",2452}, - {"gridDefinition",930}, - {"unitsDecimalScaleFactor",2377}, - {""}, {""}, - {"obstype",1535}, + {"rdbType",1825}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"upperRange",2414}, {""}, {""}, {""}, {""}, - {"dataKeys",638}, - {"shortName",2126}, - {"angleDivisor",312}, - {""}, {""}, {""}, - {"periodOfTime",1721}, - {""}, {""}, - {"datasetForLocal",652}, - {""}, - {"global",918}, - {""}, - {"cfName",418}, - {"matchTimeRepres",1286}, - {""}, {""}, {""}, {""}, {""}, - {"localDefinition",1172}, - {""}, {""}, - {"localDecimalScaleFactor",1169}, - {""}, {""}, - {"NT",191}, - {"typicalDay",2354}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudesList",1120}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"setLocalDefinition",2120}, - {""}, {""}, {""}, {""}, {""}, - {"laplacianOperatorIsSet",1082}, - {"generatingProcessTemplate",913}, - {""}, - {"pressureLevel",1765}, - {"rdbtimeTime",1825}, - {""}, - {"centreLongitude",413}, - {""}, {""}, {""}, {""}, {""}, - {"rdbType",1816}, - {""}, {""}, {""}, {""}, - {"lengthDescriptors",1128}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"Nf",198}, - {""}, {""}, {""}, {""}, - {"LaD",105}, - {""}, {""}, - {"energyNorm",779}, - {""}, {""}, {""}, - {"Ny",209}, - {""}, - {"editionNumber",740}, - {"endOfRange",771}, - {""}, {""}, {""}, - {"offsetDescriptors",1554}, - {""}, {""}, {""}, {""}, - {"groupSplitting",942}, - {""}, {""}, - {"derivedForecast",694}, - {""}, - {"distinctLatitudes",714}, + {"tubeDomain",2329}, + {"typicalDate",2370}, {""}, {""}, {""}, {""}, {""}, {""}, - {"referenceSampleInterval",1848}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"userDateTimeStart",2402}, - {""}, {""}, {""}, {""}, - {"freeFormData",899}, - {"templatesLocalDir",2246}, + {"marsStartStep",1270}, {""}, - {"forecastLeadTime",885}, - {"sectionNumber",2085}, - {""}, - {"Ncy",197}, - {""}, {""}, {""}, - {"dateOfForecast",656}, - {""}, - {"timeOfForecast",2275}, - {""}, {""}, {""}, {""}, {"ensembleSize",783}, - {""}, {""}, - {"centreForLocal",409}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"climatologicalRegime",439}, - {"KS",96}, - {"tubeDomain",2312}, + {"heightLevelName",954}, {""}, {""}, - {"analysisOffsets",311}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Nuy",207}, - {"setDecimalPrecision",2119}, - {"anoffsetFirst",319}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"generatingProcessIdentifier",912}, - {"verticalDomainTemplate",2438}, - {"reservedOctet",1863}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"originalSubCentreIdentifier",1606}, - {""}, - {"rdbtimeDate",1819}, - {""}, - {"localTimeForecastList",1194}, - {""}, {""}, - {"longitudeOfCentrePoint",1205}, - {""}, {""}, {""}, {""}, - {"incrementOfLengths",990}, - {""}, - {"scaledDirections",1972}, - {""}, - {"LaR",107}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"integerScalingFactorAppliedToDirections",1018}, - {"integerScalingFactorAppliedToFrequencies",1019}, - {""}, - {"defaultName",680}, + {"meanSize",1315}, {""}, {""}, {""}, - {"LoR",128}, - {"clusterNumber",551}, - {""}, {""}, - {"decimalScaleFactor",676}, - {""}, {""}, {""}, {""}, - {"integerScaleFactor",1017}, - {"correction3Part",619}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"generatingProcessIdentificationNumber",911}, - {""}, {""}, - {"controlForecastCluster",586}, - {"offsetSection0",1560}, - {"marsParam",1265}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"lcwfvSuiteName",1122}, - {"zeros",2515}, - {"validityDate",2408}, - {"channelNumber",431}, - {"realPart",1827}, - {"oldSubtype",1576}, - {"zero",2514}, - {""}, {""}, {""}, - {"yearOfForecast",2509}, - {""}, {""}, {""}, - {"epsPoint",787}, - {"boustrophedonic",380}, - {""}, - {"JS",94}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"longitudeSexagesimal",1231}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"rdbDateTime",1814}, - {""}, {""}, {""}, {""}, - {"spectralDataRepresentationMode",2171}, - {""}, - {"anoffsetFrequency",320}, - {""}, {""}, {""}, - {"gridDefinitionSection",932}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"anoffsetLast",321}, - {""}, {""}, - {"referenceOfLengths",1844}, - {"heightLevelName",953}, - {""}, - {"preferLocalConcepts",1744}, - {"conceptsLocalDirAll",574}, - {""}, - {"rdbtimeDay",1820}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"computeStatistics",570}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"marsLevelist",1262}, + {"offsetSection0",1567}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"rectimeDay",1843}, + {"rdbtimeDate",1828}, {""}, {""}, {""}, {""}, - {"angleOfRotation",314}, - {""}, {""}, {""}, - {"hourOfForecast",966}, - {""}, - {"minuteOfReference",1333}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ifsParam",987}, - {""}, {""}, {""}, - {"latitudeOfCentrePoint",1093}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"newSubtype",1378}, - {""}, {""}, - {"visibility",2442}, - {""}, - {"dateOfReference",661}, - {""}, - {"timeOfReference",2278}, - {""}, {""}, {""}, - {"gridDefinitionDescription",931}, - {""}, - {"N",172}, + {"offsetDescriptors",1561}, + {"preferLocalConcepts",1753}, {""}, {""}, {""}, {""}, {""}, - {"monthOfForecast",1356}, - {""}, {""}, {""}, - {"K",95}, - {"meanSize",1313}, - {"spectralDataRepresentationType",2172}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"faFieldName",855}, - {"longitudinalDirectionGridLength",1234}, - {"dimensionType",705}, + {"boustrophedonic",379}, {""}, {""}, {""}, {""}, - {"qfe",1793}, - {""}, {""}, {""}, - {"experiment",804}, - {""}, {""}, {""}, - {"quantile",1803}, - {"dayOfForecast",669}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"NR",189}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"sequences",2116}, - {"standardParallel",2177}, - {""}, {""}, {""}, {""}, - {"northernLatitudeOfDomain",1391}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"secondSize",2026}, - {""}, {""}, {""}, {""}, - {"bufrTemplate",385}, - {""}, {""}, {""}, {""}, {""}, - {"maximum",1291}, + {"userDateTimeStart",2420}, {""}, {""}, - {"modeNumber",1345}, - {"bottomLevel",379}, - {"overlayTemplateNumber",1616}, - {"typeOfLevel",2330}, - {"NL",187}, + {"centreLongitudeInDegrees",413}, + {""}, {""}, {""}, + {"runwayState",1944}, + {""}, {""}, {""}, + {"parameterDiscipline",1709}, {""}, {"datumSize",665}, - {""}, - {"validityDateTime",2409}, - {"centreLongitudeInDegrees",414}, - {""}, {""}, {""}, - {"secondOfForecast",2019}, - {"multiplicationFactorForLatLong",1365}, - {""}, - {"createNewData",628}, - {""}, {""}, {""}, {""}, - {"typeOfStatisticalPostProcessingOfEnsembleMembers",2342}, - {""}, {""}, - {"typeOfStatisticalProcessing",2343}, - {""}, {""}, {""}, - {"levTypeName",1139}, - {""}, {""}, {""}, - {"yearOfReference",2512}, - {""}, - {"minuteOfForecast",1330}, - {""}, {""}, {""}, - {"observedData",1534}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"overlayTemplate",1622}, {""}, {""}, {""}, {""}, {""}, - {"marsKeywords",1257}, + {"typeOfTile",2362}, {""}, {""}, {""}, - {"southernLatitudeOfDomain",2158}, + {"localDecimalScaleFactor",1171}, + {"levelType",1143}, + {"laplacianOperatorIsSet",1083}, + {""}, + {"activity",298}, + {"secondSize",2035}, + {""}, {""}, {""}, {""}, {""}, + {"categoryType",390}, + {""}, + {"localFlag",1178}, + {""}, {""}, + {"subSetK",2229}, + {""}, + {"firstDimension",868}, + {""}, + {"lengthDescriptors",1129}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"conceptsLocalDirAll",574}, + {""}, {""}, + {"generatingProcessTemplate",914}, + {""}, + {"anoffsetLast",320}, + {""}, {""}, + {"JS",93}, + {"gridDefinition",931}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"angleDivisor",311}, + {""}, {"firstSize",876}, - {""}, - {"listOfScaledFrequencies",1162}, - {"qnh",1796}, + {"rdbDateTime",1823}, + {"validityTime",2430}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"sectionPosition",2086}, - {""}, {""}, {""}, {""}, - {"forecastPeriod",888}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"legNumber",1126}, - {""}, {""}, - {"rectimeSecond",1837}, - {"windPresent",2474}, - {""}, {""}, {""}, {""}, - {"defaultParameter",681}, {""}, {""}, {""}, {""}, {""}, - {"crraSection",630}, + {"waveDomain",2472}, + {""}, + {"datasetForLocal",652}, {""}, {""}, {""}, {""}, {""}, - {"totalNumber",2288}, + {"dateOfForecast",656}, {""}, {""}, {""}, - {"hourOfReference",969}, + {"timeOfForecast",2290}, + {""}, {""}, + {"bottomLevel",378}, + {"longitudinalDirectionGridLength",1236}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"uerraSection",2366}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"optimisationTime",1592}, - {""}, - {"generatingProcessTemplateNumber",914}, - {""}, - {"J",93}, - {""}, - {"section6",2068}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"stepTypeForConversion",2199}, - {""}, {""}, {""}, - {"numberOfFloats",1444}, - {""}, {""}, - {"representationType",1856}, - {"extraDim",812}, - {""}, - {"oceanLevName",1537}, - {"monthOfReference",1359}, - {""}, {""}, - {"localDefinitionNumber",1173}, - {""}, {""}, {""}, {""}, {""}, - {"epsStatisticsPoint",789}, - {"atmosphericChemicalOrPhysicalConstituentType",324}, - {"localSection",1189}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"expver",810}, - {""}, {""}, - {"waveLevType",2454}, - {""}, {""}, - {"xFirst",2496}, - {""}, {""}, {""}, {""}, - {"forecastPeriodTo",890}, - {""}, - {"orderOfSpatialDifferencing",1597}, - {""}, {""}, - {"scaleFactorOfStandardDeviation",1963}, - {""}, - {"scaleFactorOfSecondSize",1961}, - {"longitudeOfGridPoints",1212}, - {"standardParallelInDegrees",2178}, - {""}, {""}, - {"expoffset",809}, - {""}, - {"originalParameterNumber",1604}, - {""}, {""}, {""}, - {"clusterSize",552}, - {""}, - {"scaleFactorOfStandardDeviationInTheCluster",1964}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"tiggeSection",2262}, - {""}, {""}, {""}, - {"siteId",2137}, - {"latitudeOfCentrePointInDegrees",1094}, - {""}, {""}, {""}, {""}, - {"marsIdent",1256}, - {"boustrophedonicOrdering",381}, - {"faLevelName",856}, - {""}, {""}, {""}, - {"xLast",2497}, - {""}, {""}, {""}, - {"typeOfStatisticalProcessingForTimeRangeForReferencePeriod",2344}, - {"waveDirectionNumber",2451}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"selectedDay",2108}, - {"indexTemplate",991}, - {"neitherPresent",1377}, - {"paramId",1693}, - {""}, {""}, {""}, - {"dewPointTemperature",698}, - {"indexingTime",995}, - {""}, {""}, {""}, - {"rdbSubtype",1815}, - {""}, {""}, {""}, {""}, - {"numberOfTimeSteps",1511}, - {""}, {""}, {""}, {""}, - {"iIncrement",978}, - {"scaleFactorOfFirstSize",1950}, - {""}, {""}, {""}, {""}, - {"angleOfRotationOfProjection",316}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"typicalSecond",2358}, + {"localDay",1170}, + {""}, + {"matchTimeRepres",1288}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"auxiliary",326}, - {"significanceOfReferenceTime",2132}, - {""}, {""}, {""}, - {"defaultShortName",683}, - {""}, {""}, {""}, - {"numberingOrderOfDiamonds",1527}, - {"angleOfRotationInDegrees",315}, - {""}, {""}, - {"expandedTypes",802}, - {""}, {""}, - {"numberOfRadials",1493}, - {""}, {""}, {""}, - {"postProcessing",1736}, + {"oldSubtype",1583}, {""}, {""}, {""}, {""}, - {"numberOfSection",1501}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"systemNumber",2230}, - {""}, - {"methodNumber",1323}, - {""}, - {"modelIdentifier",1348}, - {"frequency",900}, - {""}, - {"probPoint",1771}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"defaultTypeOfLevel",685}, - {""}, {""}, - {"numberOfSubsets",1506}, - {""}, - {"dataRepresentation",641}, - {"numberOfDirections",1434}, - {""}, {""}, - {"clusteringMethod",554}, - {""}, {""}, - {"dataValues",650}, - {""}, - {"defaultFaFieldName",677}, - {"changingPrecision",429}, - {""}, {""}, {""}, {""}, - {"treatmentOfMissingData",2304}, - {""}, - {"inputDelayedDescriptorReplicationFactor",1007}, - {""}, {""}, - {"SPD",229}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"derivedForecast",693}, {""}, {""}, {""}, - {"trueLengthOfLastGroup",2306}, - {""}, {""}, - {"headersOnly",952}, + {"localDefinition",1174}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfDiamonds",1433}, - {""}, {""}, - {"numberOfStatisticallyProcessedFieldsForLocalTime",1504}, - {""}, {""}, - {"horizontalCoordinateSupplement",959}, - {""}, {""}, {""}, {""}, - {"matchLandType",1284}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Nb",195}, + {"generatingProcessIdentifier",913}, {""}, {""}, - {"averagingPeriod",330}, + {"anoffsetFirst",318}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"Nr",200}, + {""}, {""}, {""}, {""}, + {"originalSubCentreIdentifier",1613}, + {"Ni",198}, + {""}, {""}, {""}, {""}, + {"northernLatitudeOfDomain",1396}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"productDefinition",1778}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"secondDimension",2013}, + {"lowerRange",1238}, + {"setDecimalPrecision",2128}, {""}, - {"forecastPeriodFrom",889}, + {"groupSplitting",943}, + {""}, {""}, + {"Nside",203}, + {"generatingProcessIdentificationNumber",912}, {""}, {""}, {""}, {""}, {""}, {""}, - {"masterTableNumber",1279}, - {"simpleThinningSkip",2134}, - {""}, {""}, {""}, {""}, {""}, - {"referencePeriodList",1846}, + {"freeFormData",900}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"longitudeOfCentrePoint",1207}, + {""}, {""}, {""}, + {"clusterSize",551}, + {""}, {""}, {""}, + {"incrementOfLengths",991}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"endOfRange",770}, + {""}, {""}, + {"reservedOctet",1872}, + {""}, + {"lcwfvSuiteName",1123}, {""}, {""}, {""}, {""}, - {"siteLongitude",2139}, - {"marsLongitude",1263}, - {""}, {""}, - {"optimizeScaleFactor",1593}, - {"horizontalCoordinateDefinition",958}, + {"southernLatitudeOfDomain",2167}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"parameterName",1711}, {""}, - {"numberOfFrequencies",1451}, - {""}, - {"ccccIdentifiers",393}, + {"hourOfForecast",967}, {""}, {""}, - {"floatVal",883}, + {"marsLevelist",1264}, + {""}, + {"NL",186}, + {"anoffsetFrequency",319}, + {"verticalDomainTemplate",2458}, + {"suiteName",2233}, + {""}, {""}, {""}, + {"bufrTemplate",384}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"localLatitude",1179}, + {"tileName",2282}, {""}, {""}, {""}, {""}, - {"computeLaplacianOperator",569}, - {"typeOfRelationToReferenceDataset",2338}, - {"centreLatitude",411}, + {"decimalScaleFactor",676}, {""}, - {"firstLatitude",871}, - {"dayOfStartOfReferencePeriod",673}, + {"integerScaleFactor",1018}, + {"J",92}, + {"typicalDay",2372}, + {""}, + {"marsParam",1267}, + {""}, + {"marsKeywords",1259}, + {"newSubtype",1383}, + {""}, {""}, {""}, + {"analysisOffsets",310}, + {""}, + {"modelName",1351}, + {""}, {""}, {""}, + {"LaR",106}, + {""}, {""}, {""}, + {"monthOfForecast",1358}, + {"typeOfLevel",2347}, + {"cfName",417}, + {"gridName",936}, + {"latitudeOfCentrePoint",1094}, + {"localTimeForecastList",1196}, + {""}, {""}, {""}, {""}, + {"referenceOfLengths",1853}, + {""}, {""}, + {"yearOfForecast",2529}, + {""}, {""}, {""}, + {"LoR",127}, + {""}, + {"epsPoint",787}, + {"rdbtimeDay",1829}, + {""}, {""}, + {"controlForecastCluster",586}, + {"longitudeSexagesimal",1233}, + {""}, + {"shortName",2135}, + {""}, + {"Nassigned",193}, + {""}, + {"scaledDirections",1981}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"defaultStepUnits",684}, + {""}, {""}, {""}, {""}, + {"realPart",1836}, + {"integerScalingFactorAppliedToDirections",1019}, + {"integerScalingFactorAppliedToFrequencies",1020}, + {""}, {""}, {""}, + {"Nf",197}, + {"qfe",1802}, + {""}, {""}, {""}, {""}, + {"gridDefinitionSection",933}, + {""}, + {"NT",190}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"changeDecimalPrecision",424}, - {""}, - {"referenceValue",1850}, - {""}, - {"dataRepresentationTemplate",642}, - {""}, - {"secondLatitude",2016}, + {"ifsParam",988}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"defaultFaLevelName",678}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"charValues",433}, - {""}, {""}, {""}, {""}, - {"applicationIdentifier",322}, - {""}, {""}, {""}, {""}, - {"secondOfForecastUsedInLocalTime",2020}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"inputDataPresentIndicator",1006}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"satelliteIdentifier",1939}, - {"perturbedType",1724}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"sequences",2125}, + {"editionNumber",739}, {""}, {""}, {""}, {""}, {""}, - {"minuteOfForecastUsedInLocalTime",1331}, + {"minuteOfReference",1335}, + {""}, {""}, {""}, + {"multiplicationFactorForLatLong",1367}, + {""}, + {"quantile",1812}, + {""}, {""}, {""}, {""}, {""}, + {"dateOfReference",661}, + {""}, {""}, {""}, + {"timeOfReference",2293}, + {""}, + {"rdbSubtype",1824}, + {""}, {""}, {""}, {""}, + {"overlayTemplateNumber",1623}, + {""}, + {"sectionNumber",2094}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"masterTableNumber",1281}, + {"climatologicalRegime",438}, + {""}, + {"numberOfTimeSteps",1516}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"qnh",1805}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"trueLengthOfLastGroup",2323}, + {""}, {""}, {""}, + {"visibility",2462}, + {"minuteOfForecast",1332}, + {""}, {""}, {""}, + {"validityDate",2428}, + {""}, {""}, {""}, {""}, + {"secondOfForecast",2028}, + {"observedData",1541}, + {""}, {""}, + {"numberOfFloats",1449}, + {""}, {""}, {""}, {""}, + {"gridDefinitionDescription",932}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"Adelta",13}, - {""}, {""}, {""}, - {"indexingDate",994}, + {""}, {""}, {""}, {""}, + {"numberOfDirections",1439}, + {""}, + {"defaultName",680}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"pvlLocation",1792}, - {"endOfProduct",770}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"iDirectionIncrement",974}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"clusterNumber",550}, + {""}, + {"optimizeScaleFactor",1600}, + {""}, {""}, {""}, + {"longitudeOfGridPoints",1214}, {""}, {""}, {""}, {""}, - {"versionNumOfFilesFreeSpaceStorage",2429}, - {""}, - {"dataRepresentationType",644}, + {"rectimeSecond",1846}, + {""}, {""}, + {"isAuto",1027}, + {""}, {""}, + {"crraSection",630}, {""}, {""}, {""}, - {"dataRepresentationTemplateNumber",643}, + {"uerraSection",2384}, {""}, {""}, {""}, {""}, - {"rdbtimeSecond",1824}, - {""}, {""}, - {"tubeNumber",2313}, - {"simpleThinningStart",2135}, - {""}, {""}, {""}, - {"partitionItems",1708}, - {"offsetSection6",1568}, + {"numberingOrderOfDiamonds",1534}, {""}, {""}, {""}, {""}, - {"coordinate3OfLastGridPoint",600}, - {"numberOfForcasts",1445}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"energyNorm",779}, + {"channelNumber",430}, + {""}, {""}, {""}, {""}, {""}, + {"dayOfForecast",669}, + {""}, + {"localDefinitionNumber",1175}, + {""}, + {"numberOfSection",1506}, {""}, {""}, {""}, - {"totalNumberOfdimensions",2303}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfLocalDefinitions",1461}, - {""}, {""}, - {"internalVersion",1021}, - {"FirstLatitude",67}, - {""}, {""}, - {"tableNumber",2234}, - {""}, {""}, {""}, - {"isAuto",1026}, - {"correction1Part",615}, - {""}, {""}, {""}, {""}, {""}, - {"corr4Data",612}, - {""}, - {"stretchingFactor",2205}, - {""}, - {"temperatureAndDewpointPresent",2245}, - {"scaleFactorOfFirstFixedSurface",1949}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ensembleForecastNumbers",781}, - {""}, - {"verificationDate",2424}, - {"SecondLatitude",230}, - {""}, - {"P",213}, - {"localLongitude",1182}, - {"codedValues",562}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfForecastsInTube",1449}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"expandedNames",797}, - {""}, {""}, {""}, {""}, {""}, - {"orientationOfTheGrid",1600}, - {""}, {""}, {""}, {""}, {""}, - {"stretchingFactorScaled",2206}, - {""}, - {"bitmapSectionPresent",375}, - {"scaleFactorOfSecondFixedSurface",1960}, - {"listOfDistributionFunctionParameter",1158}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"observablePropertyTemplate",1529}, - {""}, {""}, {""}, {""}, {""}, - {"corr3Data",611}, - {"formatForLongs",896}, - {""}, - {"climateDateFrom",437}, + {"spectralDataRepresentationMode",2180}, {""}, {""}, {""}, {""}, - {"subSetK",2218}, + {"hourOfReference",970}, + {""}, + {"optimisationTime",1599}, {""}, {""}, {""}, - {"widthOfFirstOrderValues",2460}, + {"defaultParameter",681}, + {""}, {""}, {""}, + {"computeLaplacianOperator",569}, + {""}, + {"listOfScaledFrequencies",1163}, + {""}, + {"forecastPeriod",889}, + {""}, + {"waveLevType",2474}, + {""}, {""}, + {"numberOfSubsets",1511}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfLocalDefinitions",1466}, + {""}, {""}, {""}, + {"standardParallel",2186}, + {""}, {""}, {""}, {""}, {""}, {"dataAccessors",634}, - {""}, {""}, {""}, - {"memberNumber",1319}, - {""}, {""}, {""}, {""}, {""}, - {"yDirectionGridLength",2500}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"totalNumberOfTubes",2299}, - {""}, {""}, - {"longitudeOfIcosahedronPole",1213}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"unitOfOffsetFromReferenceTime",2369}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"secondsOfReference",2036}, - {""}, {""}, {""}, - {"scaleFactorOfRadiusOfSphericalEarth",1959}, - {"floatValues",884}, - {""}, - {"totalNumberOfQuantiles",2296}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"typeOfDistributionFunction",2321}, - {""}, {""}, {""}, {""}, {""}, - {"observablePropertyTemplateNumber",1530}, - {""}, - {"expandedDescriptors",796}, - {"levelIndicator",1141}, - {""}, - {"missingDataFlag",1337}, - {"diagnosticNumber",700}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"isEps",1035}, {""}, {""}, {""}, {""}, - {"numberOfDistinctSection9s",1441}, - {""}, {""}, {""}, - {"numberOfDistinctSection8s",1440}, - {""}, {""}, - {"stringValues",2207}, - {""}, {""}, {""}, {""}, {""}, - {"orderOfSPD",1596}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"globalDomain",919}, + {"typeOfStatisticalPostProcessingOfEnsembleMembers",2359}, + {"nTileAtt",1371}, {""}, {""}, {""}, {""}, - {"tablesVersion",2238}, - {"numberOfReferencePeriodTimeRanges",1494}, + {"Ny",208}, + {"angleOfRotation",313}, + {"horizontalCoordinateDefinition",959}, + {"horizontalCoordinateSupplement",960}, {""}, - {"scaleFactorAtReferencePoint",1942}, - {"endOfInterval",768}, + {"monthOfReference",1361}, + {""}, + {"XR",271}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfOperationalForecastTube",1472}, - {""}, {""}, - {"unitOfTimeIncrement",2371}, - {""}, {""}, {""}, {""}, {""}, - {"realization",1829}, - {"diffInDays",701}, - {"scanPosition",2003}, - {""}, {""}, - {"stepTypeInternal",2200}, - {""}, {""}, {""}, {""}, - {"lengthOfProjectLocalTemplate",1135}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfReservedBytes",1498}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"TAFstr",237}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"totalNumberOfRepetitions",2297}, - {""}, {""}, {""}, {""}, {""}, - {"verticalDomainTemplateNumber",2439}, - {""}, - {"qnhPresent",1798}, - {""}, - {"qfePresent",1794}, - {""}, {""}, {""}, {""}, - {"monthlyVerificationTime",1363}, - {""}, - {"totalNumberOfDirections",2291}, - {"identificationNumber",982}, - {""}, - {"destineLocalVersion",695}, - {""}, - {"section9Pointer",2081}, - {"levelValues",1143}, - {"falseNorthing",860}, - {""}, - {"section8Pointer",2078}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"typeOfTimeIncrement",2345}, - {""}, - {"secondDimensionPhysicalSignificance",2015}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"indexTemplateNumber",992}, - {""}, {""}, - {"subSetJ",2217}, - {""}, {""}, - {"angleSubdivisions",317}, - {"Xo",274}, - {""}, {""}, {""}, {""}, {""}, - {"sampleSizeOfReferencePeriod",1937}, - {""}, - {"centuryOfReference",416}, - {""}, - {"scalingFactorForFrequencies",2002}, - {""}, {""}, {""}, - {"Xp",275}, - {""}, {""}, {""}, - {"gridDefinitionTemplateNumber",933}, - {"cfVarName",421}, - {""}, - {"correction4Part",621}, - {""}, - {"ensembleStandardDeviation",784}, - {"molarMass",1352}, - {""}, {""}, {""}, {""}, - {"longitudeOfFirstGridPoint",1210}, - {"totalNumberOfFrequencies",2293}, + {"yearOfReference",2532}, + {"typeOfStatisticalProcessing",2360}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"marsEndStep",1251}, + {"indicatorOfUnitOfTimeRange",1006}, {""}, {""}, {""}, {""}, - {"marsModel",1264}, - {""}, - {"dayOfReference",672}, + {"modeNumber",1347}, + {"Ncy",196}, + {"dataValues",650}, + {"numberOfFrequencies",1456}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Nuy",206}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"uuidOfDataGroup",2424}, + {""}, {""}, {""}, {""}, + {"validityDateTime",2429}, + {"localSection",1191}, + {""}, {""}, {""}, {""}, {""}, + {"minuteOfForecastUsedInLocalTime",1333}, + {"numberOfDiamonds",1438}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"secondOfForecastUsedInLocalTime",2029}, + {"tiggeSection",2273}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"forecastPeriodTo",891}, + {"probPoint",1780}, + {""}, + {"latitudeOfCentrePointInDegrees",1095}, + {""}, + {"originalParameterNumber",1611}, + {"referenceValue",1859}, + {"boustrophedonicOrdering",380}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"experiment",804}, + {""}, {""}, {""}, {""}, {""}, + {"oceanLevName",1544}, + {""}, + {"iteratorDisableUnrotate",1061}, + {""}, {""}, + {"sectionPosition",2095}, + {"xLast",2517}, + {""}, + {"maximum",1293}, + {"yDirectionGridLength",2520}, + {""}, {""}, + {"atmosphericChemicalOrPhysicalConstituentType",323}, + {""}, {""}, + {"iDirectionIncrement",975}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"totalNumber",2303}, + {""}, + {"spectralDataRepresentationType",2181}, + {""}, {""}, + {"charValues",432}, + {""}, + {"epsStatisticsPoint",789}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"applicationIdentifier",321}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"legNumber",1127}, + {"windPresent",2494}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfStatisticallyProcessedFieldsForLocalTime",1509}, + {""}, + {"significanceOfReferenceTime",2141}, + {""}, {""}, + {"angleOfRotationInDegrees",314}, + {""}, {""}, + {"neitherPresent",1382}, + {""}, + {"faFieldName",855}, + {""}, {""}, + {"pvlLocation",1801}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"orderOfSpatialDifferencing",1604}, + {""}, + {"faLevelName",856}, + {"floatVal",883}, + {""}, {""}, {""}, {""}, + {"stepTypeForConversion",2209}, + {""}, {""}, + {"changingPrecision",428}, + {"numberOfRadials",1498}, + {"typicalSecond",2376}, + {""}, {""}, {""}, + {"scaleFactorOfSecondSize",1970}, + {""}, + {"standardParallelInDegrees",2187}, + {"defaultTypeOfLevel",685}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"groupLeafNodeK",941}, + {""}, {""}, + {"productDefinition",1787}, + {""}, {""}, {""}, + {"rdbtimeSecond",1833}, + {"clusteringMethod",553}, + {""}, + {"siteId",2146}, + {""}, + {"paramId",1700}, + {""}, + {"referencePeriodList",1855}, + {"TAFstr",236}, + {"marsIdent",1258}, + {""}, + {"numberOfForcasts",1450}, + {"methodNumber",1325}, + {""}, {""}, {""}, {""}, + {"subSetJ",2228}, + {"frequency",901}, + {""}, {""}, + {"observablePropertyTemplate",1536}, + {""}, {""}, {""}, {""}, {""}, + {"ensembleForecastNumbers",781}, + {""}, {""}, {""}, {""}, + {"iIncrement",979}, + {""}, {""}, + {"typeOfStatisticalProcessingForTimeRangeForReferencePeriod",2361}, + {""}, {""}, + {"Nb",194}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"expoffset",809}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"unitOfTimeIncrement",2389}, + {""}, {""}, {""}, {""}, + {"scaleFactorOfStandardDeviation",1972}, + {""}, + {"numberOfForecastsInTube",1454}, + {""}, {""}, + {"SPD",228}, + {""}, {""}, + {"dewPointTemperature",697}, + {""}, {""}, + {"formatForLongs",897}, + {"observablePropertyTemplateNumber",1537}, + {""}, {""}, + {"scaleFactorOfStandardDeviationInTheCluster",1973}, + {"simpleThinningSkip",2143}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ensembleForecastNumbersList",782}, - {""}, {""}, {""}, - {"longitudeOfStretchingPole",1222}, - {""}, - {"tableReference",2235}, + {""}, {""}, + {"extraDim",812}, + {"realization",1838}, + {"firstLatitude",871}, {""}, {""}, {""}, {""}, - {"dx",726}, - {""}, {""}, {""}, - {"numberOfForecastsUsedInLocalTime",1450}, - {"PLPresent",216}, - {"max",1289}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"productDefinitionTemplateNumber",1779}, + {"treatmentOfMissingData",2321}, {""}, {""}, {""}, {""}, {""}, - {"orientationOfTheGridInDegrees",1601}, - {""}, {""}, {""}, {""}, {""}, - {"offsetFreeFormData",1556}, - {""}, {""}, {""}, {""}, {""}, - {"isAccumulation",1025}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"sizeOfOffsets",2141}, + {"forecastPeriodFrom",890}, {""}, - {"localDefNumberTwo",1171}, + {"powerOfTenUsedToScaleClimateWeight",1746}, {""}, - {"userTimeEnd",2403}, - {"unsignedIntegers",2388}, - {"monthlyVerificationDate",1361}, + {"scaleFactorOfFirstSize",1959}, + {""}, + {"secondDimension",2022}, + {""}, + {"destineLocalVersion",694}, + {"averagingPeriod",329}, + {""}, + {"postProcessing",1745}, + {"marsLongitude",1265}, + {"internalVersion",1022}, {""}, {""}, {""}, - {"decimalPrecision",675}, - {"DiInDegrees",32}, - {"subcentreOfAnalysis",2220}, - {"secondOrderFlags",2023}, - {"productDefinitionTemplateNumberInternal",1780}, - {"meaningOfVerticalCoordinate",1318}, - {"numberOfPartitions",1476}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"nosigPresent",1392}, - {""}, {""}, {""}, {""}, - {"dateOfForecastRun",657}, - {"gridPointPosition",936}, - {""}, {""}, {""}, - {"typeOfPostProcessing",2334}, - {""}, - {"iterationNumber",1059}, - {"dimensionNumber",704}, - {"latitudeOfGridPoints",1097}, - {"parameterNumber",1704}, - {""}, {""}, {""}, - {"g2grid",907}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"clutterFilterIndicator",555}, - {""}, {""}, {""}, {""}, {""}, - {"latLonValues",1087}, - {"scaleFactorOfDistributionFunctionParameter",1946}, - {"partitionNumber",1709}, - {"widthOfSPD",2462}, - {""}, {""}, {""}, - {"siteElevation",2136}, - {""}, {""}, - {"theMessage",2249}, - {""}, {""}, {""}, - {"extractSubset",843}, - {""}, {""}, {""}, - {"directionNumber",707}, - {"operatingMode",1590}, - {"periodOfTimeIntervals",1722}, - {""}, {""}, - {"radialAngularSpacing",1805}, - {"satelliteNumber",1940}, - {"section0Pointer",2039}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"TAF",236}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"perturbationNumber",1723}, - {""}, {""}, {""}, {""}, - {"tiggeModel",2261}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"eastLongitudeOfCluster",733}, - {""}, {""}, - {"correction3",618}, - {"representationMode",1855}, - {""}, {""}, {""}, {""}, - {"coordinate3Flag",598}, - {"angleMultiplier",313}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"DyInDegrees",43}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"userDateEnd",2399}, - {""}, {""}, {""}, - {"northLatitudeOfCluster",1384}, - {""}, {""}, - {"MS",159}, - {"clusterMember9",550}, - {""}, {""}, {""}, - {"latitudeOfStretchingPole",1107}, - {""}, {""}, - {"unitsOfSecondFixedSurface",2382}, - {"clusterMember8",549}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"complexPacking",566}, - {""}, {""}, - {"NP",188}, - {"spatialProcessing",2169}, - {"localMinute",1185}, - {"corr2Data",610}, - {""}, - {"spectralMode",2173}, - {""}, {""}, - {"numberOfRemaininChars",1496}, - {""}, {""}, - {"libraryVersion",1148}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Dx",39}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"NAT",175}, - {""}, - {"scanningMode",2004}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"groupLeafNodeK",940}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"longitudeOfLastGridPoint",1214}, - {""}, {""}, {""}, {""}, {""}, - {"southLatitudeOfCluster",2154}, - {"localMonth",1186}, - {"scanningMode8",2009}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetAfterPadding",1545}, - {""}, - {"sensitiveAreaDomain",2115}, - {""}, - {"oneMillionConstant",1579}, - {""}, {""}, {""}, - {"iScansNegatively",979}, - {""}, {""}, {""}, {""}, {""}, - {"localDefNumberOne",1170}, - {""}, - {"interpretationOfNumberOfPoints",1023}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"totalNumberOfTileAttributePairs",2298}, - {""}, - {"binaryScaleFactor",371}, - {""}, {""}, {""}, - {"internationalDataSubCategory",1022}, - {""}, {""}, - {"baseAddress",336}, - {""}, {""}, {""}, {""}, {""}, - {"westLongitudeOfCluster",2456}, - {""}, - {"Lx",152}, - {""}, {""}, {""}, - {"biFourierTruncationType",370}, - {""}, {""}, {""}, {""}, {""}, - {"minutesAfterDataCutoff",1335}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"tablesVersionLatest",2239}, - {""}, - {"isConstant",1032}, - {""}, {""}, {""}, {""}, - {"userDateTimeEnd",2401}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfRows",1499}, - {""}, - {"heightOrPressureOfLevel",954}, - {"earthMinorAxis",731}, - {"streamOfAnalysis",2204}, - {""}, {""}, - {"Lcx",118}, - {""}, {""}, {""}, {""}, {""}, - {"localSectionPresent",1190}, - {"marsClass",1246}, - {""}, {""}, {""}, - {"scaleFactorOfLowerLimit",1954}, - {""}, - {"section_8",2105}, - {""}, - {"thisMarsType",2253}, - {""}, {""}, - {"earthIsOblate",728}, - {""}, {""}, - {"is_uerra",1053}, - {""}, - {"longitudeOfCentrePointInDegrees",1206}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"outerLoopLengthOfTimeRange",1612}, - {""}, {""}, - {"yearOfStartOfReferencePeriod",2513}, - {""}, {""}, {""}, - {"Lux",148}, - {"thisMarsStream",2252}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"is_aerosol",1045}, - {""}, {""}, {""}, {""}, {""}, - {"formatForDoubles",895}, - {"offsetAfterLocalSection",1544}, - {""}, {""}, {""}, - {"marsLamModel",1259}, - {"ITN",92}, - {""}, - {"timeIncrement",2272}, - {"additionalFlagPresent",302}, - {""}, {""}, {""}, {""}, - {"scaledValueOfStandardDeviation",1994}, - {""}, - {"scaledValueOfSecondSize",1992}, - {""}, {""}, - {"numberOfDistinctSection6s",1438}, - {""}, - {"minuteOfAnalysis",1328}, - {""}, - {"plusOneinOrdersOfSPD",1731}, - {""}, - {"parameterCode",1700}, - {"short_name",2129}, - {"ecpt_model",737}, - {""}, - {"scaledValueOfStandardDeviationInTheCluster",1995}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"siteLongitude",2148}, {""}, {"Azi",15}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsTitle3",530}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"createNewData",628}, {""}, - {"bitmapPresent",374}, - {"_T",290}, - {""}, {""}, {""}, {""}, {""}, - {"tigge_name",2264}, - {""}, {""}, - {"cnmc_isac",557}, - {""}, {""}, - {"numberOfIterations",1459}, - {""}, {""}, - {"isHindcast",1038}, - {"grib3divider",924}, - {"latitudeLastInDegrees",1090}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"hourOfStartOfReferencePeriod",970}, - {"windVariableDirection",2485}, - {""}, {""}, - {"extraDimensionPresent",813}, - {""}, {""}, {""}, {""}, - {"LaDInDegrees",106}, - {""}, - {"_endStep",293}, - {""}, {""}, - {"local_use",1199}, - {""}, {""}, - {"XR",272}, - {""}, - {"scaledValueOfFirstSize",1981}, - {""}, - {"efas_model",741}, - {"defaultSequence",682}, - {""}, {""}, - {"totalNumberOfForecastProbabilities",2292}, - {"gts_header",949}, - {""}, {""}, {""}, {""}, {""}, - {"representativeMember",1857}, + {"codedValues",561}, {""}, {""}, {""}, - {"dayOfAnalysis",667}, + {"systemNumber",2241}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"expver",810}, + {""}, + {"levTypeName",1140}, + {""}, + {"indexingTime",996}, + {""}, {""}, {""}, {""}, {""}, + {"isAccumulation",1026}, + {""}, {""}, + {"changeDecimalPrecision",423}, + {""}, {""}, {""}, {""}, + {"dataRepresentation",641}, + {"tubeNumber",2330}, + {"centreLatitude",410}, + {"generatingProcessTemplateNumber",915}, + {"numberOfForecastsUsedInLocalTime",1455}, + {""}, + {"sizeOfOffsets",2150}, + {"xFirst",2516}, + {""}, {""}, {""}, {""}, + {"localLatitude",1181}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"bitmapSectionPresent",374}, + {"tablesVersion",2249}, + {""}, {""}, {""}, {""}, {""}, + {"longitudeOfIcosahedronPole",1215}, + {"listOfDistributionFunctionParameter",1159}, + {""}, + {"endOfProduct",769}, + {""}, {""}, + {"secondLatitude",2025}, + {""}, {""}, {""}, + {"modelIdentifier",1350}, + {""}, + {"numberOfOperationalForecastTube",1477}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"inputDataPresentIndicator",1007}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"defaultShortName",683}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"oneConstant",1578}, + {"radialAngularSpacing",1814}, {""}, - {"tileClassification",2266}, - {""}, - {"observationGeneratingProcessIdentifier",1532}, - {""}, - {"section6Pointer",2070}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"cnmc_cmcc",556}, - {"modelVersionTime",1351}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"is_uerra",1054}, {""}, {""}, {""}, - {"Nx",208}, - {""}, - {"localTimeMethod",1195}, - {"_anoffset",292}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"is_chemical",1047}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"addressOfFileFreeSpaceInfo",304}, - {"endDayTrend3",749}, - {""}, - {"verticalVisibility",2440}, - {"versionNumOfRootGroupSymbolTableEntry",2430}, - {""}, - {"is_localtime",1050}, - {"integerValues",1020}, - {""}, - {"calendarIdPresent",387}, - {"missingValue",1338}, + {"ccccIdentifiers",392}, {""}, {""}, {""}, - {"numberOfVerticalPoints",1522}, - {"section_09",2095}, - {""}, {""}, - {"defaultStepUnits",684}, + {"tableNumber",2245}, {""}, - {"iScansPositively",980}, - {"scaledFrequencies",1973}, - {""}, - {"section_08",2094}, - {"Ncx",196}, - {""}, {""}, - {"parameterIndicator",1702}, - {"monthOfStartOfReferencePeriod",1360}, + {"scaleFactorOfLowerLimit",1963}, {""}, {""}, {""}, {""}, {""}, - {"tiggeCentre",2258}, + {"unitOfOffsetFromReferenceTime",2387}, + {"typeOfTimeIncrement",2363}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"NDSP",180}, - {""}, {""}, - {"numericValues",1528}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfVerticalCoordinateValues",1520}, - {""}, {""}, {""}, {""}, - {"localHour",1178}, - {""}, - {"calendarIdentification",388}, - {""}, {""}, - {"Nux",206}, - {"rectimeHour",1835}, - {""}, {""}, - {"offsetAfterCentreLocalSection",1542}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"NFSP",182}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"unitsOfFirstFixedSurface",2381}, - {"startOfMessage",2182}, - {""}, {""}, {""}, {""}, - {"numberOfVerticalGridDescriptors",1521}, - {""}, - {"corr1Data",609}, - {""}, {""}, - {"jdSelected",1070}, - {""}, {""}, {""}, {""}, - {"numberOfInts",1458}, - {""}, {""}, - {"endOfFileAddress",766}, + {"verificationDate",2444}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"floatValues",884}, + {"memberNumber",1321}, + {"N",171}, {""}, {""}, {""}, - {"section4Padding",2061}, - {""}, {""}, {""}, - {"roundedMarsLongitude",1882}, + {"indexTemplate",992}, {""}, - {"modelVersionDate",1350}, + {"inputDelayedDescriptorReplicationFactor",1008}, {""}, {""}, {""}, - {"conceptsLocalMarsDirAll",576}, - {""}, {""}, - {"_TS",291}, - {""}, {""}, - {"xDirectionGridLength",2493}, - {"extractSubsetList",846}, + {"offsetAfterPadding",1552}, {""}, - {"extraValues",816}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"targetCompressionRatio",2241}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"indicatorOfUnitOfTimeRange",1005}, - {""}, {""}, {""}, {""}, - {"centuryOfReferenceTimeOfData",417}, - {"extractedDateTimeNumberOfSubsets",848}, - {""}, {""}, - {"conceptsMasterDir",577}, - {"roundedMarsLatitude",1880}, - {"typeOfEnsembleForecast",2322}, + {"minutesAfterDataCutoff",1337}, {""}, {""}, {""}, {""}, {""}, {""}, - {"forecastProbabilityNumber",891}, + {"section_8",2114}, + {""}, {""}, {""}, + {"temperatureAndDewpointPresent",2256}, {""}, {""}, - {"tablesVersionLatestOfficial",2240}, - {"accumulationInterval",296}, + {"cnmc_isac",556}, + {""}, + {"expandedTypes",802}, + {""}, {""}, {""}, {""}, + {"stringValues",2218}, + {"short_name",2138}, + {"baseAddress",335}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"latLonValues",1088}, + {""}, {""}, + {"simpleThinningStart",2144}, + {""}, {""}, + {"TAF",235}, + {""}, {""}, + {"typeOfDistributionFunction",2338}, + {""}, {""}, {""}, + {"_T",289}, + {""}, {""}, + {"cnmc_cmcc",555}, + {""}, {""}, {""}, + {"offsetAfterLocalSection",1551}, + {""}, {""}, + {"defaultFaLevelName",678}, + {""}, {""}, {""}, + {"SecondLatitude",229}, + {""}, {""}, {""}, + {"FirstLatitude",66}, + {"correction4Part",621}, + {""}, + {"NR",188}, {""}, {""}, {""}, {""}, {""}, - {"section3Padding",2056}, + {"dataRepresentationTemplate",642}, + {"_endStep",292}, + {""}, + {"stretchingFactor",2216}, + {""}, {""}, {""}, {""}, {""}, + {"waveDirectionNumber",2471}, + {""}, + {"numberOfDistinctSection9s",1446}, + {""}, {""}, {""}, {""}, {""}, + {"section_09",2104}, {""}, {""}, - {"faModelName",857}, - {"referenceReflectivityForEchoTop",1847}, + {"angleOfRotationOfProjection",315}, + {""}, {""}, + {"tigge_name",2275}, + {"_anoffset",291}, + {""}, + {"dimensionType",704}, + {"meaningOfVerticalCoordinate",1320}, + {"ecpt_model",736}, + {""}, + {"gts_header",950}, + {"is_aerosol",1046}, + {"numberOfDistinctSection8s",1445}, + {""}, + {"auxiliary",325}, + {""}, + {"sensitiveAreaDomain",2124}, + {""}, {""}, {""}, {""}, + {"satelliteIdentifier",1948}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"orientationOfTheGrid",1607}, + {""}, {""}, + {"P",212}, + {"dataRepresentationTemplateNumber",643}, + {""}, + {"isEps",1036}, + {"section_08",2103}, + {"globalDomain",920}, + {"local_use",1201}, + {""}, {""}, {""}, {""}, {""}, + {"partitionItems",1717}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"is_chemical",1048}, + {"efas_model",740}, + {""}, + {"stretchingFactorScaled",2217}, + {""}, {""}, {""}, + {"localLongitude",1184}, + {"typeOfRelationToReferenceDataset",2355}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"diagnosticNumber",699}, + {""}, {""}, {""}, + {"scaleFactorOfSecondFixedSurface",1969}, + {""}, + {"dayOfStartOfReferencePeriod",673}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"dataRepresentationType",644}, + {""}, + {"defaultFaFieldName",677}, + {""}, + {"tablesVersionLatest",2250}, + {""}, {""}, {""}, {""}, {""}, + {"orderOfSPD",1603}, + {"PLPresent",215}, + {""}, {""}, {""}, + {"is_localtime",1051}, + {"matchLandType",1286}, + {"climateDateFrom",436}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"widthOfFirstOrderValues",2480}, + {"secondsOfReference",2045}, + {""}, {""}, + {"correction1Part",615}, + {""}, {""}, {""}, + {"scaleFactorOfFirstFixedSurface",1958}, + {""}, {""}, {""}, {""}, + {"ensembleStandardDeviation",784}, + {""}, {""}, + {"monthlyVerificationTime",1365}, + {""}, + {"angleSubdivisions",316}, + {""}, + {"numberOfPartitions",1481}, + {""}, + {"sampleSizeOfReferencePeriod",1946}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"levelValues",1144}, + {"corr4Data",612}, + {"scanPosition",2012}, + {""}, + {"indexingDate",995}, + {""}, {""}, {""}, {""}, + {"numberOfReservedBytes",1503}, + {"_TS",290}, + {"latitudeOfGridPoints",1098}, + {""}, {""}, {""}, {""}, {""}, + {"longitudeOfStretchingPole",1224}, + {"qfePresent",1803}, + {"numberOfReferencePeriodTimeRanges",1499}, + {""}, {""}, + {"qnhPresent",1807}, + {""}, {""}, {""}, + {"streamOfAnalysis",2215}, + {""}, {""}, {""}, {""}, + {"lengthOfProjectLocalTemplate",1136}, + {""}, {""}, {""}, {""}, {""}, + {"marsEndStep",1253}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"outerLoopLengthOfTimeRange",1619}, + {""}, + {"totalNumberOfdimensions",2319}, + {""}, {""}, + {"startingAzimuth",2197}, + {"numberOfRows",1504}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"minuteOfAnalysis",1330}, + {""}, {""}, + {"tableReference",2246}, + {""}, {""}, + {"offsetAfterCentreLocalSection",1549}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"verticalCoordinate",2436}, - {""}, {""}, - {"groupSplittingMethodUsed",943}, - {"setCalendarId",2118}, + {"userTimeEnd",2421}, {""}, {""}, {""}, - {"reservedSection3",1865}, - {"destineOrigin",696}, + {"section9Pointer",2090}, + {""}, + {"localDefNumberTwo",1173}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section8Pointer",2087}, + {""}, + {"unitsOfSecondFixedSurface",2400}, + {"secondDimensionPhysicalSignificance",2024}, + {""}, {""}, + {"totalNumberOfTubes",2315}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"calendarIdentificationTemplateNumber",389}, - {"gridDescriptionSectionPresent",934}, + {"latitudeOfStretchingPole",1108}, + {""}, + {"missingDataFlag",1339}, + {""}, + {"diffInDays",700}, + {""}, + {"totalNumberOfQuantiles",2311}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"NAT",174}, + {""}, {""}, + {"monthlyVerificationDate",1363}, + {""}, {""}, {""}, {""}, + {"representationType",1865}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cfVarName",420}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"sphericalHarmonics",2175}, + {"libraryVersion",1149}, + {""}, {""}, {""}, + {"scaleFactorOfRadiusOfSphericalEarth",1968}, + {""}, {""}, {""}, {""}, + {"centuryOfReference",415}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"scalingFactorForFrequencies",2011}, + {""}, {""}, {""}, + {"endOfInterval",767}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"section0Pointer",2048}, + {""}, + {"dayOfReference",672}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"perturbedType",1733}, + {""}, + {"heightOrPressureOfLevel",955}, + {""}, + {"levelIndicator",1142}, {""}, {""}, {""}, {""}, {""}, {""}, + {"decimalPrecision",675}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"verticalDomainTemplateNumber",2459}, + {""}, {""}, {""}, {""}, + {"windVariableDirection",2505}, + {""}, {""}, + {"numberOfRemaininChars",1501}, + {""}, {""}, + {"stepTypeInternal",2210}, + {""}, + {"orientationOfTheGridInDegrees",1608}, + {"userDateEnd",2417}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfVerticalPoints",1529}, + {""}, {""}, + {"widthOfSPD",2482}, + {""}, + {"scaleFactorAtReferencePoint",1951}, + {""}, + {"longitudeOfLastGridPoint",1216}, + {""}, {""}, {""}, {""}, + {"selectedDay",2117}, + {""}, {""}, {""}, {""}, + {"periodOfTimeIntervals",1731}, + {""}, + {"expandedDescriptors",796}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"typeOfPostProcessing",2351}, + {""}, + {"offsetFreeFormData",1563}, + {""}, + {"extractSubset",843}, + {"gts_ddhh00",949}, + {""}, {""}, + {"northLatitudeOfCluster",1389}, + {"longitudeOfFirstGridPoint",1212}, + {"numberOfVerticalCoordinateValues",1527}, + {""}, + {"molarMass",1354}, + {""}, {""}, + {"nosigPresent",1397}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"eastLongitudeOfCluster",732}, + {"siteElevation",2145}, + {""}, + {"lsdate_bug",1242}, + {""}, {""}, + {"gridDefinitionTemplateNumber",934}, + {"lstime_bug",1243}, + {""}, {""}, + {"versionNumOfFilesFreeSpaceStorage",2449}, + {"observationGeneratingProcessIdentifier",1539}, + {""}, + {"totalNumberOfDirections",2306}, + {"dayOfAnalysis",667}, + {""}, {""}, {""}, + {"interpretationOfNumberOfPoints",1024}, + {""}, + {"numberOfVerticalGridDescriptors",1528}, + {""}, {""}, + {"is_aerosol_optical",1047}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"perturbationNumber",1732}, + {""}, {""}, {""}, {""}, {""}, + {"tablesVersionLatestOfficial",2251}, + {""}, {""}, + {"southLatitudeOfCluster",2163}, + {""}, + {"marsModel",1266}, + {"headersOnly",953}, + {"secondOrderFlags",2032}, + {""}, {""}, {""}, + {"spatialProcessing",2178}, + {"scaleFactorOfDistributionFunctionParameter",1955}, + {""}, {""}, {""}, {""}, + {"numberOfLevelValues",1465}, + {""}, + {"isConstant",1033}, + {""}, {""}, {""}, {""}, {""}, + {"endOfFileAddress",765}, + {""}, {""}, + {"userDateTimeEnd",2419}, + {"gridPointPosition",937}, + {""}, {""}, {""}, {""}, {""}, + {"LoV",128}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"unsignedIntegers",2406}, + {""}, + {"expandedNames",797}, + {"theMessage",2260}, + {"g2grid",908}, + {""}, {""}, {""}, + {"falseNorthing",860}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"bitmapPresent",373}, + {"numberOfIterations",1464}, + {"DiInDegrees",32}, + {"numberOfAnalysis",1409}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"marsClass",1248}, + {""}, + {"operatingMode",1597}, + {""}, {""}, {""}, + {"binaryScaleFactor",370}, + {""}, + {"totalNumberOfFrequencies",2308}, + {""}, {""}, {""}, + {"productDefinitionTemplateNumber",1788}, + {""}, {""}, {""}, {""}, + {"marsLamModel",1261}, + {""}, {""}, + {"parameterCode",1708}, + {""}, {""}, {""}, + {"scaledValueOfSecondSize",2001}, + {""}, {""}, + {"clusterMember9",549}, + {"is_chemical_distfn",1049}, + {"modelVersionTime",1353}, + {""}, + {"MS",158}, + {""}, {""}, + {"sfc_levtype",2132}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"clutterFilterIndicator",554}, + {""}, {""}, + {"matchAerosolPacking",1285}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"clusterMember8",548}, + {""}, {""}, {""}, {""}, {""}, + {"setCalendarId",2127}, + {""}, + {"internationalDataSubCategory",1023}, + {""}, {""}, {""}, {""}, + {"corr2Data",610}, + {""}, {""}, + {"localMinute",1187}, + {""}, {""}, + {"crraLocalVersion",629}, + {""}, + {"productDefinitionTemplateNumberInternal",1789}, + {""}, {""}, {""}, {""}, {""}, + {"spectralMode",2182}, + {""}, {""}, + {"earthIsOblate",727}, + {"angleMultiplier",312}, + {""}, {""}, {""}, + {"correction3Part",619}, + {""}, {""}, {""}, + {"scanningMode",2013}, + {""}, + {"totalNumberOfTileAttributePairs",2314}, + {""}, + {"totalNumberOfRepetitions",2312}, + {"xDirectionGridLength",2513}, + {""}, + {"LaDInDegrees",105}, + {""}, + {"param_value_min",1705}, + {""}, + {"tiggeModel",2272}, + {""}, {""}, {""}, {""}, + {"scaledValueOfStandardDeviation",2003}, + {"westLongitudeOfCluster",2476}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"typeOfSizeInterval",2358}, + {""}, {""}, {""}, + {"totalNumberOfTileAttributeCombinations",2313}, + {"scaledValueOfStandardDeviationInTheCluster",2004}, + {""}, + {"representationMode",1864}, + {""}, + {"latitudeLastInDegrees",1091}, + {""}, + {"localMonth",1188}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"biFourierTruncationType",369}, + {"scanningMode8",2018}, + {""}, {""}, {""}, + {"scaledValueOfFirstSize",1990}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"earthMinorAxis",730}, + {"thisMarsStream",2263}, + {""}, {""}, {""}, + {"oneConstant",1585}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"tiggeCentre",2269}, + {"indicatorOfUnitForForecastTime",1002}, + {"DyInDegrees",43}, + {""}, {""}, + {"modelVersionDate",1352}, + {""}, + {"dirty_statistics",709}, + {""}, + {"localSectionPresent",1192}, + {"timeIncrement",2287}, {"coordinate4OfLastGridPoint",603}, {""}, {""}, - {"functionCode",903}, - {"typeOfPreProcessing",2335}, - {""}, {""}, {""}, {""}, - {"projString",1785}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"roundedMarsLevelist",1881}, - {""}, {""}, {""}, - {"CDFstr",22}, - {""}, {""}, - {"typicalHour",2355}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"originalParameterTableNumber",1605}, + {"corr1Data",609}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"parameterCategory",1699}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"dateOfForecastRun",657}, + {"verticalVisibility",2460}, {""}, {""}, - {"clusterIdentifier",540}, + {"parameterNumber",1712}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"extractSubsetList",846}, + {""}, + {"default_max_val",686}, + {""}, + {"iterationNumber",1060}, + {""}, {""}, + {"tigge_short_name",2276}, + {""}, {""}, {""}, + {"targetCompressionRatio",2252}, + {""}, + {"dimensionNumber",703}, + {""}, {""}, {""}, {""}, {""}, + {"partitionNumber",1718}, {""}, {""}, {""}, {""}, {""}, {""}, - {"productIdentifier",1781}, + {"tileClassification",2279}, + {"dx",725}, + {"max",1291}, + {""}, {""}, {""}, {""}, + {"directionNumber",706}, + {""}, {""}, {""}, + {"bufrDataEncoded",381}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"longitudeOfCentrePointInDegrees",1208}, + {""}, {""}, + {"functionCode",904}, {""}, - {"numberOfPoints",1477}, - {""}, {""}, {""}, {""}, {""}, - {"spare4",2168}, + {"thisMarsType",2264}, + {""}, + {"scaledValueOfLowerLimit",1994}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"thresholdIndicator",2257}, - {""}, {""}, {""}, - {"scaledValueOfFirstFixedSurface",1980}, + {"Lx",151}, + {"conceptsLocalMarsDirAll",576}, + {"jdLocal",1070}, + {"identificationNumber",983}, + {"subCentre",2219}, {""}, {""}, {""}, {""}, - {"jdLocal",1069}, + {"localDefNumberOne",1172}, + {""}, + {"minutesAfterReferenceTimeOfDataCutoff",1338}, {""}, {""}, - {"bufrDataEncoded",382}, + {"complexPacking",566}, + {""}, + {"oneMillionConstant",1586}, + {""}, {""}, {""}, {""}, {""}, + {"significanceOfReferenceDateAndTime",2140}, + {""}, + {"indexTemplateNumber",993}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Lcx",117}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"tableCode",2244}, + {""}, {""}, + {"jdSelected",1071}, + {"additionalFlagPresent",301}, {""}, {""}, {""}, {""}, - {"matchAerosolPacking",1283}, + {"Lux",147}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"subcentreOfAnalysis",2231}, {""}, {""}, {""}, - {"directionScalingFactor",709}, - {"numberOfIntegers",1457}, - {"tableCode",2233}, - {""}, {""}, {""}, - {"truncateDegrees",2307}, - {""}, {""}, - {"numberOfLevelValues",1460}, - {"originOfPostProcessing",1603}, - {""}, {""}, - {"section4",2059}, - {""}, {""}, {""}, - {"kurt",1077}, - {""}, {""}, - {"listOfModelIdentifiers",1160}, + {"formatForDoubles",896}, + {"satelliteNumber",1949}, {""}, {""}, {""}, {""}, - {"originatingCentre",1607}, - {""}, {""}, {""}, - {"scaledValueOfSecondFixedSurface",1991}, - {""}, {""}, {""}, - {"tablesMasterDir",2237}, - {"subCentre",2208}, + {"numberOfInts",1463}, + {""}, {""}, {""}, {""}, + {"plusOneinOrdersOfSPD",1740}, + {"numericValues",1535}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfPoints",1482}, + {""}, + {"totalNumberOfForecastProbabilities",2307}, + {""}, + {"NP",187}, + {""}, + {"defaultSequence",682}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"projectLocalTemplate",1796}, + {""}, + {"calendarIdPresent",386}, + {""}, {""}, {""}, {""}, {""}, + {"missingValue",1340}, + {""}, + {"integerValues",1021}, + {"verticalCoordinate",2456}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"monthOfStartOfReferencePeriod",1362}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"biFourierMakeTemplate",363}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"extraLocalSectionPresent",815}, - {""}, {""}, - {"startingAzimuth",2187}, - {"n3",1368}, - {""}, {""}, - {"kurtosis",1078}, - {"crraLocalVersion",629}, - {""}, {""}, {""}, - {"LoV",129}, - {""}, - {"numberOfAnalysis",1404}, - {""}, - {"laplacianScalingFactor",1083}, - {""}, {""}, - {"timeRangeIndicator",2279}, - {"md5Section9",1306}, - {""}, {""}, - {"md5Section8",1305}, - {""}, - {"longitudeFirstInDegrees",1202}, - {""}, {""}, {""}, {""}, {""}, - {"md5Data",1292}, - {""}, - {"marsForecastMonth",1254}, - {""}, {""}, {""}, {""}, {""}, - {"sp3",2161}, - {""}, {""}, {""}, {""}, - {"localNumberOfObservations",1187}, - {""}, {"coordinateIndexNumber",606}, {""}, {""}, {""}, {""}, - {"spare3",2167}, + {"extraLocalSectionPresent",815}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"gridDescriptionSectionPresent",935}, + {"calendarIdentification",387}, {""}, {""}, - {"grib2divider",923}, + {"versionNumberOfGribLocalTables",2453}, {""}, {""}, {""}, - {"scaledValueOfRadiusOfSphericalEarth",1990}, + {"addressOfFileFreeSpaceInfo",303}, {""}, {""}, {""}, - {"versionNumberOfGribLocalTables",2433}, + {"latitudeOfSouthernPole",1106}, + {""}, + {"destineOrigin",695}, {""}, {""}, {""}, {""}, {""}, - {"paleontologicalOffset",1691}, - {""}, {""}, - {"coordinate1Start",594}, - {""}, - {"preProcessingParameter",1739}, - {""}, {""}, - {"typeOfSizeInterval",2341}, - {"isEPS",1034}, - {"sfc_levtype",2123}, - {""}, {""}, {""}, {""}, - {"skewness",2145}, - {""}, + {"parameterIndicator",1710}, + {"centralLongitude",403}, {"extraLocalSectionNumber",814}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"verticalCoordinateDefinition",2437}, - {"correction2Part",617}, - {""}, {""}, {""}, - {"coordinate1Flag",593}, - {"dirty_statistics",710}, - {"typeOfHorizontalLine",2327}, - {""}, {""}, - {"projectLocalTemplate",1787}, + {"projString",1794}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"secondsOfAnalysis",2044}, {""}, - {"iteratorDisableUnrotate",1060}, - {"julianDay",1071}, - {""}, {""}, {""}, {""}, - {"latitudeOfSouthernPole",1105}, - {"classOfAnalysis",436}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"constantFieldHalfByte",583}, - {""}, {""}, {""}, - {"startOfHeaders",2181}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"CDF",21}, + {"CDFstr",22}, + {""}, {""}, {""}, {""}, {""}, + {"typeOfEnsembleForecast",2339}, + {"indicatorOfUnitForTimeRange",1004}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"localTimeMethod",1197}, + {"extractedDateTimeNumberOfSubsets",848}, + {"truncateDegrees",2324}, + {"centuryOfReferenceTimeOfData",416}, + {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfSecondFixedSurface",2000}, {""}, {""}, {""}, {"extractAreaWestLongitude",822}, - {""}, {""}, {""}, {""}, - {"iDirectionIncrementInDegrees",977}, {""}, - {"PVPresent",218}, - {""}, {""}, {""}, {""}, - {"defaultFaModelName",679}, + {"normAtInitialTime",1387}, {""}, {""}, {""}, - {"unknown",2383}, - {""}, {""}, {""}, - {"centralLongitude",404}, - {""}, {""}, {""}, {""}, - {"monthOfAnalysis",1354}, - {""}, {""}, - {"powerOfTenUsedToScaleClimateWeight",1737}, - {""}, - {"is_aerosol_optical",1046}, - {"totalNumberOfIterations",2295}, - {"lsdate_bug",1240}, - {""}, - {"lstime_bug",1241}, + {"Dx",39}, + {""}, {""}, {""}, {""}, {""}, + {"directionScalingFactor",708}, + {""}, {""}, {""}, {""}, {""}, + {"representativeMember",1866}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"keySat",1075}, - {""}, {""}, {""}, - {"postAuxiliary",1734}, - {"rdbtimeHour",1821}, - {"scanningModeForOneDiamond",2010}, - {""}, {""}, {""}, - {"originatingClass",1609}, + {"accumulationInterval",295}, {""}, - {"predefined_grid",1742}, - {""}, - {"lengthOfMessage",1133}, - {"productionStatusOfProcessedData",1783}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"DxInDegrees",40}, - {""}, - {"standardParallelInMicrodegrees",2179}, - {""}, - {"significanceOfReferenceDateAndTime",2131}, + {"extraValues",816}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"hourOfStartOfReferencePeriod",971}, + {"parameterCategory",1707}, {""}, {""}, - {"normAtInitialTime",1382}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"marsExpver",1253}, + {"originalParameterTableNumber",1612}, + {""}, + {"forecastProbabilityNumber",892}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"scaledValueOfFirstFixedSurface",1989}, + {""}, + {"startOfMessage",2191}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfIntegers",1462}, + {""}, {""}, {""}, {""}, {""}, + {"listOfModelIdentifiers",1161}, + {""}, {""}, {""}, + {"scaledFrequencies",1982}, + {"predefined_grid",1751}, + {""}, {""}, {""}, {""}, + {"calendarIdentificationTemplateNumber",388}, + {"monthOfForecastUsedInLocalTime",1359}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfPackedValues",1478}, + {""}, {""}, + {"yearOfStartOfReferencePeriod",2533}, + {"referenceReflectivityForEchoTop",1856}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"originatingCentre",1614}, + {"offsetSection10",1569}, + {""}, {""}, {""}, + {"extraDimensionPresent",813}, + {""}, {""}, {""}, + {"productIdentifier",1790}, + {""}, + {"corr3Data",611}, + {""}, + {"tablesMasterDir",2248}, + {""}, {""}, + {"roundedMarsLongitude",1891}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"iDirectionIncrementInDegrees",978}, + {"laplacianScalingFactor",1084}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"boot_edition",377}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"biFourierMakeTemplate",362}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"clusterIdentifier",539}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"messageLength",1322}, + {""}, {""}, {""}, {""}, {""}, + {"typeOfPreProcessing",2352}, + {""}, + {"roundedMarsLatitude",1889}, + {""}, {""}, {""}, {""}, {""}, + {"easternLongitudeOfDomain",735}, + {"numberInTheGridCoordinateList",1405}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"aerosolbinnumber",307}, - {""}, - {"typeOfCompressionUsed",2320}, - {""}, - {"lengthOfHeaders",1131}, - {""}, {""}, - {"NV",193}, - {"skew",2144}, - {""}, - {"identificationOfProject",984}, - {""}, {""}, - {"secondDimensionCoordinateValueDefinition",2014}, - {""}, {""}, - {"numberOfModels",1469}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"projectionCenterFlag",1789}, - {""}, {""}, {""}, - {"nameOfSecondFixedSurface",1374}, - {""}, {""}, {""}, {""}, {""}, - {"keyData",1073}, + {"postAuxiliary",1743}, + {"verticalCoordinateDefinition",2457}, + {"centuryOfAnalysis",414}, {""}, {""}, {""}, {""}, - {"minutesAfterReferenceTimeOfDataCutoff",1336}, - {""}, - {"codedNumberOfFirstOrderPackedValues",560}, - {""}, {""}, {""}, - {"rectimeMinute",1836}, + {"grib2divider",924}, {""}, {""}, {""}, {""}, - {"biFourierResolutionParameterN",366}, - {""}, - {"dateOfAnalysis",655}, - {"reserved3",1861}, - {"timeOfAnalysis",2274}, + {"local_padding",1200}, {""}, {""}, {""}, {""}, {""}, {""}, - {"upperThreshold",2397}, - {""}, {""}, {""}, - {"secondsOfAnalysis",2035}, + {"PVPresent",217}, + {""}, + {"unitsOfFirstFixedSurface",2399}, + {"shapeOfVerificationArea",2134}, + {""}, + {"isEPS",1035}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"typeOfCompressionUsed",2337}, + {""}, + {"numberOfEffectiveValues",1448}, + {""}, {""}, {""}, {""}, + {"tileAttribute",2278}, + {""}, {""}, + {"groupSplittingMethodUsed",944}, + {""}, + {"thresholdIndicator",2268}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"section4Padding",2070}, + {""}, {""}, + {"numberOfMembersInCluster",1468}, {""}, {""}, {""}, {""}, {""}, - {"projectionCentreFlag",1790}, + {"conceptsMasterDir",577}, + {""}, + {"productionStatusOfProcessedData",1792}, + {""}, {""}, {""}, + {"startStepInHours",2194}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"roundedMarsLevelist",1890}, + {"projectLocalTemplateNumber",1797}, + {"scaledValueOfRadiusOfSphericalEarth",1999}, + {""}, {""}, {""}, {""}, {""}, + {"centralLongitudeInDegrees",404}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"originOfPostProcessing",1610}, + {""}, {""}, {""}, {""}, + {"CDF",21}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"aerosolbinnumber",306}, + {"NDSP",179}, + {""}, + {"section7",2081}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfDataPoints",1434}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"grib1divider",921}, + {"numberOfChars",1420}, + {"preProcessingParameter",1748}, + {"NV",192}, + {""}, {""}, {""}, + {"secondDimensionCoordinateValueDefinition",2023}, + {""}, + {"numberOfModels",1474}, + {""}, + {"coordinate1Start",594}, + {""}, + {"expandedAbbreviations",791}, + {""}, {""}, {""}, {""}, + {"indicatorOfUnitForTimeRangeForReferencePeriod",1005}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfTimeIncrementsOfForecastsUsedInLocalTime",1513}, {""}, {""}, - {"numberOfDistributionFunctionParameters",1442}, - {"numberOfDataPoints",1429}, + {"projectionCenterFlag",1798}, + {""}, {""}, + {"distanceFromTubeToEnsembleMean",712}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"driverInformationBlockAddress",720}, + {"level_value_list",1145}, + {"NFSP",181}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"identificationOfProject",985}, + {"northernLatitudeOfClusterDomain",1395}, + {""}, + {"julianDay",1072}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"referenceValueError",1860}, + {""}, {""}, + {"listMembersUsed",1154}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"projectionCentreFlag",1799}, + {"longitudeFirstInDegrees",1204}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"numberOfValues",1526}, + {"coordinate3OfLastGridPoint",600}, + {""}, + {"westernLongitudeOfDomain",2479}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfDistributionFunctionParameters",1447}, + {"southernLatitudeOfClusterDomain",2166}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"AA",6}, + {""}, {""}, {""}, {""}, + {"numberOfCharacters",1419}, + {""}, {""}, + {"scaledValueOfDistributionFunctionParameter",1986}, + {"localNumberOfObservations",1189}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"offsetAfterBitmap",1548}, + {""}, {""}, {""}, + {"faModelName",857}, + {"originatingClass",1616}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"dayOfEndOfOverallTimeInterval",668}, - {""}, {""}, {""}, - {"is_chemical_distfn",1048}, - {""}, {""}, {""}, - {"section2Padding",2050}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"monthOfAnalysis",1356}, {""}, {""}, - {"messageLength",1320}, + {"ITN",91}, + {""}, {""}, + {"classOfAnalysis",435}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfEffectiveValues",1443}, - {""}, {""}, - {"startOfRange",2183}, - {"gts_ddhh00",948}, - {"scaleFactorOfDistanceFromEnsembleMean",1945}, + {"longitudeOfSubSatellitePoint",1226}, + {""}, {""}, {""}, + {"deletePV",692}, + {"isCorrection",1034}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"qnhAPresent",1806}, + {""}, {""}, {""}, {""}, + {"longitudeOfSubSatellitePointInDegrees",1227}, + {""}, {""}, {""}, {""}, + {"paleontologicalOffset",1698}, + {"mars_labeling",1278}, {""}, {""}, {""}, {"correction4",620}, - {"section2Present",2052}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"md5Structure",1307}, - {""}, - {"easternLongitudeOfDomain",736}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetSection10",1562}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaleFactorOfAdditionalParameterForReferencePeriod",1952}, {""}, {""}, - {"numberOfDistinctSection4s",1436}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"lengthOfIndexTemplate",1132}, - {""}, {""}, {""}, {""}, {""}, - {"referenceOfWidths",1845}, - {"lowerThreshold",1237}, - {"scaledValueOfDistributionFunctionParameter",1977}, - {"numberOfPackedValues",1473}, - {"centralClusterDefinition",403}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"isotopeIdentificationNumber",1058}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfDistinctSection7s",1444}, {""}, - {"deleteExtraLocalSection",691}, - {""}, {""}, {""}, {""}, {""}, - {"unitsConversionOffset",2375}, - {""}, - {"offsetSection4",1566}, - {"julianForecastDay",1072}, - {""}, - {"typeOfSecondFixedSurface",2340}, - {"yearOfAnalysis",2506}, - {""}, - {"param_value_min",1697}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfTimeIncrementsOfForecastsUsedInLocalTime",1508}, - {""}, - {"centralLongitudeInDegrees",405}, {"coordinate4Flag",601}, - {""}, - {"implementationDateOfModelCycle",989}, - {"packingType",1620}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"typeOfAnalysis",2317}, - {"marsExperimentOffset",1252}, - {"startStepInHours",2185}, - {""}, {""}, {""}, - {"numberOfDistinctSection3s",1435}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfValues",1519}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"basicAngleOfTheInitialProductionDomain",340}, {""}, {""}, {""}, + {"biFourierCoefficients",361}, + {""}, {""}, {""}, + {"timeRangeIndicator",2294}, + {"marsForecastMonth",1256}, + {"twoOrdersOfSPD",2332}, + {"centralClusterDefinition",402}, + {"startOfRange",2192}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfMembersInEnsemble",1469}, + {"sectionLengthLimitForEnsembles",2092}, {"conceptsLocalDirECMF",575}, - {""}, {""}, - {"reservedNeedNotBePresent",1862}, - {""}, {""}, - {"numberOfMembersInCluster",1463}, {""}, - {"typicalMinute",2356}, - {""}, {""}, - {"isotopeIdentificationNumber",1057}, - {""}, {""}, - {"md5DataSection",1293}, - {""}, - {"section4Pointer",2062}, - {""}, {""}, {""}, {""}, {""}, - {"centuryOfAnalysis",415}, - {""}, - {"outerLoopTypeOfStatisticalProcessing",1613}, - {"isCorrection",1033}, - {""}, {""}, {""}, {""}, - {"totalLength",2287}, - {""}, {""}, - {"selectedMonth",2112}, - {"twoOrdersOfSPD",2315}, - {""}, {""}, - {"nameOfFirstFixedSurface",1373}, - {"latitudeOfFirstGridPoint",1095}, - {"frequencyNumber",901}, - {""}, {""}, - {"numberOfDataMatrices",1428}, - {"lengthIncrementForTheGroupLengths",1129}, - {""}, {""}, - {"hourOfAnalysis",964}, - {""}, - {"md5TimeDomainSection",1308}, - {""}, - {"timeRangeIndicatorFromStepRange",2280}, - {""}, - {"grib1divider",920}, - {""}, {""}, - {"clusterMember6",547}, - {""}, - {"tigge_short_name",2265}, - {""}, - {"shapeOfTheEarth",2124}, - {""}, {""}, {""}, - {"default_max_val",686}, - {""}, {""}, {""}, - {"tileIndex",2267}, - {""}, - {"biFourierSubTruncationType",369}, + {"predefined_grid_values",1752}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"westernLongitudeOfDomain",2459}, - {""}, - {"simpleThinningMissingRadius",2133}, - {""}, {""}, {""}, {""}, - {"section3Pointer",2057}, - {""}, {""}, {""}, - {"offsetSection3",1565}, - {""}, - {"gridCoordinate",929}, - {""}, {""}, {""}, - {"doExtractDateTime",717}, - {""}, {""}, {""}, - {"quantileValue",1804}, + {"implementationDateOfModelCycle",990}, + {"gridCoordinate",930}, {""}, {""}, - {"numberInTheGridCoordinateList",1400}, - {""}, {""}, {""}, {""}, - {"northernLatitudeOfClusterDomain",1390}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"windSpeedTrend4",2479}, - {""}, {""}, - {"stepHumanReadable",2194}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"scanningMode6",2007}, - {""}, {""}, - {"cloudsTitle3Trend4",534}, + {"spare4",2177}, + {"nameOfSecondFixedSurface",1379}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"driverInformationBlockAddress",721}, - {"distanceFromTubeToEnsembleMean",713}, - {""}, {""}, - {"referenceValueError",1851}, - {""}, - {"forecastMonth",886}, + {"versionNumOfRootGroupSymbolTableEntry",2450}, {""}, {""}, {""}, {""}, {""}, {""}, - {"biFourierResolutionSubSetParameterN",368}, - {"expandedAbbreviations",791}, - {"inputExtendedDelayedDescriptorReplicationFactor",1008}, - {""}, - {"DiInMetres",33}, - {""}, {""}, - {"section7",2072}, - {"numberOfChars",1415}, - {""}, {""}, - {"longitudeOfSubSatellitePoint",1224}, + {"LoVInDegrees",129}, + {"lengthOfMessage",1134}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"missing_values",1344}, + {"numberOfDataMatrices",1433}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfAdditionalParameterForReferencePeriod",1943}, - {""}, {""}, {""}, - {"waveFrequencyNumber",2453}, + {"typeOfAuxiliaryInformation",2335}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section4",2068}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"longitudeOfSubSatellitePointInDegrees",1225}, - {"windDirectionTrend4",2468}, - {""}, {""}, {""}, - {"sampleSizeOfModelClimate",1936}, - {""}, - {"consensusCount",580}, - {""}, {""}, {""}, - {"typeOfFirstFixedSurface",2324}, - {""}, - {"southernLatitudeOfClusterDomain",2157}, - {"tsectionNumber4",2310}, - {""}, - {"projectLocalTemplateNumber",1788}, + {"julianForecastDay",1073}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"isectionNumber4",1056}, - {"deletePV",693}, - {""}, {""}, - {"cloudsTitle3Trend3",533}, - {""}, {""}, {""}, - {"stepRangeInHours",2197}, + {"marsExpver",1255}, {""}, - {"numberOfMissing",1465}, - {"cloudsTitle4",535}, - {""}, {""}, - {"md5Section6",1303}, + {"yDirectionGridLengthInMetres",2521}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"standardParallelInMicrodegrees",2188}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Yo",285}, + {"latitudeOfFirstGridPoint",1096}, {""}, {""}, {""}, {""}, {""}, - {"g1conceptsMasterDir",906}, + {"widthOfLengths",2481}, + {""}, + {"g1conceptsMasterDir",907}, + {""}, {""}, {""}, + {"Nx",207}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfDistinctSection4s",1441}, + {""}, + {"coordinate1Flag",593}, + {"unitsConversionOffset",2393}, + {""}, + {"stepRangeInHours",2207}, + {"numberOfCategories",1418}, {""}, {""}, - {"scaledValueOfLowerLimit",1985}, + {"numberOfOctetsExtraDescriptors",1476}, + {"dateOfAnalysis",655}, + {""}, {""}, {""}, + {"timeOfAnalysis",2289}, + {""}, {""}, + {"offsetSection7",1576}, + {"scaleFactorOfDistanceFromEnsembleMean",1954}, + {""}, {""}, {""}, + {"dayOfEndOfOverallTimeInterval",668}, + {""}, + {"Ncx",195}, {""}, {""}, {""}, {""}, - {"Yp",286}, - {""}, {""}, {""}, - {"latitudeOfStretchingPoleInDegrees",1108}, - {""}, {""}, {""}, - {"dataCategory",635}, - {""}, {""}, {""}, - {"longitudeOfFirstGridPointInDegrees",1211}, - {""}, {""}, - {"section_6",2103}, - {"masterTablesVersionNumber",1280}, - {""}, - {"longitudeOfNorthWestCornerOfArea",1216}, - {""}, {""}, {""}, - {"orderingConvention",1599}, - {"numberOfDistinctSection7s",1439}, - {""}, - {"windSpeedTrend3",2478}, - {""}, {""}, {""}, {""}, {""}, - {"lengthOfTimeRange",1136}, + {"section10Pointer",2051}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"longitudeOfStretchingPoleInDegrees",1223}, - {""}, - {"radiusInMetres",1808}, + {"Nux",205}, {""}, {""}, {""}, - {"missingValuesPresent",1341}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"verificationMonth",2425}, - {""}, - {"bufrHeaderCentre",383}, - {"DyInMetres",44}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"LoVInDegrees",130}, - {"local_padding",1198}, - {"typeOfOriginalFieldValues",2332}, - {""}, {""}, - {"expandedCodes",792}, - {""}, {""}, {""}, {""}, {""}, - {"longitudeOfLastGridPointInDegrees",1215}, - {""}, {""}, {""}, {""}, - {"selectedHour",2110}, - {""}, {""}, - {"addExtraLocalSection",301}, + {"grib3divider",925}, + {"codedNumberOfFirstOrderPackedValues",559}, {""}, {""}, {""}, - {"yDirectionGridLengthInMetres",2501}, - {"section10Pointer",2042}, - {"windDirectionTrend3",2467}, - {""}, {""}, - {"rdbtimeMinute",1822}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section1Padding",2047}, - {"groupLengths",941}, - {"tsectionNumber3",2309}, - {"localYear",1197}, - {"endDayTrend4",750}, - {""}, {""}, - {"isectionNumber3",1055}, + {"listOfContributingSpectralBands",1158}, {""}, {""}, {""}, {""}, - {"numberOfCharacters",1414}, + {"section2Padding",2059}, + {""}, {""}, {""}, + {"default_min_val",687}, + {""}, {""}, + {"totalNumberOfIterations",2310}, {""}, {""}, {""}, {""}, - {"groupInternalNodeK",939}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section7Pointer",2074}, - {""}, {""}, - {"biFourierCoefficients",362}, - {""}, {""}, - {"epsContinous",786}, + {"section2Present",2061}, + {"masterTablesVersionNumber",1282}, + {""}, {""}, {""}, + {"quantileValue",1813}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"marsExperimentOffset",1254}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"selectedYear",2114}, - {""}, {""}, {""}, {""}, {""}, - {"verifyingMonth",2427}, {""}, - {"LyInMetres",155}, + {"scanningModeForOneDiamond",2019}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"yDirectionGridLengthInMillimetres",2522}, + {"sampleSizeOfModelClimate",1945}, + {""}, {""}, {""}, {""}, + {"kurt",1078}, + {"deleteExtraLocalSection",690}, + {"section7Pointer",2083}, + {""}, {""}, {""}, + {"_numberOfValues",294}, + {""}, {""}, + {"nTileAttCombo",1372}, + {""}, + {"latitudeOfStretchingPoleInDegrees",1109}, + {""}, {""}, {""}, + {"biFourierSubTruncationType",368}, + {"typeOfSecondFixedSurface",2357}, + {"masterTablesVersionNumberLatest",1283}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"typeOfOriginalFieldValues",2349}, + {""}, {""}, {""}, + {"addExtraLocalSection",300}, + {"selectedMonth",2121}, + {""}, {""}, {""}, + {"lengthIncrementForTheGroupLengths",1130}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsTitle4",534}, + {""}, {""}, {""}, + {"patch_precip_fp",1725}, + {""}, {""}, {""}, + {"numberOfMissing",1470}, {""}, {""}, {"epsStatisticsContinous",788}, - {""}, {""}, {""}, - {"qnhAPresent",1797}, - {""}, - {"selectedFcIndex",2109}, - {"yDirectionGridLengthInMillimetres",2502}, - {""}, {""}, {""}, {""}, {""}, - {"parametersVersion",1707}, - {""}, {""}, {""}, {""}, {""}, - {"shapeOfVerificationArea",2125}, - {""}, {""}, {""}, - {"widthOfLengths",2461}, - {"predefined_grid_values",1743}, - {"listMembersMissing",1149}, - {""}, - {"numberOfCategories",1413}, {""}, {""}, - {"missing_values",1342}, - {""}, {""}, {""}, - {"timeCoordinateDefinition",2269}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"listOfContributingSpectralBands",1157}, - {""}, - {"md5Product",1296}, - {""}, {""}, {""}, - {"listOfEnsembleForecastNumbers",1159}, - {""}, - {"percentileValue",1720}, - {""}, {""}, {""}, {""}, - {"numberOfDataValues",1431}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"sectionLengthLimitForEnsembles",2083}, - {""}, {""}, {""}, {""}, - {"typeOfAuxiliaryInformation",2318}, - {""}, {""}, {""}, - {"level_value_list",1144}, - {""}, {""}, {""}, {""}, - {"section_06",2092}, - {"numberOfMembersInEnsemble",1464}, - {"primaryMissingValue",1768}, - {""}, {""}, {""}, - {"lengthOfTimeRangeForReferencePeriod",1137}, - {""}, {""}, {""}, - {"numberOfOctetsExtraDescriptors",1471}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"numberOfModeOfDistribution",1468}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"jIncrement",1065}, - {"scaleValuesBy",1971}, - {""}, {""}, {""}, {""}, {""}, - {"matrixOfValues",1288}, - {""}, {""}, {""}, {""}, - {"boot_edition",378}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"southEastLatitudeOfLPOArea",2159}, {""}, {""}, - {"typicalYear",2360}, + {"hourOfAnalysis",965}, + {""}, + {"orderingConvention",1606}, {""}, {""}, {""}, {""}, {""}, - {"reservedSection4",1866}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"forecastMonth",887}, {""}, {""}, - {"table2Version",2232}, + {"kurtosis",1079}, {""}, - {"extendedFlag",811}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section1Padding",2056}, + {"groupWidth",945}, {""}, - {"scaleFactorOfPrimeMeridianOffset",1958}, - {""}, - {"M",156}, - {"expandedOriginalCodes",798}, - {""}, - {"expandedOriginalWidths",801}, - {"qualityControl",1800}, - {""}, {""}, - {"latitudeOfIcosahedronPole",1098}, - {""}, {""}, {""}, {""}, - {"averaging2Flag",329}, - {""}, {""}, - {"Experiment_Identifier",55}, - {"bitsPerValue",376}, + {"outerLoopTypeOfStatisticalProcessing",1620}, {""}, {""}, {""}, - {"totalInitialConditions",2286}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfMissingInStatisticalProcess",1466}, - {"extractSubsetIntervalEnd",844}, - {"runwayDepositState4",1894}, - {"masterTablesVersionNumberLatest",1281}, + {"timeCoordinateDefinition",2284}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"extractSubsetIntervalStart",845}, - {"expandedOriginalScales",800}, - {""}, {""}, {""}, - {"inputOriginatingCentre",1009}, - {""}, {""}, - {"mAngleMultiplier",1243}, - {""}, {""}, {""}, - {"offsetAfterBitmap",1541}, + {"DxInDegrees",40}, + {""}, {""}, {""}, {""}, {""}, + {"distinctLongitudes",714}, + {"lengthOfIndexTemplate",1133}, + {""}, {""}, {""}, {""}, {""}, + {"isHindcast",1039}, {""}, - {"n2",1367}, - {"extremeClockwiseWindDirection",849}, + {"iScansNegatively",980}, + {"numberOfForecastsInEnsemble",1452}, + {""}, {""}, {""}, + {"section9Length",2089}, + {"simpleThinningMissingRadius",2142}, + {""}, + {"numberOfLogicals",1467}, + {"iScansPositively",981}, + {""}, {""}, {""}, {""}, {""}, + {"defaultFaModelName",679}, + {""}, {""}, + {"yearOfAnalysis",2526}, {""}, {""}, {""}, {""}, {""}, {""}, - {"operationalForecastCluster",1591}, + {"mAngleMultiplier",1245}, + {"section8Length",2086}, {""}, - {"section2Pointer",2051}, - {""}, - {"inputProcessIdentifier",1011}, - {"correction1",614}, - {""}, - {"offsetSection7",1569}, - {""}, - {"directionOfVariation",708}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"runwaySideCodeState4",1934}, - {""}, - {"windVariableDirectionTrend4",2489}, - {""}, - {"numberOfTimeRange",1509}, - {"bitMapIndicator",372}, - {"centreLatitudeInDegrees",412}, - {"sp2",2160}, - {""}, {""}, - {"coordinate1End",592}, - {"numberOfTimeRanges",1510}, - {"II",88}, - {"probContinous",1770}, - {""}, - {"numberInTheAuxiliaryArray",1399}, - {""}, {""}, {""}, - {"spare2",2166}, + {"lengthOfTimeRange",1137}, {""}, {""}, {""}, {""}, - {"numberOfOctectsForNumberOfPoints",1470}, - {""}, {""}, - {"typeOfCalendar",2319}, - {""}, {""}, - {"secondLatitudeInDegrees",2017}, - {""}, {""}, {""}, - {"primaryMissingValueSubstitute",1769}, - {"doSimpleThinning",719}, + {"typeOfAnalysis",2334}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"consensusCount",580}, {""}, - {"distinctLongitudes",715}, - {""}, - {"LcyInMetres",121}, - {""}, - {"marsStream1",1271}, - {""}, {""}, - {"updateSequenceNumber",2394}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"maxLevelValue",1290}, - {""}, {""}, {""}, - {"spatialSmoothingOfProduct",2170}, - {""}, - {"versionNumberOfExperimentalSuite",2432}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"presentTrend4",1749}, - {""}, {""}, - {"windVariableDirectionTrend3",2488}, - {""}, {""}, - {"numberOfForecastsInCluster",1446}, - {""}, - {"indicatorOfUnitForForecastTime",1001}, - {"LuyInMetres",151}, - {"typicalCentury",2351}, - {""}, - {"numberOfForecastsInEnsemble",1447}, + {"longitudeOfLastGridPointInDegrees",1217}, + {""}, {""}, {""}, {""}, + {"longitudeOfStretchingPoleInDegrees",1225}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"rectimeMinute",1845}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayDepositState3",1893}, - {""}, {""}, {""}, - {"basicAngleOfTheInitialProductionDomain",341}, - {""}, {""}, {""}, - {"selectedMinute",2111}, - {""}, {""}, {""}, - {"section9Length",2080}, + {"numberOfMissingInStatisticalProcess",1471}, + {""}, {""}, + {"numberOfDataValues",1436}, {""}, - {"cloudsTitle3Trend2",532}, + {"section4Pointer",2071}, + {""}, {""}, {""}, {""}, {""}, + {"inputExtendedDelayedDescriptorReplicationFactor",1009}, {""}, - {"section8Length",2077}, + {"numberOfForecastsInCluster",1451}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"rectimeHour",1844}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfModeOfDistribution",1473}, {""}, - {"unitsBias",2374}, + {"biFourierResolutionParameterN",365}, + {"groupInternalNodeK",940}, + {"timeDomainTemplate",2285}, + {""}, + {"indicatorOfUnitForTimeIncrement",1003}, + {""}, {""}, + {"doExtractDateTime",716}, + {""}, {""}, {""}, + {"southEastLatitudeOfVerficationArea",2160}, + {""}, {""}, + {"climateDateTo",437}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Experiment_Identifier",54}, + {""}, {""}, {""}, + {"section0Length",2047}, + {""}, + {"table2Version",2243}, + {""}, {""}, {""}, {""}, + {"section10Length",2050}, + {"missingValuesPresent",1343}, + {""}, + {"jDirectionIncrement",1062}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"offsetSection4",1573}, + {""}, {""}, {""}, {""}, {""}, + {"skewness",2154}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"latitudeLongitudeValues",1092}, + {""}, + {"expandedCodes",792}, + {""}, + {"unknown",2401}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"numberOfTimeRange",1514}, + {"_leg_number",293}, + {"sectionLengthLimitForProbability",2093}, + {""}, + {"endDayTrend4",749}, + {""}, {""}, {""}, {""}, {""}, + {"verificationMonth",2445}, + {""}, + {"numberOfTimeRanges",1515}, + {""}, + {"timeRangeIndicatorFromStepRange",2295}, + {"localHour",1180}, + {""}, {""}, + {"inputOriginatingCentre",1010}, + {""}, + {"frequencyNumber",902}, + {""}, {""}, {""}, + {"md5Section9",1308}, + {""}, + {"constituentType",584}, + {"totalLength",2302}, + {"scaleValuesBy",1980}, + {""}, {""}, {""}, + {"lengthOfTimeRangeForReferencePeriod",1138}, + {"groupWidths",946}, + {"swapScanningLat",2236}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"LyInMetres",154}, + {""}, {""}, {""}, + {"md5Section8",1307}, + {""}, {""}, {""}, {""}, + {"DiInMetres",33}, + {"swapScanningLon",2237}, + {""}, + {"nameOfFirstFixedSurface",1378}, + {""}, {""}, {""}, + {"keySat",1076}, + {""}, {""}, + {"md5Data",1294}, + {"constituentTypeName",585}, + {""}, {""}, + {"upperThreshold",2415}, + {"lengthOfOriginatorLocalTemplate",1135}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"windVariableDirectionTrend4",2509}, + {""}, {""}, {""}, {""}, + {"bitsPerValue",375}, + {""}, {""}, + {"originatorLocalTemplate",1617}, + {""}, {""}, {""}, {""}, {""}, + {"correction2Part",617}, + {""}, + {"isSatelliteType",1043}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"numberOfForecastsInTheCluster",1453}, + {""}, {""}, {""}, {""}, + {"typeOfCalendar",2336}, + {""}, {""}, + {"verifyingMonth",2447}, + {""}, + {"jIncrement",1066}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfAdditionalParametersForReferencePeriod",1408}, + {"epsContinous",786}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"typeOfIntervalForFirstAndSecondSize",2345}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"typicalDateTime",2371}, + {"listOfEnsembleForecastNumbers",1160}, + {"radiusInMetres",1817}, + {"referenceOfWidths",1854}, + {"qualityControl",1809}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"operationalForecastCluster",1598}, + {""}, {""}, {""}, {""}, {""}, + {"sphericalHarmonics",2184}, + {""}, + {"listMembersMissing",1150}, + {"windSpeedTrend4",2499}, + {"longitudeOfFirstGridPointInDegrees",1213}, + {""}, {""}, {""}, + {"keyData",1074}, + {""}, + {"doSimpleThinning",718}, + {"primaryMissingValue",1777}, + {"skew",2153}, + {""}, {""}, {""}, {""}, {""}, + {"waveFrequencyNumber",2473}, + {""}, + {"numberOfParallelsBetweenAPoleAndTheEquator",1479}, + {""}, + {"typicalMinute",2374}, + {""}, {""}, {""}, {""}, + {"probContinous",1779}, + {""}, + {"reservedSection4",1875}, + {"numberOfDistinctSection6s",1443}, + {""}, + {"coordinate3Flag",598}, + {""}, {""}, {""}, {""}, {""}, + {"minuteOfModelVersion",1334}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfComponents",1428}, + {"secondOfModelVersion",2030}, + {""}, {""}, + {"totalInitialConditions",2301}, + {""}, {""}, {""}, {""}, {""}, + {"typicalHour",2373}, + {""}, {""}, {""}, {""}, + {"rdbtimeMinute",1831}, + {""}, {""}, {""}, + {"grib2LocalSectionPresent",923}, + {""}, + {"attributeOfTile",324}, + {""}, + {"section3Padding",2065}, + {""}, {""}, + {"md5Structure",1309}, + {""}, {""}, {""}, + {"typeOfIntervalForFirstAndSecondWavelength",2346}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"biFourierResolutionSubSetParameterN",367}, + {"correction1",614}, + {""}, {""}, {""}, + {"spatialSmoothingOfProduct",2179}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"rdbtimeHour",1830}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"packingType",1627}, + {"DyInMetres",44}, + {"grib2LocalSectionNumber",922}, + {""}, + {"selectedFcIndex",2118}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"bitMapIndicator",371}, + {""}, + {"frequencyScalingFactor",903}, + {""}, + {"gts_TTAAii",948}, + {"totalTileAttCombo",2320}, + {""}, {""}, + {"typeOfFirstFixedSurface",2341}, + {""}, {""}, {""}, + {"reservedNeedNotBePresent",1871}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"marsStream1",1273}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"lowerThreshold",1239}, + {""}, {""}, + {"windDirectionTrend4",2488}, + {""}, {""}, {""}, {""}, + {"combinationOfAttributesOfTile",564}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfOctectsForNumberOfPoints",1475}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"SecondOfModelVersion",230}, + {"groupLengths",942}, + {""}, {""}, + {"inputProcessIdentifier",1012}, + {""}, {""}, {""}, {""}, + {"monthOfModelVersion",1360}, + {""}, {""}, {""}, + {"expandedOriginalCodes",798}, + {"extremeClockwiseWindDirection",849}, + {"expandedOriginalWidths",801}, + {"resolutionAndComponentFlags",1877}, + {""}, {""}, {""}, + {"ijDirectionIncrementGiven",989}, + {""}, + {"primaryMissingValueSubstitute",1778}, + {"tileIndex",2281}, + {"matrixOfValues",1290}, + {"LcyInMetres",120}, + {""}, {""}, + {"startOfHeaders",2190}, + {""}, + {"centreLatitudeInDegrees",411}, + {"monthlyVerificationMonth",1364}, + {""}, {""}, {""}, {""}, {""}, + {"section_10",2106}, + {""}, {""}, {""}, {""}, {""}, + {"LuyInMetres",150}, + {""}, {""}, {""}, {""}, + {"maxLevelValue",1292}, + {""}, {""}, {""}, + {"extractedAreaNumberOfSubsets",847}, + {""}, {""}, {""}, + {"Lar2InDegrees",111}, + {""}, {""}, {""}, + {"secondLatitudeInDegrees",2026}, + {"resolutionAndComponentFlags8",1884}, + {""}, {""}, + {"section2Pointer",2060}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"forecastOrSingularVectorNumber",888}, + {""}, {""}, {""}, + {"coordAveragingTims",591}, + {"Lor2InDegrees",146}, + {""}, {""}, + {"is_ocean2d_param",1052}, + {""}, {""}, + {"expandedOriginalScales",800}, + {""}, + {"latitudeOfNorthWestCornerOfArea",1102}, + {"longitudeOfNorthWestCornerOfArea",1218}, + {"firstDimensionCoordinateValueDefinition",869}, + {""}, {""}, {""}, {""}, {""}, + {"extendedFlag",811}, + {""}, {""}, {""}, {""}, + {"typeOfHorizontalLine",2344}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"M",155}, + {""}, {""}, + {"extractSubsetIntervalEnd",844}, + {""}, + {"radiusOfCentralCluster",1818}, + {""}, {""}, {""}, {""}, + {"section6Pointer",2079}, + {""}, + {"extractSubsetIntervalStart",845}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"listOfParametersUsedForClustering",1162}, + {""}, {""}, {""}, + {"scaledValueOfAdditionalParameterForReferencePeriod",1983}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"unitsConversionScaleFactor",2394}, + {""}, {""}, {""}, {""}, {""}, + {"coordAveraging0",587}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfPointsAlongXAxis",1490}, + {""}, + {"n2",1369}, {""}, {"expandedOriginalReferences",799}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"monthlyVerificationMonth",1362}, + {"dataCategory",635}, + {"latitudeOfIcosahedronPole",1099}, + {"stepForClustering",2203}, {""}, {""}, {""}, - {"lengthOfOriginatorLocalTemplate",1134}, - {""}, - {"mars_labeling",1276}, + {"numberOfCoordinatesValues",1431}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"averaging2Flag",328}, {""}, {""}, {""}, - {"totalNumberOfDataValuesMissingInStatisticalProcess",2290}, - {"secondOfModelVersion",2021}, - {""}, {""}, - {"runwaySideCodeState3",1933}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"formatVersionMajorNumber",897}, - {""}, {""}, {""}, {""}, {""}, - {"latitudeLongitudeValues",1091}, - {""}, {""}, - {"minuteOfModelVersion",1332}, - {"backgroundProcess",334}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"YR",281}, - {""}, {""}, {""}, - {"numberOfLogicals",1462}, - {""}, - {"jDirectionIncrement",1061}, - {""}, {""}, {""}, - {"groupWidth",944}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"timeDomainTemplate",2270}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"resolutionAndComponentFlags",1868}, - {""}, {""}, {""}, {""}, - {"stepInHours",2195}, - {"constituentType",584}, - {""}, - {"dummy2",724}, - {"rdbtimeYear",1826}, - {"presentTrend3",1748}, - {"swapScanningLat",2225}, - {"frequencyScalingFactor",902}, - {""}, {""}, - {"climateDateTo",438}, - {""}, {""}, - {"resolutionAndComponentFlags8",1875}, - {""}, {""}, {""}, - {"swapScanningLon",2226}, - {""}, {""}, {""}, - {"shortNameECMF",2127}, - {"indicatorOfUnitForTimeRange",1003}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Lar2InDegrees",112}, + {"Lar1InDegrees",109}, + {"sp2",2169}, {""}, {""}, {""}, {""}, {""}, {""}, - {"uerraLocalVersion",2365}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Lor2InDegrees",147}, - {""}, {""}, - {"yCoordinateOfSubSatellitePoint",2499}, - {"typeOfIntervalForFirstAndSecondSize",2328}, - {"isSatelliteType",1042}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"primaryBitmap",1767}, + {"section1Pointer",2057}, {""}, - {"marsType2",1275}, - {"reserved2",1860}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"monthOfModelVersion",1358}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"variationOfVisibilityDirection",2413}, - {""}, {""}, {""}, {""}, {""}, - {"variationOfVisibilityDirectionAngle",2414}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfForecastsInTheCluster",1448}, + {"scaleFactorOfPrimeMeridianOffset",1967}, + {"lengthOfHeaders",1132}, {""}, {""}, - {"stepForClustering",2193}, + {"spare2",2175}, + {""}, + {"yCoordinateOfSubSatellitePoint",2519}, + {"La2",102}, + {""}, {""}, + {"constantFieldHalfByte",583}, + {"Lor1InDegrees",144}, + {""}, + {"Lar2",110}, {""}, {""}, {""}, - {"SecondOfModelVersion",231}, - {""}, {""}, {""}, - {"constituentTypeName",585}, - {"yearOfCentury",2507}, - {""}, {""}, - {"cloudsTitle1",520}, - {""}, {""}, {""}, {""}, - {"originatorLocalTemplate",1610}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"groupWidths",945}, - {""}, - {"La2",103}, - {""}, - {"section0Length",2038}, - {""}, - {"Lar2",111}, - {""}, {""}, {""}, {""}, {"conceptsDir1",572}, - {""}, - {"tiggeLocalVersion",2260}, - {"Latin2",116}, - {""}, {""}, - {"Lo2",126}, - {"localExtensionPadding",1175}, - {""}, {""}, - {"Lor2",146}, - {""}, {""}, - {"variationOfVisibility",2412}, - {"typicalDateTime",2353}, + {"md5TimeDomainSection",1310}, + {""}, {""}, {""}, {""}, {""}, + {"Latin2",115}, {""}, {""}, {""}, - {"listOfParametersUsedForClustering",1161}, - {""}, {""}, {""}, - {"marsGrid",1255}, - {""}, {""}, {""}, - {"isGridded",1037}, - {"La2InDegrees",104}, - {"radiusOfCentralCluster",1809}, + {"Lo2",125}, {""}, {""}, - {"legBaseTime",1125}, + {"azimuthalWidth",331}, + {""}, {""}, + {"Lor2",145}, {""}, {""}, {""}, {""}, - {"gribDataQualityChecks",925}, + {"numberInTheAuxiliaryArray",1404}, + {""}, + {"cloudsTitle1",519}, + {""}, {""}, {""}, {""}, + {"numberOfColumns",1427}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"tsectionNumber4",2327}, + {""}, + {"windVariableDirectionTrend2",2507}, + {""}, + {"isectionNumber4",1057}, + {""}, {""}, {""}, + {"numberOfCodedValues",1424}, + {""}, + {"md5DataSection",1295}, {""}, {""}, {""}, {""}, {""}, - {"Lo2InDegrees",127}, + {"II",87}, + {"La2InDegrees",103}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"doExtractArea",715}, + {""}, {""}, {""}, + {"Lo2InDegrees",126}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"typeOfIntervalForFirstAndSecondWavelength",2329}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"averaging1Flag",328}, - {"firstOrderValues",875}, - {"section3Flags",2054}, - {""}, {""}, {""}, - {"cloudsTitle1Trend4",524}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"halfByte",950}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"default_min_val",687}, - {""}, - {"coordinate2Start",597}, - {""}, {""}, {""}, - {"southEastLatitudeOfVerficationArea",2151}, - {""}, - {"endDayTrend1",747}, + {"formatVersionMajorNumber",898}, + {"originatingCentreOfAnalysis",1615}, {""}, {""}, - {"diffInHours",702}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"secondOrderValuesDifferentWidths",2025}, + {"shapeOfTheEarth",2133}, + {""}, {""}, {""}, + {"averaging1Flag",327}, {""}, {""}, {""}, {""}, {""}, - {"numberOfComponents",1423}, - {"coordinate2Flag",596}, - {"section1Pointer",2048}, + {"tiggeLAMName",2270}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"XRInMetres",272}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfDistanceFromEnsembleMean",1985}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"section6",2077}, + {""}, {""}, {""}, {""}, + {"numberOfDistinctSection3s",1440}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"updateSequenceNumber",2412}, + {""}, {""}, + {"baseTimeEPS",338}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"swapScanningX",2238}, + {""}, {""}, {""}, {""}, {""}, + {"windVariableDirectionTrend1",2506}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"stepUnits",2211}, + {""}, {""}, {""}, {""}, {""}, + {"La1InDegrees",101}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"longitudeOfFirstDiamondCenterLine",1209}, + {""}, + {"longitudeOfFirstDiamondCentreLine",1210}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Lo1InDegrees",124}, + {""}, + {"typicalCentury",2369}, + {""}, {""}, {""}, {""}, {""}, + {"selectedMinute",2120}, + {""}, {""}, + {"presentTrend4",1758}, + {""}, + {"longitudeOfFirstDiamondCentreLineInDegrees",1211}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"latitudeOfSouthernPoleInDegrees",1107}, + {""}, + {"sp1",2168}, + {""}, + {"dummy2",723}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"spare1",2174}, + {""}, {""}, + {"La1",100}, + {""}, {""}, {""}, {""}, {""}, + {"Lar1",108}, + {""}, {""}, {""}, + {"xDirectionGridLengthInMetres",2514}, + {""}, + {"yearOfCentury",2527}, + {""}, {""}, {""}, {""}, + {"Latin1",113}, + {""}, + {"bufrHeaderCentre",382}, + {""}, + {"Lo1",123}, + {""}, + {"endDayTrend1",746}, + {""}, {""}, + {"scaleFactorOfLengthOfSemiMinorAxis",1962}, + {"Lor1",143}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"section1",2049}, + {""}, {""}, + {"fileConsistencyFlags",866}, + {"marsGrid",1257}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"LLCOSP",98}, + {""}, + {"secondOrderOfDifferentWidth",2033}, + {"backgroundProcess",333}, + {""}, + {"isGridded",1038}, + {""}, {""}, {""}, + {"stepHumanReadable",2204}, + {""}, {""}, {""}, + {"reserved2",1869}, + {""}, {""}, + {"numberOfCoefficientsOrValuesUsedToSpecifyFirstDimensionCoordinateFunction",1425}, + {"numberOfCoefficientsOrValuesUsedToSpecifySecondDimensionCoordinateFunction",1426}, + {""}, + {"marsType2",1277}, + {"X2",269}, + {""}, {""}, + {"runwayDepositState4",1903}, + {""}, {""}, + {"baseDateEPS",336}, + {""}, {""}, {""}, {""}, {""}, + {"scaleFactorOfWaveDirections",1977}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaleFactorOfWaveDirectionSequenceParameter",1976}, + {""}, {""}, {""}, {""}, {""}, + {"scaleFactorOfWaveFrequencies",1978}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"typeOfWavePeriodInterval",2367}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"totalNumberOfValuesInUnpackedSubset",2316}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"verticalVisibilityCoded",2461}, + {"cloudsTitle4Trend4",538}, + {""}, {""}, + {"shortNameECMF",2136}, {""}, {""}, {""}, {"compressedData",568}, + {""}, {""}, {""}, + {"runwaySideCodeState4",1943}, + {"latitudeOfSubSatellitePoint",1110}, + {""}, + {"md5Product",1298}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfWaveFrequencies",1532}, + {"indicatorOfTypeOfLevel",1001}, + {"xDirectionGridLengthInMillimetres",2515}, + {""}, {""}, {""}, + {"totalNumberOfDataValuesMissingInStatisticalProcess",2305}, + {"timeDomainTemplateNumber",2286}, + {"numberOfWaveDirections",1531}, + {"windUnits",2500}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ls_labeling",1241}, + {""}, + {"unitsBias",2392}, + {""}, {""}, + {"typeOfEnsembleMember",2340}, + {""}, {""}, + {"section3Pointer",2066}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"numberOfRepresentativeMember",1502}, + {""}, {""}, {""}, {""}, + {"is_ocean3d_param",1053}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section10Length",2041}, + {"localExtensionPadding",1177}, + {""}, + {"latitudeOfCentralPointInClusterDomain",1093}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section_7",2113}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"offsetSection2",1571}, + {""}, + {"reducedGrid",1847}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"longitudeOfFirstDiamondCenterLine",1207}, + {"wrongPadding",2510}, {""}, - {"longitudeOfFirstDiamondCentreLine",1208}, - {"cloudsTitle1Trend3",523}, - {""}, {""}, {""}, - {"doExtractSubsets",718}, - {"secondaryBitmap",2028}, - {"centreForTable2",410}, - {""}, {""}, {""}, {""}, - {"extractedAreaNumberOfSubsets",847}, - {""}, - {"sectionLengthLimitForProbability",2084}, - {"longitudeOfFirstDiamondCentreLineInDegrees",1209}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"totalNumberOfValuesInUnpackedSubset",2300}, - {"fileConsistencyFlags",866}, - {""}, - {"numberOfColumns",1422}, - {""}, {""}, {""}, {""}, - {"legBaseDate",1124}, + {"normAtFinalTime",1386}, + {""}, {""}, + {"dummy1",722}, + {""}, {""}, + {"scaleFactorOfSecondWavelength",1971}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"indicatorOfUnitForTimeRangeForReferencePeriod",1004}, - {""}, - {"offsetSection2",1564}, - {"unpackedSubsetPrecision",2386}, - {""}, {""}, {""}, - {"scaledValueOfDistanceFromEnsembleMean",1976}, - {""}, {""}, - {"is_ocean3d_param",1052}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"firstDimensionCoordinateValueDefinition",869}, - {""}, - {"ijDirectionIncrementGiven",988}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"N2",174}, - {""}, - {"forecastOrSingularVectorNumber",887}, - {"reducedGrid",1838}, - {""}, {""}, - {"unitsConversionScaleFactor",2376}, - {"grib2LocalSectionPresent",922}, - {""}, {""}, - {"cloudsTitle3Trend1",531}, - {""}, {""}, - {"monthOfForecastUsedInLocalTime",1357}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"realPartOf00",1828}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"GTSstr",79}, - {""}, {""}, - {"windGust",2469}, - {""}, {""}, - {"rangeBinSpacing",1813}, {""}, {""}, {""}, {""}, {""}, - {"windVariableDirectionTrend2",2487}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"typeOfEnsembleMember",2323}, - {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfLengthOfSemiMinorAxis",1953}, - {""}, - {"integerPointValues",1016}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"secondaryBitmapPresent",2029}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"grib2LocalSectionNumber",921}, - {""}, {""}, - {"localFlagLatestVersion",1177}, - {"numberOfParallelsBetweenAPoleAndTheEquator",1474}, - {""}, {""}, - {"componentIndex",567}, - {""}, {""}, {""}, {""}, - {"DxInMetres",41}, - {""}, {""}, {""}, {""}, - {"upperThresholdValue",2398}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, + {"integerPointValues",1017}, {"DjInDegrees",36}, - {""}, - {"BufrTemplate",19}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"localTablesVersion",1191}, - {""}, {""}, - {"xDirectionGridLengthInMetres",2494}, - {"windSpeedTrend2",2477}, - {""}, {""}, {""}, {""}, {""}, - {"Lar1InDegrees",110}, - {""}, {""}, {""}, - {"missingValueManagement",1339}, - {"attributeOfTile",325}, {""}, {""}, {""}, {""}, - {"NrInRadiusOfEarthScaled",203}, - {"numberOfAdditionalParametersForReferencePeriod",1403}, - {""}, {""}, {""}, - {"Lor1InDegrees",145}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"secondaryBitmaps",2030}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfDistinctSection5s",1437}, - {""}, {""}, - {"latitudeOfSouthernPoleInDegrees",1106}, - {""}, - {"offsetBSection9",1549}, - {""}, - {"subSetM",2219}, - {""}, - {"cloudsCode3",510}, - {""}, {""}, - {"cloudsTitle4Trend4",539}, - {"coordAveragingTims",591}, - {""}, {""}, - {"GTS",78}, - {"LxInMetres",153}, - {""}, {""}, - {"biFourierResolutionParameterM",365}, - {"section6Length",2069}, - {""}, - {"windDirectionTrend2",2466}, - {""}, {""}, {""}, - {"xDirectionGridLengthInMillimetres",2495}, - {"latitudeOfSubSatellitePoint",1109}, - {""}, - {"lowerThresholdValue",1238}, + {"subSetM",2230}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudeOfCentralPointInClusterDomain",1092}, - {""}, - {"NrInRadiusOfEarth",202}, - {""}, - {"isectionNumber2",1054}, - {""}, {""}, {""}, {""}, - {"wrongPadding",2490}, - {""}, {""}, {""}, {""}, {"flagForIrregularGridCoordinateList",879}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"GTSstr",78}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"conceptsMasterMarsDir",578}, - {""}, {""}, - {"isRotatedGrid",1040}, - {"secondaryBitmapsCount",2031}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsTitle4Trend3",538}, - {""}, - {"md5Section7",1304}, - {""}, - {"scaledValueOfAdditionalParameterForReferencePeriod",1974}, - {""}, - {"tiggeLAMName",2259}, - {"La1InDegrees",102}, - {""}, {""}, {""}, {""}, {""}, - {"dayOfTheYearDate",674}, - {""}, {""}, {""}, {""}, - {"earthMinorAxisInMetres",732}, - {""}, - {"packedValues",1618}, - {""}, - {"Lo1InDegrees",125}, - {"section5Pointer",2066}, - {""}, {""}, {""}, {""}, {""}, - {"DiGiven",31}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"thisMarsClass",2251}, - {"instrumentType",1015}, - {""}, - {"listMembersUsed",1153}, - {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfWaveDirections",1968}, - {""}, {""}, {""}, - {"_numberOfValues",295}, - {""}, {""}, - {"timeDomainTemplateNumber",2271}, - {""}, {""}, - {"meanRVR4",1312}, - {""}, - {"doExtractArea",716}, - {"scaleFactorOfWaveDirectionSequenceParameter",1967}, - {""}, {""}, - {"indicatorOfTypeOfLevel",1000}, - {"monthOfEndOfOverallTimeInterval",1355}, - {""}, - {"southEastLatitudeOfLPOArea",2150}, - {"latitudeOfFirstGridPointInDegrees",1096}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfWaveFrequencies",1969}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"indexedStorageInternalNodeK",993}, - {""}, {""}, - {"offsetBeforeData",1551}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfRepresentativeMember",1497}, - {""}, {""}, {""}, {""}, - {"AA",6}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"jScansNegatively",1067}, - {""}, {""}, - {"firstDimensionPhysicalSignificance",870}, - {""}, - {"baseTimeEPS",339}, - {"typeOfGrid",2326}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"sp1",2159}, - {""}, - {"sizeOfLength",2140}, - {"P2",215}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"spare1",2165}, - {""}, {""}, - {"originatingCentreOfAnalysis",1608}, - {"unstructuredGrid",2389}, - {""}, {""}, {""}, {""}, - {"remarkPresent",1853}, + {"cloudsTitle1Trend4",523}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"correction2",616}, {""}, {""}, {""}, - {"unstructuredGridType",2391}, - {"secondOfEndOfOverallTimeInterval",2018}, - {"experimentVersionNumber",805}, + {"scaleFactorOfWaveFrequencySequenceParameter",1979}, + {"endStepUnit",773}, + {"originatorLocalTemplateNumber",1618}, + {"centreForTable2",409}, {""}, {""}, - {"originatorLocalTemplateNumber",1611}, - {""}, {""}, - {"section1",2040}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfCoordinatesValues",1426}, + {"reserved1",1868}, + {""}, + {"pressureUnits",1775}, + {""}, + {"offsetSection6",1575}, + {""}, + {"marsType1",1276}, + {"X1",267}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"minuteOfEndOfOverallTimeInterval",1329}, - {"meanRVR3",1311}, - {""}, - {"earthMajorAxis",729}, - {""}, {""}, - {"verticalVisibilityCoded",2441}, - {""}, - {"cloudsTitle1Trend2",522}, - {""}, {""}, - {"numberOfClusters",1418}, - {""}, - {"scaleFactorOfWaveFrequencySequenceParameter",1970}, - {""}, - {"yearOfEndOfOverallTimeInterval",2508}, - {""}, {""}, {""}, - {"secondOrderOfDifferentWidth",2024}, + {"windGust",2489}, {""}, {""}, {""}, {""}, {""}, - {"deleteCalendarId",690}, - {""}, {""}, {""}, {""}, - {"marsStream2",1272}, - {""}, {""}, {""}, {""}, {""}, - {"offsetEndSection4",1555}, - {""}, {""}, {""}, {""}, - {"numberOfCodedValues",1419}, + {"sizeOfLength",2149}, {""}, - {"stepUnits",2201}, + {"section_07",2102}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"windVariableDirectionTrend3",2508}, {""}, {""}, - {"LcxInMetres",119}, - {""}, {""}, {""}, {""}, {""}, - {"typeOfWavePeriodInterval",2349}, - {""}, - {"longitudeOfSouthEastCornerOfArea",1219}, - {""}, - {"coordAveraging0",587}, - {"unpackedError",2385}, + {"clusterMember10",541}, {""}, {""}, - {"subDefinitions2",2210}, - {""}, {""}, {""}, {""}, - {"packingError",1619}, + {"gribDataQualityChecks",926}, + {""}, {""}, + {"southEastLongitudeOfVerficationArea",2162}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"thisMarsClass",2262}, {""}, - {"is_ocean2d_param",1051}, - {""}, {""}, {""}, - {"windVariableDirectionTrend1",2486}, - {""}, - {"baseDateEPS",337}, - {""}, - {"keyMore",1074}, - {""}, {""}, {""}, - {"gribTablesVersionNo",927}, - {""}, {""}, {""}, - {"endOfMessage",769}, - {"biFourierResolutionSubSetParameterM",367}, - {"LuxInMetres",149}, + {"missingValueManagement",1341}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"rootTablesDir",1879}, - {""}, {""}, - {"beginDayTrend4",345}, - {""}, - {"runwayFrictionCoefficientState4",1930}, - {""}, {""}, {""}, - {"hourOfEndOfOverallTimeInterval",965}, - {"heightPressureEtcOfLevels",955}, + {"primaryBitmap",1776}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"postAuxiliaryArrayPresent",1744}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"GTS",77}, + {""}, {""}, + {"windSpeedTrend2",2497}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {"flagForAnyFurtherInformation",878}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudeOfNorthWestCornerOfArea",1101}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"dummy1",723}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfSecondWavelength",1962}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"secondaryMissingValue",2033}, - {""}, {""}, {""}, - {"endStepInHours",773}, - {""}, {""}, {""}, - {"runwayDepositState2",1892}, - {""}, {""}, {""}, - {"theHindcastMarsStream",2248}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayFrictionCoefficientState3",1929}, - {"verificationYear",2426}, - {""}, {""}, {""}, {""}, {""}, - {"oceanAtmosphereCoupling",1536}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"yCoordinateOfOriginOfSectorImage",2498}, - {""}, - {"marsType1",1274}, - {"reserved1",1859}, - {""}, {""}, {""}, {""}, - {"clusterMember10",542}, - {""}, {""}, {""}, {""}, - {"windUnits",2480}, - {""}, - {"scaledValueOfPrimeMeridianOffset",1989}, - {""}, {""}, - {"southEastLongitudeOfVerficationArea",2153}, - {"md5Section3",1300}, - {""}, {""}, - {"formatVersionMinorNumber",898}, - {""}, - {"identificationOfOriginatingGeneratingCentre",983}, - {""}, - {"runwaySideCodeState2",1932}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudinalDirectionGridLength",1121}, - {"totalNumberOfClusters",2289}, - {""}, {""}, {""}, {""}, - {"clusterMember4",545}, - {"bufrdcExpandedDescriptors",386}, - {""}, {""}, - {"beginDayTrend3",344}, - {""}, {""}, {""}, {""}, {""}, - {"jScansPositively",1068}, - {""}, {""}, - {"La1",101}, - {""}, {""}, {""}, - {"Lar1",109}, - {""}, {""}, {""}, {""}, - {"xCoordinateOfSubSatellitePoint",2492}, - {""}, {""}, - {"Latin1",114}, - {""}, {""}, - {"Lo1",124}, - {""}, {""}, {""}, - {"Lor1",144}, - {""}, {""}, {""}, {""}, {""}, - {"versionOfModelClimate",2435}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"presentTrend2",1747}, - {""}, {""}, {""}, {""}, - {"definitionFilesVersion",689}, - {"patch_precip_fp",1716}, - {"endOfHeadersMarker",767}, - {"cavokOrVisibility",392}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsTitle2",525}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"LLCOSP",99}, - {"Dj",34}, - {""}, - {"default_step_units",688}, - {""}, {""}, {""}, - {"scanningMode4",2005}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"conceptsDir2",573}, - {"pastTendencyRVR3",1714}, - {"azimuthalWidth",332}, - {""}, {""}, {""}, - {"numberOfCoefficientsOrValuesUsedToSpecifyFirstDimensionCoordinateFunction",1420}, - {"numberOfCoefficientsOrValuesUsedToSpecifySecondDimensionCoordinateFunction",1421}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"indicatorOfUnitForTimeIncrement",1002}, - {""}, {""}, - {"endMinuteTrend4",761}, - {"numberOfPointsInDomain",1489}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"centralLongitudeInMicrodegrees",406}, - {""}, {""}, {""}, {""}, - {"cloudsTitle4Trend2",537}, - {"pressureUnits",1766}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"tiggeSuiteID",2263}, - {""}, - {"tablesLocalDir",2236}, - {""}, {""}, {""}, - {"localTablesVersionNumber",1192}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"gaussianGridName",908}, - {"clusterMember3",544}, - {""}, {""}, - {"southPoleOnProjectionPlane",2156}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfWaveFrequencies",1525}, - {"section_10",2097}, - {""}, - {"md5Headers",1295}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"NC",177}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section1Flags",2045}, - {""}, - {"subLocalDefinition2",2212}, - {""}, {""}, - {"thisExperimentVersionNumber",2250}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"endDayTrend2",748}, - {""}, {""}, {""}, {""}, - {"section_4",2101}, - {""}, {""}, - {"expandBy",790}, - {""}, - {"scaleFactorOfFirstWavelength",1951}, - {""}, {""}, - {"getNumberOfValues",916}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"latitudeOfFirstGridPointInDegrees",1097}, + {"numberOfClusters",1423}, + {""}, + {"correction3",618}, + {"doExtractSubsets",717}, {""}, {""}, {""}, - {"offsetSection1",1561}, + {"earthMajorAxis",728}, + {""}, {""}, {""}, + {"earthMinorAxisInMetres",731}, + {"legBaseTime",1126}, {""}, - {"numberOfWaveDirections",1524}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"coordinate2End",595}, - {"sourceOfGridDefinition",2148}, - {""}, {""}, {""}, {""}, - {"endMinuteTrend3",760}, - {""}, {""}, - {"cloudsTitle1Trend1",521}, - {"extractDateTimeYearStart",842}, - {""}, {""}, - {"LIMITS",98}, - {""}, - {"kindOfProduct",1076}, - {"rootGroupObjectHeaderAddress",1877}, - {""}, {""}, - {"N1",173}, - {""}, - {"SOH",228}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"TIDE",238}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"typicalMonth",2357}, - {"numberOfClusterLowResolution",1417}, - {""}, {""}, {""}, {""}, - {"unstructuredGridSubtype",2390}, - {"numberOfBits",1405}, - {"resolutionAndComponentFlags6",1873}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"flagShowingPostAuxiliaryArrayInUse",881}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"offsetSection1",1568}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section_3",2100}, - {""}, {""}, {""}, - {"spaceUnitFlag",2162}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"longitudeOfTangencyPoint",1226}, - {""}, {""}, {""}, - {"P_INST",219}, - {"unpackedValues",2387}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberIncludedInAverage",1401}, - {""}, {""}, {""}, {""}, - {"inputShortDelayedDescriptorReplicationFactor",1012}, - {"NH",184}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"param_value_max",1696}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"windSpeedTrend1",2476}, - {""}, {""}, {""}, - {"reservedSection2",1864}, - {""}, - {"_leg_number",294}, - {""}, {""}, {""}, - {"monthlyVerificationYear",1364}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"typeOfReferenceDataset",2337}, - {"Nj",200}, - {""}, {""}, - {"preBitmapValues",1738}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"section_04",2090}, - {""}, - {"selectStepTemplateInstant",2106}, - {""}, {""}, - {"typeOfPacking",2333}, - {""}, {""}, - {"section4Length",2060}, + {"LxInMetres",152}, {""}, {""}, {""}, {""}, {""}, - {"coordinateFlag2",605}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"clusteringDomain",553}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"ls_labeling",1239}, - {""}, - {"windDirectionTrend1",2465}, + {"offsetEndSection4",1562}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"totalNumberOfWaveDirections",2301}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"longitudeOfCentralPointInClusterDomain",1204}, - {"secondaryBitmapsSize",2032}, - {"cfVarNameECMF",422}, - {""}, {""}, {""}, - {"runwayFrictionCoefficientState2",1928}, - {""}, - {"localLatitude2",1181}, - {""}, {""}, {""}, {""}, {""}, - {"GDSPresent",68}, {""}, {""}, - {"totalNumberOfWaveFrequencies",2302}, - {"unitOfTimeRange",2372}, + {"spaceUnitFlag",2171}, + {"numberOfPointsAlongASide",1485}, + {""}, {""}, + {"deleteCalendarId",689}, + {"thisExperimentVersionNumber",2261}, + {""}, {""}, + {"biFourierResolutionParameterM",364}, + {""}, {""}, + {"unitOfTimeRange",2390}, + {""}, + {"endOfMessage",768}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"unstructuredGrid",2407}, {""}, {""}, {""}, - {"falseEasting",859}, - {""}, {""}, {""}, {""}, - {"section3Length",2055}, - {"extractAreaEastLongitude",817}, - {"numberOfHorizontalPoints",1456}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfPointsAlongAMeridian",1483}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"jDirectionIncrementInDegrees",1064}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"section5",2064}, - {"NUT",192}, - {"XRInMetres",273}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"upperThresholdValue",2416}, {""}, {""}, {""}, - {"runwayDesignatorState4",1910}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"postAuxiliaryArrayPresent",1735}, - {""}, {""}, {""}, {""}, - {"variationOfVisibilityTrend4",2422}, - {"observationType",1533}, - {"section_03",2089}, - {""}, {""}, {""}, {""}, - {"scaleFactorOfCentralWaveNumber",1944}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"secondaryMissingValueSubstitute",2034}, + {"section_4",2110}, {""}, {""}, - {"normAtFinalTime",1381}, - {""}, {""}, {""}, {""}, - {"cloudsTitle4Trend1",536}, + {"halfByte",951}, + {""}, {""}, + {"monthOfEndOfOverallTimeInterval",1357}, + {"unstructuredGridType",2409}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"rdbtimeMonth",1823}, - {""}, - {"jPointsAreConsecutive",1066}, - {""}, {""}, {""}, {""}, - {"longitudeOfReferencePoint",1217}, + {"instrumentType",1016}, {""}, {""}, {""}, {""}, {""}, - {"numberOfDataBinsAlongRadials",1427}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"endGridDefinition",752}, - {""}, {""}, {""}, {""}, - {"unexpandedDescriptors",2367}, + {"scaleFactorOfFirstWavelength",1960}, {""}, - {"longitudeOfTheSouthernPoleOfProjection",1230}, + {"northWestLatitudeOfLPOArea",1391}, {""}, {""}, {""}, - {"runwayDesignatorState3",1909}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"variationOfVisibilityDirectionTrend4",2418}, - {""}, {""}, {""}, - {"variationOfVisibilityTrend3",2421}, - {""}, {""}, {""}, {""}, - {"cloudsTitle2Trend4",529}, - {""}, {""}, {""}, {""}, - {"longitudeOfSouthernPole",1220}, + {"windDirectionTrend2",2486}, + {""}, {""}, + {"bufrdcExpandedDescriptors",385}, {""}, - {"P1",214}, + {"indexedStorageInternalNodeK",994}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"subLocalDefinitionLength2",2214}, - {""}, - {"easternLongitudeOfClusterDomain",735}, - {""}, - {"startDateOfReferencePeriod",2180}, - {""}, {""}, - {"extractAreaNorthLatitude",820}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"HDF5str",81}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"scaledValueOfLengthOfSemiMinorAxis",1984}, - {"localLongitude2",1184}, - {""}, {""}, {""}, - {"clusterMember7",548}, - {""}, {""}, - {"unexpandedDescriptorsEncoded",2368}, - {""}, {""}, {""}, - {"mask",1277}, - {""}, - {"cloudsCode4",515}, - {""}, {""}, - {"variationOfVisibilityDirectionTrend3",2417}, - {""}, {""}, {""}, {""}, - {"runwayDepthOfDepositCodeState4",1898}, - {""}, {""}, {""}, - {"cloudsTitle2Trend3",528}, - {""}, {""}, - {"longitudeOfThePoleOfStretching",1227}, - {""}, {""}, {""}, - {"dateSSTFieldUsed",663}, + {"latitudinalDirectionGridLength",1122}, {""}, {""}, {""}, {""}, {""}, - {"visibilityInKilometresTrend4",2446}, - {"md5Section5",1302}, - {"nameLegacyECMF",1372}, - {"numberOfClusterHighResolution",1416}, + {"centralLongitudeInMicrodegrees",405}, {""}, - {"produceLargeConstantFields",1776}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"NRj",190}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"PUnset",217}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"pack",1617}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"selectStepTemplateInterval",2107}, - {""}, - {"scanningMode7",2008}, - {""}, {""}, {""}, - {"subDefinitions1",2209}, - {""}, {""}, {""}, - {"runwayDepthOfDepositCodeState3",1897}, - {""}, {""}, {""}, - {"section7Length",2073}, - {""}, - {"METARstr",158}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Dj",34}, + {"param_value_max",1704}, + {"heightPressureEtcOfLevels",956}, + {"selectedHour",2119}, {""}, {""}, {""}, {""}, - {"deleteLocalDefinition",692}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"alternativeRowScanning",309}, - {""}, {""}, - {"offsetBSection6",1548}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"gts_TTAAii",947}, - {""}, {""}, {""}, {""}, - {"backgroundGeneratingProcessIdentifier",333}, - {""}, - {"westernLongitudeOfClusterDomain",2458}, - {""}, {""}, {""}, {""}, - {"extractDateTimeHourStart",829}, - {"unpack",2384}, - {""}, - {"mBasicAngle",1244}, + {"DiGiven",31}, {""}, {""}, {""}, - {"referenceForGroupWidths",1843}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"probabilityType",1773}, - {""}, - {"meanRVR2",1310}, - {""}, - {"visibilityInKilometresTrend3",2445}, - {"subLocalDefinitionNumber2",2216}, + {"tablesLocalDir",2247}, + {""}, {""}, {""}, {""}, + {"coordinate2Start",597}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section11Pointer",2044}, - {"runwayDepositState1",1891}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section_7",2104}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"satelliteID",1938}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwaySideCodeState1",1931}, + {"subDefinitions2",2221}, {""}, - {"cloudsAbbreviation4",455}, + {"longitudeOfReferencePoint",1219}, + {""}, + {"legBaseDate",1125}, + {""}, + {"Yp",285}, + {""}, {""}, + {"unpackedSubsetPrecision",2404}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaledValueOfWaveDirectionSequenceParameter",1998}, - {""}, - {"iDirectionIncrementGiven",975}, - {"parameterUnits",1705}, + {"Yo",284}, + {"longitudeOfTangencyPoint",1228}, {""}, {""}, {""}, {""}, {""}, - {"X2",270}, + {"typeOfGrid",2343}, + {"numberOfPointsInDomain",1494}, {""}, - {"codedNumberOfGroups",561}, + {"cloudsTitle4Trend2",536}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"windSpeedTrend1",2496}, + {"conceptsMasterMarsDir",578}, {""}, - {"rdb_key",1817}, - {"Product_Identifier",222}, + {"observationType",1540}, + {""}, + {"rootGroupObjectHeaderAddress",1886}, + {""}, + {"N2",173}, + {""}, {""}, {""}, {""}, + {"rangeBinSpacing",1822}, + {"extractDateTimeYearStart",842}, + {"section_04",2099}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section1Flags",2054}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"startDateOfReferencePeriod",2189}, + {""}, + {"minuteOfEndOfOverallTimeInterval",1331}, + {""}, {""}, + {"DxInMetres",41}, + {"rootTablesDir",1888}, + {""}, {""}, {""}, {""}, + {"secondOfEndOfOverallTimeInterval",2027}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"southPoleOnProjectionPlane",2165}, + {"section7Length",2082}, + {""}, + {"numberOfPointsAlongSecondAxis",1487}, + {""}, + {"P_INST",218}, + {""}, + {"isRotatedGrid",1041}, + {""}, {""}, {""}, + {"northWestLatitudeOfVerficationArea",1392}, + {""}, {""}, + {"secondaryBitmap",2037}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"jPointsAreConsecutive",1067}, + {"P2",214}, + {""}, {""}, {""}, + {"BufrTemplate",19}, + {""}, + {"componentIndex",567}, + {"packedValues",1625}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayFrictionCoefficientState1",1927}, - {"probabilityTypeName",1774}, + {"selectStepTemplateInstant",2115}, + {"tiggeSuiteID",2274}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"subLocalDefinition2",2223}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsTitle4Trend1",535}, + {""}, + {"longitudeOfTheSouthernPoleOfProjection",1232}, + {""}, {""}, {""}, {""}, {""}, + {"versionOfModelClimate",2455}, + {""}, {""}, + {"scaledValueOfPrimeMeridianOffset",1998}, + {""}, + {"extractDateTimeHourStart",829}, + {""}, + {"cloudsTitle3",529}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"parametersVersion",1715}, + {""}, {""}, + {"selectedYear",2123}, + {""}, + {"lowerThresholdValue",1240}, + {"hourOfEndOfOverallTimeInterval",966}, + {""}, {""}, {""}, {""}, + {"numberOfPointsAlongAParallel",1484}, + {"LcxInMetres",118}, + {""}, {""}, + {"yCoordinateOfOriginOfSectorImage",2518}, + {""}, {""}, {""}, {""}, + {"n3",1370}, + {"cloudsTitle1Trend2",521}, + {"localYear",1199}, + {""}, {""}, {""}, {""}, {""}, + {"windDirectionTrend1",2485}, + {""}, + {"LuxInMetres",148}, + {""}, + {"offsetBeforeData",1558}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"biFourierResolutionSubSetParameterM",366}, + {""}, + {"offsetBSection9",1556}, + {""}, {""}, {""}, {""}, {""}, + {"longitudeOfThePoleOfStretching",1229}, + {"isectionNumber2",1055}, + {"sp3",2170}, + {""}, {""}, + {"oceanAtmosphereCoupling",1543}, + {"easternLongitudeOfClusterDomain",734}, + {""}, {""}, + {"runwayFrictionCoefficientState4",1939}, + {""}, {""}, {""}, + {"secondaryMissingValue",2042}, + {""}, + {"spare3",2176}, + {""}, + {"Product_Identifier",221}, + {"yearOfEndOfOverallTimeInterval",2528}, + {""}, {""}, {""}, {""}, + {"cloudsTitle3Trend4",533}, + {""}, {""}, {""}, {""}, + {"subDefinitions1",2220}, + {""}, {""}, {""}, {""}, + {"padding_sec1_loc",1692}, + {""}, {""}, {""}, + {"section4Length",2069}, + {""}, {""}, {""}, {""}, {""}, + {"dateSSTFieldUsed",663}, + {"percentileValue",1729}, + {""}, {""}, {""}, {""}, + {"beginDayTrend4",344}, + {"produceLargeConstantFields",1785}, + {"secondaryBitmapPresent",2038}, + {""}, {""}, + {"formatVersionMinorNumber",899}, + {""}, {""}, + {"NC",176}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"md5Section7",1306}, + {"unstructuredGridSubtype",2408}, + {""}, + {"PUnset",216}, + {"coordinate1End",592}, + {""}, {""}, + {"N1",172}, + {""}, + {"longitudeOfSouthEastCornerOfArea",1221}, + {"subLocalDefinitionLength2",2225}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"firstMonthUsedToBuildClimateMonth2",874}, + {""}, + {"expandedCrex_scales",793}, + {""}, {""}, + {"jDirectionIncrementInDegrees",1065}, + {""}, {""}, {""}, + {"Model_Additional_Information",167}, + {""}, + {"TIDE",237}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsTitle1Trend1",520}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"identificationOfOriginatingGeneratingCentre",984}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"uerraLocalVersion",2383}, + {""}, + {"clusterMember7",547}, + {""}, {""}, + {"xCoordinateOfSubSatellitePoint",2512}, + {""}, + {"meanRVR4",1314}, + {""}, {""}, + {"NrInRadiusOfEarthScaled",202}, + {""}, + {"P1",213}, + {"expandedCrex_units",794}, + {""}, + {"numberOfDistinctSection5s",1442}, + {""}, + {"coordinate2Flag",596}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"NUT",191}, + {""}, {""}, {""}, {""}, {""}, + {"versionNumberOfExperimentalSuite",2452}, + {"stepInHours",2205}, + {""}, {""}, + {"LIMITS",97}, + {"falseEasting",859}, + {""}, + {"subLocalDefinition1",2222}, + {"alternativeRowScanning",308}, + {"presentTrend2",1756}, + {""}, + {"typicalYear",2378}, + {""}, {""}, {""}, + {"marsKeywords1",1260}, + {"Sub-Experiment_Identifier",234}, + {""}, {""}, {""}, {""}, + {"endDayTrend3",748}, + {""}, {""}, {""}, {""}, {""}, + {"NrInRadiusOfEarth",201}, + {""}, {""}, + {"qfeUnits",1804}, + {"numberOfClusterHighResolution",1421}, + {""}, + {"directionOfVariation",707}, + {"qnhUnits",1808}, + {"secondaryBitmaps",2039}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"unpackedError",2403}, + {"firstMonthUsedToBuildClimateMonth1",873}, + {""}, {""}, + {"totalNumberOfWaveDirections",2317}, + {""}, {""}, + {"rdbtimeYear",1835}, + {"parameterUnits",1713}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfLengthOfSemiMinorAxis",1993}, + {""}, + {"totalNumberOfWaveFrequencies",2318}, + {""}, + {"scanningMode7",2017}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfClusterLowResolution",1422}, + {""}, {""}, {""}, + {"Ensemble_Identifier",50}, + {""}, {""}, {""}, {""}, + {"secondaryBitmapsCount",2040}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"offsetFromReferenceOfFirstTime",1565}, + {""}, {""}, + {"westernLongitudeOfClusterDomain",2478}, + {""}, {""}, {""}, {""}, + {"remarkPresent",1862}, + {""}, + {"packingError",1626}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"section3Flags",2063}, + {""}, {""}, {""}, {""}, + {"runwayDepositState2",1901}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"visibilityInKilometresTrend4",2466}, + {""}, {""}, {""}, {""}, + {"tiggeLocalVersion",2271}, + {""}, {""}, + {"scaledValueOfWaveDirectionSequenceParameter",2007}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"sourceOfGridDefinition",2157}, + {"scaleFactorOfUpperLimit",1974}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"firstDimensionPhysicalSignificance",870}, + {""}, {""}, + {"METARstr",157}, + {""}, {""}, {""}, + {"totalNumberOfClusters",2304}, + {""}, {""}, + {"diffInHours",701}, + {""}, {""}, {""}, + {"subLocalDefinitionLength1",2224}, + {""}, {""}, {""}, {""}, + {"longitudeOfCentralPointInClusterDomain",1206}, + {""}, {""}, {""}, + {"reserved3",1870}, + {""}, {""}, {""}, {""}, {""}, + {"runwaySideCodeState2",1941}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"startStepUnit",2195}, + {""}, {""}, {""}, {""}, + {"cloudsTitle4Trend3",537}, + {""}, {""}, {""}, {""}, + {"reservedSection3",1874}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation4",454}, + {"selectStepTemplateInterval",2116}, + {"cloudsCode4",514}, + {""}, {""}, {""}, {""}, {""}, + {"section11Pointer",2053}, + {""}, {""}, {""}, {""}, + {"numberOfUnexpandedDescriptors",1517}, + {""}, {""}, {""}, {""}, {""}, + {"expandedCrex_widths",795}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfUsedTileAttributes",1521}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"presentTrend1",1755}, + {"section5Pointer",2075}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"scaledValueOfSecondWavelength",2002}, + {"numberOfWaveFrequencySequenceParameters",1533}, + {"numberOfStepsUsedForClustering",1510}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfUsedTileAttributesForTileAttributeCombination",1522}, + {""}, {""}, {""}, + {"scaledValuesOfWaveDirections",2009}, + {"Nj",199}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfWaveDirectionSequenceParameters",1530}, + {""}, + {"secondaryMissingValueSubstitute",2043}, {""}, {"dataSubCategory",647}, - {""}, {""}, - {"referenceForGroupLengths",1842}, - {"versionNumOfSharedHeaderMessageFormat",2431}, {""}, {""}, {""}, {""}, {""}, - {"xCoordinateOfOriginOfSectorImage",2491}, - {""}, - {"qnhUnits",1799}, - {""}, - {"qfeUnits",1795}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"marsKeywords1",1258}, - {""}, - {"presentTrend1",1746}, + {"clusterMember4",544}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberMissingFromAveragesOrAccumulations",1407}, {""}, {""}, {""}, {""}, - {"totalNumberOfGridPoints",2294}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"offsetSection5",1567}, + {"Model_Identifier",168}, {""}, {""}, - {"mixedCoordinateFieldFlag",1344}, - {""}, {""}, - {"DjInMetres",37}, - {""}, {""}, - {"dateOfModelVersion",660}, - {"latitudeOfSubSatellitePointInDegrees",1110}, - {"timeOfModelVersion",2277}, + {"offsetSection3",1572}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"expandedCrex_scales",793}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section2Length",2049}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetBeforePL",1552}, - {""}, {""}, {""}, - {"cloudsAbbreviation3",450}, - {""}, {""}, {""}, - {"matrixBitmapsPresent",1287}, - {""}, {""}, {""}, {""}, - {"latitudeOfLastGridPoint",1099}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"scaledValueOfWaveFrequencySequenceParameter",1999}, - {""}, - {"METAR",157}, - {""}, {""}, {""}, {""}, {""}, - {"MinuteOfModelVersion",160}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"expandedCrex_units",794}, - {"beginDayTrend2",343}, - {""}, {""}, {""}, - {"offsetFromReferenceOfFirstTime",1558}, - {""}, {""}, {""}, {""}, - {"Model_Identifier",169}, - {""}, {""}, {""}, - {"swapScanningAlternativeRows",2224}, + {"endMinuteTrend4",760}, + {"forceStepUnits",885}, + {"scaledValueOfWaveFrequencySequenceParameter",2008}, {""}, {""}, - {"section_07",2093}, - {""}, - {"ITERATOR",91}, + {"numberOfPointsAlongXAxisInCouplingArea",1491}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"latitudeOfTangencyPoint",1112}, {""}, {""}, {""}, - {"subLocalDefinition1",2211}, - {""}, {""}, - {"longitudeOfThePolePoint",1228}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"md5Section10",1298}, - {""}, {""}, {""}, - {"crraSuiteID",631}, + {"clusteringDomain",552}, {""}, {""}, {""}, {""}, - {"scaleFactorOfUpperLimit",1965}, - {"extractDateTimeMinuteEnd",830}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"northWestLatitudeOfVerficationArea",1387}, - {"extractDateTimeMinuteStart",832}, - {"typeOfProcessedData",2336}, - {""}, - {"yearOfModelVersion",2511}, - {""}, {""}, {""}, - {"physicalMeaningOfVerticalCoordinate",1728}, - {""}, - {"endMonthTrend4",765}, + {"runwayDepositState1",1900}, + {"numberIncludedInAverage",1406}, + {"scaledValuesOfWaveFrequencies",2010}, {""}, {""}, - {"numberMissingFromAveragesOrAccumulations",1402}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayDesignatorState2",1908}, - {"md5Section4",1301}, + {"cloudsTitle1Trend3",522}, + {""}, + {"longitudeOfThePolePoint",1230}, + {"runwayFrictionCoefficientState2",1937}, + {""}, {""}, + {"cfVarNameECMF",421}, + {"WRAPstr",266}, + {""}, {""}, {""}, + {"swapScanningAlternativeRows",2235}, + {""}, + {"variationOfVisibilityDirection",2433}, + {""}, {""}, {""}, + {"cloudsTitle3Trend2",531}, + {""}, + {"variationOfVisibilityDirectionAngle",2434}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"secondOrderValuesDifferentWidths",2034}, + {""}, {""}, {""}, + {"section2Length",2058}, + {""}, {""}, + {"scanningMode4",2014}, + {""}, + {"deleteLocalDefinition",691}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"variationOfVisibilityTrend2",2420}, - {""}, {""}, - {"extractDateTimeMonthEnd",833}, - {""}, {""}, {""}, - {"expandedUnits",803}, - {""}, {""}, {""}, - {"extractDateTimeMonthStart",835}, + {"tempPressureUnits",2254}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudeOfTangencyPoint",1111}, - {""}, - {"latitudeWhereDxAndDyAreSpecified",1117}, - {""}, - {"MonthOfModelVersion",171}, - {""}, - {"scaledValueOfSecondWavelength",1993}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudeWhereDxAndDyAreSpecifiedInDegrees",1118}, - {""}, {""}, {""}, {""}, - {"numberOfDataPointsExpected",1430}, - {"runwayFrictionCodeValueState4",1922}, - {""}, {""}, {""}, {""}, - {"WMO",265}, - {""}, {""}, {""}, {""}, {""}, - {"clusterMember2",543}, - {""}, - {"numberOfPointsAlongASide",1480}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"hourOfModelVersion",968}, - {""}, - {"variationOfVisibilityDirectionTrend2",2416}, {""}, {""}, - {"numberOfContributingSpectralBands",1424}, - {""}, {""}, {""}, {""}, - {"numberOfPointsAlongAMeridian",1478}, - {"cloudsTitle2Trend2",527}, - {"tsectionNumber5",2311}, + {"runwaySideCodeState1",1940}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"expandedCrex_widths",795}, - {""}, {""}, - {"dayOfModelVersion",671}, - {""}, - {"qualityControlIndicator",1801}, - {""}, {""}, - {"cloudsBase3",470}, {""}, {""}, {""}, {""}, - {"uuidOfVGrid",2406}, - {"runwayDepositCodeState4",1890}, - {""}, {""}, {""}, {""}, {""}, - {"tempPressureUnits",2243}, - {"pastTendencyRVR4",1715}, - {""}, - {"localUsePresent",1196}, - {"radiusOfTheEarth",1811}, - {""}, - {"runwayFrictionCodeValueState3",1921}, - {""}, {""}, {""}, {""}, {""}, - {"endMonthTrend3",764}, + {"gaussianGridName",909}, {""}, {""}, - {"offsetValuesBy",1573}, + {"numberOfBits",1410}, + {""}, {""}, {""}, + {"typeOfReferenceDataset",2354}, + {""}, + {"section6Length",2078}, {""}, {""}, {""}, {""}, {""}, + {"cavokOrVisibility",391}, + {"runwayDesignatorState4",1919}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"keyMore",1075}, + {""}, {""}, + {"scaleFactorOfCentralWaveNumber",1953}, + {"inputShortDelayedDescriptorReplicationFactor",1013}, + {""}, {""}, + {"rdb_key",1826}, + {"preBitmapValues",1747}, + {"correction2",616}, + {""}, {""}, + {"firstOrderValues",875}, + {""}, {""}, + {"GDSPresent",67}, + {"scaleFactorOfLowerWavePeriodLimit",1964}, + {""}, {""}, + {"runwayFrictionCoefficientState1",1936}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfUsedSpatialTiles",1519}, + {""}, {""}, {""}, {""}, + {"cloudsTitle3Trend1",530}, + {""}, {"************_PRODUCT_***************",3}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"runwayDepthOfDepositCodeState2",1896}, + {"WMO",264}, + {""}, {""}, {""}, + {"windSpeedTrend3",2498}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"section1Length",2055}, + {""}, {""}, {""}, + {"iDirectionIncrementGiven",976}, + {""}, {""}, + {"section11Length",2052}, + {"localLatitude2",1183}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"variationOfVisibility",2432}, + {"localUsePresent",1198}, {""}, - {"beginHourTrend4",349}, - {""}, - {"Ensemble_Identifier",51}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"endMinuteTrend2",759}, - {""}, {""}, {""}, {""}, - {"scaledValuesOfWaveDirections",2000}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"endGridDefinition",751}, + {"dayOfForecastUsedInLocalTime",670}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfBytesPerInteger",1412}, - {""}, - {"latitudeFirstInDegrees",1089}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfGroups",1454}, - {"typeOfTimeIncrementBetweenSuccessiveFieldsUsedInTheStatisticalProcessing",2346}, - {"numberOfWaveFrequencySequenceParameters",1526}, - {""}, {""}, {""}, - {"constantAntennaElevationAngle",582}, - {""}, {""}, {""}, {""}, - {"numberOfPointsAlongAParallel",1479}, - {""}, {""}, {""}, - {"numberOfDaysInClimateSamplingWindow",1432}, - {"coordinateFlag1",604}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetAfterData",1543}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Model_Additional_Information",168}, + {"marsStream2",1274}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"coordinateFlag2",605}, + {""}, {""}, + {"probabilityType",1782}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"dateOfSSTFieldUsed",662}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"secondaryBitMap",2027}, - {"iDirectionIncrementGridLength",976}, - {"runwayDepositCodeState3",1889}, - {"scaledValuesOfWaveFrequencies",2001}, - {""}, {""}, {""}, {""}, - {"section_2",2099}, - {"reflectivityCalibrationConstant",1852}, - {""}, {""}, {""}, {""}, - {"localLatitude1",1180}, - {""}, {""}, {""}, - {"matchAerosolBinNumber",1282}, - {"horizontalDomainTemplate",961}, - {"marsClass2",1248}, - {"longitudeLastInDegrees",1203}, - {""}, {""}, {""}, - {"cloudsCode1",500}, - {"numberOfPointsAlongSecondAxis",1482}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"numberOfWaveDirectionSequenceParameters",1523}, - {""}, {""}, {""}, {""}, - {"numberOfUsedTileAttributes",1515}, + {"offsetAfterData",1550}, {""}, - {"beginHourTrend3",348}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"numberOfUnexpandedDescriptors",1512}, - {""}, {""}, - {"Latin2InDegrees",117}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"totalAerosolBinsNumbers",2285}, - {"scaledValueOfFirstWavelength",1982}, - {""}, {""}, {""}, {""}, {""}, - {"NEAREST",181}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded3Trend4",494}, + {"section_2",2108}, + {"extractDateTimeMinuteEnd",830}, + {"mBasicAngle",1246}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"DayOfModelVersion",29}, + {"extractDateTimeMinuteStart",832}, + {""}, {""}, + {"secondaryBitmapsSize",2041}, + {""}, {""}, + {"probabilityTypeName",1783}, {""}, {""}, {""}, - {"section1Length",2046}, + {"scaledValueOfFirstWavelength",1991}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"extractDateTimeMonthEnd",833}, {""}, - {"numberOfStepsUsedForClustering",1505}, - {""}, {""}, {""}, - {"Sub-Experiment_Identifier",235}, + {"YR",280}, + {""}, {""}, {""}, {""}, + {"extractDateTimeMonthStart",835}, + {""}, {""}, {""}, {""}, + {"METAR",156}, + {""}, {""}, {""}, {""}, {""}, + {"md5Section6",1305}, {""}, {""}, {""}, {""}, {""}, {""}, - {"WRAPstr",267}, + {"numberOfContributingSpectralBands",1429}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"extractDateTimeStart",839}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"typeOfSSTFieldUsed",2339}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section9UniqueIdentifier",2082}, + {"offsetBeforePL",1559}, + {""}, {""}, {""}, {""}, {""}, + {"localFlagLatestVersion",1179}, {""}, {""}, - {"cloudsBaseCoded3",490}, - {"section8UniqueIdentifier",2079}, + {"extractAreaNorthLatitude",820}, + {"latitudeWhereDxAndDyAreSpecified",1118}, + {""}, {""}, + {"theHindcastMarsStream",2259}, {""}, + {"iDirectionIncrementGridLength",977}, + {"windDirectionTrend3",2487}, + {""}, {""}, {""}, + {"section_6",2112}, + {""}, {""}, {""}, {""}, + {"expandedUnits",803}, + {""}, {""}, + {"latitudeWhereDxAndDyAreSpecifiedInDegrees",1119}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"jScansNegatively",1068}, + {""}, + {"southEastLongitudeOfLPOArea",2161}, + {""}, {""}, + {"section_02",2097}, + {""}, {""}, {""}, + {"jScansPositively",1069}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"latitudeOfReferencePoint",1103}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfRadarSitesUsed",1497}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"unpackedValues",2405}, + {""}, + {"MinuteOfModelVersion",159}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"extractDateTimeStart",839}, + {""}, {""}, {""}, {""}, + {"localTablesVersion",1193}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"latitudeOfSubSatellitePointInDegrees",1111}, + {""}, {""}, {""}, {""}, {""}, + {"localLatitude1",1182}, + {""}, {""}, + {"subLocalDefinitionNumber2",2227}, + {""}, {""}, {""}, {"extractDateTimeSecondEnd",836}, {""}, {""}, {""}, - {"cloudsBaseCoded3Trend3",493}, - {""}, {""}, {""}, {""}, {""}, + {"numberOfDataBinsAlongRadials",1432}, + {""}, {""}, {""}, {""}, {"extractDateTimeSecondStart",838}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"subLocalDefinitionLength1",2213}, - {""}, {""}, {""}, - {"northWestLatitudeOfLPOArea",1386}, {""}, - {"dayOfForecastUsedInLocalTime",670}, + {"localLongitude2",1186}, + {""}, {""}, + {"conceptsDir2",573}, + {""}, {""}, + {"unexpandedDescriptors",2385}, {""}, - {"listMembersMissing4",1152}, + {"typeOfSSTFieldUsed",2356}, {""}, {""}, {""}, {""}, - {"numberOfUsedSpatialTiles",1514}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"templatesMasterDir",2247}, - {""}, {""}, - {"endHourTrend4",756}, + {"NRj",189}, + {"coordinateFlag1",604}, + {"section_06",2101}, {""}, - {"localLongitude1",1183}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ITERATOR",90}, + {""}, + {"gribTablesVersionNo",928}, {""}, {""}, - {"runwayDesignatorState1",1907}, - {"numberOfRadarSitesUsed",1492}, - {"padding_sec1_loc",1685}, + {"longitudeOfSouthernPole",1222}, + {"numberOfHorizontalPoints",1461}, {""}, {""}, {""}, - {"sizeOfPostAuxiliaryArray",2142}, + {"cloudsTitle2",524}, + {""}, {""}, {""}, {""}, + {"dayOfTheYearDate",674}, + {""}, {""}, + {"section9UniqueIdentifier",2091}, + {"section_1",2105}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"section8UniqueIdentifier",2088}, + {""}, {""}, {""}, {""}, + {"numberOfControlForecastTube",1430}, + {""}, {""}, {""}, {""}, + {"uuidOfVGrid",2426}, + {""}, {""}, + {"unexpandedDescriptorsEncoded",2386}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"kindOfProduct",1077}, {""}, {""}, {""}, {""}, {""}, - {"variationOfVisibilityTrend1",2419}, - {"modelErrorType",1347}, - {"ceilingAndVisibilityOK",398}, - {""}, {""}, {""}, - {"section_02",2088}, - {""}, {""}, - {"horizontalDimensionProcessed",960}, - {""}, {""}, - {"section11Length",2043}, - {""}, {""}, - {"numberOfControlForecastTube",1425}, + {"matchAerosolBinNumber",1284}, + {"typeOfPacking",2350}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfPointsAlongXAxis",1485}, + {"numberOfDataPointsExpected",1435}, + {""}, {""}, {""}, + {"horizontalDomainTemplate",962}, + {""}, {""}, + {"MonthOfModelVersion",170}, + {""}, {""}, {""}, + {"pentagonalResolutionParameterK",1727}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"backgroundGeneratingProcessIdentifier",332}, + {"runwayFrictionCoefficientState3",1938}, + {""}, {""}, {""}, {""}, + {"DjInMetres",37}, + {"beginDayTrend2",342}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsTitle3Trend3",532}, + {""}, {""}, {""}, {""}, {""}, + {"northWestLongitudeOfVerficationArea",1394}, + {"typicalMonth",2375}, + {"tsectionNumber3",2326}, + {""}, {""}, {""}, + {"isectionNumber3",1056}, + {"latitudeOfLastGridPoint",1100}, + {"section3Length",2064}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"section_01",2096}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"expandBy",790}, + {""}, {""}, {""}, {""}, {""}, + {"runwayDesignatorState2",1917}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"NEAREST",180}, + {"rdbtimeMonth",1832}, + {""}, {""}, {""}, {""}, + {"qualityControlIndicator",1810}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"minuteOfStartOfReferencePeriod",1336}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"secondOfStartOfReferencePeriod",2031}, + {""}, {""}, {""}, {""}, + {"runwayFrictionCodeValueState4",1931}, + {"padding_local40_1",1689}, + {""}, {""}, {""}, {""}, {""}, + {"meanRVR2",1312}, + {""}, + {"mixedCoordinateFieldFlag",1346}, + {""}, {""}, {""}, {""}, + {"cloudsCode1",499}, + {""}, {""}, {""}, {""}, + {"subLocalDefinitionNumber1",2226}, + {""}, {""}, + {"xCoordinateOfOriginOfSectorImage",2511}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"listMembersUsed4",1157}, + {""}, {""}, + {"localLongitude1",1185}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"Latin2InDegrees",116}, + {""}, + {"endDayTrend2",747}, + {""}, + {"referenceForGroupWidths",1852}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"satelliteID",1947}, + {""}, + {"endOfHeadersMarker",766}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"extractAreaEastLongitude",817}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayDesignatorState1",1916}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"inputOverriddenReferenceValues",1011}, + {""}, + {"physicalMeaningOfVerticalCoordinate",1737}, + {""}, {""}, + {"presentTrend3",1757}, + {""}, {""}, {""}, + {"Original_Parameter_Identifier",211}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"crraSuiteID",631}, + {""}, {""}, + {"codedNumberOfGroups",560}, + {""}, + {"referenceForGroupLengths",1851}, + {""}, {""}, {""}, + {"typeOfProcessedData",2353}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"visibilityInKilometresTrend2",2464}, + {""}, {""}, {""}, {""}, + {"totalAerosolBinsNumbers",2300}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfUpperLimit",2005}, + {""}, {""}, {""}, + {"beginDayTrend1",341}, + {""}, {""}, {""}, + {"Latin1InDegrees",114}, + {""}, {""}, + {"verificationYear",2446}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"sizeOfPostAuxiliaryArray",2151}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"constantAntennaElevationAngle",582}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"projTargetString",1795}, + {""}, {""}, {""}, {""}, + {"runwayDepositState3",1902}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"coordinate3OfFirstGridPoint",599}, + {"endStepInHours",772}, + {""}, {""}, {""}, + {"reservedSection2",1873}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation2",444}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"unstructuredGridUUID",2392}, - {""}, {""}, {""}, - {"firstMonthUsedToBuildClimateMonth2",874}, - {""}, {""}, {""}, - {"variationOfVisibilityDirectionTrend1",2415}, - {""}, {""}, {""}, {""}, - {"latitudeOfReferencePoint",1102}, - {""}, {""}, {""}, - {"cloudsTitle2Trend1",526}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"listMembersMissing3",1151}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"meanRVR1",1311}, {""}, {""}, {""}, {""}, {""}, {""}, - {"endHourTrend3",755}, + {"projSourceString",1793}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"offsetICEFieldsUsed",1566}, {""}, {""}, - {"nameECMF",1371}, + {"runwaySideCodeState3",1942}, + {""}, {""}, {""}, + {"longitudeLastInDegrees",1205}, + {""}, {""}, {""}, + {"experimentVersionNumber",805}, + {"totalNumberOfGridPoints",2309}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaleFactorOfMajorAxisOfOblateSpheroidEarth",1965}, + {""}, {""}, + {"numberOfGroups",1459}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"horizontalDimensionProcessed",961}, {""}, {""}, {""}, {""}, {""}, {""}, - {"disableGrib1LocalSection",711}, + {"marsClass2",1250}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayDepthOfDepositCodeState1",1895}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"meanRVR1",1309}, - {""}, - {"scaleFactorOfLowerWavePeriodLimit",1955}, - {"subLocalDefinitionNumber1",2215}, - {""}, {""}, {""}, - {"shortNameLegacyECMF",2128}, - {""}, {""}, {""}, {""}, {""}, - {"timeIncrementBetweenSuccessiveFields",2273}, - {""}, - {"recentWeather",1831}, - {""}, {""}, {""}, {""}, - {"numberOfSecondOrderPackedValues",1500}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfGroupsOfDataValues",1455}, - {""}, {""}, {""}, {""}, - {"runwayFrictionCodeValueState2",1920}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"projTargetString",1786}, - {""}, {""}, {""}, - {"unitsECMF",2378}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"scaledValueOfCentralWaveNumber",1975}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"southEastLongitudeOfLPOArea",2152}, - {""}, {""}, {""}, - {"X1",268}, - {""}, {""}, {""}, {""}, - {"visibilityTrend3",2449}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"accuracyMultipliedByFactor",298}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberInMixedCoordinateDefinition",1398}, - {"scaleFactorOfMajorAxisOfOblateSpheroidEarth",1956}, - {"md5Section1",1297}, - {""}, - {"section5Length",2065}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"checkInternalVersion",434}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"pentagonalResolutionParameterK",1718}, - {"northWestLongitudeOfVerficationArea",1389}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"listMembersUsed3",1155}, - {""}, {""}, {""}, - {"NC2",179}, - {""}, - {"visibilityInKilometresTrend2",2444}, - {""}, {""}, {""}, - {"Latin1InDegrees",115}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"changeIndicatorTrend4",428}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"legacyGaussSubarea",1127}, - {""}, {""}, - {"generalExtended2ordr",910}, - {""}, - {"projSourceString",1784}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"experimentVersionNumberOfAnalysis",808}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfPointsAlongFirstAxis",1486}, + {"pentagonalResolutionParameterJ",1726}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"pastTendencyRVR1",1712}, - {"secondOfStartOfReferencePeriod",2022}, - {""}, {""}, - {"changeIndicatorTrend3",427}, + {"clusterMember2",542}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Threshold_Or_Distribution_Units",250}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"WRAP",265}, {""}, {""}, {""}, {""}, {""}, {""}, - {"beginDayTrend1",342}, + {"endMinuteTrend2",758}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"minuteOfStartOfReferencePeriod",1334}, - {""}, {""}, - {"pentagonalResolutionParameterJ",1717}, - {"outerLoopTypeOfTimeIncrement",1614}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"commonBlock",565}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"runwayDepthOfDepositState4",1902}, - {"cloudsBaseCoded3Trend2",492}, + {"numberInMixedCoordinateDefinition",1403}, {""}, {""}, {""}, - {"resolutionAndComponentFlags4",1872}, + {"typeOfTimeIncrementBetweenSuccessiveFieldsUsedInTheStatisticalProcessing",2364}, + {""}, {""}, {""}, + {"endMonthTrend4",764}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"visibilityInKilometresTrend1",2463}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfPointsAlongTheXAxis",1488}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"realPartOf00",1837}, + {"clusterMember6",546}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsTitle2Trend4",528}, + {""}, {""}, {""}, + {"changeIndicatorTrend4",427}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"numberOfSingularVectorsComputed",1507}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ZLMULT",288}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"nameECMF",1376}, + {""}, + {"hoursAfterReferenceTimeOfDataCutoff",973}, + {""}, {""}, {""}, {"extractDateTimeYearEnd",840}, - {""}, {""}, {""}, {""}, - {"extractAreaSouthLatitude",821}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfLengthOfSemiMajorAxis",1952}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"cloudsAbbreviation2",445}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"clusterMember1",541}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"firstMonthUsedToBuildClimateMonth1",873}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"physicalFlag2",1727}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section6UniqueIdentifier",2071}, - {"inputOverriddenReferenceValues",1010}, - {"eastLongitudeOfDomainOfTubing",734}, - {""}, {""}, {""}, - {"numberOfGridInReference",1452}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"probProductDefinition",1772}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"runwayDepthOfDepositState3",1901}, - {""}, - {"numberOfBitsForScaledGroupLengths",1407}, - {""}, {""}, - {"resolutionAndComponentFlags3",1871}, - {""}, - {"northLatitudeOfDomainOfTubing",1385}, - {""}, {""}, {""}, - {"section2Used",2053}, - {""}, {""}, - {"numberOfBytesInLocalDefinition",1410}, - {"endMinuteTrend1",758}, - {""}, {""}, {""}, - {"observationDiagnostic",1531}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"numberOfMissingValues",1467}, - {"YRInMetres",282}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"runwayFrictionCodeValueState1",1919}, - {""}, - {"numberOfSingularVectorsEvolved",1503}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"flagForNormalOrStaggeredGrid",880}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayFrictionCoefficientCodeState4",1926}, {""}, {""}, {""}, {""}, {""}, - {"firstLatitudeInDegrees",872}, - {""}, {""}, {""}, {""}, {""}, - {"earthMajorAxisInMetres",730}, - {""}, - {"addEmptySection2",300}, - {""}, - {"longitudeOfReferencePointInDegrees",1218}, - {"padding_local40_1",1682}, - {"DjGiven",35}, - {""}, {""}, {""}, {""}, - {"southLatitudeOfDomainOfTubing",2155}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"section_1",2096}, + {"cloudsAbbreviation1",439}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"marsClass1",1247}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"endMonthTrend2",763}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"disableGrib1LocalSection",710}, + {""}, + {"latitudeFirstInDegrees",1090}, + {""}, + {"scaledValueOfCentralWaveNumber",1984}, + {""}, {""}, + {"offsetValuesBy",1580}, {""}, {""}, {""}, {""}, - {"indexingTimeMM",998}, - {""}, {""}, {""}, - {"runwayFrictionCoefficientCodeState3",1925}, + {"section2Used",2062}, + {"longitudeOfReferencePointInDegrees",1220}, + {""}, + {"runwayDepositCodeState4",1899}, + {""}, + {"scaledValueOfLowerWavePeriodLimit",1995}, + {"runwayDesignatorState3",1918}, + {""}, + {"runwayFrictionCodeValueState2",1929}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"legacyGaussSubarea",1128}, + {"scanningMode6",2016}, + {"numberOfBytesPerInteger",1417}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"unitsECMF",2396}, + {""}, {""}, {""}, {""}, + {"numberOfSingularVectorsEvolved",1508}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"definitionFilesVersion",688}, + {""}, {""}, {""}, {""}, + {"marsClass1",1249}, + {""}, {""}, {""}, {""}, {""}, + {"Ensemble_Combination_Number",49}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"clusterMember1",540}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"modelErrorType",1349}, + {"extractDateTimeHourEnd",827}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"westLongitudeOfDomainOfTubing",2457}, + {"getNumberOfValues",917}, + {""}, {""}, {""}, {""}, {""}, + {"endMinuteTrend1",757}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayDepthOfDepositCodeState4",1907}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayFrictionCodeValueState1",1928}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"recentWeather",1840}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Local_Number_Members_Used",138}, + {"unstructuredGridUUID",2410}, + {""}, + {"monthlyVerificationYear",1366}, + {""}, {""}, {""}, {""}, + {"numberOfSecondOrderPackedValues",1505}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section_3",2109}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Total_Number_Members_Used",259}, + {""}, {""}, + {"numberOfDaysInClimateSamplingWindow",1437}, + {""}, {""}, + {"scaleFactorOfLengthOfSemiMajorAxis",1961}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"matrixBitmapsPresent",1289}, + {""}, {""}, + {"nameLegacyECMF",1377}, + {""}, {""}, {""}, {"Date_E4",28}, - {""}, {""}, - {"cloudsBaseCoded1Trend4",484}, - {""}, {""}, - {"scaledValueOfUpperLimit",1996}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfSingularVectorsComputed",1502}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsCode2",505}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayDesignatorRVR4",1906}, + {"md5Section4",1303}, + {""}, {""}, {""}, {""}, + {"numberOfGroupsOfDataValues",1460}, {""}, {""}, {""}, - {"beginYearTrend4",361}, + {"numberOfPressureLevelsUsedForClustering",1496}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase4",475}, + {"outerLoopTypeOfTimeIncrement",1621}, + {""}, {""}, {""}, {""}, {""}, + {"reflectivityCalibrationConstant",1861}, + {""}, {""}, {""}, + {"localTablesVersionNumber",1194}, + {"Local_Number_Members_Possible",134}, + {"mask",1279}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"longitudeOfSouthernPoleInDegrees",1221}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {"dateOfIceFieldUsed",659}, {""}, - {"WRAP",266}, + {"Total_Number_Members_Possible",258}, + {""}, {""}, {""}, {""}, {""}, + {"templatesMasterDir",2258}, + {"section_03",2098}, + {"pack",1624}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"northLatitudeOfDomainOfTubing",1390}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded1Trend3",483}, - {""}, {""}, {""}, {""}, - {"runwayDepositCodeState2",1888}, + {"eastLongitudeOfDomainOfTubing",733}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"paramIdLegacyECMF",1695}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"uuidOfHGrid",2405}, - {""}, {""}, {""}, - {"offsetFromOriginToInnerBound",1557}, - {""}, {""}, - {"cfNameECMF",419}, - {""}, {""}, - {"sizeOfPostAuxiliaryArrayPlusOne",2143}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"beginHourTrend2",347}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Date_E3",27}, + {"unpack",2402}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"typeOfWaveFrequencySequence",2366}, {""}, {""}, {""}, {""}, {""}, {""}, - {"lengthOf4DvarWindow",1130}, - {""}, - {"changeIndicatorTrend2",426}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"widthOfWidths",2463}, - {""}, {""}, {""}, {""}, - {"runwayDesignatorRVR3",1905}, - {"cloudsBaseCoded3Trend1",491}, - {""}, {""}, - {"beginYearTrend3",360}, - {"section_01",2087}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, + {"pastTendencyRVR4",1724}, {"dateOfForecastUsedInLocalTime",658}, - {""}, - {"timeOfForecastUsedInLocalTime",2276}, - {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfEarthMajorAxis",1947}, - {"md5GridSection",1294}, - {"scaleFactorOfEarthMinorAxis",1948}, - {""}, {""}, - {"typeOfGeneratingProcess",2325}, - {"typeOfWaveFrequencySequence",2348}, - {""}, - {"cloudsAbbreviation4Trend4",459}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"horizontalDomainTemplateNumber",962}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"coordAveraging3",590}, - {"sourceSinkChemicalPhysicalProcess",2149}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"spacingOfBinsAlongRadials",2163}, - {""}, {""}, - {"Y2",279}, - {""}, - {"cloudsAbbreviation3Trend4",454}, {""}, {""}, {""}, - {"numberOfPointsAlongFirstAxis",1481}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"timeOfForecastUsedInLocalTime",2291}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Local_Number_Members_Missing",130}, + {""}, {""}, {""}, {""}, + {"southLatitudeOfDomainOfTubing",2164}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"extractDateTimeHourEnd",827}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"INBITS",89}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"yearOfForecastUsedInLocalTime",2510}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"endYearTrend4",778}, + {"ceilingAndVisibilityOK",397}, {""}, {""}, - {"cloudsAbbreviation4Trend3",458}, - {""}, - {"cloudsBaseCoded4",495}, - {""}, - {"numberOfBytesOfFreeFormatData",1411}, - {""}, {""}, {""}, {""}, - {"cloudsBaseCoded4Trend4",499}, + {"resolutionAndComponentFlags7",1883}, + {"Total_Number_Members_Missing",257}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"extractDateTimeEnd",826}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"resolutionAndComponentFlags7",1874}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"ZLMULT",289}, - {""}, - {"typeOfWavelengthInterval",2350}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation3Trend3",453}, - {"hourOfForecastUsedInLocalTime",967}, - {"listMembersMissing2",1150}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded4Trend3",498}, + {"extractAreaSouthLatitude",821}, + {"paramIdLegacyECMF",1702}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"offsetSection11",1570}, + {""}, {""}, {""}, {""}, + {"listMembersMissing4",1153}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"cloudsTitle2Trend2",526}, + {""}, {""}, {""}, + {"changeIndicatorTrend2",425}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"probProductDefinition",1781}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"endHourTrend2",754}, - {"numberOfPressureLevelsUsedForClustering",1491}, + {"md5Headers",1297}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"observationDiagnostic",1538}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsCode3",509}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"beginDayTrend3",343}, + {""}, + {"section5Length",2074}, + {""}, {""}, + {"hourOfForecastUsedInLocalTime",968}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"secondaryBitMap",2036}, + {""}, {""}, + {"coordinate2End",595}, + {""}, {""}, {""}, {""}, + {"section5",2073}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayFrictionCodeValueState3",1930}, + {""}, {""}, {""}, + {"timeUnitFlag",2296}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsTitle2Trend1",525}, + {""}, {""}, + {"yearOfForecastUsedInLocalTime",2530}, + {"changeIndicatorTrend1",424}, + {"sizeOfPostAuxiliaryArrayPlusOne",2152}, + {"westLongitudeOfDomainOfTubing",2477}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"meanRVR3",1313}, + {""}, {""}, {""}, + {"earthMajorAxisInMetres",729}, + {"checkInternalVersion",433}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"NC2",178}, + {""}, {""}, {""}, {""}, + {"lengthOf4DvarWindow",1131}, + {""}, + {"laplacianScalingFactorUnset",1085}, + {"runwayDepthOfDepositCodeState2",1905}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation4Trend4",458}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfPointsUsed",1495}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayFrictionCoefficientCodeState4",1935}, + {"variationOfVisibilityTrend4",2442}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"visibilityTrend4",2470}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaleFactorOfEarthMajorAxis",1956}, + {""}, {""}, + {"variationOfVisibilityDirectionTrend4",2438}, + {""}, {""}, + {"scaleFactorOfEarthMinorAxis",1957}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfGridInReference",1457}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"timeIncrementBetweenSuccessiveFields",2288}, + {""}, {""}, {""}, + {"resolutionAndComponentFlags4",1881}, + {""}, {""}, {""}, + {"md5Section5",1304}, + {""}, + {"numberOfBitsForScaledGroupLengths",1412}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"visibilityInKilometresTrend3",2465}, {""}, {""}, {""}, {""}, {""}, - {"gribMasterTablesVersionNumber",926}, + {"physicalFlag2",1736}, + {"DjGiven",35}, + {""}, {""}, + {"gribMasterTablesVersionNumber",927}, + {""}, {""}, + {"runwayDepthOfDepositCodeState1",1904}, + {""}, {""}, {""}, {""}, + {"horizontalDomainTemplateNumber",963}, + {""}, + {"northWestLongitudeOfLPOArea",1393}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfMajorAxisOfOblateSpheroidEarth",1996}, + {""}, {""}, {""}, + {"SOH",227}, + {""}, {""}, {""}, {""}, {""}, + {"DELETE",24}, + {"scaleFactorOfMinorAxisOfOblateSpheroidEarth",1966}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation3",449}, + {""}, {""}, {""}, + {"latitudeOfReferencePointInDegrees",1104}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"7777",5}, + {""}, + {"longitudeOfThePolePointInDegrees",1231}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"firstLatitudeInDegrees",872}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"NC1",177}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"endMonthTrend2",762}, + {""}, + {"beginHourTrend4",348}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"clusterMember3",543}, + {""}, {""}, + {"padding_grid90_1",1635}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"typeOfGeneratingProcess",2342}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"CLNOMA",23}, + {""}, + {"endMinuteTrend3",759}, + {""}, {""}, {""}, {""}, + {"dateOfModelVersion",660}, + {""}, {""}, {""}, + {"timeOfModelVersion",2292}, + {"offsetSection5",1574}, + {""}, {""}, {""}, {""}, + {"section7UniqueIdentifier",2084}, + {""}, {""}, {""}, {""}, + {"padding_local_7_1",1691}, + {""}, + {"flagForNormalOrStaggeredGrid",880}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"physicalFlag1",1735}, + {"widthOfWidths",2483}, + {""}, {""}, {""}, {""}, + {"cloudsTitle2Trend3",527}, + {""}, {""}, {""}, + {"changeIndicatorTrend3",426}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfBytesInLocalDefinition",1415}, + {""}, {""}, {""}, + {"beginMinuteTrend4",352}, + {""}, {""}, {""}, {""}, + {"versionNumOfSharedHeaderMessageFormat",2451}, + {"accuracyMultipliedByFactor",297}, + {""}, {""}, + {"md5Section1",1299}, + {""}, {""}, {""}, {""}, + {"runwayDepositCodeState2",1897}, + {"cfNameECMF",418}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"HDF5str",80}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"endMark",757}, + {"padding_loc9_2",1685}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"NC1",178}, - {""}, - {"visibilityInKilometresTrend1",2443}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"baseTimeOfThisLeg",339}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"hourOfModelVersion",969}, + {""}, {""}, + {"spacingOfBinsAlongRadials",2172}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Original_Parameter_Identifier",212}, - {""}, - {"endYearTrend3",777}, - {""}, - {"offsetSection11",1563}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudeOfLastGridPointInDegrees",1100}, - {""}, {""}, {""}, - {"md5Section2",1299}, - {""}, {""}, {""}, {""}, {"countOfICEFieldsUsed",624}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"timeUnitFlag",2281}, - {""}, {""}, - {"runwayFrictionCoefficientCodeState2",1924}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"clusterMember5",546}, - {""}, {""}, {""}, {""}, - {"longitudeOfThePolePointInDegrees",1229}, - {""}, {""}, {""}, - {"coordinate4OfFirstGridPoint",602}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfMinorAxisOfOblateSpheroidEarth",1957}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"pastTendencyRVR2",1713}, - {""}, - {"scanningMode5",2006}, - {"swapScanningX",2227}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded1Trend2",482}, - {""}, - {"changeIndicatorTrend1",425}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"typicalYearOfCentury",2362}, - {""}, {""}, - {"visibilityTrend4",2450}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"laplacianScalingFactorUnset",1084}, - {"recentWeatherTry",1832}, - {""}, - {"cloudsAbbreviation1",440}, - {""}, {""}, {""}, {""}, {""}, - {"scaledValueOfLowerWavePeriodLimit",1986}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"listMembersUsed4",1156}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"physicalFlag1",1726}, - {""}, {""}, - {"section_5",2102}, - {""}, {""}, {""}, - {"section4UniqueIdentifier",2063}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"superblockExtensionAddress",2223}, - {""}, {""}, - {"beginMinuteTrend4",353}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfPointsAlongXAxisInCouplingArea",1486}, + {"section4UniqueIdentifier",2072}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaledValueOfMajorAxisOfOblateSpheroidEarth",1987}, - {""}, {""}, - {"cloudsBase1",460}, - {""}, {""}, {""}, {""}, {""}, - {"numberInHorizontalCoordinates",1397}, - {""}, {""}, - {"latitudeOfReferencePointInDegrees",1103}, - {""}, {""}, - {"section3UniqueIdentifier",2058}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"numberOfPointsUsed",1490}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation2Trend4",449}, - {""}, {""}, - {"DELETE",24}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation2Trend4",448}, {""}, - {"beginMinuteTrend3",352}, - {""}, - {"latitudeOfThePolePoint",1113}, + {"endMonthTrend1",761}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"radiusOfTheEarth",1820}, + {"pastTendencyRVR1",1721}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"hoursAfterReferenceTimeOfDataCutoff",972}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayFrictionCoefficientCodeState2",1933}, + {"variationOfVisibilityTrend2",2440}, {""}, {""}, {""}, {""}, - {"cfVarNameLegacyECMF",423}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"baseTimeOfThisLeg",340}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"endMonthTrend1",762}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetBeforePV",1553}, + {"yearOfModelVersion",2531}, + {"runwayDepthOfDepositCodeState3",1906}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"runwayDepthOfDepositState2",1900}, - {""}, {""}, {""}, {""}, - {"resolutionAndComponentFlags2",1870}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"subdivisionsOfBasicAngle",2221}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"numberOfUsedTileAttributeCombinationsForTypeOfTile",1520}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfLengthOfSemiMajorAxis",1992}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"variationOfVisibilityDirectionTrend2",2436}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation2Trend3",448}, - {""}, {""}, - {"section_05",2091}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded4Trend2",497}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Total_Number_Members_Used",260}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"runwayFrictionCoefficientCodeState1",1923}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"numberOfPointsAlongYAxis",1487}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaledValueOfLengthOfSemiMajorAxis",1983}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayDepositCodeState1",1887}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"numberOfReforecastYearsInModelClimate",1495}, - {""}, {""}, - {"Total_Number_Members_Possible",259}, - {""}, {""}, {""}, - {"windUnitsTrend4",2484}, - {""}, - {"baseDateOfThisLeg",338}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"beginHourTrend1",346}, - {""}, {""}, {""}, - {"section7UniqueIdentifier",2075}, - {""}, {""}, {""}, - {"Ensemble_Combination_Number",50}, - {""}, {""}, {""}, {""}, {""}, - {"listOfWaveFrequencySequenceParameters",1164}, - {"offsetICEFieldsUsed",1559}, - {""}, {""}, {""}, - {"cloudsBaseCoded1",480}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded1Trend1",481}, - {""}, {""}, {""}, - {"pentagonalResolutionParameterM",1719}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetBBitmap",1546}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Total_Number_Members_Missing",258}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"windUnitsTrend3",2483}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"isCavok",1027}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Y1",277}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"cloudsCode3Trend4",514}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"Date_E2",26}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"typeOfLevelECMF",2331}, - {""}, {""}, {""}, {""}, {""}, - {"jDirectionIncrementGiven",1062}, - {"runwayDesignatorRVR2",1904}, - {"Local_Number_Members_Used",139}, - {""}, {""}, - {"beginYearTrend2",359}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"presentWeather3Present",1760}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation1Trend4",444}, + {"listOfWaveFrequencySequenceParameters",1166}, + {""}, {""}, {""}, {""}, {""}, + {"dayOfModelVersion",671}, {""}, {""}, {""}, {""}, - {"cloudsCode3Trend3",513}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"HDF5",80}, - {""}, {""}, {""}, {""}, {""}, - {"NB",176}, + {"generalExtended2ordr",911}, + {""}, + {"cloudsBase4",474}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"indexingTimeMM",999}, + {"baseDateOfThisLeg",337}, + {"cloudsAbbreviation1Trend4",443}, + {"shortNameLegacyECMF",2137}, + {""}, {""}, + {"runwayDepositCodeState1",1896}, + {"runwayDesignatorRVR4",1915}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"longitudeOfSouthernPoleInDegrees",1223}, + {""}, {""}, {""}, {""}, + {"runwayFrictionCoefficientCodeState1",1932}, + {"variationOfVisibilityTrend1",2439}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"radiusOfClusterDomain",1810}, + {"typeOfWavelengthInterval",2368}, + {""}, {""}, {""}, + {"Less_Than_Or_To_Overall_Distribution",121}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"listMembersUsed3",1156}, + {""}, {""}, {""}, {""}, {""}, + {"NH",183}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Local_Number_Members_Possible",135}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc9_1",1684}, + {"padding_loc7_1",1683}, + {""}, + {"variationOfVisibilityDirectionTrend1",2435}, + {""}, + {"coordinate4OfFirstGridPoint",602}, + {"padding_loc6_1",1682}, + {""}, {""}, {""}, {""}, {""}, + {"experimentVersionNumberOfAnalysis",808}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc5_1",1681}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"numberOfUsefulPointsAlongXAxis",1523}, + {""}, {""}, {""}, {""}, + {"subdivisionsOfBasicAngle",2232}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"latitudeOfLastGridPointInDegrees",1101}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"endHourTrend4",755}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"listMembersMissing2",1151}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"tileGrouping",2280}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc50_1",1680}, + {""}, {""}, {""}, {""}, + {"visibilityTrend1",2467}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"DayOfModelVersion",29}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsCode2",504}, + {""}, {""}, {""}, {""}, + {"numberOfBytesOfFreeFormatData",1416}, + {""}, {""}, {""}, {""}, {""}, + {"beginMinuteTrend2",350}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"windUnitsTrend4",2504}, + {""}, + {"offsetBeforePV",1560}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"offsetFromOriginToInnerBound",1564}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"md5Section10",1300}, + {""}, {""}, + {"tsectionNumber5",2328}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"addEmptySection2",299}, + {""}, {""}, {""}, + {"pentagonalResolutionParameterM",1728}, + {""}, {""}, {""}, {""}, {""}, + {"Threshold_Or_Distribution_0_no_1_yes",249}, + {"latitudeOfThePolePoint",1114}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBaseCoded4",494}, + {""}, {""}, {""}, {""}, + {"Original_CodeTable_2_Version_Number",209}, + {""}, {""}, {""}, + {"commonBlock",565}, + {""}, + {"cloudsBaseCoded4Trend4",498}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"coordAveraging2",589}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"endHourTrend1",753}, - {""}, {""}, {""}, - {"beginMinuteTrend2",351}, - {""}, {""}, {""}, - {"latitudeOfThePoleOfStretching",1112}, - {""}, {""}, - {"versionNumberOfSuperblock",2434}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"setPackingType",2121}, - {"visibilityTrend1",2447}, - {""}, - {"offsetToEndOf4DvarWindow",1572}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"setBitsPerValue",2117}, - {""}, - {"northWestLongitudeOfLPOArea",1388}, - {""}, - {"beginMonthTrend3",356}, - {""}, - {"HourOfModelVersion",82}, - {""}, {""}, - {"cloudsAbbreviation1Trend3",443}, - {""}, {""}, {""}, - {"cloudsAbbreviation4Trend2",457}, - {""}, {""}, {""}, {""}, - {"cloudsBaseCoded4Trend1",496}, - {"windGustTrend4",2473}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetBeforeBitmap",1550}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"Local_Number_Members_Missing",131}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded2Trend4",489}, - {""}, {""}, {""}, {""}, - {"typicalYear2",2361}, - {""}, - {"scaledValueOfEarthMajorAxis",1978}, - {""}, - {"scaledValueOfEarthMinorAxis",1979}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation3Trend2",452}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"CLNOMA",23}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"countOfGroupLengths",623}, + {"beginMinuteTrend1",349}, {""}, - {"cloudsBaseCoded2Trend3",488}, + {"jDirectionIncrementGiven",1063}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation4Trend2",456}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"7777",5}, - {""}, {""}, {""}, {""}, - {"endYearTrend2",776}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"windGustTrend3",2472}, + {"cloudsAbbreviation3Trend4",453}, + {"section6UniqueIdentifier",2080}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ccsdsCompressionOptionsMask",395}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"indexingTimeHH",996}, + {"qualityValueAssociatedWithParameter",1811}, {""}, {""}, {""}, {""}, {""}, {""}, - {"unitsLegacyECMF",2380}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"mixedCoordinateDefinition",1343}, - {"latitudeOfSouthEastCornerOfArea",1104}, + {"runwayFrictionCoefficientCodeState3",1934}, + {"variationOfVisibilityTrend3",2441}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfEarthMajorAxis",1987}, + {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfEarthMinorAxis",1988}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayExtentOfContaminationState4",1918}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"Threshold_Or_Distribution_Units",251}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"setToMissingIfOutOfRange",2122}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"experimentVersionNumber2",807}, - {""}, {""}, {""}, {""}, {""}, - {"jDirectionIncrementGridLength",1063}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"extractAreaLongitudeRank",819}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayExtentOfContaminationState3",1917}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase2",465}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"presentWeather2Present",1755}, - {""}, {""}, {""}, {""}, {""}, - {"g1conceptsLocalDirAll",905}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsCode3Trend2",512}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"beginMinuteTrend1",350}, - {""}, {""}, {""}, {""}, {""}, - {"padding_loc9_2",1678}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"uvRelativeToGrid",2407}, - {"scaledValueOfMinorAxisOfOblateSpheroidEarth",1988}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayDepthOfDepositState1",1899}, - {""}, {""}, {""}, {""}, - {"resolutionAndComponentFlags1",1869}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {"*********_EXTRA_DATA_***************",4}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ceilingAndVisibilityOKTrend4",402}, + {"resolutionAndComponentFlags2",1879}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"variationOfVisibilityDirectionTrend3",2437}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayDepthOfDepositState4",1911}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section_11",2107}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"cloudsBaseCoded1Trend4",483}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"jDirectionIncrementGridLength",1064}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"intervalBetweenTimes",1024}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"scaledValueOfMinorAxisOfOblateSpheroidEarth",1997}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"resolutionAndComponentFlags6",1882}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_grid90_1",1628}, - {""}, - {"NG",183}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Minute_E4",163}, - {""}, {""}, {""}, {""}, - {"is_chemical_srcsink",1049}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation2Trend2",447}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"paramIdECMF",1694}, - {"ceilingAndVisibilityOKTrend3",401}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"skipExtraKeyAttributes",2146}, - {"cloudsBaseCoded2",485}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded2Trend2",487}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"extractAreaLatitudeRank",818}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"cloudsCode1Trend4",504}, - {""}, {""}, {""}, {""}, {""}, - {"qualityValueAssociatedWithParameter",1802}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Minute_E3",162}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"runwayDesignatorRVR1",1903}, - {""}, {""}, {""}, - {"beginYearTrend1",358}, - {"section5UniqueIdentifier",2067}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsCode1Trend3",503}, - {""}, {""}, {""}, {""}, {""}, - {"padding_local_35",1683}, - {"ccsdsBlockSize",394}, - {""}, {""}, - {"typeOfWaveDirectionSequence",2347}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"windUnitsTrend2",2482}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"coordAveraging1",588}, - {""}, {""}, {""}, {""}, {""}, - {"presentWeather1Present",1750}, - {""}, - {"numberOfPointsAlongTheXAxis",1483}, - {""}, - {"runwayExtentOfContaminationState2",1916}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsCode3Trend1",511}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"bufrHeaderSubCentre",384}, {""}, {""}, {""}, {""}, {""}, {""}, - {"weightAppliedToClimateMonth1",2455}, + {"cloudsAbbreviation4Trend1",455}, + {"extractDateTimeEnd",826}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"oneMinuteMeanMaximumRVR4",1583}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation4Trend1",456}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"visibilityTrend2",2448}, {""}, - {"unusedBitsInBitmap",2393}, + {"g1conceptsLocalDirAll",906}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"beginHourTrend2",346}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation3Trend1",451}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"listMembersUsed2",1154}, - {"TYPE_FF",245}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"isCavokTrend4",1031}, + {"offsetToEndOf4DvarWindow",1579}, + {"numberInHorizontalCoordinates",1402}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"missingValueManagementUsed",1340}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"resolutionAndComponentFlags1",1878}, {""}, {""}, {""}, - {"cloudsCode4Trend4",519}, - {"TYPE_OF",247}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"latitudeOfTheSouthernPoleOfProjection",1115}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"oneMinuteMeanMaximumRVR3",1582}, + {"endMonthTrend3",763}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"endYearTrend1",775}, + {"md5Section3",1302}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"uuidOfHGrid",2425}, + {""}, {""}, {""}, {""}, + {"numberOfMissingValues",1472}, + {""}, + {"md5GridSection",1296}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"latitudeOfThePoleOfStretching",1113}, + {"cloudsBase1",459}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"coordinate3OfFirstGridPoint",599}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"beginMinuteTrend3",351}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Local_Number_Members_Possible_E4",137}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"Local_Number_Members_Missing_E4",133}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation1Trend2",442}, + {"INBITS",88}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"runwayDepositCodeState3",1898}, + {""}, {""}, {""}, + {"hook_post_meta_data",958}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"cloudsBaseCoded4Trend2",496}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"pastTendencyRVR3",1723}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Ensemble_Identifier_E4",53}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfPointsAlongYAxisInCouplingArea",1488}, + {"cloudsAbbreviation2Trend2",446}, + {""}, {""}, {""}, + {"beginHourTrend1",345}, + {""}, {""}, {""}, + {"countOfGroupLengths",623}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section3UniqueIdentifier",2067}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"weightAppliedToClimateMonth1",2475}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"sourceSinkChemicalPhysicalProcess",2158}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"radiusOfClusterDomain",1819}, + {""}, + {"cloudsBaseCoded4Trend1",495}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"recentWeatherTry",1841}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation1Trend2",441}, + {""}, {""}, {""}, {""}, + {"runwayDesignatorRVR2",1913}, + {"cloudsBaseCoded1Trend2",481}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Minute_E4",162}, + {""}, + {"section_5",2111}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Date_E3",27}, + {""}, + {"latitudeOfSouthEastCornerOfArea",1105}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfParametersUsedForClustering",1480}, + {""}, {""}, {""}, + {"listMembersUsed2",1155}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"TYPE_OR",248}, - {"cloudsCode4Trend3",518}, + {"cloudsBaseCoded3Trend4",493}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"intervalBetweenTimes",1025}, + {"cloudsCode4Trend4",518}, + {""}, {""}, + {"numberOfPointsAlongYAxis",1492}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBaseCoded1",479}, + {""}, {""}, {""}, {""}, + {"cloudsAbbreviation2Trend1",445}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsBaseCoded1Trend1",480}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"section_05",2100}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"endHourTrend2",753}, + {"superblockExtensionAddress",2234}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_local11_1",1686}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"visibilityTrend3",2469}, + {""}, {""}, + {"beginYearTrend4",360}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"uvRelativeToGrid",2427}, + {""}, {""}, {""}, {""}, + {"cfVarNameLegacyECMF",422}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Number_Combination_Ensembles_1_none",204}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation1Trend1",440}, + {""}, {""}, {""}, {""}, + {"runwayDesignatorRVR1",1912}, + {""}, {""}, {""}, {""}, {""}, + {"listMembersMissing3",1152}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsCode1Trend4",503}, + {"YRInMetres",281}, + {""}, + {"windUnitsTrend2",2502}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"endMark",756}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"beginMonthTrend4",356}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Local_Number_Members_Possible_E2",135}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"Local_Number_Members_Missing_E2",131}, + {"runwayExtentOfContaminationState4",1927}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"typeOfWaveDirectionSequence",2365}, + {""}, {""}, + {"mixedCoordinateDefinition",1345}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"padding_loc190_1",1650}, + {""}, {""}, {""}, {""}, {""}, + {"************_EXPERIMENT_************",2}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"Ensemble_Identifier_E2",51}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsBaseCoded4Trend3",497}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"endHourTrend1",752}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"windGustTrend4",2493}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsAbbreviation3Trend2",451}, + {""}, + {"missingValueManagementUsed",1342}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"coordAveraging3",590}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc4_2",1679}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation4Trend3",457}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"Y2",278}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"runwayDepthOfDepositState2",1909}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"presentWeather2Present",1764}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"windUnitsTrend1",2501}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"setToMissingIfOutOfRange",2131}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"resolutionAndComponentFlags3",1880}, + {""}, {""}, + {"ccsdsCompressionOptionsMask",394}, + {"paramIdECMF",1701}, {""}, {""}, {""}, - {"YearOfModelVersion",284}, + {"cloudsBaseCoded1Trend3",482}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBaseCoded3Trend2",491}, + {""}, {""}, {""}, {""}, {""}, + {"offsetBBitmap",1553}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"ZLBASE",287}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"typeOfLevelECMF",2348}, + {""}, {""}, {""}, + {"padding_sec4_1",1697}, + {""}, {""}, {""}, {""}, + {"cloudsCode4Trend2",516}, + {""}, {""}, + {"padding_loc19_2",1655}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"presentWeather1Present",1759}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBaseCoded2Trend1",486}, + {"padding_loc18_2",1649}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"is_chemical_srcsink",1050}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation3Trend1",450}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"cloudsBaseCoded3Trend1",490}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"setPackingType",2130}, + {""}, {""}, + {"endYearTrend4",778}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Y1",276}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"beginHourTrend3",347}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"md5Section2",1301}, + {""}, {""}, + {"cloudsCode4Trend1",515}, + {""}, {""}, + {"runwayDepthOfDepositState1",1908}, + {""}, + {"typicalYearOfCentury",2380}, + {"cloudsBase3",469}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"isCavok",1028}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"clusterMember5",545}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsCode1Trend2",501}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"offsetBSection6",1555}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"offsetBeforeBitmap",1557}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {"extractDateTimeDayStart",825}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"Hour_E4",85}, - {""}, - {"latitudeOfThePolePointInDegrees",1114}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"numberOfTensOfThousandsOfYearsOfOffset",1507}, {""}, {""}, - {"isCavokTrend3",1030}, - {""}, {""}, {""}, - {"beginMonthTrend4",357}, - {""}, {""}, - {"section_11",2098}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_local_7_1",1684}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Original_CodeTable_2_Version_Number",210}, - {""}, - {"BUFR",18}, + {"runwayExtentOfContaminationState2",1925}, {""}, {""}, {""}, {""}, {""}, {""}, - {"windGustTrend2",2471}, + {"cloudsCode3Trend4",513}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"hoursAfterDataCutoff",972}, + {""}, + {"Local_Number_Members_Possible_E3",136}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"Local_Number_Members_Missing_E3",132}, + {""}, {""}, + {"scanningMode5",2015}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"pastTendencyRVR2",1722}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"skipExtraKeyAttributes",2155}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc18_1",1648}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsCode1Trend1",500}, + {""}, + {"scaleFactorOfUpperWavePeriodLimit",1975}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"Ensemble_Identifier_E3",52}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"padding_local1_1",1687}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"runwayExtentOfContaminationState1",1924}, + {""}, {""}, + {"padding_grid4_1",1632}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"section5UniqueIdentifier",2076}, + {""}, + {"cloudsAbbreviation2Trend3",447}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc10_1",1636}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"RVR4_1",226}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"Minute_E2",160}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ICPLSIZE",86}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"presentWeather3Present",1769}, + {""}, {""}, {""}, + {"XpInGridLengths",275}, + {""}, + {"padding_local_35",1690}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"beginMonthTrend1",353}, + {"cloudsAbbreviation1Trend3",442}, + {""}, {""}, {""}, {""}, + {"runwayDesignatorRVR3",1914}, + {""}, {""}, {""}, + {"versionNumberOfSuperblock",2454}, + {""}, {""}, + {"cloudsBaseCoded3",489}, + {""}, {""}, + {"RENAME",222}, + {""}, {""}, {""}, + {"NG",182}, + {""}, {""}, {""}, + {"cloudsBaseCoded3Trend3",492}, + {""}, {""}, {""}, {""}, + {"extractAreaLongitudeRank",819}, + {""}, {""}, {""}, {""}, + {"numberOfGridUsed",1458}, + {""}, {""}, {""}, + {"numberOfReforecastYearsInModelClimate",1500}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Time_Range_One_E4",253}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsCode4Trend3",517}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"latitudeOfThePolePointInDegrees",1115}, + {""}, {""}, {""}, {""}, {""}, + {"Extra_Data_FreeFormat_0_none",55}, + {""}, {""}, + {"visibilityTrend2",2468}, + {""}, {""}, {""}, {""}, {""}, + {"beginYearTrend2",358}, + {""}, {""}, + {"ccsdsBlockSize",393}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"bufrHeaderSubCentre",383}, + {""}, + {"NB",175}, + {""}, {""}, {""}, {""}, {""}, + {"listOfWaveDirectionSequenceParameters",1165}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ECMWF",45}, + {""}, {""}, + {"latitudeOfTheSouthernPoleOfProjection",1116}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"endHourTrend3",754}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"altitudeOfTheCameraFromTheEarthsCentreMeasuredInUnitsOfTheEarthsRadius",309}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc30_2",1674}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"biFourierPackingModeForAxes",363}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"************_ENSEMBLE_**************",1}, + {""}, {""}, + {"cloudsCode1Trend3",502}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"padding_sec3_1",1696}, + {"padding_grid1_2",1630}, + {""}, {""}, {""}, + {"cloudsCode3Trend2",511}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"windUnitsTrend3",2503}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayExtentOfContaminationState3",1926}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"padding_loc3_1",1678}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"BUFR",18}, + {"windGustTrend2",2491}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc38_1",1677}, + {""}, {""}, {""}, + {"beginYearTrend1",357}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsCode3Trend1",510}, + {""}, {""}, {""}, + {"numberOfBitsContainingEachPackedValue",1411}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"padding_local1_31",1688}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsAbbreviation3Trend3",452}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"RVR2_1",224}, + {""}, {""}, {""}, {""}, + {"padding_loc30_1",1673}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"unusedBitsInBitmap",2411}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_grid1_1",1629}, + {""}, {""}, {""}, + {"runwayDepthOfDepositState3",1910}, + {""}, {""}, {""}, {""}, + {"TYPE_OF",246}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"Hour_E4",84}, + {""}, {""}, {""}, + {"oneMinuteMeanMaximumRVR4",1590}, + {""}, + {"cloudsBaseCoded2Trend4",488}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"TYPE_FF",244}, + {"Time_Range_One_E2",251}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"RVR1_1",223}, + {""}, {""}, + {"P_TACC",219}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"unitsLegacyECMF",2398}, + {""}, {""}, {""}, + {"extractAreaLatitudeRank",818}, + {"windGustTrend1",2490}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"TYPE_FX",245}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfPointsAlongYAxisInCouplingArea",1493}, + {""}, {""}, {""}, + {"endYearTrend2",776}, + {"ceilingAndVisibilityOKTrend4",401}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsBase2",464}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"FMULTE",64}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"isCavokTrend4",1032}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsCode3Trend3",512}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"rootGroupSymbolTableEntry",1887}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"scaledValueOfUpperWavePeriodLimit",2006}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ICEFieldsUsed",85}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"TYPE_OR",247}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfBitsUsedForTheScaledGroupLengths",1414}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"endYearTrend1",775}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_grid3_1",1631}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"setBitsPerValue",2126}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Ensemble_Combinat_Number_0_none_E4",48}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"cfNameLegacyECMF",419}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"beginMonthTrend3",355}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"RVR3_1",225}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsBaseCoded2",484}, + {""}, {""}, {""}, + {"Minute_E3",161}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBaseCoded2Trend2",486}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"experimentVersionNumber2",807}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Time_Range_One_E3",252}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsBaseCoded2Trend1",485}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"padding_loc17_2",1647}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"beginYearTrend3",359}, + {""}, {""}, {""}, + {"numberOfVGridUsed",1525}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"TYPE_PF",248}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {"experimentVersionNumber1",806}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"Hour_E3",84}, - {""}, - {"ZLBASE",288}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc30_2",1667}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsCode1Trend2",502}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfParametersUsedForClustering",1475}, - {""}, {""}, {""}, {""}, - {"runwayExtentOfContaminationState1",1915}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc7_1",1676}, - {"padding_loc9_1",1677}, + {"cloudsCode2Trend4",508}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc14_2",1644}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc6_1",1675}, - {""}, {""}, {""}, - {"padding_loc5_1",1674}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"LSTCUM",99}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Time_Range_One_E4",254}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"biFourierPackingModeForAxes",364}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Time_Range_One_E3",253}, - {"Local_Number_Members_Possible_E4",138}, - {""}, {""}, - {"cfNameLegacyECMF",420}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"RENAME",223}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"numberOfBitsContainingEachPackedValue",1406}, - {""}, {""}, - {"Local_Number_Members_Missing_E4",134}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc13_4",1641}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsAbbreviation2Trend1",446}, - {""}, {""}, - {"Local_Number_Members_Possible_E3",137}, - {""}, {""}, {""}, - {"cloudsBase3Trend4",474}, + {"FMULTM",65}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"typicalYear2",2379}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"CCCC",20}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"hoursAfterDataCutoff",971}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"altitudeOfTheCameraFromTheEarthsCentreMeasuredInUnitsOfTheEarthsRadius",310}, - {"Local_Number_Members_Missing_E3",133}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc50_1",1673}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase3Trend3",473}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"windGustTrend3",2492}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Ensemble_Identifier_E4",54}, - {"cloudsCode4Trend2",517}, - {""}, {""}, - {"ICPLSIZE",87}, - {"listOfWaveDirectionSequenceParameters",1163}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"rootGroupSymbolTableEntry",1878}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"ceilingAndVisibilityOKTrend2",400}, - {""}, {""}, {""}, {""}, - {"TYPE_PF",249}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Ensemble_Identifier_E3",53}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfUsefulPointsAlongXAxis",1516}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"offsetBSection5",1547}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"windUnitsTrend1",2481}, + {"Ensemble_Combinat_Number_0_none_E2",46}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsCode1Trend1",501}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Minute_E2",161}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"beginMonthTrend1",354}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc192_1",1654}, {""}, {""}, {""}, {""}, {""}, - {"oneMinuteMeanMinimumRVR4",1587}, + {"padding_grid50_1",1633}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfGridUsed",1453}, - {""}, - {"hook_post_meta_data",957}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"padding_sec3_1",1689}, - {""}, {""}, {""}, - {"************_ENSEMBLE_**************",1}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"ECMWF",45}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc19_2",1648}, - {""}, {""}, {""}, - {"padding_loc18_2",1642}, - {"padding_local11_1",1679}, - {"cloudsAbbreviation1Trend1",441}, - {""}, {""}, {""}, {""}, - {"padding_loc3_1",1671}, - {"Time_Range_One_E2",252}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"padding_loc38_1",1670}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaleFactorOfUpperWavePeriodLimit",1966}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"padding_local1_31",1681}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"oneMinuteMeanMinimumRVR3",1586}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"Local_Number_Members_Possible_E2",136}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc190_1",1643}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"RVR4_1",227}, - {""}, {""}, {""}, {""}, - {"cloudsCode4Trend1",516}, - {""}, {""}, - {"Local_Number_Members_Missing_E2",132}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"oneMinuteMeanMaximumRVR2",1581}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"windGustTrend1",2470}, - {"cloudsBase3Trend2",472}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsCode2Trend4",509}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"RVR3_1",226}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsCode2Trend3",508}, - {""}, {""}, {""}, - {"padding_loc30_1",1666}, - {""}, {""}, {""}, {""}, {""}, - {"isCavokTrend2",1029}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"Ensemble_Identifier_E2",52}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Number_Combination_Ensembles_1_none",205}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfBitsUsedForTheScaledGroupLengths",1409}, - {""}, {""}, {""}, {""}, - {"padding_sec2_3",1688}, - {"padding_loc4_2",1672}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"YY",283}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Hour_E2",83}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc29_3",1663}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"padding_loc13_4",1634}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"cloudsBase1Trend4",464}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase1Trend3",463}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc13_3",1633}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"padding_loc191_3",1646}, - {""}, {""}, - {"numberOfPointsAlongTheYAxis",1484}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase3Trend1",471}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ceilingAndVisibilityOKTrend1",399}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayExtentOfContaminationCodeState4",1923}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"swapScanningY",2228}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"runwayExtentOfContaminationCodeState4",1914}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"RVR2_1",225}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"runwayExtentOfContaminationCodeState3",1913}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsCode2Trend2",507}, - {""}, {""}, {""}, {""}, - {"ICEFieldsUsed",86}, - {""}, - {"indexingTimeHHMM",997}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsBase4Trend4",479}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Threshold_Or_Distribution_0_no_1_yes",250}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase4Trend3",478}, - {""}, {""}, - {"extractDateTimeYearRank",841}, - {""}, {""}, {""}, - {"Less_Than_Or_To_Overall_Distribution",122}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"FMULTE",65}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"beginMonthTrend2",355}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"padding_loc18_1",1641}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Extra_Data_FreeFormat_0_none",56}, - {""}, {""}, {""}, {""}, - {"padding_grid4_1",1625}, - {""}, {""}, {""}, {""}, - {"padding_local1_1",1680}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"extractDateTimeDayEnd",823}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"HourOfModelVersion",81}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc37_2",1669}, + {"Hour_E2",82}, + {""}, {""}, {""}, + {"oneMinuteMeanMaximumRVR2",1588}, + {""}, {""}, {""}, + {"cloudsBase4Trend4",478}, + {"oneMinuteMeanMinimumRVR4",1594}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_grid3_1",1624}, + {""}, {""}, + {"padding_sec2_2",1694}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"HDF5",79}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc14_1",1643}, + {""}, {""}, + {"cloudsBaseCoded2Trend3",487}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc191_1",1651}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"cloudsBase1Trend2",462}, - {""}, {""}, {""}, {""}, - {"oneMinuteMeanMaximumRVR1",1580}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"listOfUsedTileAttributesInCombination",1164}, + {""}, + {"padding_loc2_2",1672}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc29_2",1669}, + {""}, {""}, {""}, {""}, {""}, + {"ceilingAndVisibilityOKTrend2",399}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_grid1_2",1623}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"presentWeather3PresentTrend4",1764}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"TYPE_AN",242}, + {"numberOfTensOfThousandsOfYearsOfOffset",1512}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"numberOfPointsAlongTheYAxis",1489}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"FMULTM",66}, {""}, {""}, {""}, - {"oneMinuteMeanMinimumRVR2",1585}, + {"cloudsBase1Trend4",463}, + {""}, {""}, + {"isCavokTrend2",1030}, + {""}, {""}, + {"endYearTrend3",777}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc37_2",1676}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc10_1",1629}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"isCavokTrend1",1028}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"RVR1_1",224}, + {"oneMinuteMeanMaximumRVR1",1587}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_sec4_1",1690}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsCode2Trend1",506}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_sec2_1",1693}, {""}, {""}, {""}, {""}, - {"presentWeather3PresentTrend3",1763}, - {""}, {""}, {""}, - {"XpInGridLengths",276}, + {"cloudsCode2Trend2",506}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"extremeValuesRVR4",854}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"padding_loc2_1",1671}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc29_1",1668}, + {""}, {""}, {""}, {""}, {""}, + {"ceilingAndVisibilityOKTrend1",398}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc28_1",1667}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"runwayExtentOfContaminationCodeState2",1912}, - {""}, {""}, {""}, {""}, - {"octetAtWichPackedDataBegins",1539}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"scaledValueOfUpperWavePeriodLimit",1997}, + {"cloudsCode2Trend1",505}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"At_least__Or_Distribut_Proportion_Of",14}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"isCavokTrend1",1029}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"padding_loc37_1",1675}, + {""}, {""}, {""}, {""}, + {"padding_grid5_1",1634}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"Ensemble_Combinat_Number_0_none_E3",47}, + {""}, {""}, {""}, + {"beginMonthTrend2",354}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"padding_loc20_1",1656}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"runwayExtentOfContaminationCodeState2",1921}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsBase4Trend2",476}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"padding_loc12_1",1637}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"DIAG",25}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"padding_loc16_1",1646}, + {"octetAtWichPackedDataBegins",1546}, + {""}, {""}, + {"runwayExtentOfContaminationCodeState1",1920}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"Local_Number_Members_Used_E4",141}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBase4Trend1",475}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Missing_Model_LBC",163}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBase1Trend2",461}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"X2InGridLengths",270}, + {""}, + {"cloudsBase3Trend4",473}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"cloudsBase1Trend1",460}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsCode2Trend3",507}, + {""}, + {"extremeValuesRVR2",852}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"padding_loc13_2",1639}, + {""}, {""}, {""}, {""}, {""}, + {"X1InGridLengths",268}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"extremeValuesRVR1",851}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayExtentOfContaminationCodeState3",1922}, + {""}, {""}, {""}, {""}, + {"padding_loc191_3",1653}, + {""}, {""}, {""}, + {"oneMinuteMeanMinimumRVR2",1592}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"cloudsBase4Trend3",477}, + {""}, {""}, {""}, {""}, {""}, + {"TYPE_AN",241}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"Hour_E3",83}, + {""}, {""}, + {"padding_loc13_1",1638}, + {"oneMinuteMeanMaximumRVR3",1589}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_sec2_3",1695}, + {""}, {""}, {""}, {""}, {""}, {""}, + {"indexingTimeHH",997}, + {""}, + {"TYPE_CF",242}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Original_Parameter_Iden_CodeTable2",210}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc29_3",1670}, + {""}, {""}, {""}, {""}, {""}, + {"ceilingAndVisibilityOKTrend3",400}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBase1Trend3",462}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBase3Trend2",471}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"extractDateTimeYearRank",841}, + {"isCavokTrend3",1031}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"oneMinuteMeanMinimumRVR1",1591}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"offsetBSection5",1554}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"extremeValuesRVR3",853}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"TYPE_CF",243}, + {"cloudsBase3Trend1",470}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"extractDateTimeHourRank",828}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"LBC_Initial_Conditions",96}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"genVertHeightCoords",909}, + {"YearOfModelVersion",283}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase4Trend2",477}, - {"padding_sec2_2",1687}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfVGridUsed",1518}, - {""}, - {"padding_loc2_2",1665}, - {""}, {""}, - {"DIAG",25}, - {""}, - {"extractDateTimeHourRank",828}, {""}, {""}, {""}, - {"padding_loc29_2",1662}, + {"presentWeather2PresentTrend4",1768}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfUsefulPointsAlongYAxis",1524}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfUsefulPointsAlongYAxis",1517}, - {"LSTCUM",100}, + {"Local_Number_Members_Used_E2",139}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -7385,555 +7372,316 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"cloudsBase1Trend1",461}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc14_2",1637}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_grid50_1",1626}, - {""}, {""}, - {"CCCC",20}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc16_1",1639}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"presentWeather1PresentTrend4",1763}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"bitsPerValueAndRepack",376}, + {""}, {""}, {""}, + {"gts_CCCC",947}, + {""}, {""}, {""}, {""}, + {"padding_loc27_2",1666}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsBase3Trend3",472}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"Time_Range_Two_E4",256}, + {""}, {""}, {"extractDateTimeMinuteRank",831}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc13_2",1632}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"presentWeather2PresentTrend4",1759}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"extractDateTimeMonthRank",834}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"genVertHeightCoords",910}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"padding_loc13_3",1640}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"lBB",1079}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"runwayExtentOfContaminationCodeState1",1911}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"presentWeather2PresentTrend3",1758}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"P_TACC",220}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"extremeValuesRVR2",852}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"cloudsBase4Trend1",476}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"************_EXPERIMENT_************",2}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc17_2",1640}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"cloudsBase2Trend4",469}, + {"padding_loc27_1",1665}, {""}, {""}, {""}, {""}, - {"padding_loc37_1",1668}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"precisionOfTheUnpackedSubset",1750}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase2Trend3",468}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_grid1_1",1622}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"padding_loc192_1",1647}, {"extractDateTimeSecondRank",837}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc191_2",1652}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Ensemble_Combinat_Number_0_none_E4",49}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"oneMinuteMeanMinimumRVR1",1584}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"oneMinuteMeanMinimumRVR3",1593}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"presentWeather1PresentTrend4",1754}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Ensemble_Combinat_Number_0_none_E3",48}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"presentWeather1PresentTrend3",1753}, + {"presentWeather3PresentTrend4",1773}, {""}, {""}, {""}, {""}, {""}, - {"ExtremeValuesInMaximumRVR4",60}, + {"padding_loc15_1",1645}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"ECMWF_s",46}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"presentWeather3PresentTrend2",1762}, - {"extremeValuesRVR1",851}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_sec2_1",1686}, + {"lastMonthUsedToBuildClimateMonth2",1087}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"padding_loc2_1",1664}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc29_1",1661}, - {""}, - {"ExtremeValuesInMaximumRVR3",59}, - {""}, - {"padding_loc28_1",1660}, + {"ExtremeValuesRVR4",63}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"padding_grid5_1",1627}, - {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsBase2Trend4",468}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Time_Range_Two_E2",254}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"lastMonthUsedToBuildClimateMonth1",1086}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {"extractDateTimeDayRank",824}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ExtremeValuesInMaximumRVR4",59}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"GG",68}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc14_1",1636}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc191_1",1644}, + {"presentWeather2PresentTrend2",1766}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"lBB",1080}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc26_1",1664}, + {"Model_LBC_Member_Identifier",169}, + {""}, {""}, {""}, {""}, + {"Local_Number_Members_Used_E3",140}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase2Trend2",467}, + {"presentWeather1PresentTrend2",1761}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc244_3",1654}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"padding_loc13_1",1631}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"padding_loc20_1",1649}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"Ensemble_Combinat_Number_0_none_E2",47}, - {""}, {""}, {""}, {""}, - {"GG",69}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"TYPE_FX",246}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"presentWeather2PresentTrend2",1757}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"meanValueRVR4",1317}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"YpInGridLengths",287}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"cloudsBase2Trend1",466}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"NINT_RITZ_EXP",186}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayBrakingActionState4",1886}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"padding_loc26_1",1657}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"meanValueRVR3",1316}, + {"ExtremeValuesRVR2",61}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"padding_loc21_1",1657}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc12_1",1630}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"runwayBrakingActionState3",1885}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"bitsPerValueAndRepack",377}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"presentWeather3PresentTrend1",1761}, - {""}, {""}, {""}, {""}, - {"lastMonthUsedToBuildClimateMonth2",1086}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"LBC_Initial_Conditions",97}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"ExtremeValuesRVR4",64}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"presentWeather1PresentTrend2",1752}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"padding_loc13_5",1635}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"ExtremeValuesRVR3",63}, - {""}, {""}, {""}, - {"Time_Range_Two_E4",257}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc27_2",1659}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"X2InGridLengths",271}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"Missing_Model_LBC",164}, - {""}, {""}, {""}, {""}, - {"GRIBEditionNumber",74}, + {"cloudsBase2Trend2",466}, {""}, - {"Time_Range_Two_E3",256}, + {"P_TAVG",220}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"indexingTimeHHMM",998}, + {""}, {""}, {""}, {""}, + {"swapScanningY",2239}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Time_Range_Two_E3",255}, + {"NINT_RITZ_EXP",185}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"presentWeather2PresentTrend1",1765}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"ExtremeValuesRVR1",60}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"cloudsBase2Trend1",465}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"presentWeather1PresentTrend1",1760}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ExtremeValuesInMaximumRVR2",58}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc191_2",1645}, + {"presentWeather3PresentTrend2",1771}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"padding_loc23_1",1658}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Local_Number_Members_Used_E4",142}, + {""}, + {"TYPE_FC",243}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"GRIBEditionNumber",73}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"precisionOfTheUnpackedSubset",1741}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"TYPE_FC",244}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Local_Number_Members_Used_E3",141}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"lastMonthUsedToBuildClimateMonth1",1085}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"GRIB",70}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"presentWeather2PresentTrend1",1756}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"X1InGridLengths",269}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ExtremeValuesRVR2",62}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"padding_loc15_1",1638}, - {""}, {""}, {""}, {""}, {""}, - {"Time_Range_Two_E2",255}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {"extremeCounterClockwiseWindDirection",850}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"padding_loc23_1",1651}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"meanValueRVR2",1315}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"runwayBrakingActionState2",1884}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, - {"presentWeather1PresentTrend1",1751}, - {"gts_CCCC",946}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc27_1",1658}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Original_Parameter_Iden_CodeTable2",211}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ExtremeValuesRVR1",61}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"ExtremeValuesInMaximumRVR1",57}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"padding_loc244_1",1652}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Local_Number_Members_Used_E2",140}, + {"ExtremeValuesRVR3",62}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"padding_loc244_1",1659}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"cloudsBase2Trend3",467}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"P_TAVG",221}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfUnusedBitsAtEndOfSection3",1513}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc21_1",1650}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"meanValueRVR1",1314}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"Y2InGridLengths",280}, + {"presentWeather3PresentTrend1",1770}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Model_LBC_Member_Identifier",170}, + {"ExtremeValuesInMaximumRVR2",57}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"runwayBrakingActionState1",1883}, + {"runwayBrakingActionState4",1895}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"meanValueRVR4",1319}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"YpInGridLengths",286}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"ExtremeValuesInMaximumRVR1",56}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"presentWeather2PresentTrend3",1767}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -7946,31 +7694,10 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Missing_Model_LBC_E4",166}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc244_2",1653}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"presentWeather1PresentTrend3",1762}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -7985,7 +7712,21 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Y1InGridLengths",278}, + {"Show_Combination_Ensem_E4_0_no_1_yes",233}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"padding_loc13_5",1642}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8004,6 +7745,13 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"YY",282}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"presentWeather3PresentTrend3",1772}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8011,8 +7759,7 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"INGRIB",90}, + {"padding_loc244_3",1661}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8023,11 +7770,24 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Show_Combination_Ensem_E2_0_no_1_yes",231}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayBrakingActionState2",1893}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc245_1",1655}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"At_least__Or_Distribut_Proportion_Of",14}, + {"meanValueRVR2",1317}, + {""}, {""}, {""}, + {"ExtremeValuesInMaximumRVR3",58}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8035,14 +7795,6 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, - {"Missing_Model_LBC_E4",167}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"BBB",16}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8054,7 +7806,54 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Missing_Model_LBC_E3",166}, + {"GRIB",69}, + {""}, {""}, {""}, {""}, + {"numberOfUnusedBitsAtEndOfSection3",1518}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"runwayBrakingActionState1",1892}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"meanValueRVR1",1316}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"Missing_Model_LBC_E2",164}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"Show_Combination_Ensem_E3_0_no_1_yes",232}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8092,6 +7891,8 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"padding_loc244_2",1660}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8105,6 +7906,8 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc245_1",1662}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8116,6 +7919,18 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"runwayBrakingActionState3",1894}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"meanValueRVR3",1318}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8143,13 +7958,17 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"padding_loc245_2",1656}, + {"GRIBEXSection1Problem",70}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, + {"Y2InGridLengths",279}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"Missing_Model_LBC_E3",165}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8158,6 +7977,10 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"AEC_PAD_RSI_OPTION_MASK",11}, + {""}, {""}, {""}, {""}, + {"Y1InGridLengths",277}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8178,7 +8001,6 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Missing_Model_LBC_E2",165}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8227,8 +8049,6 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"GRIBEXSection1Problem",71}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8263,652 +8083,105 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"Used_Model_LBC",260}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"INGRIB",89}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"padding_loc245_2",1663}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"BUDG",17}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, - {"Show_Combination_Ensem_E4_0_no_1_yes",234}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Show_Combination_Ensem_E3_0_no_1_yes",233}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"numberOfBitsUsedForTheGroupWidths",1408}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Show_Combination_Ensem_E2_0_no_1_yes",232}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"Used_Model_LBC",261}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"NINT_LOG10_RITZ",185}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"GRIBEX_boustrophedonic",73}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"GRIB_DEPTH",75}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"GRIBEXShBugPresent",72}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"AEC_PAD_RSI_OPTION_MASK",11}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"numberOfBitsUsedForTheGroupWidths",1413}, {""}, - {"Used_Model_LBC_E4",264}, + {"BBB",16}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"NINT_LOG10_RITZ",184}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, - {"Used_Model_LBC_E3",263}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -8969,8 +8242,6 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {"Used_Model_LBC_E2",262}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -9025,6 +8296,8 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"GRIBEX_boustrophedonic",72}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -9199,91 +8472,8 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, - {"GRIB_LATITUDE",76}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"GRIBEXShBugPresent",71}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -9484,7 +8674,244 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, + {"Used_Model_LBC_E4",263}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, + {"GRIB_DEPTH",74}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"Used_Model_LBC_E2",261}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, + {"Used_Model_LBC_E3",262}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {"GRIB_LATITUDE",75}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {"AEC_RESTRICTED_OPTION_MASK",12}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -9533,100 +8960,6 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"AEC_DATA_3BYTE_OPTION_MASK",7}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -9649,8 +8982,6 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, - {"GRIB_LONGITUDE",77}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -9666,236 +8997,7 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"AEC_DATA_MSB_OPTION_MASK",8}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -9985,21 +9087,380 @@ static const struct grib_keys_hash wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, + {"GRIB_LONGITUDE",76}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, + {""}, {""}, {"AEC_DATA_PREPROCESS_OPTION_MASK",9} }; const struct grib_keys_hash * -grib_keys_hash_get (const char *str, size_t len) +grib_keys_hash_get ( const char *str, size_t len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { - unsigned int key = hash_keys (str, len); + unsigned int key = hash_keys (str, len); if (key <= MAX_HASH_VALUE) if (len == lengthtable[key]) { - const char *s = wordlist[key].name; + const char *s = wordlist[key].name; if (*str == *s && !memcmp (str + 1, s + 1, len - 1)) return &wordlist[key]; diff --git a/tests/keys b/tests/keys index 5318a6c8a..ba3aadd43 100644 --- a/tests/keys +++ b/tests/keys @@ -48,525 +48,525 @@ Dy,42 DyInDegrees,43 DyInMetres,44 ECMWF,45 -ECMWF_s,46 -Ensemble_Combinat_Number_0_none_E2,47 -Ensemble_Combinat_Number_0_none_E3,48 -Ensemble_Combinat_Number_0_none_E4,49 -Ensemble_Combination_Number,50 -Ensemble_Identifier,51 -Ensemble_Identifier_E2,52 -Ensemble_Identifier_E3,53 -Ensemble_Identifier_E4,54 -Experiment_Identifier,55 -Extra_Data_FreeFormat_0_none,56 -ExtremeValuesInMaximumRVR1,57 -ExtremeValuesInMaximumRVR2,58 -ExtremeValuesInMaximumRVR3,59 -ExtremeValuesInMaximumRVR4,60 -ExtremeValuesRVR1,61 -ExtremeValuesRVR2,62 -ExtremeValuesRVR3,63 -ExtremeValuesRVR4,64 -FMULTE,65 -FMULTM,66 -FirstLatitude,67 -GDSPresent,68 -GG,69 -GRIB,70 -GRIBEXSection1Problem,71 -GRIBEXShBugPresent,72 -GRIBEX_boustrophedonic,73 -GRIBEditionNumber,74 -GRIB_DEPTH,75 -GRIB_LATITUDE,76 -GRIB_LONGITUDE,77 -GTS,78 -GTSstr,79 -HDF5,80 -HDF5str,81 -HourOfModelVersion,82 -Hour_E2,83 -Hour_E3,84 -Hour_E4,85 -ICEFieldsUsed,86 -ICPLSIZE,87 -II,88 -INBITS,89 -INGRIB,90 -ITERATOR,91 -ITN,92 -J,93 -JS,94 -K,95 -KS,96 -LBC_Initial_Conditions,97 -LIMITS,98 -LLCOSP,99 -LSTCUM,100 -La1,101 -La1InDegrees,102 -La2,103 -La2InDegrees,104 -LaD,105 -LaDInDegrees,106 -LaR,107 -Lap,108 -Lar1,109 -Lar1InDegrees,110 -Lar2,111 -Lar2InDegrees,112 -Latin,113 -Latin1,114 -Latin1InDegrees,115 -Latin2,116 -Latin2InDegrees,117 -Lcx,118 -LcxInMetres,119 -Lcy,120 -LcyInMetres,121 -Less_Than_Or_To_Overall_Distribution,122 -Lo,123 -Lo1,124 -Lo1InDegrees,125 -Lo2,126 -Lo2InDegrees,127 -LoR,128 -LoV,129 -LoVInDegrees,130 -Local_Number_Members_Missing,131 -Local_Number_Members_Missing_E2,132 -Local_Number_Members_Missing_E3,133 -Local_Number_Members_Missing_E4,134 -Local_Number_Members_Possible,135 -Local_Number_Members_Possible_E2,136 -Local_Number_Members_Possible_E3,137 -Local_Number_Members_Possible_E4,138 -Local_Number_Members_Used,139 -Local_Number_Members_Used_E2,140 -Local_Number_Members_Used_E3,141 -Local_Number_Members_Used_E4,142 -Lop,143 -Lor1,144 -Lor1InDegrees,145 -Lor2,146 -Lor2InDegrees,147 -Lux,148 -LuxInMetres,149 -Luy,150 -LuyInMetres,151 -Lx,152 -LxInMetres,153 -Ly,154 -LyInMetres,155 -M,156 -METAR,157 -METARstr,158 -MS,159 -MinuteOfModelVersion,160 -Minute_E2,161 -Minute_E3,162 -Minute_E4,163 -Missing_Model_LBC,164 -Missing_Model_LBC_E2,165 -Missing_Model_LBC_E3,166 -Missing_Model_LBC_E4,167 -Model_Additional_Information,168 -Model_Identifier,169 -Model_LBC_Member_Identifier,170 -MonthOfModelVersion,171 -N,172 -N1,173 -N2,174 -NAT,175 -NB,176 -NC,177 -NC1,178 -NC2,179 -NDSP,180 -NEAREST,181 -NFSP,182 -NG,183 -NH,184 -NINT_LOG10_RITZ,185 -NINT_RITZ_EXP,186 -NL,187 -NP,188 -NR,189 -NRj,190 -NT,191 -NUT,192 -NV,193 -Nassigned,194 -Nb,195 -Ncx,196 -Ncy,197 -Nf,198 -Ni,199 -Nj,200 -Nr,201 -NrInRadiusOfEarth,202 -NrInRadiusOfEarthScaled,203 -Nside,204 -Number_Combination_Ensembles_1_none,205 -Nux,206 -Nuy,207 -Nx,208 -Ny,209 -Original_CodeTable_2_Version_Number,210 -Original_Parameter_Iden_CodeTable2,211 -Original_Parameter_Identifier,212 -P,213 -P1,214 -P2,215 -PLPresent,216 -PUnset,217 -PVPresent,218 -P_INST,219 -P_TACC,220 -P_TAVG,221 -Product_Identifier,222 -RENAME,223 -RVR1_1,224 -RVR2_1,225 -RVR3_1,226 -RVR4_1,227 -SOH,228 -SPD,229 -SecondLatitude,230 -SecondOfModelVersion,231 -Show_Combination_Ensem_E2_0_no_1_yes,232 -Show_Combination_Ensem_E3_0_no_1_yes,233 -Show_Combination_Ensem_E4_0_no_1_yes,234 -Sub-Experiment_Identifier,235 -TAF,236 -TAFstr,237 -TIDE,238 -TS,239 -TScalc,240 -TT,241 -TYPE_AN,242 -TYPE_CF,243 -TYPE_FC,244 -TYPE_FF,245 -TYPE_FX,246 -TYPE_OF,247 -TYPE_OR,248 -TYPE_PF,249 -Threshold_Or_Distribution_0_no_1_yes,250 -Threshold_Or_Distribution_Units,251 -Time_Range_One_E2,252 -Time_Range_One_E3,253 -Time_Range_One_E4,254 -Time_Range_Two_E2,255 -Time_Range_Two_E3,256 -Time_Range_Two_E4,257 -Total_Number_Members_Missing,258 -Total_Number_Members_Possible,259 -Total_Number_Members_Used,260 -Used_Model_LBC,261 -Used_Model_LBC_E2,262 -Used_Model_LBC_E3,263 -Used_Model_LBC_E4,264 -WMO,265 -WRAP,266 -WRAPstr,267 -X1,268 -X1InGridLengths,269 -X2,270 -X2InGridLengths,271 -XR,272 -XRInMetres,273 -Xo,274 -Xp,275 -XpInGridLengths,276 -Y1,277 -Y1InGridLengths,278 -Y2,279 -Y2InGridLengths,280 -YR,281 -YRInMetres,282 -YY,283 -YearOfModelVersion,284 -Yo,285 -Yp,286 -YpInGridLengths,287 -ZLBASE,288 -ZLMULT,289 -_T,290 -_TS,291 -_anoffset,292 -_endStep,293 -_leg_number,294 -_numberOfValues,295 -accumulationInterval,296 -accuracy,297 -accuracyMultipliedByFactor,298 -activity,299 -addEmptySection2,300 -addExtraLocalSection,301 -additionalFlagPresent,302 -additionalParameter,303 -addressOfFileFreeSpaceInfo,304 -aerosolType,305 -aerosolTypeName,306 -aerosolbinnumber,307 -aerosolpacking,308 -alternativeRowScanning,309 -altitudeOfTheCameraFromTheEarthsCentreMeasuredInUnitsOfTheEarthsRadius,310 -analysisOffsets,311 -angleDivisor,312 -angleMultiplier,313 -angleOfRotation,314 -angleOfRotationInDegrees,315 -angleOfRotationOfProjection,316 -angleSubdivisions,317 -anoffset,318 -anoffsetFirst,319 -anoffsetFrequency,320 -anoffsetLast,321 -applicationIdentifier,322 -assertion,323 -atmosphericChemicalOrPhysicalConstituentType,324 -attributeOfTile,325 -auxiliary,326 -average,327 -averaging1Flag,328 -averaging2Flag,329 -averagingPeriod,330 -avg,331 -azimuthalWidth,332 -backgroundGeneratingProcessIdentifier,333 -backgroundProcess,334 -band,335 -baseAddress,336 -baseDateEPS,337 -baseDateOfThisLeg,338 -baseTimeEPS,339 -baseTimeOfThisLeg,340 -basicAngleOfTheInitialProductionDomain,341 -beginDayTrend1,342 -beginDayTrend2,343 -beginDayTrend3,344 -beginDayTrend4,345 -beginHourTrend1,346 -beginHourTrend2,347 -beginHourTrend3,348 -beginHourTrend4,349 -beginMinuteTrend1,350 -beginMinuteTrend2,351 -beginMinuteTrend3,352 -beginMinuteTrend4,353 -beginMonthTrend1,354 -beginMonthTrend2,355 -beginMonthTrend3,356 -beginMonthTrend4,357 -beginYearTrend1,358 -beginYearTrend2,359 -beginYearTrend3,360 -beginYearTrend4,361 -biFourierCoefficients,362 -biFourierMakeTemplate,363 -biFourierPackingModeForAxes,364 -biFourierResolutionParameterM,365 -biFourierResolutionParameterN,366 -biFourierResolutionSubSetParameterM,367 -biFourierResolutionSubSetParameterN,368 -biFourierSubTruncationType,369 -biFourierTruncationType,370 -binaryScaleFactor,371 -bitMapIndicator,372 -bitmap,373 -bitmapPresent,374 -bitmapSectionPresent,375 -bitsPerValue,376 -bitsPerValueAndRepack,377 -boot_edition,378 -bottomLevel,379 -boustrophedonic,380 -boustrophedonicOrdering,381 -bufrDataEncoded,382 -bufrHeaderCentre,383 -bufrHeaderSubCentre,384 -bufrTemplate,385 -bufrdcExpandedDescriptors,386 -calendarIdPresent,387 -calendarIdentification,388 -calendarIdentificationTemplateNumber,389 -categories,390 -categoryType,391 -cavokOrVisibility,392 -ccccIdentifiers,393 -ccsdsBlockSize,394 -ccsdsCompressionOptionsMask,395 -ccsdsFlags,396 -ccsdsRsi,397 -ceilingAndVisibilityOK,398 -ceilingAndVisibilityOKTrend1,399 -ceilingAndVisibilityOKTrend2,400 -ceilingAndVisibilityOKTrend3,401 -ceilingAndVisibilityOKTrend4,402 -centralClusterDefinition,403 -centralLongitude,404 -centralLongitudeInDegrees,405 -centralLongitudeInMicrodegrees,406 -centre,407 -centreDescription,408 -centreForLocal,409 -centreForTable2,410 -centreLatitude,411 -centreLatitudeInDegrees,412 -centreLongitude,413 -centreLongitudeInDegrees,414 -centuryOfAnalysis,415 -centuryOfReference,416 -centuryOfReferenceTimeOfData,417 -cfName,418 -cfNameECMF,419 -cfNameLegacyECMF,420 -cfVarName,421 -cfVarNameECMF,422 -cfVarNameLegacyECMF,423 -changeDecimalPrecision,424 -changeIndicatorTrend1,425 -changeIndicatorTrend2,426 -changeIndicatorTrend3,427 -changeIndicatorTrend4,428 -changingPrecision,429 -channel,430 -channelNumber,431 -char,432 -charValues,433 -checkInternalVersion,434 -class,435 -classOfAnalysis,436 -climateDateFrom,437 -climateDateTo,438 -climatologicalRegime,439 -cloudsAbbreviation1,440 -cloudsAbbreviation1Trend1,441 -cloudsAbbreviation1Trend2,442 -cloudsAbbreviation1Trend3,443 -cloudsAbbreviation1Trend4,444 -cloudsAbbreviation2,445 -cloudsAbbreviation2Trend1,446 -cloudsAbbreviation2Trend2,447 -cloudsAbbreviation2Trend3,448 -cloudsAbbreviation2Trend4,449 -cloudsAbbreviation3,450 -cloudsAbbreviation3Trend1,451 -cloudsAbbreviation3Trend2,452 -cloudsAbbreviation3Trend3,453 -cloudsAbbreviation3Trend4,454 -cloudsAbbreviation4,455 -cloudsAbbreviation4Trend1,456 -cloudsAbbreviation4Trend2,457 -cloudsAbbreviation4Trend3,458 -cloudsAbbreviation4Trend4,459 -cloudsBase1,460 -cloudsBase1Trend1,461 -cloudsBase1Trend2,462 -cloudsBase1Trend3,463 -cloudsBase1Trend4,464 -cloudsBase2,465 -cloudsBase2Trend1,466 -cloudsBase2Trend2,467 -cloudsBase2Trend3,468 -cloudsBase2Trend4,469 -cloudsBase3,470 -cloudsBase3Trend1,471 -cloudsBase3Trend2,472 -cloudsBase3Trend3,473 -cloudsBase3Trend4,474 -cloudsBase4,475 -cloudsBase4Trend1,476 -cloudsBase4Trend2,477 -cloudsBase4Trend3,478 -cloudsBase4Trend4,479 -cloudsBaseCoded1,480 -cloudsBaseCoded1Trend1,481 -cloudsBaseCoded1Trend2,482 -cloudsBaseCoded1Trend3,483 -cloudsBaseCoded1Trend4,484 -cloudsBaseCoded2,485 -cloudsBaseCoded2Trend1,486 -cloudsBaseCoded2Trend2,487 -cloudsBaseCoded2Trend3,488 -cloudsBaseCoded2Trend4,489 -cloudsBaseCoded3,490 -cloudsBaseCoded3Trend1,491 -cloudsBaseCoded3Trend2,492 -cloudsBaseCoded3Trend3,493 -cloudsBaseCoded3Trend4,494 -cloudsBaseCoded4,495 -cloudsBaseCoded4Trend1,496 -cloudsBaseCoded4Trend2,497 -cloudsBaseCoded4Trend3,498 -cloudsBaseCoded4Trend4,499 -cloudsCode1,500 -cloudsCode1Trend1,501 -cloudsCode1Trend2,502 -cloudsCode1Trend3,503 -cloudsCode1Trend4,504 -cloudsCode2,505 -cloudsCode2Trend1,506 -cloudsCode2Trend2,507 -cloudsCode2Trend3,508 -cloudsCode2Trend4,509 -cloudsCode3,510 -cloudsCode3Trend1,511 -cloudsCode3Trend2,512 -cloudsCode3Trend3,513 -cloudsCode3Trend4,514 -cloudsCode4,515 -cloudsCode4Trend1,516 -cloudsCode4Trend2,517 -cloudsCode4Trend3,518 -cloudsCode4Trend4,519 -cloudsTitle1,520 -cloudsTitle1Trend1,521 -cloudsTitle1Trend2,522 -cloudsTitle1Trend3,523 -cloudsTitle1Trend4,524 -cloudsTitle2,525 -cloudsTitle2Trend1,526 -cloudsTitle2Trend2,527 -cloudsTitle2Trend3,528 -cloudsTitle2Trend4,529 -cloudsTitle3,530 -cloudsTitle3Trend1,531 -cloudsTitle3Trend2,532 -cloudsTitle3Trend3,533 -cloudsTitle3Trend4,534 -cloudsTitle4,535 -cloudsTitle4Trend1,536 -cloudsTitle4Trend2,537 -cloudsTitle4Trend3,538 -cloudsTitle4Trend4,539 -clusterIdentifier,540 -clusterMember1,541 -clusterMember10,542 -clusterMember2,543 -clusterMember3,544 -clusterMember4,545 -clusterMember5,546 -clusterMember6,547 -clusterMember7,548 -clusterMember8,549 -clusterMember9,550 -clusterNumber,551 -clusterSize,552 -clusteringDomain,553 -clusteringMethod,554 -clutterFilterIndicator,555 -cnmc_cmcc,556 -cnmc_isac,557 -codeFigure,558 -codeType,559 -codedNumberOfFirstOrderPackedValues,560 -codedNumberOfGroups,561 -codedValues,562 -coefsFirst,563 -coefsSecond,564 +Ensemble_Combinat_Number_0_none_E2,46 +Ensemble_Combinat_Number_0_none_E3,47 +Ensemble_Combinat_Number_0_none_E4,48 +Ensemble_Combination_Number,49 +Ensemble_Identifier,50 +Ensemble_Identifier_E2,51 +Ensemble_Identifier_E3,52 +Ensemble_Identifier_E4,53 +Experiment_Identifier,54 +Extra_Data_FreeFormat_0_none,55 +ExtremeValuesInMaximumRVR1,56 +ExtremeValuesInMaximumRVR2,57 +ExtremeValuesInMaximumRVR3,58 +ExtremeValuesInMaximumRVR4,59 +ExtremeValuesRVR1,60 +ExtremeValuesRVR2,61 +ExtremeValuesRVR3,62 +ExtremeValuesRVR4,63 +FMULTE,64 +FMULTM,65 +FirstLatitude,66 +GDSPresent,67 +GG,68 +GRIB,69 +GRIBEXSection1Problem,70 +GRIBEXShBugPresent,71 +GRIBEX_boustrophedonic,72 +GRIBEditionNumber,73 +GRIB_DEPTH,74 +GRIB_LATITUDE,75 +GRIB_LONGITUDE,76 +GTS,77 +GTSstr,78 +HDF5,79 +HDF5str,80 +HourOfModelVersion,81 +Hour_E2,82 +Hour_E3,83 +Hour_E4,84 +ICEFieldsUsed,85 +ICPLSIZE,86 +II,87 +INBITS,88 +INGRIB,89 +ITERATOR,90 +ITN,91 +J,92 +JS,93 +K,94 +KS,95 +LBC_Initial_Conditions,96 +LIMITS,97 +LLCOSP,98 +LSTCUM,99 +La1,100 +La1InDegrees,101 +La2,102 +La2InDegrees,103 +LaD,104 +LaDInDegrees,105 +LaR,106 +Lap,107 +Lar1,108 +Lar1InDegrees,109 +Lar2,110 +Lar2InDegrees,111 +Latin,112 +Latin1,113 +Latin1InDegrees,114 +Latin2,115 +Latin2InDegrees,116 +Lcx,117 +LcxInMetres,118 +Lcy,119 +LcyInMetres,120 +Less_Than_Or_To_Overall_Distribution,121 +Lo,122 +Lo1,123 +Lo1InDegrees,124 +Lo2,125 +Lo2InDegrees,126 +LoR,127 +LoV,128 +LoVInDegrees,129 +Local_Number_Members_Missing,130 +Local_Number_Members_Missing_E2,131 +Local_Number_Members_Missing_E3,132 +Local_Number_Members_Missing_E4,133 +Local_Number_Members_Possible,134 +Local_Number_Members_Possible_E2,135 +Local_Number_Members_Possible_E3,136 +Local_Number_Members_Possible_E4,137 +Local_Number_Members_Used,138 +Local_Number_Members_Used_E2,139 +Local_Number_Members_Used_E3,140 +Local_Number_Members_Used_E4,141 +Lop,142 +Lor1,143 +Lor1InDegrees,144 +Lor2,145 +Lor2InDegrees,146 +Lux,147 +LuxInMetres,148 +Luy,149 +LuyInMetres,150 +Lx,151 +LxInMetres,152 +Ly,153 +LyInMetres,154 +M,155 +METAR,156 +METARstr,157 +MS,158 +MinuteOfModelVersion,159 +Minute_E2,160 +Minute_E3,161 +Minute_E4,162 +Missing_Model_LBC,163 +Missing_Model_LBC_E2,164 +Missing_Model_LBC_E3,165 +Missing_Model_LBC_E4,166 +Model_Additional_Information,167 +Model_Identifier,168 +Model_LBC_Member_Identifier,169 +MonthOfModelVersion,170 +N,171 +N1,172 +N2,173 +NAT,174 +NB,175 +NC,176 +NC1,177 +NC2,178 +NDSP,179 +NEAREST,180 +NFSP,181 +NG,182 +NH,183 +NINT_LOG10_RITZ,184 +NINT_RITZ_EXP,185 +NL,186 +NP,187 +NR,188 +NRj,189 +NT,190 +NUT,191 +NV,192 +Nassigned,193 +Nb,194 +Ncx,195 +Ncy,196 +Nf,197 +Ni,198 +Nj,199 +Nr,200 +NrInRadiusOfEarth,201 +NrInRadiusOfEarthScaled,202 +Nside,203 +Number_Combination_Ensembles_1_none,204 +Nux,205 +Nuy,206 +Nx,207 +Ny,208 +Original_CodeTable_2_Version_Number,209 +Original_Parameter_Iden_CodeTable2,210 +Original_Parameter_Identifier,211 +P,212 +P1,213 +P2,214 +PLPresent,215 +PUnset,216 +PVPresent,217 +P_INST,218 +P_TACC,219 +P_TAVG,220 +Product_Identifier,221 +RENAME,222 +RVR1_1,223 +RVR2_1,224 +RVR3_1,225 +RVR4_1,226 +SOH,227 +SPD,228 +SecondLatitude,229 +SecondOfModelVersion,230 +Show_Combination_Ensem_E2_0_no_1_yes,231 +Show_Combination_Ensem_E3_0_no_1_yes,232 +Show_Combination_Ensem_E4_0_no_1_yes,233 +Sub-Experiment_Identifier,234 +TAF,235 +TAFstr,236 +TIDE,237 +TS,238 +TScalc,239 +TT,240 +TYPE_AN,241 +TYPE_CF,242 +TYPE_FC,243 +TYPE_FF,244 +TYPE_FX,245 +TYPE_OF,246 +TYPE_OR,247 +TYPE_PF,248 +Threshold_Or_Distribution_0_no_1_yes,249 +Threshold_Or_Distribution_Units,250 +Time_Range_One_E2,251 +Time_Range_One_E3,252 +Time_Range_One_E4,253 +Time_Range_Two_E2,254 +Time_Range_Two_E3,255 +Time_Range_Two_E4,256 +Total_Number_Members_Missing,257 +Total_Number_Members_Possible,258 +Total_Number_Members_Used,259 +Used_Model_LBC,260 +Used_Model_LBC_E2,261 +Used_Model_LBC_E3,262 +Used_Model_LBC_E4,263 +WMO,264 +WRAP,265 +WRAPstr,266 +X1,267 +X1InGridLengths,268 +X2,269 +X2InGridLengths,270 +XR,271 +XRInMetres,272 +Xo,273 +Xp,274 +XpInGridLengths,275 +Y1,276 +Y1InGridLengths,277 +Y2,278 +Y2InGridLengths,279 +YR,280 +YRInMetres,281 +YY,282 +YearOfModelVersion,283 +Yo,284 +Yp,285 +YpInGridLengths,286 +ZLBASE,287 +ZLMULT,288 +_T,289 +_TS,290 +_anoffset,291 +_endStep,292 +_leg_number,293 +_numberOfValues,294 +accumulationInterval,295 +accuracy,296 +accuracyMultipliedByFactor,297 +activity,298 +addEmptySection2,299 +addExtraLocalSection,300 +additionalFlagPresent,301 +additionalParameter,302 +addressOfFileFreeSpaceInfo,303 +aerosolType,304 +aerosolTypeName,305 +aerosolbinnumber,306 +aerosolpacking,307 +alternativeRowScanning,308 +altitudeOfTheCameraFromTheEarthsCentreMeasuredInUnitsOfTheEarthsRadius,309 +analysisOffsets,310 +angleDivisor,311 +angleMultiplier,312 +angleOfRotation,313 +angleOfRotationInDegrees,314 +angleOfRotationOfProjection,315 +angleSubdivisions,316 +anoffset,317 +anoffsetFirst,318 +anoffsetFrequency,319 +anoffsetLast,320 +applicationIdentifier,321 +assertion,322 +atmosphericChemicalOrPhysicalConstituentType,323 +attributeOfTile,324 +auxiliary,325 +average,326 +averaging1Flag,327 +averaging2Flag,328 +averagingPeriod,329 +avg,330 +azimuthalWidth,331 +backgroundGeneratingProcessIdentifier,332 +backgroundProcess,333 +band,334 +baseAddress,335 +baseDateEPS,336 +baseDateOfThisLeg,337 +baseTimeEPS,338 +baseTimeOfThisLeg,339 +basicAngleOfTheInitialProductionDomain,340 +beginDayTrend1,341 +beginDayTrend2,342 +beginDayTrend3,343 +beginDayTrend4,344 +beginHourTrend1,345 +beginHourTrend2,346 +beginHourTrend3,347 +beginHourTrend4,348 +beginMinuteTrend1,349 +beginMinuteTrend2,350 +beginMinuteTrend3,351 +beginMinuteTrend4,352 +beginMonthTrend1,353 +beginMonthTrend2,354 +beginMonthTrend3,355 +beginMonthTrend4,356 +beginYearTrend1,357 +beginYearTrend2,358 +beginYearTrend3,359 +beginYearTrend4,360 +biFourierCoefficients,361 +biFourierMakeTemplate,362 +biFourierPackingModeForAxes,363 +biFourierResolutionParameterM,364 +biFourierResolutionParameterN,365 +biFourierResolutionSubSetParameterM,366 +biFourierResolutionSubSetParameterN,367 +biFourierSubTruncationType,368 +biFourierTruncationType,369 +binaryScaleFactor,370 +bitMapIndicator,371 +bitmap,372 +bitmapPresent,373 +bitmapSectionPresent,374 +bitsPerValue,375 +bitsPerValueAndRepack,376 +boot_edition,377 +bottomLevel,378 +boustrophedonic,379 +boustrophedonicOrdering,380 +bufrDataEncoded,381 +bufrHeaderCentre,382 +bufrHeaderSubCentre,383 +bufrTemplate,384 +bufrdcExpandedDescriptors,385 +calendarIdPresent,386 +calendarIdentification,387 +calendarIdentificationTemplateNumber,388 +categories,389 +categoryType,390 +cavokOrVisibility,391 +ccccIdentifiers,392 +ccsdsBlockSize,393 +ccsdsCompressionOptionsMask,394 +ccsdsFlags,395 +ccsdsRsi,396 +ceilingAndVisibilityOK,397 +ceilingAndVisibilityOKTrend1,398 +ceilingAndVisibilityOKTrend2,399 +ceilingAndVisibilityOKTrend3,400 +ceilingAndVisibilityOKTrend4,401 +centralClusterDefinition,402 +centralLongitude,403 +centralLongitudeInDegrees,404 +centralLongitudeInMicrodegrees,405 +centre,406 +centreDescription,407 +centreForLocal,408 +centreForTable2,409 +centreLatitude,410 +centreLatitudeInDegrees,411 +centreLongitude,412 +centreLongitudeInDegrees,413 +centuryOfAnalysis,414 +centuryOfReference,415 +centuryOfReferenceTimeOfData,416 +cfName,417 +cfNameECMF,418 +cfNameLegacyECMF,419 +cfVarName,420 +cfVarNameECMF,421 +cfVarNameLegacyECMF,422 +changeDecimalPrecision,423 +changeIndicatorTrend1,424 +changeIndicatorTrend2,425 +changeIndicatorTrend3,426 +changeIndicatorTrend4,427 +changingPrecision,428 +channel,429 +channelNumber,430 +char,431 +charValues,432 +checkInternalVersion,433 +class,434 +classOfAnalysis,435 +climateDateFrom,436 +climateDateTo,437 +climatologicalRegime,438 +cloudsAbbreviation1,439 +cloudsAbbreviation1Trend1,440 +cloudsAbbreviation1Trend2,441 +cloudsAbbreviation1Trend3,442 +cloudsAbbreviation1Trend4,443 +cloudsAbbreviation2,444 +cloudsAbbreviation2Trend1,445 +cloudsAbbreviation2Trend2,446 +cloudsAbbreviation2Trend3,447 +cloudsAbbreviation2Trend4,448 +cloudsAbbreviation3,449 +cloudsAbbreviation3Trend1,450 +cloudsAbbreviation3Trend2,451 +cloudsAbbreviation3Trend3,452 +cloudsAbbreviation3Trend4,453 +cloudsAbbreviation4,454 +cloudsAbbreviation4Trend1,455 +cloudsAbbreviation4Trend2,456 +cloudsAbbreviation4Trend3,457 +cloudsAbbreviation4Trend4,458 +cloudsBase1,459 +cloudsBase1Trend1,460 +cloudsBase1Trend2,461 +cloudsBase1Trend3,462 +cloudsBase1Trend4,463 +cloudsBase2,464 +cloudsBase2Trend1,465 +cloudsBase2Trend2,466 +cloudsBase2Trend3,467 +cloudsBase2Trend4,468 +cloudsBase3,469 +cloudsBase3Trend1,470 +cloudsBase3Trend2,471 +cloudsBase3Trend3,472 +cloudsBase3Trend4,473 +cloudsBase4,474 +cloudsBase4Trend1,475 +cloudsBase4Trend2,476 +cloudsBase4Trend3,477 +cloudsBase4Trend4,478 +cloudsBaseCoded1,479 +cloudsBaseCoded1Trend1,480 +cloudsBaseCoded1Trend2,481 +cloudsBaseCoded1Trend3,482 +cloudsBaseCoded1Trend4,483 +cloudsBaseCoded2,484 +cloudsBaseCoded2Trend1,485 +cloudsBaseCoded2Trend2,486 +cloudsBaseCoded2Trend3,487 +cloudsBaseCoded2Trend4,488 +cloudsBaseCoded3,489 +cloudsBaseCoded3Trend1,490 +cloudsBaseCoded3Trend2,491 +cloudsBaseCoded3Trend3,492 +cloudsBaseCoded3Trend4,493 +cloudsBaseCoded4,494 +cloudsBaseCoded4Trend1,495 +cloudsBaseCoded4Trend2,496 +cloudsBaseCoded4Trend3,497 +cloudsBaseCoded4Trend4,498 +cloudsCode1,499 +cloudsCode1Trend1,500 +cloudsCode1Trend2,501 +cloudsCode1Trend3,502 +cloudsCode1Trend4,503 +cloudsCode2,504 +cloudsCode2Trend1,505 +cloudsCode2Trend2,506 +cloudsCode2Trend3,507 +cloudsCode2Trend4,508 +cloudsCode3,509 +cloudsCode3Trend1,510 +cloudsCode3Trend2,511 +cloudsCode3Trend3,512 +cloudsCode3Trend4,513 +cloudsCode4,514 +cloudsCode4Trend1,515 +cloudsCode4Trend2,516 +cloudsCode4Trend3,517 +cloudsCode4Trend4,518 +cloudsTitle1,519 +cloudsTitle1Trend1,520 +cloudsTitle1Trend2,521 +cloudsTitle1Trend3,522 +cloudsTitle1Trend4,523 +cloudsTitle2,524 +cloudsTitle2Trend1,525 +cloudsTitle2Trend2,526 +cloudsTitle2Trend3,527 +cloudsTitle2Trend4,528 +cloudsTitle3,529 +cloudsTitle3Trend1,530 +cloudsTitle3Trend2,531 +cloudsTitle3Trend3,532 +cloudsTitle3Trend4,533 +cloudsTitle4,534 +cloudsTitle4Trend1,535 +cloudsTitle4Trend2,536 +cloudsTitle4Trend3,537 +cloudsTitle4Trend4,538 +clusterIdentifier,539 +clusterMember1,540 +clusterMember10,541 +clusterMember2,542 +clusterMember3,543 +clusterMember4,544 +clusterMember5,545 +clusterMember6,546 +clusterMember7,547 +clusterMember8,548 +clusterMember9,549 +clusterNumber,550 +clusterSize,551 +clusteringDomain,552 +clusteringMethod,553 +clutterFilterIndicator,554 +cnmc_cmcc,555 +cnmc_isac,556 +codeFigure,557 +codeType,558 +codedNumberOfFirstOrderPackedValues,559 +codedNumberOfGroups,560 +codedValues,561 +coefsFirst,562 +coefsSecond,563 +combinationOfAttributesOfTile,564 commonBlock,565 complexPacking,566 componentIndex,567 @@ -690,92 +690,92 @@ defaultStepUnits,684 defaultTypeOfLevel,685 default_max_val,686 default_min_val,687 -default_step_units,688 -definitionFilesVersion,689 -deleteCalendarId,690 -deleteExtraLocalSection,691 -deleteLocalDefinition,692 -deletePV,693 -derivedForecast,694 -destineLocalVersion,695 -destineOrigin,696 -destineSection,697 -dewPointTemperature,698 -diagnostic,699 -diagnosticNumber,700 -diffInDays,701 -diffInHours,702 -dimension,703 -dimensionNumber,704 -dimensionType,705 -direction,706 -directionNumber,707 -directionOfVariation,708 -directionScalingFactor,709 -dirty_statistics,710 -disableGrib1LocalSection,711 -discipline,712 -distanceFromTubeToEnsembleMean,713 -distinctLatitudes,714 -distinctLongitudes,715 -doExtractArea,716 -doExtractDateTime,717 -doExtractSubsets,718 -doSimpleThinning,719 -domain,720 -driverInformationBlockAddress,721 -dummy,722 -dummy1,723 -dummy2,724 -dummyc,725 -dx,726 -dy,727 -earthIsOblate,728 -earthMajorAxis,729 -earthMajorAxisInMetres,730 -earthMinorAxis,731 -earthMinorAxisInMetres,732 -eastLongitudeOfCluster,733 -eastLongitudeOfDomainOfTubing,734 -easternLongitudeOfClusterDomain,735 -easternLongitudeOfDomain,736 -ecpt_model,737 -ed,738 -edition,739 -editionNumber,740 -efas_model,741 -efiOrder,742 -eight,743 -elementsTable,744 -elevation,745 -eleven,746 -endDayTrend1,747 -endDayTrend2,748 -endDayTrend3,749 -endDayTrend4,750 -endDescriptors,751 -endGridDefinition,752 -endHourTrend1,753 -endHourTrend2,754 -endHourTrend3,755 -endHourTrend4,756 -endMark,757 -endMinuteTrend1,758 -endMinuteTrend2,759 -endMinuteTrend3,760 -endMinuteTrend4,761 -endMonthTrend1,762 -endMonthTrend2,763 -endMonthTrend3,764 -endMonthTrend4,765 -endOfFileAddress,766 -endOfHeadersMarker,767 -endOfInterval,768 -endOfMessage,769 -endOfProduct,770 -endOfRange,771 -endStep,772 -endStepInHours,773 +definitionFilesVersion,688 +deleteCalendarId,689 +deleteExtraLocalSection,690 +deleteLocalDefinition,691 +deletePV,692 +derivedForecast,693 +destineLocalVersion,694 +destineOrigin,695 +destineSection,696 +dewPointTemperature,697 +diagnostic,698 +diagnosticNumber,699 +diffInDays,700 +diffInHours,701 +dimension,702 +dimensionNumber,703 +dimensionType,704 +direction,705 +directionNumber,706 +directionOfVariation,707 +directionScalingFactor,708 +dirty_statistics,709 +disableGrib1LocalSection,710 +discipline,711 +distanceFromTubeToEnsembleMean,712 +distinctLatitudes,713 +distinctLongitudes,714 +doExtractArea,715 +doExtractDateTime,716 +doExtractSubsets,717 +doSimpleThinning,718 +domain,719 +driverInformationBlockAddress,720 +dummy,721 +dummy1,722 +dummy2,723 +dummyc,724 +dx,725 +dy,726 +earthIsOblate,727 +earthMajorAxis,728 +earthMajorAxisInMetres,729 +earthMinorAxis,730 +earthMinorAxisInMetres,731 +eastLongitudeOfCluster,732 +eastLongitudeOfDomainOfTubing,733 +easternLongitudeOfClusterDomain,734 +easternLongitudeOfDomain,735 +ecpt_model,736 +ed,737 +edition,738 +editionNumber,739 +efas_model,740 +efiOrder,741 +eight,742 +elementsTable,743 +elevation,744 +eleven,745 +endDayTrend1,746 +endDayTrend2,747 +endDayTrend3,748 +endDayTrend4,749 +endDescriptors,750 +endGridDefinition,751 +endHourTrend1,752 +endHourTrend2,753 +endHourTrend3,754 +endHourTrend4,755 +endMark,756 +endMinuteTrend1,757 +endMinuteTrend2,758 +endMinuteTrend3,759 +endMinuteTrend4,760 +endMonthTrend1,761 +endMonthTrend2,762 +endMonthTrend3,763 +endMonthTrend4,764 +endOfFileAddress,765 +endOfHeadersMarker,766 +endOfInterval,767 +endOfMessage,768 +endOfProduct,769 +endOfRange,770 +endStep,771 +endStepInHours,772 +endStepUnit,773 endTimeStep,774 endYearTrend1,775 endYearTrend2,776 @@ -887,1634 +887,1654 @@ flagShowingPostAuxiliaryArrayInUse,881 flags,882 floatVal,883 floatValues,884 -forecastLeadTime,885 -forecastMonth,886 -forecastOrSingularVectorNumber,887 -forecastPeriod,888 -forecastPeriodFrom,889 -forecastPeriodTo,890 -forecastProbabilityNumber,891 -forecastSteps,892 -forecastTime,893 -forecastperiod,894 -formatForDoubles,895 -formatForLongs,896 -formatVersionMajorNumber,897 -formatVersionMinorNumber,898 -freeFormData,899 -frequency,900 -frequencyNumber,901 -frequencyScalingFactor,902 -functionCode,903 -g,904 -g1conceptsLocalDirAll,905 -g1conceptsMasterDir,906 -g2grid,907 -gaussianGridName,908 -genVertHeightCoords,909 -generalExtended2ordr,910 -generatingProcessIdentificationNumber,911 -generatingProcessIdentifier,912 -generatingProcessTemplate,913 -generatingProcessTemplateNumber,914 -generation,915 -getNumberOfValues,916 -gg,917 -global,918 -globalDomain,919 -grib1divider,920 -grib2LocalSectionNumber,921 -grib2LocalSectionPresent,922 -grib2divider,923 -grib3divider,924 -gribDataQualityChecks,925 -gribMasterTablesVersionNumber,926 -gribTablesVersionNo,927 -grid,928 -gridCoordinate,929 -gridDefinition,930 -gridDefinitionDescription,931 -gridDefinitionSection,932 -gridDefinitionTemplateNumber,933 -gridDescriptionSectionPresent,934 -gridName,935 -gridPointPosition,936 -gridSpecification,937 -gridType,938 -groupInternalNodeK,939 -groupLeafNodeK,940 -groupLengths,941 -groupSplitting,942 -groupSplittingMethodUsed,943 -groupWidth,944 -groupWidths,945 -gts_CCCC,946 -gts_TTAAii,947 -gts_ddhh00,948 -gts_header,949 -halfByte,950 -hdate,951 -headersOnly,952 -heightLevelName,953 -heightOrPressureOfLevel,954 -heightPressureEtcOfLevels,955 -hideThis,956 -hook_post_meta_data,957 -horizontalCoordinateDefinition,958 -horizontalCoordinateSupplement,959 -horizontalDimensionProcessed,960 -horizontalDomainTemplate,961 -horizontalDomainTemplateNumber,962 -hour,963 -hourOfAnalysis,964 -hourOfEndOfOverallTimeInterval,965 -hourOfForecast,966 -hourOfForecastUsedInLocalTime,967 -hourOfModelVersion,968 -hourOfReference,969 -hourOfStartOfReferencePeriod,970 -hoursAfterDataCutoff,971 -hoursAfterReferenceTimeOfDataCutoff,972 -hundred,973 -iDirectionIncrement,974 -iDirectionIncrementGiven,975 -iDirectionIncrementGridLength,976 -iDirectionIncrementInDegrees,977 -iIncrement,978 -iScansNegatively,979 -iScansPositively,980 -ident,981 -identificationNumber,982 -identificationOfOriginatingGeneratingCentre,983 -identificationOfProject,984 -identifier,985 -ieeeFloats,986 -ifsParam,987 -ijDirectionIncrementGiven,988 -implementationDateOfModelCycle,989 -incrementOfLengths,990 -indexTemplate,991 -indexTemplateNumber,992 -indexedStorageInternalNodeK,993 -indexingDate,994 -indexingTime,995 -indexingTimeHH,996 -indexingTimeHHMM,997 -indexingTimeMM,998 -indicatorOfParameter,999 -indicatorOfTypeOfLevel,1000 -indicatorOfUnitForForecastTime,1001 -indicatorOfUnitForTimeIncrement,1002 -indicatorOfUnitForTimeRange,1003 -indicatorOfUnitForTimeRangeForReferencePeriod,1004 -indicatorOfUnitOfTimeRange,1005 -inputDataPresentIndicator,1006 -inputDelayedDescriptorReplicationFactor,1007 -inputExtendedDelayedDescriptorReplicationFactor,1008 -inputOriginatingCentre,1009 -inputOverriddenReferenceValues,1010 -inputProcessIdentifier,1011 -inputShortDelayedDescriptorReplicationFactor,1012 -instrument,1013 -instrumentIdentifier,1014 -instrumentType,1015 -integerPointValues,1016 -integerScaleFactor,1017 -integerScalingFactorAppliedToDirections,1018 -integerScalingFactorAppliedToFrequencies,1019 -integerValues,1020 -internalVersion,1021 -internationalDataSubCategory,1022 -interpretationOfNumberOfPoints,1023 -intervalBetweenTimes,1024 -isAccumulation,1025 -isAuto,1026 -isCavok,1027 -isCavokTrend1,1028 -isCavokTrend2,1029 -isCavokTrend3,1030 -isCavokTrend4,1031 -isConstant,1032 -isCorrection,1033 -isEPS,1034 -isEps,1035 -isFillup,1036 -isGridded,1037 -isHindcast,1038 -isOctahedral,1039 -isRotatedGrid,1040 -isSatellite,1041 -isSatelliteType,1042 -isSens,1043 -isSpectral,1044 -is_aerosol,1045 -is_aerosol_optical,1046 -is_chemical,1047 -is_chemical_distfn,1048 -is_chemical_srcsink,1049 -is_localtime,1050 -is_ocean2d_param,1051 -is_ocean3d_param,1052 -is_uerra,1053 -isectionNumber2,1054 -isectionNumber3,1055 -isectionNumber4,1056 -isotopeIdentificationNumber,1057 -iteration,1058 -iterationNumber,1059 -iteratorDisableUnrotate,1060 -jDirectionIncrement,1061 -jDirectionIncrementGiven,1062 -jDirectionIncrementGridLength,1063 -jDirectionIncrementInDegrees,1064 -jIncrement,1065 -jPointsAreConsecutive,1066 -jScansNegatively,1067 -jScansPositively,1068 -jdLocal,1069 -jdSelected,1070 -julianDay,1071 -julianForecastDay,1072 -keyData,1073 -keyMore,1074 -keySat,1075 -kindOfProduct,1076 -kurt,1077 -kurtosis,1078 -lBB,1079 -landtype,1080 -laplacianOperator,1081 -laplacianOperatorIsSet,1082 -laplacianScalingFactor,1083 -laplacianScalingFactorUnset,1084 -lastMonthUsedToBuildClimateMonth1,1085 -lastMonthUsedToBuildClimateMonth2,1086 -latLonValues,1087 -latitude,1088 -latitudeFirstInDegrees,1089 -latitudeLastInDegrees,1090 -latitudeLongitudeValues,1091 -latitudeOfCentralPointInClusterDomain,1092 -latitudeOfCentrePoint,1093 -latitudeOfCentrePointInDegrees,1094 -latitudeOfFirstGridPoint,1095 -latitudeOfFirstGridPointInDegrees,1096 -latitudeOfGridPoints,1097 -latitudeOfIcosahedronPole,1098 -latitudeOfLastGridPoint,1099 -latitudeOfLastGridPointInDegrees,1100 -latitudeOfNorthWestCornerOfArea,1101 -latitudeOfReferencePoint,1102 -latitudeOfReferencePointInDegrees,1103 -latitudeOfSouthEastCornerOfArea,1104 -latitudeOfSouthernPole,1105 -latitudeOfSouthernPoleInDegrees,1106 -latitudeOfStretchingPole,1107 -latitudeOfStretchingPoleInDegrees,1108 -latitudeOfSubSatellitePoint,1109 -latitudeOfSubSatellitePointInDegrees,1110 -latitudeOfTangencyPoint,1111 -latitudeOfThePoleOfStretching,1112 -latitudeOfThePolePoint,1113 -latitudeOfThePolePointInDegrees,1114 -latitudeOfTheSouthernPoleOfProjection,1115 -latitudeSexagesimal,1116 -latitudeWhereDxAndDyAreSpecified,1117 -latitudeWhereDxAndDyAreSpecifiedInDegrees,1118 -latitudes,1119 -latitudesList,1120 -latitudinalDirectionGridLength,1121 -lcwfvSuiteName,1122 -leadtime,1123 -legBaseDate,1124 -legBaseTime,1125 -legNumber,1126 -legacyGaussSubarea,1127 -lengthDescriptors,1128 -lengthIncrementForTheGroupLengths,1129 -lengthOf4DvarWindow,1130 -lengthOfHeaders,1131 -lengthOfIndexTemplate,1132 -lengthOfMessage,1133 -lengthOfOriginatorLocalTemplate,1134 -lengthOfProjectLocalTemplate,1135 -lengthOfTimeRange,1136 -lengthOfTimeRangeForReferencePeriod,1137 -lev,1138 -levTypeName,1139 -level,1140 -levelIndicator,1141 -levelType,1142 -levelValues,1143 -level_value_list,1144 -levelist,1145 -levels,1146 -levtype,1147 -libraryVersion,1148 -listMembersMissing,1149 -listMembersMissing2,1150 -listMembersMissing3,1151 -listMembersMissing4,1152 -listMembersUsed,1153 -listMembersUsed2,1154 -listMembersUsed3,1155 -listMembersUsed4,1156 -listOfContributingSpectralBands,1157 -listOfDistributionFunctionParameter,1158 -listOfEnsembleForecastNumbers,1159 -listOfModelIdentifiers,1160 -listOfParametersUsedForClustering,1161 -listOfScaledFrequencies,1162 -listOfWaveDirectionSequenceParameters,1163 -listOfWaveFrequencySequenceParameters,1164 -local,1165 -localDate,1166 -localDateTime,1167 -localDay,1168 -localDecimalScaleFactor,1169 -localDefNumberOne,1170 -localDefNumberTwo,1171 -localDefinition,1172 -localDefinitionNumber,1173 -localDir,1174 -localExtensionPadding,1175 -localFlag,1176 -localFlagLatestVersion,1177 -localHour,1178 -localLatitude,1179 -localLatitude1,1180 -localLatitude2,1181 -localLongitude,1182 -localLongitude1,1183 -localLongitude2,1184 -localMinute,1185 -localMonth,1186 -localNumberOfObservations,1187 -localSecond,1188 -localSection,1189 -localSectionPresent,1190 -localTablesVersion,1191 -localTablesVersionNumber,1192 -localTime,1193 -localTimeForecastList,1194 -localTimeMethod,1195 -localUsePresent,1196 -localYear,1197 -local_padding,1198 -local_use,1199 -logTransform,1200 -longitude,1201 -longitudeFirstInDegrees,1202 -longitudeLastInDegrees,1203 -longitudeOfCentralPointInClusterDomain,1204 -longitudeOfCentrePoint,1205 -longitudeOfCentrePointInDegrees,1206 -longitudeOfFirstDiamondCenterLine,1207 -longitudeOfFirstDiamondCentreLine,1208 -longitudeOfFirstDiamondCentreLineInDegrees,1209 -longitudeOfFirstGridPoint,1210 -longitudeOfFirstGridPointInDegrees,1211 -longitudeOfGridPoints,1212 -longitudeOfIcosahedronPole,1213 -longitudeOfLastGridPoint,1214 -longitudeOfLastGridPointInDegrees,1215 -longitudeOfNorthWestCornerOfArea,1216 -longitudeOfReferencePoint,1217 -longitudeOfReferencePointInDegrees,1218 -longitudeOfSouthEastCornerOfArea,1219 -longitudeOfSouthernPole,1220 -longitudeOfSouthernPoleInDegrees,1221 -longitudeOfStretchingPole,1222 -longitudeOfStretchingPoleInDegrees,1223 -longitudeOfSubSatellitePoint,1224 -longitudeOfSubSatellitePointInDegrees,1225 -longitudeOfTangencyPoint,1226 -longitudeOfThePoleOfStretching,1227 -longitudeOfThePolePoint,1228 -longitudeOfThePolePointInDegrees,1229 -longitudeOfTheSouthernPoleOfProjection,1230 -longitudeSexagesimal,1231 -longitudes,1232 -longitudesList,1233 -longitudinalDirectionGridLength,1234 -lowerLimit,1235 -lowerRange,1236 -lowerThreshold,1237 -lowerThresholdValue,1238 -ls_labeling,1239 -lsdate_bug,1240 -lstime_bug,1241 -m,1242 -mAngleMultiplier,1243 -mBasicAngle,1244 -mars,1245 -marsClass,1246 -marsClass1,1247 -marsClass2,1248 -marsDir,1249 -marsDomain,1250 -marsEndStep,1251 -marsExperimentOffset,1252 -marsExpver,1253 -marsForecastMonth,1254 -marsGrid,1255 -marsIdent,1256 -marsKeywords,1257 -marsKeywords1,1258 -marsLamModel,1259 -marsLatitude,1260 -marsLevel,1261 -marsLevelist,1262 -marsLongitude,1263 -marsModel,1264 -marsParam,1265 -marsQuantile,1266 -marsRange,1267 -marsStartStep,1268 -marsStep,1269 -marsStream,1270 -marsStream1,1271 -marsStream2,1272 -marsType,1273 -marsType1,1274 -marsType2,1275 -mars_labeling,1276 -mask,1277 -masterDir,1278 -masterTableNumber,1279 -masterTablesVersionNumber,1280 -masterTablesVersionNumberLatest,1281 -matchAerosolBinNumber,1282 -matchAerosolPacking,1283 -matchLandType,1284 -matchSort,1285 -matchTimeRepres,1286 -matrixBitmapsPresent,1287 -matrixOfValues,1288 -max,1289 -maxLevelValue,1290 -maximum,1291 -md5Data,1292 -md5DataSection,1293 -md5GridSection,1294 -md5Headers,1295 -md5Product,1296 -md5Section1,1297 -md5Section10,1298 -md5Section2,1299 -md5Section3,1300 -md5Section4,1301 -md5Section5,1302 -md5Section6,1303 -md5Section7,1304 -md5Section8,1305 -md5Section9,1306 -md5Structure,1307 -md5TimeDomainSection,1308 -meanRVR1,1309 -meanRVR2,1310 -meanRVR3,1311 -meanRVR4,1312 -meanSize,1313 -meanValueRVR1,1314 -meanValueRVR2,1315 -meanValueRVR3,1316 -meanValueRVR4,1317 -meaningOfVerticalCoordinate,1318 -memberNumber,1319 -messageLength,1320 -metadata,1321 -method,1322 -methodNumber,1323 -million,1324 -min,1325 -minimum,1326 -minute,1327 -minuteOfAnalysis,1328 -minuteOfEndOfOverallTimeInterval,1329 -minuteOfForecast,1330 -minuteOfForecastUsedInLocalTime,1331 -minuteOfModelVersion,1332 -minuteOfReference,1333 -minuteOfStartOfReferencePeriod,1334 -minutesAfterDataCutoff,1335 -minutesAfterReferenceTimeOfDataCutoff,1336 -missingDataFlag,1337 -missingValue,1338 -missingValueManagement,1339 -missingValueManagementUsed,1340 -missingValuesPresent,1341 -missing_values,1342 -mixedCoordinateDefinition,1343 -mixedCoordinateFieldFlag,1344 -modeNumber,1345 -model,1346 -modelErrorType,1347 -modelIdentifier,1348 -modelName,1349 -modelVersionDate,1350 -modelVersionTime,1351 -molarMass,1352 -month,1353 -monthOfAnalysis,1354 -monthOfEndOfOverallTimeInterval,1355 -monthOfForecast,1356 -monthOfForecastUsedInLocalTime,1357 -monthOfModelVersion,1358 -monthOfReference,1359 -monthOfStartOfReferencePeriod,1360 -monthlyVerificationDate,1361 -monthlyVerificationMonth,1362 -monthlyVerificationTime,1363 -monthlyVerificationYear,1364 -multiplicationFactorForLatLong,1365 -n,1366 -n2,1367 -n3,1368 -na,1369 -name,1370 -nameECMF,1371 -nameLegacyECMF,1372 -nameOfFirstFixedSurface,1373 -nameOfSecondFixedSurface,1374 -names,1375 -nd,1376 -neitherPresent,1377 -newSubtype,1378 -nlev,1379 -nnn,1380 -normAtFinalTime,1381 -normAtInitialTime,1382 -normal,1383 -northLatitudeOfCluster,1384 -northLatitudeOfDomainOfTubing,1385 -northWestLatitudeOfLPOArea,1386 -northWestLatitudeOfVerficationArea,1387 -northWestLongitudeOfLPOArea,1388 -northWestLongitudeOfVerficationArea,1389 -northernLatitudeOfClusterDomain,1390 -northernLatitudeOfDomain,1391 -nosigPresent,1392 -notDecoded,1393 -nref,1394 -nt,1395 -number,1396 -numberInHorizontalCoordinates,1397 -numberInMixedCoordinateDefinition,1398 -numberInTheAuxiliaryArray,1399 -numberInTheGridCoordinateList,1400 -numberIncludedInAverage,1401 -numberMissingFromAveragesOrAccumulations,1402 -numberOfAdditionalParametersForReferencePeriod,1403 -numberOfAnalysis,1404 -numberOfBits,1405 -numberOfBitsContainingEachPackedValue,1406 -numberOfBitsForScaledGroupLengths,1407 -numberOfBitsUsedForTheGroupWidths,1408 -numberOfBitsUsedForTheScaledGroupLengths,1409 -numberOfBytesInLocalDefinition,1410 -numberOfBytesOfFreeFormatData,1411 -numberOfBytesPerInteger,1412 -numberOfCategories,1413 -numberOfCharacters,1414 -numberOfChars,1415 -numberOfClusterHighResolution,1416 -numberOfClusterLowResolution,1417 -numberOfClusters,1418 -numberOfCodedValues,1419 -numberOfCoefficientsOrValuesUsedToSpecifyFirstDimensionCoordinateFunction,1420 -numberOfCoefficientsOrValuesUsedToSpecifySecondDimensionCoordinateFunction,1421 -numberOfColumns,1422 -numberOfComponents,1423 -numberOfContributingSpectralBands,1424 -numberOfControlForecastTube,1425 -numberOfCoordinatesValues,1426 -numberOfDataBinsAlongRadials,1427 -numberOfDataMatrices,1428 -numberOfDataPoints,1429 -numberOfDataPointsExpected,1430 -numberOfDataValues,1431 -numberOfDaysInClimateSamplingWindow,1432 -numberOfDiamonds,1433 -numberOfDirections,1434 -numberOfDistinctSection3s,1435 -numberOfDistinctSection4s,1436 -numberOfDistinctSection5s,1437 -numberOfDistinctSection6s,1438 -numberOfDistinctSection7s,1439 -numberOfDistinctSection8s,1440 -numberOfDistinctSection9s,1441 -numberOfDistributionFunctionParameters,1442 -numberOfEffectiveValues,1443 -numberOfFloats,1444 -numberOfForcasts,1445 -numberOfForecastsInCluster,1446 -numberOfForecastsInEnsemble,1447 -numberOfForecastsInTheCluster,1448 -numberOfForecastsInTube,1449 -numberOfForecastsUsedInLocalTime,1450 -numberOfFrequencies,1451 -numberOfGridInReference,1452 -numberOfGridUsed,1453 -numberOfGroups,1454 -numberOfGroupsOfDataValues,1455 -numberOfHorizontalPoints,1456 -numberOfIntegers,1457 -numberOfInts,1458 -numberOfIterations,1459 -numberOfLevelValues,1460 -numberOfLocalDefinitions,1461 -numberOfLogicals,1462 -numberOfMembersInCluster,1463 -numberOfMembersInEnsemble,1464 -numberOfMissing,1465 -numberOfMissingInStatisticalProcess,1466 -numberOfMissingValues,1467 -numberOfModeOfDistribution,1468 -numberOfModels,1469 -numberOfOctectsForNumberOfPoints,1470 -numberOfOctetsExtraDescriptors,1471 -numberOfOperationalForecastTube,1472 -numberOfPackedValues,1473 -numberOfParallelsBetweenAPoleAndTheEquator,1474 -numberOfParametersUsedForClustering,1475 -numberOfPartitions,1476 -numberOfPoints,1477 -numberOfPointsAlongAMeridian,1478 -numberOfPointsAlongAParallel,1479 -numberOfPointsAlongASide,1480 -numberOfPointsAlongFirstAxis,1481 -numberOfPointsAlongSecondAxis,1482 -numberOfPointsAlongTheXAxis,1483 -numberOfPointsAlongTheYAxis,1484 -numberOfPointsAlongXAxis,1485 -numberOfPointsAlongXAxisInCouplingArea,1486 -numberOfPointsAlongYAxis,1487 -numberOfPointsAlongYAxisInCouplingArea,1488 -numberOfPointsInDomain,1489 -numberOfPointsUsed,1490 -numberOfPressureLevelsUsedForClustering,1491 -numberOfRadarSitesUsed,1492 -numberOfRadials,1493 -numberOfReferencePeriodTimeRanges,1494 -numberOfReforecastYearsInModelClimate,1495 -numberOfRemaininChars,1496 -numberOfRepresentativeMember,1497 -numberOfReservedBytes,1498 -numberOfRows,1499 -numberOfSecondOrderPackedValues,1500 -numberOfSection,1501 -numberOfSingularVectorsComputed,1502 -numberOfSingularVectorsEvolved,1503 -numberOfStatisticallyProcessedFieldsForLocalTime,1504 -numberOfStepsUsedForClustering,1505 -numberOfSubsets,1506 -numberOfTensOfThousandsOfYearsOfOffset,1507 -numberOfTimeIncrementsOfForecastsUsedInLocalTime,1508 -numberOfTimeRange,1509 -numberOfTimeRanges,1510 -numberOfTimeSteps,1511 -numberOfUnexpandedDescriptors,1512 -numberOfUnusedBitsAtEndOfSection3,1513 -numberOfUsedSpatialTiles,1514 -numberOfUsedTileAttributes,1515 -numberOfUsefulPointsAlongXAxis,1516 -numberOfUsefulPointsAlongYAxis,1517 -numberOfVGridUsed,1518 -numberOfValues,1519 -numberOfVerticalCoordinateValues,1520 -numberOfVerticalGridDescriptors,1521 -numberOfVerticalPoints,1522 -numberOfWaveDirectionSequenceParameters,1523 -numberOfWaveDirections,1524 -numberOfWaveFrequencies,1525 -numberOfWaveFrequencySequenceParameters,1526 -numberingOrderOfDiamonds,1527 -numericValues,1528 -observablePropertyTemplate,1529 -observablePropertyTemplateNumber,1530 -observationDiagnostic,1531 -observationGeneratingProcessIdentifier,1532 -observationType,1533 -observedData,1534 -obstype,1535 -oceanAtmosphereCoupling,1536 -oceanLevName,1537 -oceanStream,1538 -octetAtWichPackedDataBegins,1539 -offset,1540 -offsetAfterBitmap,1541 -offsetAfterCentreLocalSection,1542 -offsetAfterData,1543 -offsetAfterLocalSection,1544 -offsetAfterPadding,1545 -offsetBBitmap,1546 -offsetBSection5,1547 -offsetBSection6,1548 -offsetBSection9,1549 -offsetBeforeBitmap,1550 -offsetBeforeData,1551 -offsetBeforePL,1552 -offsetBeforePV,1553 -offsetDescriptors,1554 -offsetEndSection4,1555 -offsetFreeFormData,1556 -offsetFromOriginToInnerBound,1557 -offsetFromReferenceOfFirstTime,1558 -offsetICEFieldsUsed,1559 -offsetSection0,1560 -offsetSection1,1561 -offsetSection10,1562 -offsetSection11,1563 -offsetSection2,1564 -offsetSection3,1565 -offsetSection4,1566 -offsetSection5,1567 -offsetSection6,1568 -offsetSection7,1569 -offsetSection8,1570 -offsetSection9,1571 -offsetToEndOf4DvarWindow,1572 -offsetValuesBy,1573 -offsetdate,1574 -offsettime,1575 -oldSubtype,1576 -one,1577 -oneConstant,1578 -oneMillionConstant,1579 -oneMinuteMeanMaximumRVR1,1580 -oneMinuteMeanMaximumRVR2,1581 -oneMinuteMeanMaximumRVR3,1582 -oneMinuteMeanMaximumRVR4,1583 -oneMinuteMeanMinimumRVR1,1584 -oneMinuteMeanMinimumRVR2,1585 -oneMinuteMeanMinimumRVR3,1586 -oneMinuteMeanMinimumRVR4,1587 -oper,1588 -operStream,1589 -operatingMode,1590 -operationalForecastCluster,1591 -optimisationTime,1592 -optimizeScaleFactor,1593 -optionalData,1594 -opttime,1595 -orderOfSPD,1596 -orderOfSpatialDifferencing,1597 -ordering,1598 -orderingConvention,1599 -orientationOfTheGrid,1600 -orientationOfTheGridInDegrees,1601 -origin,1602 -originOfPostProcessing,1603 -originalParameterNumber,1604 -originalParameterTableNumber,1605 -originalSubCentreIdentifier,1606 -originatingCentre,1607 -originatingCentreOfAnalysis,1608 -originatingClass,1609 -originatorLocalTemplate,1610 -originatorLocalTemplateNumber,1611 -outerLoopLengthOfTimeRange,1612 -outerLoopTypeOfStatisticalProcessing,1613 -outerLoopTypeOfTimeIncrement,1614 -overlayTemplate,1615 -overlayTemplateNumber,1616 -pack,1617 -packedValues,1618 -packingError,1619 -packingType,1620 -padding,1621 -padding_grid1_1,1622 -padding_grid1_2,1623 -padding_grid3_1,1624 -padding_grid4_1,1625 -padding_grid50_1,1626 -padding_grid5_1,1627 -padding_grid90_1,1628 -padding_loc10_1,1629 -padding_loc12_1,1630 -padding_loc13_1,1631 -padding_loc13_2,1632 -padding_loc13_3,1633 -padding_loc13_4,1634 -padding_loc13_5,1635 -padding_loc14_1,1636 -padding_loc14_2,1637 -padding_loc15_1,1638 -padding_loc16_1,1639 -padding_loc17_2,1640 -padding_loc18_1,1641 -padding_loc18_2,1642 -padding_loc190_1,1643 -padding_loc191_1,1644 -padding_loc191_2,1645 -padding_loc191_3,1646 -padding_loc192_1,1647 -padding_loc19_2,1648 -padding_loc20_1,1649 -padding_loc21_1,1650 -padding_loc23_1,1651 -padding_loc244_1,1652 -padding_loc244_2,1653 -padding_loc244_3,1654 -padding_loc245_1,1655 -padding_loc245_2,1656 -padding_loc26_1,1657 -padding_loc27_1,1658 -padding_loc27_2,1659 -padding_loc28_1,1660 -padding_loc29_1,1661 -padding_loc29_2,1662 -padding_loc29_3,1663 -padding_loc2_1,1664 -padding_loc2_2,1665 -padding_loc30_1,1666 -padding_loc30_2,1667 -padding_loc37_1,1668 -padding_loc37_2,1669 -padding_loc38_1,1670 -padding_loc3_1,1671 -padding_loc4_2,1672 -padding_loc50_1,1673 -padding_loc5_1,1674 -padding_loc6_1,1675 -padding_loc7_1,1676 -padding_loc9_1,1677 -padding_loc9_2,1678 -padding_local11_1,1679 -padding_local1_1,1680 -padding_local1_31,1681 -padding_local40_1,1682 -padding_local_35,1683 -padding_local_7_1,1684 -padding_sec1_loc,1685 -padding_sec2_1,1686 -padding_sec2_2,1687 -padding_sec2_3,1688 -padding_sec3_1,1689 -padding_sec4_1,1690 -paleontologicalOffset,1691 -param,1692 -paramId,1693 -paramIdECMF,1694 -paramIdLegacyECMF,1695 -param_value_max,1696 -param_value_min,1697 -parameter,1698 -parameterCategory,1699 -parameterCode,1700 -parameterDiscipline,1701 -parameterIndicator,1702 -parameterName,1703 -parameterNumber,1704 -parameterUnits,1705 -parameters,1706 -parametersVersion,1707 -partitionItems,1708 -partitionNumber,1709 -partitionTable,1710 -partitions,1711 -pastTendencyRVR1,1712 -pastTendencyRVR2,1713 -pastTendencyRVR3,1714 -pastTendencyRVR4,1715 -patch_precip_fp,1716 -pentagonalResolutionParameterJ,1717 -pentagonalResolutionParameterK,1718 -pentagonalResolutionParameterM,1719 -percentileValue,1720 -periodOfTime,1721 -periodOfTimeIntervals,1722 -perturbationNumber,1723 -perturbedType,1724 -phase,1725 -physicalFlag1,1726 -physicalFlag2,1727 -physicalMeaningOfVerticalCoordinate,1728 -pl,1729 -platform,1730 -plusOneinOrdersOfSPD,1731 -points,1732 -pointsOrdering,1733 -postAuxiliary,1734 -postAuxiliaryArrayPresent,1735 -postProcessing,1736 -powerOfTenUsedToScaleClimateWeight,1737 -preBitmapValues,1738 -preProcessingParameter,1739 -precision,1740 -precisionOfTheUnpackedSubset,1741 -predefined_grid,1742 -predefined_grid_values,1743 -preferLocalConcepts,1744 -present,1745 -presentTrend1,1746 -presentTrend2,1747 -presentTrend3,1748 -presentTrend4,1749 -presentWeather1Present,1750 -presentWeather1PresentTrend1,1751 -presentWeather1PresentTrend2,1752 -presentWeather1PresentTrend3,1753 -presentWeather1PresentTrend4,1754 -presentWeather2Present,1755 -presentWeather2PresentTrend1,1756 -presentWeather2PresentTrend2,1757 -presentWeather2PresentTrend3,1758 -presentWeather2PresentTrend4,1759 -presentWeather3Present,1760 -presentWeather3PresentTrend1,1761 -presentWeather3PresentTrend2,1762 -presentWeather3PresentTrend3,1763 -presentWeather3PresentTrend4,1764 -pressureLevel,1765 -pressureUnits,1766 -primaryBitmap,1767 -primaryMissingValue,1768 -primaryMissingValueSubstitute,1769 -probContinous,1770 -probPoint,1771 -probProductDefinition,1772 -probabilityType,1773 -probabilityTypeName,1774 -process,1775 -produceLargeConstantFields,1776 -product,1777 -productDefinition,1778 -productDefinitionTemplateNumber,1779 -productDefinitionTemplateNumberInternal,1780 -productIdentifier,1781 -productType,1782 -productionStatusOfProcessedData,1783 -projSourceString,1784 -projString,1785 -projTargetString,1786 -projectLocalTemplate,1787 -projectLocalTemplateNumber,1788 -projectionCenterFlag,1789 -projectionCentreFlag,1790 -pv,1791 -pvlLocation,1792 -qfe,1793 -qfePresent,1794 -qfeUnits,1795 -qnh,1796 -qnhAPresent,1797 -qnhPresent,1798 -qnhUnits,1799 -qualityControl,1800 -qualityControlIndicator,1801 -qualityValueAssociatedWithParameter,1802 -quantile,1803 -quantileValue,1804 -radialAngularSpacing,1805 -radials,1806 -radius,1807 -radiusInMetres,1808 -radiusOfCentralCluster,1809 -radiusOfClusterDomain,1810 -radiusOfTheEarth,1811 -range,1812 -rangeBinSpacing,1813 -rdbDateTime,1814 -rdbSubtype,1815 -rdbType,1816 -rdb_key,1817 -rdbtime,1818 -rdbtimeDate,1819 -rdbtimeDay,1820 -rdbtimeHour,1821 -rdbtimeMinute,1822 -rdbtimeMonth,1823 -rdbtimeSecond,1824 -rdbtimeTime,1825 -rdbtimeYear,1826 -realPart,1827 -realPartOf00,1828 -realization,1829 -recDateTime,1830 -recentWeather,1831 -recentWeatherTry,1832 -rectime,1833 -rectimeDay,1834 -rectimeHour,1835 -rectimeMinute,1836 -rectimeSecond,1837 -reducedGrid,1838 -refdate,1839 -reference,1840 -referenceDate,1841 -referenceForGroupLengths,1842 -referenceForGroupWidths,1843 -referenceOfLengths,1844 -referenceOfWidths,1845 -referencePeriodList,1846 -referenceReflectivityForEchoTop,1847 -referenceSampleInterval,1848 -referenceStep,1849 -referenceValue,1850 -referenceValueError,1851 -reflectivityCalibrationConstant,1852 -remarkPresent,1853 -reportType,1854 -representationMode,1855 -representationType,1856 -representativeMember,1857 -reserved,1858 -reserved1,1859 -reserved2,1860 -reserved3,1861 -reservedNeedNotBePresent,1862 -reservedOctet,1863 -reservedSection2,1864 -reservedSection3,1865 -reservedSection4,1866 -resolution,1867 -resolutionAndComponentFlags,1868 -resolutionAndComponentFlags1,1869 -resolutionAndComponentFlags2,1870 -resolutionAndComponentFlags3,1871 -resolutionAndComponentFlags4,1872 -resolutionAndComponentFlags6,1873 -resolutionAndComponentFlags7,1874 -resolutionAndComponentFlags8,1875 -restricted,1876 -rootGroupObjectHeaderAddress,1877 -rootGroupSymbolTableEntry,1878 -rootTablesDir,1879 -roundedMarsLatitude,1880 -roundedMarsLevelist,1881 -roundedMarsLongitude,1882 -runwayBrakingActionState1,1883 -runwayBrakingActionState2,1884 -runwayBrakingActionState3,1885 -runwayBrakingActionState4,1886 -runwayDepositCodeState1,1887 -runwayDepositCodeState2,1888 -runwayDepositCodeState3,1889 -runwayDepositCodeState4,1890 -runwayDepositState1,1891 -runwayDepositState2,1892 -runwayDepositState3,1893 -runwayDepositState4,1894 -runwayDepthOfDepositCodeState1,1895 -runwayDepthOfDepositCodeState2,1896 -runwayDepthOfDepositCodeState3,1897 -runwayDepthOfDepositCodeState4,1898 -runwayDepthOfDepositState1,1899 -runwayDepthOfDepositState2,1900 -runwayDepthOfDepositState3,1901 -runwayDepthOfDepositState4,1902 -runwayDesignatorRVR1,1903 -runwayDesignatorRVR2,1904 -runwayDesignatorRVR3,1905 -runwayDesignatorRVR4,1906 -runwayDesignatorState1,1907 -runwayDesignatorState2,1908 -runwayDesignatorState3,1909 -runwayDesignatorState4,1910 -runwayExtentOfContaminationCodeState1,1911 -runwayExtentOfContaminationCodeState2,1912 -runwayExtentOfContaminationCodeState3,1913 -runwayExtentOfContaminationCodeState4,1914 -runwayExtentOfContaminationState1,1915 -runwayExtentOfContaminationState2,1916 -runwayExtentOfContaminationState3,1917 -runwayExtentOfContaminationState4,1918 -runwayFrictionCodeValueState1,1919 -runwayFrictionCodeValueState2,1920 -runwayFrictionCodeValueState3,1921 -runwayFrictionCodeValueState4,1922 -runwayFrictionCoefficientCodeState1,1923 -runwayFrictionCoefficientCodeState2,1924 -runwayFrictionCoefficientCodeState3,1925 -runwayFrictionCoefficientCodeState4,1926 -runwayFrictionCoefficientState1,1927 -runwayFrictionCoefficientState2,1928 -runwayFrictionCoefficientState3,1929 -runwayFrictionCoefficientState4,1930 -runwaySideCodeState1,1931 -runwaySideCodeState2,1932 -runwaySideCodeState3,1933 -runwaySideCodeState4,1934 -runwayState,1935 -sampleSizeOfModelClimate,1936 -sampleSizeOfReferencePeriod,1937 -satelliteID,1938 -satelliteIdentifier,1939 -satelliteNumber,1940 -satelliteSeries,1941 -scaleFactorAtReferencePoint,1942 -scaleFactorOfAdditionalParameterForReferencePeriod,1943 -scaleFactorOfCentralWaveNumber,1944 -scaleFactorOfDistanceFromEnsembleMean,1945 -scaleFactorOfDistributionFunctionParameter,1946 -scaleFactorOfEarthMajorAxis,1947 -scaleFactorOfEarthMinorAxis,1948 -scaleFactorOfFirstFixedSurface,1949 -scaleFactorOfFirstSize,1950 -scaleFactorOfFirstWavelength,1951 -scaleFactorOfLengthOfSemiMajorAxis,1952 -scaleFactorOfLengthOfSemiMinorAxis,1953 -scaleFactorOfLowerLimit,1954 -scaleFactorOfLowerWavePeriodLimit,1955 -scaleFactorOfMajorAxisOfOblateSpheroidEarth,1956 -scaleFactorOfMinorAxisOfOblateSpheroidEarth,1957 -scaleFactorOfPrimeMeridianOffset,1958 -scaleFactorOfRadiusOfSphericalEarth,1959 -scaleFactorOfSecondFixedSurface,1960 -scaleFactorOfSecondSize,1961 -scaleFactorOfSecondWavelength,1962 -scaleFactorOfStandardDeviation,1963 -scaleFactorOfStandardDeviationInTheCluster,1964 -scaleFactorOfUpperLimit,1965 -scaleFactorOfUpperWavePeriodLimit,1966 -scaleFactorOfWaveDirectionSequenceParameter,1967 -scaleFactorOfWaveDirections,1968 -scaleFactorOfWaveFrequencies,1969 -scaleFactorOfWaveFrequencySequenceParameter,1970 -scaleValuesBy,1971 -scaledDirections,1972 -scaledFrequencies,1973 -scaledValueOfAdditionalParameterForReferencePeriod,1974 -scaledValueOfCentralWaveNumber,1975 -scaledValueOfDistanceFromEnsembleMean,1976 -scaledValueOfDistributionFunctionParameter,1977 -scaledValueOfEarthMajorAxis,1978 -scaledValueOfEarthMinorAxis,1979 -scaledValueOfFirstFixedSurface,1980 -scaledValueOfFirstSize,1981 -scaledValueOfFirstWavelength,1982 -scaledValueOfLengthOfSemiMajorAxis,1983 -scaledValueOfLengthOfSemiMinorAxis,1984 -scaledValueOfLowerLimit,1985 -scaledValueOfLowerWavePeriodLimit,1986 -scaledValueOfMajorAxisOfOblateSpheroidEarth,1987 -scaledValueOfMinorAxisOfOblateSpheroidEarth,1988 -scaledValueOfPrimeMeridianOffset,1989 -scaledValueOfRadiusOfSphericalEarth,1990 -scaledValueOfSecondFixedSurface,1991 -scaledValueOfSecondSize,1992 -scaledValueOfSecondWavelength,1993 -scaledValueOfStandardDeviation,1994 -scaledValueOfStandardDeviationInTheCluster,1995 -scaledValueOfUpperLimit,1996 -scaledValueOfUpperWavePeriodLimit,1997 -scaledValueOfWaveDirectionSequenceParameter,1998 -scaledValueOfWaveFrequencySequenceParameter,1999 -scaledValuesOfWaveDirections,2000 -scaledValuesOfWaveFrequencies,2001 -scalingFactorForFrequencies,2002 -scanPosition,2003 -scanningMode,2004 -scanningMode4,2005 -scanningMode5,2006 -scanningMode6,2007 -scanningMode7,2008 -scanningMode8,2009 -scanningModeForOneDiamond,2010 -sd,2011 -second,2012 -secondDimension,2013 -secondDimensionCoordinateValueDefinition,2014 -secondDimensionPhysicalSignificance,2015 -secondLatitude,2016 -secondLatitudeInDegrees,2017 -secondOfEndOfOverallTimeInterval,2018 -secondOfForecast,2019 -secondOfForecastUsedInLocalTime,2020 -secondOfModelVersion,2021 -secondOfStartOfReferencePeriod,2022 -secondOrderFlags,2023 -secondOrderOfDifferentWidth,2024 -secondOrderValuesDifferentWidths,2025 -secondSize,2026 -secondaryBitMap,2027 -secondaryBitmap,2028 -secondaryBitmapPresent,2029 -secondaryBitmaps,2030 -secondaryBitmapsCount,2031 -secondaryBitmapsSize,2032 -secondaryMissingValue,2033 -secondaryMissingValueSubstitute,2034 -secondsOfAnalysis,2035 -secondsOfReference,2036 -section,2037 -section0Length,2038 -section0Pointer,2039 -section1,2040 -section10Length,2041 -section10Pointer,2042 -section11Length,2043 -section11Pointer,2044 -section1Flags,2045 -section1Length,2046 -section1Padding,2047 -section1Pointer,2048 -section2Length,2049 -section2Padding,2050 -section2Pointer,2051 -section2Present,2052 -section2Used,2053 -section3Flags,2054 -section3Length,2055 -section3Padding,2056 -section3Pointer,2057 -section3UniqueIdentifier,2058 -section4,2059 -section4Length,2060 -section4Padding,2061 -section4Pointer,2062 -section4UniqueIdentifier,2063 -section5,2064 -section5Length,2065 -section5Pointer,2066 -section5UniqueIdentifier,2067 -section6,2068 -section6Length,2069 -section6Pointer,2070 -section6UniqueIdentifier,2071 -section7,2072 -section7Length,2073 -section7Pointer,2074 -section7UniqueIdentifier,2075 -section8,2076 -section8Length,2077 -section8Pointer,2078 -section8UniqueIdentifier,2079 -section9Length,2080 -section9Pointer,2081 -section9UniqueIdentifier,2082 -sectionLengthLimitForEnsembles,2083 -sectionLengthLimitForProbability,2084 -sectionNumber,2085 -sectionPosition,2086 -section_01,2087 -section_02,2088 -section_03,2089 -section_04,2090 -section_05,2091 -section_06,2092 -section_07,2093 -section_08,2094 -section_09,2095 -section_1,2096 -section_10,2097 -section_11,2098 -section_2,2099 -section_3,2100 -section_4,2101 -section_5,2102 -section_6,2103 -section_7,2104 -section_8,2105 -selectStepTemplateInstant,2106 -selectStepTemplateInterval,2107 -selectedDay,2108 -selectedFcIndex,2109 -selectedHour,2110 -selectedMinute,2111 -selectedMonth,2112 -selectedSecond,2113 -selectedYear,2114 -sensitiveAreaDomain,2115 -sequences,2116 -setBitsPerValue,2117 -setCalendarId,2118 -setDecimalPrecision,2119 -setLocalDefinition,2120 -setPackingType,2121 -setToMissingIfOutOfRange,2122 -sfc_levtype,2123 -shapeOfTheEarth,2124 -shapeOfVerificationArea,2125 -shortName,2126 -shortNameECMF,2127 -shortNameLegacyECMF,2128 -short_name,2129 -signature,2130 -significanceOfReferenceDateAndTime,2131 -significanceOfReferenceTime,2132 -simpleThinningMissingRadius,2133 -simpleThinningSkip,2134 -simpleThinningStart,2135 -siteElevation,2136 -siteId,2137 -siteLatitude,2138 -siteLongitude,2139 -sizeOfLength,2140 -sizeOfOffsets,2141 -sizeOfPostAuxiliaryArray,2142 -sizeOfPostAuxiliaryArrayPlusOne,2143 -skew,2144 -skewness,2145 -skipExtraKeyAttributes,2146 -sort,2147 -sourceOfGridDefinition,2148 -sourceSinkChemicalPhysicalProcess,2149 -southEastLatitudeOfLPOArea,2150 -southEastLatitudeOfVerficationArea,2151 -southEastLongitudeOfLPOArea,2152 -southEastLongitudeOfVerficationArea,2153 -southLatitudeOfCluster,2154 -southLatitudeOfDomainOfTubing,2155 -southPoleOnProjectionPlane,2156 -southernLatitudeOfClusterDomain,2157 -southernLatitudeOfDomain,2158 -sp1,2159 -sp2,2160 -sp3,2161 -spaceUnitFlag,2162 -spacingOfBinsAlongRadials,2163 -spare,2164 -spare1,2165 -spare2,2166 -spare3,2167 -spare4,2168 -spatialProcessing,2169 -spatialSmoothingOfProduct,2170 -spectralDataRepresentationMode,2171 -spectralDataRepresentationType,2172 -spectralMode,2173 -spectralType,2174 -sphericalHarmonics,2175 -standardDeviation,2176 -standardParallel,2177 -standardParallelInDegrees,2178 -standardParallelInMicrodegrees,2179 -startDateOfReferencePeriod,2180 -startOfHeaders,2181 -startOfMessage,2182 -startOfRange,2183 -startStep,2184 -startStepInHours,2185 -startTimeStep,2186 -startingAzimuth,2187 -statisticalProcess,2188 -statisticalProcessesList,2189 -statistics,2190 -status,2191 -step,2192 -stepForClustering,2193 -stepHumanReadable,2194 -stepInHours,2195 -stepRange,2196 -stepRangeInHours,2197 -stepType,2198 -stepTypeForConversion,2199 -stepTypeInternal,2200 -stepUnits,2201 -stepZero,2202 -stream,2203 -streamOfAnalysis,2204 -stretchingFactor,2205 -stretchingFactorScaled,2206 -stringValues,2207 -subCentre,2208 -subDefinitions1,2209 -subDefinitions2,2210 -subLocalDefinition1,2211 -subLocalDefinition2,2212 -subLocalDefinitionLength1,2213 -subLocalDefinitionLength2,2214 -subLocalDefinitionNumber1,2215 -subLocalDefinitionNumber2,2216 -subSetJ,2217 -subSetK,2218 -subSetM,2219 -subcentreOfAnalysis,2220 -subdivisionsOfBasicAngle,2221 -suiteName,2222 -superblockExtensionAddress,2223 -swapScanningAlternativeRows,2224 -swapScanningLat,2225 -swapScanningLon,2226 -swapScanningX,2227 -swapScanningY,2228 -system,2229 -systemNumber,2230 -t,2231 -table2Version,2232 -tableCode,2233 -tableNumber,2234 -tableReference,2235 -tablesLocalDir,2236 -tablesMasterDir,2237 -tablesVersion,2238 -tablesVersionLatest,2239 -tablesVersionLatestOfficial,2240 -targetCompressionRatio,2241 -td,2242 -tempPressureUnits,2243 -temperature,2244 -temperatureAndDewpointPresent,2245 -templatesLocalDir,2246 -templatesMasterDir,2247 -theHindcastMarsStream,2248 -theMessage,2249 -thisExperimentVersionNumber,2250 -thisMarsClass,2251 -thisMarsStream,2252 -thisMarsType,2253 -thousand,2254 -three,2255 -threshold,2256 -thresholdIndicator,2257 -tiggeCentre,2258 -tiggeLAMName,2259 -tiggeLocalVersion,2260 -tiggeModel,2261 -tiggeSection,2262 -tiggeSuiteID,2263 -tigge_name,2264 -tigge_short_name,2265 -tileClassification,2266 -tileIndex,2267 -time,2268 -timeCoordinateDefinition,2269 -timeDomainTemplate,2270 -timeDomainTemplateNumber,2271 -timeIncrement,2272 -timeIncrementBetweenSuccessiveFields,2273 -timeOfAnalysis,2274 -timeOfForecast,2275 -timeOfForecastUsedInLocalTime,2276 -timeOfModelVersion,2277 -timeOfReference,2278 -timeRangeIndicator,2279 -timeRangeIndicatorFromStepRange,2280 -timeUnitFlag,2281 -timerepres,2282 -topLevel,2283 -total,2284 -totalAerosolBinsNumbers,2285 -totalInitialConditions,2286 -totalLength,2287 -totalNumber,2288 -totalNumberOfClusters,2289 -totalNumberOfDataValuesMissingInStatisticalProcess,2290 -totalNumberOfDirections,2291 -totalNumberOfForecastProbabilities,2292 -totalNumberOfFrequencies,2293 -totalNumberOfGridPoints,2294 -totalNumberOfIterations,2295 -totalNumberOfQuantiles,2296 -totalNumberOfRepetitions,2297 -totalNumberOfTileAttributePairs,2298 -totalNumberOfTubes,2299 -totalNumberOfValuesInUnpackedSubset,2300 -totalNumberOfWaveDirections,2301 -totalNumberOfWaveFrequencies,2302 -totalNumberOfdimensions,2303 -treatmentOfMissingData,2304 -true,2305 -trueLengthOfLastGroup,2306 -truncateDegrees,2307 -truncateLaplacian,2308 -tsectionNumber3,2309 -tsectionNumber4,2310 -tsectionNumber5,2311 -tubeDomain,2312 -tubeNumber,2313 -two,2314 -twoOrdersOfSPD,2315 -type,2316 -typeOfAnalysis,2317 -typeOfAuxiliaryInformation,2318 -typeOfCalendar,2319 -typeOfCompressionUsed,2320 -typeOfDistributionFunction,2321 -typeOfEnsembleForecast,2322 -typeOfEnsembleMember,2323 -typeOfFirstFixedSurface,2324 -typeOfGeneratingProcess,2325 -typeOfGrid,2326 -typeOfHorizontalLine,2327 -typeOfIntervalForFirstAndSecondSize,2328 -typeOfIntervalForFirstAndSecondWavelength,2329 -typeOfLevel,2330 -typeOfLevelECMF,2331 -typeOfOriginalFieldValues,2332 -typeOfPacking,2333 -typeOfPostProcessing,2334 -typeOfPreProcessing,2335 -typeOfProcessedData,2336 -typeOfReferenceDataset,2337 -typeOfRelationToReferenceDataset,2338 -typeOfSSTFieldUsed,2339 -typeOfSecondFixedSurface,2340 -typeOfSizeInterval,2341 -typeOfStatisticalPostProcessingOfEnsembleMembers,2342 -typeOfStatisticalProcessing,2343 -typeOfStatisticalProcessingForTimeRangeForReferencePeriod,2344 -typeOfTimeIncrement,2345 -typeOfTimeIncrementBetweenSuccessiveFieldsUsedInTheStatisticalProcessing,2346 -typeOfWaveDirectionSequence,2347 -typeOfWaveFrequencySequence,2348 -typeOfWavePeriodInterval,2349 -typeOfWavelengthInterval,2350 -typicalCentury,2351 -typicalDate,2352 -typicalDateTime,2353 -typicalDay,2354 -typicalHour,2355 -typicalMinute,2356 -typicalMonth,2357 -typicalSecond,2358 -typicalTime,2359 -typicalYear,2360 -typicalYear2,2361 -typicalYearOfCentury,2362 -uco,2363 -ucs,2364 -uerraLocalVersion,2365 -uerraSection,2366 -unexpandedDescriptors,2367 -unexpandedDescriptorsEncoded,2368 -unitOfOffsetFromReferenceTime,2369 -unitOfTime,2370 -unitOfTimeIncrement,2371 -unitOfTimeRange,2372 -units,2373 -unitsBias,2374 -unitsConversionOffset,2375 -unitsConversionScaleFactor,2376 -unitsDecimalScaleFactor,2377 -unitsECMF,2378 -unitsFactor,2379 -unitsLegacyECMF,2380 -unitsOfFirstFixedSurface,2381 -unitsOfSecondFixedSurface,2382 -unknown,2383 -unpack,2384 -unpackedError,2385 -unpackedSubsetPrecision,2386 -unpackedValues,2387 -unsignedIntegers,2388 -unstructuredGrid,2389 -unstructuredGridSubtype,2390 -unstructuredGridType,2391 -unstructuredGridUUID,2392 -unusedBitsInBitmap,2393 -updateSequenceNumber,2394 -upperLimit,2395 -upperRange,2396 -upperThreshold,2397 -upperThresholdValue,2398 -userDateEnd,2399 -userDateStart,2400 -userDateTimeEnd,2401 -userDateTimeStart,2402 -userTimeEnd,2403 -userTimeStart,2404 -uuidOfHGrid,2405 -uuidOfVGrid,2406 -uvRelativeToGrid,2407 -validityDate,2408 -validityDateTime,2409 -validityTime,2410 -values,2411 -variationOfVisibility,2412 -variationOfVisibilityDirection,2413 -variationOfVisibilityDirectionAngle,2414 -variationOfVisibilityDirectionTrend1,2415 -variationOfVisibilityDirectionTrend2,2416 -variationOfVisibilityDirectionTrend3,2417 -variationOfVisibilityDirectionTrend4,2418 -variationOfVisibilityTrend1,2419 -variationOfVisibilityTrend2,2420 -variationOfVisibilityTrend3,2421 -variationOfVisibilityTrend4,2422 -varno,2423 -verificationDate,2424 -verificationMonth,2425 -verificationYear,2426 -verifyingMonth,2427 -version,2428 -versionNumOfFilesFreeSpaceStorage,2429 -versionNumOfRootGroupSymbolTableEntry,2430 -versionNumOfSharedHeaderMessageFormat,2431 -versionNumberOfExperimentalSuite,2432 -versionNumberOfGribLocalTables,2433 -versionNumberOfSuperblock,2434 -versionOfModelClimate,2435 -verticalCoordinate,2436 -verticalCoordinateDefinition,2437 -verticalDomainTemplate,2438 -verticalDomainTemplateNumber,2439 -verticalVisibility,2440 -verticalVisibilityCoded,2441 -visibility,2442 -visibilityInKilometresTrend1,2443 -visibilityInKilometresTrend2,2444 -visibilityInKilometresTrend3,2445 -visibilityInKilometresTrend4,2446 -visibilityTrend1,2447 -visibilityTrend2,2448 -visibilityTrend3,2449 -visibilityTrend4,2450 -waveDirectionNumber,2451 -waveDomain,2452 -waveFrequencyNumber,2453 -waveLevType,2454 -weightAppliedToClimateMonth1,2455 -westLongitudeOfCluster,2456 -westLongitudeOfDomainOfTubing,2457 -westernLongitudeOfClusterDomain,2458 -westernLongitudeOfDomain,2459 -widthOfFirstOrderValues,2460 -widthOfLengths,2461 -widthOfSPD,2462 -widthOfWidths,2463 -windDirection,2464 -windDirectionTrend1,2465 -windDirectionTrend2,2466 -windDirectionTrend3,2467 -windDirectionTrend4,2468 -windGust,2469 -windGustTrend1,2470 -windGustTrend2,2471 -windGustTrend3,2472 -windGustTrend4,2473 -windPresent,2474 -windSpeed,2475 -windSpeedTrend1,2476 -windSpeedTrend2,2477 -windSpeedTrend3,2478 -windSpeedTrend4,2479 -windUnits,2480 -windUnitsTrend1,2481 -windUnitsTrend2,2482 -windUnitsTrend3,2483 -windUnitsTrend4,2484 -windVariableDirection,2485 -windVariableDirectionTrend1,2486 -windVariableDirectionTrend2,2487 -windVariableDirectionTrend3,2488 -windVariableDirectionTrend4,2489 -wrongPadding,2490 -xCoordinateOfOriginOfSectorImage,2491 -xCoordinateOfSubSatellitePoint,2492 -xDirectionGridLength,2493 -xDirectionGridLengthInMetres,2494 -xDirectionGridLengthInMillimetres,2495 -xFirst,2496 -xLast,2497 -yCoordinateOfOriginOfSectorImage,2498 -yCoordinateOfSubSatellitePoint,2499 -yDirectionGridLength,2500 -yDirectionGridLengthInMetres,2501 -yDirectionGridLengthInMillimetres,2502 -yFirst,2503 -yLast,2504 -year,2505 -yearOfAnalysis,2506 -yearOfCentury,2507 -yearOfEndOfOverallTimeInterval,2508 -yearOfForecast,2509 -yearOfForecastUsedInLocalTime,2510 -yearOfModelVersion,2511 -yearOfReference,2512 -yearOfStartOfReferencePeriod,2513 -zero,2514 -zeros,2515 +forceStepUnits,885 +forecastLeadTime,886 +forecastMonth,887 +forecastOrSingularVectorNumber,888 +forecastPeriod,889 +forecastPeriodFrom,890 +forecastPeriodTo,891 +forecastProbabilityNumber,892 +forecastSteps,893 +forecastTime,894 +forecastperiod,895 +formatForDoubles,896 +formatForLongs,897 +formatVersionMajorNumber,898 +formatVersionMinorNumber,899 +freeFormData,900 +frequency,901 +frequencyNumber,902 +frequencyScalingFactor,903 +functionCode,904 +g,905 +g1conceptsLocalDirAll,906 +g1conceptsMasterDir,907 +g2grid,908 +gaussianGridName,909 +genVertHeightCoords,910 +generalExtended2ordr,911 +generatingProcessIdentificationNumber,912 +generatingProcessIdentifier,913 +generatingProcessTemplate,914 +generatingProcessTemplateNumber,915 +generation,916 +getNumberOfValues,917 +gg,918 +global,919 +globalDomain,920 +grib1divider,921 +grib2LocalSectionNumber,922 +grib2LocalSectionPresent,923 +grib2divider,924 +grib3divider,925 +gribDataQualityChecks,926 +gribMasterTablesVersionNumber,927 +gribTablesVersionNo,928 +grid,929 +gridCoordinate,930 +gridDefinition,931 +gridDefinitionDescription,932 +gridDefinitionSection,933 +gridDefinitionTemplateNumber,934 +gridDescriptionSectionPresent,935 +gridName,936 +gridPointPosition,937 +gridSpecification,938 +gridType,939 +groupInternalNodeK,940 +groupLeafNodeK,941 +groupLengths,942 +groupSplitting,943 +groupSplittingMethodUsed,944 +groupWidth,945 +groupWidths,946 +gts_CCCC,947 +gts_TTAAii,948 +gts_ddhh00,949 +gts_header,950 +halfByte,951 +hdate,952 +headersOnly,953 +heightLevelName,954 +heightOrPressureOfLevel,955 +heightPressureEtcOfLevels,956 +hideThis,957 +hook_post_meta_data,958 +horizontalCoordinateDefinition,959 +horizontalCoordinateSupplement,960 +horizontalDimensionProcessed,961 +horizontalDomainTemplate,962 +horizontalDomainTemplateNumber,963 +hour,964 +hourOfAnalysis,965 +hourOfEndOfOverallTimeInterval,966 +hourOfForecast,967 +hourOfForecastUsedInLocalTime,968 +hourOfModelVersion,969 +hourOfReference,970 +hourOfStartOfReferencePeriod,971 +hoursAfterDataCutoff,972 +hoursAfterReferenceTimeOfDataCutoff,973 +hundred,974 +iDirectionIncrement,975 +iDirectionIncrementGiven,976 +iDirectionIncrementGridLength,977 +iDirectionIncrementInDegrees,978 +iIncrement,979 +iScansNegatively,980 +iScansPositively,981 +ident,982 +identificationNumber,983 +identificationOfOriginatingGeneratingCentre,984 +identificationOfProject,985 +identifier,986 +ieeeFloats,987 +ifsParam,988 +ijDirectionIncrementGiven,989 +implementationDateOfModelCycle,990 +incrementOfLengths,991 +indexTemplate,992 +indexTemplateNumber,993 +indexedStorageInternalNodeK,994 +indexingDate,995 +indexingTime,996 +indexingTimeHH,997 +indexingTimeHHMM,998 +indexingTimeMM,999 +indicatorOfParameter,1000 +indicatorOfTypeOfLevel,1001 +indicatorOfUnitForForecastTime,1002 +indicatorOfUnitForTimeIncrement,1003 +indicatorOfUnitForTimeRange,1004 +indicatorOfUnitForTimeRangeForReferencePeriod,1005 +indicatorOfUnitOfTimeRange,1006 +inputDataPresentIndicator,1007 +inputDelayedDescriptorReplicationFactor,1008 +inputExtendedDelayedDescriptorReplicationFactor,1009 +inputOriginatingCentre,1010 +inputOverriddenReferenceValues,1011 +inputProcessIdentifier,1012 +inputShortDelayedDescriptorReplicationFactor,1013 +instrument,1014 +instrumentIdentifier,1015 +instrumentType,1016 +integerPointValues,1017 +integerScaleFactor,1018 +integerScalingFactorAppliedToDirections,1019 +integerScalingFactorAppliedToFrequencies,1020 +integerValues,1021 +internalVersion,1022 +internationalDataSubCategory,1023 +interpretationOfNumberOfPoints,1024 +intervalBetweenTimes,1025 +isAccumulation,1026 +isAuto,1027 +isCavok,1028 +isCavokTrend1,1029 +isCavokTrend2,1030 +isCavokTrend3,1031 +isCavokTrend4,1032 +isConstant,1033 +isCorrection,1034 +isEPS,1035 +isEps,1036 +isFillup,1037 +isGridded,1038 +isHindcast,1039 +isOctahedral,1040 +isRotatedGrid,1041 +isSatellite,1042 +isSatelliteType,1043 +isSens,1044 +isSpectral,1045 +is_aerosol,1046 +is_aerosol_optical,1047 +is_chemical,1048 +is_chemical_distfn,1049 +is_chemical_srcsink,1050 +is_localtime,1051 +is_ocean2d_param,1052 +is_ocean3d_param,1053 +is_uerra,1054 +isectionNumber2,1055 +isectionNumber3,1056 +isectionNumber4,1057 +isotopeIdentificationNumber,1058 +iteration,1059 +iterationNumber,1060 +iteratorDisableUnrotate,1061 +jDirectionIncrement,1062 +jDirectionIncrementGiven,1063 +jDirectionIncrementGridLength,1064 +jDirectionIncrementInDegrees,1065 +jIncrement,1066 +jPointsAreConsecutive,1067 +jScansNegatively,1068 +jScansPositively,1069 +jdLocal,1070 +jdSelected,1071 +julianDay,1072 +julianForecastDay,1073 +keyData,1074 +keyMore,1075 +keySat,1076 +kindOfProduct,1077 +kurt,1078 +kurtosis,1079 +lBB,1080 +landtype,1081 +laplacianOperator,1082 +laplacianOperatorIsSet,1083 +laplacianScalingFactor,1084 +laplacianScalingFactorUnset,1085 +lastMonthUsedToBuildClimateMonth1,1086 +lastMonthUsedToBuildClimateMonth2,1087 +latLonValues,1088 +latitude,1089 +latitudeFirstInDegrees,1090 +latitudeLastInDegrees,1091 +latitudeLongitudeValues,1092 +latitudeOfCentralPointInClusterDomain,1093 +latitudeOfCentrePoint,1094 +latitudeOfCentrePointInDegrees,1095 +latitudeOfFirstGridPoint,1096 +latitudeOfFirstGridPointInDegrees,1097 +latitudeOfGridPoints,1098 +latitudeOfIcosahedronPole,1099 +latitudeOfLastGridPoint,1100 +latitudeOfLastGridPointInDegrees,1101 +latitudeOfNorthWestCornerOfArea,1102 +latitudeOfReferencePoint,1103 +latitudeOfReferencePointInDegrees,1104 +latitudeOfSouthEastCornerOfArea,1105 +latitudeOfSouthernPole,1106 +latitudeOfSouthernPoleInDegrees,1107 +latitudeOfStretchingPole,1108 +latitudeOfStretchingPoleInDegrees,1109 +latitudeOfSubSatellitePoint,1110 +latitudeOfSubSatellitePointInDegrees,1111 +latitudeOfTangencyPoint,1112 +latitudeOfThePoleOfStretching,1113 +latitudeOfThePolePoint,1114 +latitudeOfThePolePointInDegrees,1115 +latitudeOfTheSouthernPoleOfProjection,1116 +latitudeSexagesimal,1117 +latitudeWhereDxAndDyAreSpecified,1118 +latitudeWhereDxAndDyAreSpecifiedInDegrees,1119 +latitudes,1120 +latitudesList,1121 +latitudinalDirectionGridLength,1122 +lcwfvSuiteName,1123 +leadtime,1124 +legBaseDate,1125 +legBaseTime,1126 +legNumber,1127 +legacyGaussSubarea,1128 +lengthDescriptors,1129 +lengthIncrementForTheGroupLengths,1130 +lengthOf4DvarWindow,1131 +lengthOfHeaders,1132 +lengthOfIndexTemplate,1133 +lengthOfMessage,1134 +lengthOfOriginatorLocalTemplate,1135 +lengthOfProjectLocalTemplate,1136 +lengthOfTimeRange,1137 +lengthOfTimeRangeForReferencePeriod,1138 +lev,1139 +levTypeName,1140 +level,1141 +levelIndicator,1142 +levelType,1143 +levelValues,1144 +level_value_list,1145 +levelist,1146 +levels,1147 +levtype,1148 +libraryVersion,1149 +listMembersMissing,1150 +listMembersMissing2,1151 +listMembersMissing3,1152 +listMembersMissing4,1153 +listMembersUsed,1154 +listMembersUsed2,1155 +listMembersUsed3,1156 +listMembersUsed4,1157 +listOfContributingSpectralBands,1158 +listOfDistributionFunctionParameter,1159 +listOfEnsembleForecastNumbers,1160 +listOfModelIdentifiers,1161 +listOfParametersUsedForClustering,1162 +listOfScaledFrequencies,1163 +listOfUsedTileAttributesInCombination,1164 +listOfWaveDirectionSequenceParameters,1165 +listOfWaveFrequencySequenceParameters,1166 +local,1167 +localDate,1168 +localDateTime,1169 +localDay,1170 +localDecimalScaleFactor,1171 +localDefNumberOne,1172 +localDefNumberTwo,1173 +localDefinition,1174 +localDefinitionNumber,1175 +localDir,1176 +localExtensionPadding,1177 +localFlag,1178 +localFlagLatestVersion,1179 +localHour,1180 +localLatitude,1181 +localLatitude1,1182 +localLatitude2,1183 +localLongitude,1184 +localLongitude1,1185 +localLongitude2,1186 +localMinute,1187 +localMonth,1188 +localNumberOfObservations,1189 +localSecond,1190 +localSection,1191 +localSectionPresent,1192 +localTablesVersion,1193 +localTablesVersionNumber,1194 +localTime,1195 +localTimeForecastList,1196 +localTimeMethod,1197 +localUsePresent,1198 +localYear,1199 +local_padding,1200 +local_use,1201 +logTransform,1202 +longitude,1203 +longitudeFirstInDegrees,1204 +longitudeLastInDegrees,1205 +longitudeOfCentralPointInClusterDomain,1206 +longitudeOfCentrePoint,1207 +longitudeOfCentrePointInDegrees,1208 +longitudeOfFirstDiamondCenterLine,1209 +longitudeOfFirstDiamondCentreLine,1210 +longitudeOfFirstDiamondCentreLineInDegrees,1211 +longitudeOfFirstGridPoint,1212 +longitudeOfFirstGridPointInDegrees,1213 +longitudeOfGridPoints,1214 +longitudeOfIcosahedronPole,1215 +longitudeOfLastGridPoint,1216 +longitudeOfLastGridPointInDegrees,1217 +longitudeOfNorthWestCornerOfArea,1218 +longitudeOfReferencePoint,1219 +longitudeOfReferencePointInDegrees,1220 +longitudeOfSouthEastCornerOfArea,1221 +longitudeOfSouthernPole,1222 +longitudeOfSouthernPoleInDegrees,1223 +longitudeOfStretchingPole,1224 +longitudeOfStretchingPoleInDegrees,1225 +longitudeOfSubSatellitePoint,1226 +longitudeOfSubSatellitePointInDegrees,1227 +longitudeOfTangencyPoint,1228 +longitudeOfThePoleOfStretching,1229 +longitudeOfThePolePoint,1230 +longitudeOfThePolePointInDegrees,1231 +longitudeOfTheSouthernPoleOfProjection,1232 +longitudeSexagesimal,1233 +longitudes,1234 +longitudesList,1235 +longitudinalDirectionGridLength,1236 +lowerLimit,1237 +lowerRange,1238 +lowerThreshold,1239 +lowerThresholdValue,1240 +ls_labeling,1241 +lsdate_bug,1242 +lstime_bug,1243 +m,1244 +mAngleMultiplier,1245 +mBasicAngle,1246 +mars,1247 +marsClass,1248 +marsClass1,1249 +marsClass2,1250 +marsDir,1251 +marsDomain,1252 +marsEndStep,1253 +marsExperimentOffset,1254 +marsExpver,1255 +marsForecastMonth,1256 +marsGrid,1257 +marsIdent,1258 +marsKeywords,1259 +marsKeywords1,1260 +marsLamModel,1261 +marsLatitude,1262 +marsLevel,1263 +marsLevelist,1264 +marsLongitude,1265 +marsModel,1266 +marsParam,1267 +marsQuantile,1268 +marsRange,1269 +marsStartStep,1270 +marsStep,1271 +marsStream,1272 +marsStream1,1273 +marsStream2,1274 +marsType,1275 +marsType1,1276 +marsType2,1277 +mars_labeling,1278 +mask,1279 +masterDir,1280 +masterTableNumber,1281 +masterTablesVersionNumber,1282 +masterTablesVersionNumberLatest,1283 +matchAerosolBinNumber,1284 +matchAerosolPacking,1285 +matchLandType,1286 +matchSort,1287 +matchTimeRepres,1288 +matrixBitmapsPresent,1289 +matrixOfValues,1290 +max,1291 +maxLevelValue,1292 +maximum,1293 +md5Data,1294 +md5DataSection,1295 +md5GridSection,1296 +md5Headers,1297 +md5Product,1298 +md5Section1,1299 +md5Section10,1300 +md5Section2,1301 +md5Section3,1302 +md5Section4,1303 +md5Section5,1304 +md5Section6,1305 +md5Section7,1306 +md5Section8,1307 +md5Section9,1308 +md5Structure,1309 +md5TimeDomainSection,1310 +meanRVR1,1311 +meanRVR2,1312 +meanRVR3,1313 +meanRVR4,1314 +meanSize,1315 +meanValueRVR1,1316 +meanValueRVR2,1317 +meanValueRVR3,1318 +meanValueRVR4,1319 +meaningOfVerticalCoordinate,1320 +memberNumber,1321 +messageLength,1322 +metadata,1323 +method,1324 +methodNumber,1325 +million,1326 +min,1327 +minimum,1328 +minute,1329 +minuteOfAnalysis,1330 +minuteOfEndOfOverallTimeInterval,1331 +minuteOfForecast,1332 +minuteOfForecastUsedInLocalTime,1333 +minuteOfModelVersion,1334 +minuteOfReference,1335 +minuteOfStartOfReferencePeriod,1336 +minutesAfterDataCutoff,1337 +minutesAfterReferenceTimeOfDataCutoff,1338 +missingDataFlag,1339 +missingValue,1340 +missingValueManagement,1341 +missingValueManagementUsed,1342 +missingValuesPresent,1343 +missing_values,1344 +mixedCoordinateDefinition,1345 +mixedCoordinateFieldFlag,1346 +modeNumber,1347 +model,1348 +modelErrorType,1349 +modelIdentifier,1350 +modelName,1351 +modelVersionDate,1352 +modelVersionTime,1353 +molarMass,1354 +month,1355 +monthOfAnalysis,1356 +monthOfEndOfOverallTimeInterval,1357 +monthOfForecast,1358 +monthOfForecastUsedInLocalTime,1359 +monthOfModelVersion,1360 +monthOfReference,1361 +monthOfStartOfReferencePeriod,1362 +monthlyVerificationDate,1363 +monthlyVerificationMonth,1364 +monthlyVerificationTime,1365 +monthlyVerificationYear,1366 +multiplicationFactorForLatLong,1367 +n,1368 +n2,1369 +n3,1370 +nTileAtt,1371 +nTileAttCombo,1372 +nTiles,1373 +na,1374 +name,1375 +nameECMF,1376 +nameLegacyECMF,1377 +nameOfFirstFixedSurface,1378 +nameOfSecondFixedSurface,1379 +names,1380 +nd,1381 +neitherPresent,1382 +newSubtype,1383 +nlev,1384 +nnn,1385 +normAtFinalTime,1386 +normAtInitialTime,1387 +normal,1388 +northLatitudeOfCluster,1389 +northLatitudeOfDomainOfTubing,1390 +northWestLatitudeOfLPOArea,1391 +northWestLatitudeOfVerficationArea,1392 +northWestLongitudeOfLPOArea,1393 +northWestLongitudeOfVerficationArea,1394 +northernLatitudeOfClusterDomain,1395 +northernLatitudeOfDomain,1396 +nosigPresent,1397 +notDecoded,1398 +nref,1399 +nt,1400 +number,1401 +numberInHorizontalCoordinates,1402 +numberInMixedCoordinateDefinition,1403 +numberInTheAuxiliaryArray,1404 +numberInTheGridCoordinateList,1405 +numberIncludedInAverage,1406 +numberMissingFromAveragesOrAccumulations,1407 +numberOfAdditionalParametersForReferencePeriod,1408 +numberOfAnalysis,1409 +numberOfBits,1410 +numberOfBitsContainingEachPackedValue,1411 +numberOfBitsForScaledGroupLengths,1412 +numberOfBitsUsedForTheGroupWidths,1413 +numberOfBitsUsedForTheScaledGroupLengths,1414 +numberOfBytesInLocalDefinition,1415 +numberOfBytesOfFreeFormatData,1416 +numberOfBytesPerInteger,1417 +numberOfCategories,1418 +numberOfCharacters,1419 +numberOfChars,1420 +numberOfClusterHighResolution,1421 +numberOfClusterLowResolution,1422 +numberOfClusters,1423 +numberOfCodedValues,1424 +numberOfCoefficientsOrValuesUsedToSpecifyFirstDimensionCoordinateFunction,1425 +numberOfCoefficientsOrValuesUsedToSpecifySecondDimensionCoordinateFunction,1426 +numberOfColumns,1427 +numberOfComponents,1428 +numberOfContributingSpectralBands,1429 +numberOfControlForecastTube,1430 +numberOfCoordinatesValues,1431 +numberOfDataBinsAlongRadials,1432 +numberOfDataMatrices,1433 +numberOfDataPoints,1434 +numberOfDataPointsExpected,1435 +numberOfDataValues,1436 +numberOfDaysInClimateSamplingWindow,1437 +numberOfDiamonds,1438 +numberOfDirections,1439 +numberOfDistinctSection3s,1440 +numberOfDistinctSection4s,1441 +numberOfDistinctSection5s,1442 +numberOfDistinctSection6s,1443 +numberOfDistinctSection7s,1444 +numberOfDistinctSection8s,1445 +numberOfDistinctSection9s,1446 +numberOfDistributionFunctionParameters,1447 +numberOfEffectiveValues,1448 +numberOfFloats,1449 +numberOfForcasts,1450 +numberOfForecastsInCluster,1451 +numberOfForecastsInEnsemble,1452 +numberOfForecastsInTheCluster,1453 +numberOfForecastsInTube,1454 +numberOfForecastsUsedInLocalTime,1455 +numberOfFrequencies,1456 +numberOfGridInReference,1457 +numberOfGridUsed,1458 +numberOfGroups,1459 +numberOfGroupsOfDataValues,1460 +numberOfHorizontalPoints,1461 +numberOfIntegers,1462 +numberOfInts,1463 +numberOfIterations,1464 +numberOfLevelValues,1465 +numberOfLocalDefinitions,1466 +numberOfLogicals,1467 +numberOfMembersInCluster,1468 +numberOfMembersInEnsemble,1469 +numberOfMissing,1470 +numberOfMissingInStatisticalProcess,1471 +numberOfMissingValues,1472 +numberOfModeOfDistribution,1473 +numberOfModels,1474 +numberOfOctectsForNumberOfPoints,1475 +numberOfOctetsExtraDescriptors,1476 +numberOfOperationalForecastTube,1477 +numberOfPackedValues,1478 +numberOfParallelsBetweenAPoleAndTheEquator,1479 +numberOfParametersUsedForClustering,1480 +numberOfPartitions,1481 +numberOfPoints,1482 +numberOfPointsAlongAMeridian,1483 +numberOfPointsAlongAParallel,1484 +numberOfPointsAlongASide,1485 +numberOfPointsAlongFirstAxis,1486 +numberOfPointsAlongSecondAxis,1487 +numberOfPointsAlongTheXAxis,1488 +numberOfPointsAlongTheYAxis,1489 +numberOfPointsAlongXAxis,1490 +numberOfPointsAlongXAxisInCouplingArea,1491 +numberOfPointsAlongYAxis,1492 +numberOfPointsAlongYAxisInCouplingArea,1493 +numberOfPointsInDomain,1494 +numberOfPointsUsed,1495 +numberOfPressureLevelsUsedForClustering,1496 +numberOfRadarSitesUsed,1497 +numberOfRadials,1498 +numberOfReferencePeriodTimeRanges,1499 +numberOfReforecastYearsInModelClimate,1500 +numberOfRemaininChars,1501 +numberOfRepresentativeMember,1502 +numberOfReservedBytes,1503 +numberOfRows,1504 +numberOfSecondOrderPackedValues,1505 +numberOfSection,1506 +numberOfSingularVectorsComputed,1507 +numberOfSingularVectorsEvolved,1508 +numberOfStatisticallyProcessedFieldsForLocalTime,1509 +numberOfStepsUsedForClustering,1510 +numberOfSubsets,1511 +numberOfTensOfThousandsOfYearsOfOffset,1512 +numberOfTimeIncrementsOfForecastsUsedInLocalTime,1513 +numberOfTimeRange,1514 +numberOfTimeRanges,1515 +numberOfTimeSteps,1516 +numberOfUnexpandedDescriptors,1517 +numberOfUnusedBitsAtEndOfSection3,1518 +numberOfUsedSpatialTiles,1519 +numberOfUsedTileAttributeCombinationsForTypeOfTile,1520 +numberOfUsedTileAttributes,1521 +numberOfUsedTileAttributesForTileAttributeCombination,1522 +numberOfUsefulPointsAlongXAxis,1523 +numberOfUsefulPointsAlongYAxis,1524 +numberOfVGridUsed,1525 +numberOfValues,1526 +numberOfVerticalCoordinateValues,1527 +numberOfVerticalGridDescriptors,1528 +numberOfVerticalPoints,1529 +numberOfWaveDirectionSequenceParameters,1530 +numberOfWaveDirections,1531 +numberOfWaveFrequencies,1532 +numberOfWaveFrequencySequenceParameters,1533 +numberingOrderOfDiamonds,1534 +numericValues,1535 +observablePropertyTemplate,1536 +observablePropertyTemplateNumber,1537 +observationDiagnostic,1538 +observationGeneratingProcessIdentifier,1539 +observationType,1540 +observedData,1541 +obstype,1542 +oceanAtmosphereCoupling,1543 +oceanLevName,1544 +oceanStream,1545 +octetAtWichPackedDataBegins,1546 +offset,1547 +offsetAfterBitmap,1548 +offsetAfterCentreLocalSection,1549 +offsetAfterData,1550 +offsetAfterLocalSection,1551 +offsetAfterPadding,1552 +offsetBBitmap,1553 +offsetBSection5,1554 +offsetBSection6,1555 +offsetBSection9,1556 +offsetBeforeBitmap,1557 +offsetBeforeData,1558 +offsetBeforePL,1559 +offsetBeforePV,1560 +offsetDescriptors,1561 +offsetEndSection4,1562 +offsetFreeFormData,1563 +offsetFromOriginToInnerBound,1564 +offsetFromReferenceOfFirstTime,1565 +offsetICEFieldsUsed,1566 +offsetSection0,1567 +offsetSection1,1568 +offsetSection10,1569 +offsetSection11,1570 +offsetSection2,1571 +offsetSection3,1572 +offsetSection4,1573 +offsetSection5,1574 +offsetSection6,1575 +offsetSection7,1576 +offsetSection8,1577 +offsetSection9,1578 +offsetToEndOf4DvarWindow,1579 +offsetValuesBy,1580 +offsetdate,1581 +offsettime,1582 +oldSubtype,1583 +one,1584 +oneConstant,1585 +oneMillionConstant,1586 +oneMinuteMeanMaximumRVR1,1587 +oneMinuteMeanMaximumRVR2,1588 +oneMinuteMeanMaximumRVR3,1589 +oneMinuteMeanMaximumRVR4,1590 +oneMinuteMeanMinimumRVR1,1591 +oneMinuteMeanMinimumRVR2,1592 +oneMinuteMeanMinimumRVR3,1593 +oneMinuteMeanMinimumRVR4,1594 +oper,1595 +operStream,1596 +operatingMode,1597 +operationalForecastCluster,1598 +optimisationTime,1599 +optimizeScaleFactor,1600 +optionalData,1601 +opttime,1602 +orderOfSPD,1603 +orderOfSpatialDifferencing,1604 +ordering,1605 +orderingConvention,1606 +orientationOfTheGrid,1607 +orientationOfTheGridInDegrees,1608 +origin,1609 +originOfPostProcessing,1610 +originalParameterNumber,1611 +originalParameterTableNumber,1612 +originalSubCentreIdentifier,1613 +originatingCentre,1614 +originatingCentreOfAnalysis,1615 +originatingClass,1616 +originatorLocalTemplate,1617 +originatorLocalTemplateNumber,1618 +outerLoopLengthOfTimeRange,1619 +outerLoopTypeOfStatisticalProcessing,1620 +outerLoopTypeOfTimeIncrement,1621 +overlayTemplate,1622 +overlayTemplateNumber,1623 +pack,1624 +packedValues,1625 +packingError,1626 +packingType,1627 +padding,1628 +padding_grid1_1,1629 +padding_grid1_2,1630 +padding_grid3_1,1631 +padding_grid4_1,1632 +padding_grid50_1,1633 +padding_grid5_1,1634 +padding_grid90_1,1635 +padding_loc10_1,1636 +padding_loc12_1,1637 +padding_loc13_1,1638 +padding_loc13_2,1639 +padding_loc13_3,1640 +padding_loc13_4,1641 +padding_loc13_5,1642 +padding_loc14_1,1643 +padding_loc14_2,1644 +padding_loc15_1,1645 +padding_loc16_1,1646 +padding_loc17_2,1647 +padding_loc18_1,1648 +padding_loc18_2,1649 +padding_loc190_1,1650 +padding_loc191_1,1651 +padding_loc191_2,1652 +padding_loc191_3,1653 +padding_loc192_1,1654 +padding_loc19_2,1655 +padding_loc20_1,1656 +padding_loc21_1,1657 +padding_loc23_1,1658 +padding_loc244_1,1659 +padding_loc244_2,1660 +padding_loc244_3,1661 +padding_loc245_1,1662 +padding_loc245_2,1663 +padding_loc26_1,1664 +padding_loc27_1,1665 +padding_loc27_2,1666 +padding_loc28_1,1667 +padding_loc29_1,1668 +padding_loc29_2,1669 +padding_loc29_3,1670 +padding_loc2_1,1671 +padding_loc2_2,1672 +padding_loc30_1,1673 +padding_loc30_2,1674 +padding_loc37_1,1675 +padding_loc37_2,1676 +padding_loc38_1,1677 +padding_loc3_1,1678 +padding_loc4_2,1679 +padding_loc50_1,1680 +padding_loc5_1,1681 +padding_loc6_1,1682 +padding_loc7_1,1683 +padding_loc9_1,1684 +padding_loc9_2,1685 +padding_local11_1,1686 +padding_local1_1,1687 +padding_local1_31,1688 +padding_local40_1,1689 +padding_local_35,1690 +padding_local_7_1,1691 +padding_sec1_loc,1692 +padding_sec2_1,1693 +padding_sec2_2,1694 +padding_sec2_3,1695 +padding_sec3_1,1696 +padding_sec4_1,1697 +paleontologicalOffset,1698 +param,1699 +paramId,1700 +paramIdECMF,1701 +paramIdLegacyECMF,1702 +paramType,1703 +param_value_max,1704 +param_value_min,1705 +parameter,1706 +parameterCategory,1707 +parameterCode,1708 +parameterDiscipline,1709 +parameterIndicator,1710 +parameterName,1711 +parameterNumber,1712 +parameterUnits,1713 +parameters,1714 +parametersVersion,1715 +paramtype,1716 +partitionItems,1717 +partitionNumber,1718 +partitionTable,1719 +partitions,1720 +pastTendencyRVR1,1721 +pastTendencyRVR2,1722 +pastTendencyRVR3,1723 +pastTendencyRVR4,1724 +patch_precip_fp,1725 +pentagonalResolutionParameterJ,1726 +pentagonalResolutionParameterK,1727 +pentagonalResolutionParameterM,1728 +percentileValue,1729 +periodOfTime,1730 +periodOfTimeIntervals,1731 +perturbationNumber,1732 +perturbedType,1733 +phase,1734 +physicalFlag1,1735 +physicalFlag2,1736 +physicalMeaningOfVerticalCoordinate,1737 +pl,1738 +platform,1739 +plusOneinOrdersOfSPD,1740 +points,1741 +pointsOrdering,1742 +postAuxiliary,1743 +postAuxiliaryArrayPresent,1744 +postProcessing,1745 +powerOfTenUsedToScaleClimateWeight,1746 +preBitmapValues,1747 +preProcessingParameter,1748 +precision,1749 +precisionOfTheUnpackedSubset,1750 +predefined_grid,1751 +predefined_grid_values,1752 +preferLocalConcepts,1753 +present,1754 +presentTrend1,1755 +presentTrend2,1756 +presentTrend3,1757 +presentTrend4,1758 +presentWeather1Present,1759 +presentWeather1PresentTrend1,1760 +presentWeather1PresentTrend2,1761 +presentWeather1PresentTrend3,1762 +presentWeather1PresentTrend4,1763 +presentWeather2Present,1764 +presentWeather2PresentTrend1,1765 +presentWeather2PresentTrend2,1766 +presentWeather2PresentTrend3,1767 +presentWeather2PresentTrend4,1768 +presentWeather3Present,1769 +presentWeather3PresentTrend1,1770 +presentWeather3PresentTrend2,1771 +presentWeather3PresentTrend3,1772 +presentWeather3PresentTrend4,1773 +pressureLevel,1774 +pressureUnits,1775 +primaryBitmap,1776 +primaryMissingValue,1777 +primaryMissingValueSubstitute,1778 +probContinous,1779 +probPoint,1780 +probProductDefinition,1781 +probabilityType,1782 +probabilityTypeName,1783 +process,1784 +produceLargeConstantFields,1785 +product,1786 +productDefinition,1787 +productDefinitionTemplateNumber,1788 +productDefinitionTemplateNumberInternal,1789 +productIdentifier,1790 +productType,1791 +productionStatusOfProcessedData,1792 +projSourceString,1793 +projString,1794 +projTargetString,1795 +projectLocalTemplate,1796 +projectLocalTemplateNumber,1797 +projectionCenterFlag,1798 +projectionCentreFlag,1799 +pv,1800 +pvlLocation,1801 +qfe,1802 +qfePresent,1803 +qfeUnits,1804 +qnh,1805 +qnhAPresent,1806 +qnhPresent,1807 +qnhUnits,1808 +qualityControl,1809 +qualityControlIndicator,1810 +qualityValueAssociatedWithParameter,1811 +quantile,1812 +quantileValue,1813 +radialAngularSpacing,1814 +radials,1815 +radius,1816 +radiusInMetres,1817 +radiusOfCentralCluster,1818 +radiusOfClusterDomain,1819 +radiusOfTheEarth,1820 +range,1821 +rangeBinSpacing,1822 +rdbDateTime,1823 +rdbSubtype,1824 +rdbType,1825 +rdb_key,1826 +rdbtime,1827 +rdbtimeDate,1828 +rdbtimeDay,1829 +rdbtimeHour,1830 +rdbtimeMinute,1831 +rdbtimeMonth,1832 +rdbtimeSecond,1833 +rdbtimeTime,1834 +rdbtimeYear,1835 +realPart,1836 +realPartOf00,1837 +realization,1838 +recDateTime,1839 +recentWeather,1840 +recentWeatherTry,1841 +rectime,1842 +rectimeDay,1843 +rectimeHour,1844 +rectimeMinute,1845 +rectimeSecond,1846 +reducedGrid,1847 +refdate,1848 +reference,1849 +referenceDate,1850 +referenceForGroupLengths,1851 +referenceForGroupWidths,1852 +referenceOfLengths,1853 +referenceOfWidths,1854 +referencePeriodList,1855 +referenceReflectivityForEchoTop,1856 +referenceSampleInterval,1857 +referenceStep,1858 +referenceValue,1859 +referenceValueError,1860 +reflectivityCalibrationConstant,1861 +remarkPresent,1862 +reportType,1863 +representationMode,1864 +representationType,1865 +representativeMember,1866 +reserved,1867 +reserved1,1868 +reserved2,1869 +reserved3,1870 +reservedNeedNotBePresent,1871 +reservedOctet,1872 +reservedSection2,1873 +reservedSection3,1874 +reservedSection4,1875 +resolution,1876 +resolutionAndComponentFlags,1877 +resolutionAndComponentFlags1,1878 +resolutionAndComponentFlags2,1879 +resolutionAndComponentFlags3,1880 +resolutionAndComponentFlags4,1881 +resolutionAndComponentFlags6,1882 +resolutionAndComponentFlags7,1883 +resolutionAndComponentFlags8,1884 +restricted,1885 +rootGroupObjectHeaderAddress,1886 +rootGroupSymbolTableEntry,1887 +rootTablesDir,1888 +roundedMarsLatitude,1889 +roundedMarsLevelist,1890 +roundedMarsLongitude,1891 +runwayBrakingActionState1,1892 +runwayBrakingActionState2,1893 +runwayBrakingActionState3,1894 +runwayBrakingActionState4,1895 +runwayDepositCodeState1,1896 +runwayDepositCodeState2,1897 +runwayDepositCodeState3,1898 +runwayDepositCodeState4,1899 +runwayDepositState1,1900 +runwayDepositState2,1901 +runwayDepositState3,1902 +runwayDepositState4,1903 +runwayDepthOfDepositCodeState1,1904 +runwayDepthOfDepositCodeState2,1905 +runwayDepthOfDepositCodeState3,1906 +runwayDepthOfDepositCodeState4,1907 +runwayDepthOfDepositState1,1908 +runwayDepthOfDepositState2,1909 +runwayDepthOfDepositState3,1910 +runwayDepthOfDepositState4,1911 +runwayDesignatorRVR1,1912 +runwayDesignatorRVR2,1913 +runwayDesignatorRVR3,1914 +runwayDesignatorRVR4,1915 +runwayDesignatorState1,1916 +runwayDesignatorState2,1917 +runwayDesignatorState3,1918 +runwayDesignatorState4,1919 +runwayExtentOfContaminationCodeState1,1920 +runwayExtentOfContaminationCodeState2,1921 +runwayExtentOfContaminationCodeState3,1922 +runwayExtentOfContaminationCodeState4,1923 +runwayExtentOfContaminationState1,1924 +runwayExtentOfContaminationState2,1925 +runwayExtentOfContaminationState3,1926 +runwayExtentOfContaminationState4,1927 +runwayFrictionCodeValueState1,1928 +runwayFrictionCodeValueState2,1929 +runwayFrictionCodeValueState3,1930 +runwayFrictionCodeValueState4,1931 +runwayFrictionCoefficientCodeState1,1932 +runwayFrictionCoefficientCodeState2,1933 +runwayFrictionCoefficientCodeState3,1934 +runwayFrictionCoefficientCodeState4,1935 +runwayFrictionCoefficientState1,1936 +runwayFrictionCoefficientState2,1937 +runwayFrictionCoefficientState3,1938 +runwayFrictionCoefficientState4,1939 +runwaySideCodeState1,1940 +runwaySideCodeState2,1941 +runwaySideCodeState3,1942 +runwaySideCodeState4,1943 +runwayState,1944 +sampleSizeOfModelClimate,1945 +sampleSizeOfReferencePeriod,1946 +satelliteID,1947 +satelliteIdentifier,1948 +satelliteNumber,1949 +satelliteSeries,1950 +scaleFactorAtReferencePoint,1951 +scaleFactorOfAdditionalParameterForReferencePeriod,1952 +scaleFactorOfCentralWaveNumber,1953 +scaleFactorOfDistanceFromEnsembleMean,1954 +scaleFactorOfDistributionFunctionParameter,1955 +scaleFactorOfEarthMajorAxis,1956 +scaleFactorOfEarthMinorAxis,1957 +scaleFactorOfFirstFixedSurface,1958 +scaleFactorOfFirstSize,1959 +scaleFactorOfFirstWavelength,1960 +scaleFactorOfLengthOfSemiMajorAxis,1961 +scaleFactorOfLengthOfSemiMinorAxis,1962 +scaleFactorOfLowerLimit,1963 +scaleFactorOfLowerWavePeriodLimit,1964 +scaleFactorOfMajorAxisOfOblateSpheroidEarth,1965 +scaleFactorOfMinorAxisOfOblateSpheroidEarth,1966 +scaleFactorOfPrimeMeridianOffset,1967 +scaleFactorOfRadiusOfSphericalEarth,1968 +scaleFactorOfSecondFixedSurface,1969 +scaleFactorOfSecondSize,1970 +scaleFactorOfSecondWavelength,1971 +scaleFactorOfStandardDeviation,1972 +scaleFactorOfStandardDeviationInTheCluster,1973 +scaleFactorOfUpperLimit,1974 +scaleFactorOfUpperWavePeriodLimit,1975 +scaleFactorOfWaveDirectionSequenceParameter,1976 +scaleFactorOfWaveDirections,1977 +scaleFactorOfWaveFrequencies,1978 +scaleFactorOfWaveFrequencySequenceParameter,1979 +scaleValuesBy,1980 +scaledDirections,1981 +scaledFrequencies,1982 +scaledValueOfAdditionalParameterForReferencePeriod,1983 +scaledValueOfCentralWaveNumber,1984 +scaledValueOfDistanceFromEnsembleMean,1985 +scaledValueOfDistributionFunctionParameter,1986 +scaledValueOfEarthMajorAxis,1987 +scaledValueOfEarthMinorAxis,1988 +scaledValueOfFirstFixedSurface,1989 +scaledValueOfFirstSize,1990 +scaledValueOfFirstWavelength,1991 +scaledValueOfLengthOfSemiMajorAxis,1992 +scaledValueOfLengthOfSemiMinorAxis,1993 +scaledValueOfLowerLimit,1994 +scaledValueOfLowerWavePeriodLimit,1995 +scaledValueOfMajorAxisOfOblateSpheroidEarth,1996 +scaledValueOfMinorAxisOfOblateSpheroidEarth,1997 +scaledValueOfPrimeMeridianOffset,1998 +scaledValueOfRadiusOfSphericalEarth,1999 +scaledValueOfSecondFixedSurface,2000 +scaledValueOfSecondSize,2001 +scaledValueOfSecondWavelength,2002 +scaledValueOfStandardDeviation,2003 +scaledValueOfStandardDeviationInTheCluster,2004 +scaledValueOfUpperLimit,2005 +scaledValueOfUpperWavePeriodLimit,2006 +scaledValueOfWaveDirectionSequenceParameter,2007 +scaledValueOfWaveFrequencySequenceParameter,2008 +scaledValuesOfWaveDirections,2009 +scaledValuesOfWaveFrequencies,2010 +scalingFactorForFrequencies,2011 +scanPosition,2012 +scanningMode,2013 +scanningMode4,2014 +scanningMode5,2015 +scanningMode6,2016 +scanningMode7,2017 +scanningMode8,2018 +scanningModeForOneDiamond,2019 +sd,2020 +second,2021 +secondDimension,2022 +secondDimensionCoordinateValueDefinition,2023 +secondDimensionPhysicalSignificance,2024 +secondLatitude,2025 +secondLatitudeInDegrees,2026 +secondOfEndOfOverallTimeInterval,2027 +secondOfForecast,2028 +secondOfForecastUsedInLocalTime,2029 +secondOfModelVersion,2030 +secondOfStartOfReferencePeriod,2031 +secondOrderFlags,2032 +secondOrderOfDifferentWidth,2033 +secondOrderValuesDifferentWidths,2034 +secondSize,2035 +secondaryBitMap,2036 +secondaryBitmap,2037 +secondaryBitmapPresent,2038 +secondaryBitmaps,2039 +secondaryBitmapsCount,2040 +secondaryBitmapsSize,2041 +secondaryMissingValue,2042 +secondaryMissingValueSubstitute,2043 +secondsOfAnalysis,2044 +secondsOfReference,2045 +section,2046 +section0Length,2047 +section0Pointer,2048 +section1,2049 +section10Length,2050 +section10Pointer,2051 +section11Length,2052 +section11Pointer,2053 +section1Flags,2054 +section1Length,2055 +section1Padding,2056 +section1Pointer,2057 +section2Length,2058 +section2Padding,2059 +section2Pointer,2060 +section2Present,2061 +section2Used,2062 +section3Flags,2063 +section3Length,2064 +section3Padding,2065 +section3Pointer,2066 +section3UniqueIdentifier,2067 +section4,2068 +section4Length,2069 +section4Padding,2070 +section4Pointer,2071 +section4UniqueIdentifier,2072 +section5,2073 +section5Length,2074 +section5Pointer,2075 +section5UniqueIdentifier,2076 +section6,2077 +section6Length,2078 +section6Pointer,2079 +section6UniqueIdentifier,2080 +section7,2081 +section7Length,2082 +section7Pointer,2083 +section7UniqueIdentifier,2084 +section8,2085 +section8Length,2086 +section8Pointer,2087 +section8UniqueIdentifier,2088 +section9Length,2089 +section9Pointer,2090 +section9UniqueIdentifier,2091 +sectionLengthLimitForEnsembles,2092 +sectionLengthLimitForProbability,2093 +sectionNumber,2094 +sectionPosition,2095 +section_01,2096 +section_02,2097 +section_03,2098 +section_04,2099 +section_05,2100 +section_06,2101 +section_07,2102 +section_08,2103 +section_09,2104 +section_1,2105 +section_10,2106 +section_11,2107 +section_2,2108 +section_3,2109 +section_4,2110 +section_5,2111 +section_6,2112 +section_7,2113 +section_8,2114 +selectStepTemplateInstant,2115 +selectStepTemplateInterval,2116 +selectedDay,2117 +selectedFcIndex,2118 +selectedHour,2119 +selectedMinute,2120 +selectedMonth,2121 +selectedSecond,2122 +selectedYear,2123 +sensitiveAreaDomain,2124 +sequences,2125 +setBitsPerValue,2126 +setCalendarId,2127 +setDecimalPrecision,2128 +setLocalDefinition,2129 +setPackingType,2130 +setToMissingIfOutOfRange,2131 +sfc_levtype,2132 +shapeOfTheEarth,2133 +shapeOfVerificationArea,2134 +shortName,2135 +shortNameECMF,2136 +shortNameLegacyECMF,2137 +short_name,2138 +signature,2139 +significanceOfReferenceDateAndTime,2140 +significanceOfReferenceTime,2141 +simpleThinningMissingRadius,2142 +simpleThinningSkip,2143 +simpleThinningStart,2144 +siteElevation,2145 +siteId,2146 +siteLatitude,2147 +siteLongitude,2148 +sizeOfLength,2149 +sizeOfOffsets,2150 +sizeOfPostAuxiliaryArray,2151 +sizeOfPostAuxiliaryArrayPlusOne,2152 +skew,2153 +skewness,2154 +skipExtraKeyAttributes,2155 +sort,2156 +sourceOfGridDefinition,2157 +sourceSinkChemicalPhysicalProcess,2158 +southEastLatitudeOfLPOArea,2159 +southEastLatitudeOfVerficationArea,2160 +southEastLongitudeOfLPOArea,2161 +southEastLongitudeOfVerficationArea,2162 +southLatitudeOfCluster,2163 +southLatitudeOfDomainOfTubing,2164 +southPoleOnProjectionPlane,2165 +southernLatitudeOfClusterDomain,2166 +southernLatitudeOfDomain,2167 +sp1,2168 +sp2,2169 +sp3,2170 +spaceUnitFlag,2171 +spacingOfBinsAlongRadials,2172 +spare,2173 +spare1,2174 +spare2,2175 +spare3,2176 +spare4,2177 +spatialProcessing,2178 +spatialSmoothingOfProduct,2179 +spectralDataRepresentationMode,2180 +spectralDataRepresentationType,2181 +spectralMode,2182 +spectralType,2183 +sphericalHarmonics,2184 +standardDeviation,2185 +standardParallel,2186 +standardParallelInDegrees,2187 +standardParallelInMicrodegrees,2188 +startDateOfReferencePeriod,2189 +startOfHeaders,2190 +startOfMessage,2191 +startOfRange,2192 +startStep,2193 +startStepInHours,2194 +startStepUnit,2195 +startTimeStep,2196 +startingAzimuth,2197 +statisticalProcess,2198 +statisticalProcessesList,2199 +statistics,2200 +status,2201 +step,2202 +stepForClustering,2203 +stepHumanReadable,2204 +stepInHours,2205 +stepRange,2206 +stepRangeInHours,2207 +stepType,2208 +stepTypeForConversion,2209 +stepTypeInternal,2210 +stepUnits,2211 +stepZero,2212 +stepunits,2213 +stream,2214 +streamOfAnalysis,2215 +stretchingFactor,2216 +stretchingFactorScaled,2217 +stringValues,2218 +subCentre,2219 +subDefinitions1,2220 +subDefinitions2,2221 +subLocalDefinition1,2222 +subLocalDefinition2,2223 +subLocalDefinitionLength1,2224 +subLocalDefinitionLength2,2225 +subLocalDefinitionNumber1,2226 +subLocalDefinitionNumber2,2227 +subSetJ,2228 +subSetK,2229 +subSetM,2230 +subcentreOfAnalysis,2231 +subdivisionsOfBasicAngle,2232 +suiteName,2233 +superblockExtensionAddress,2234 +swapScanningAlternativeRows,2235 +swapScanningLat,2236 +swapScanningLon,2237 +swapScanningX,2238 +swapScanningY,2239 +system,2240 +systemNumber,2241 +t,2242 +table2Version,2243 +tableCode,2244 +tableNumber,2245 +tableReference,2246 +tablesLocalDir,2247 +tablesMasterDir,2248 +tablesVersion,2249 +tablesVersionLatest,2250 +tablesVersionLatestOfficial,2251 +targetCompressionRatio,2252 +td,2253 +tempPressureUnits,2254 +temperature,2255 +temperatureAndDewpointPresent,2256 +templatesLocalDir,2257 +templatesMasterDir,2258 +theHindcastMarsStream,2259 +theMessage,2260 +thisExperimentVersionNumber,2261 +thisMarsClass,2262 +thisMarsStream,2263 +thisMarsType,2264 +thousand,2265 +three,2266 +threshold,2267 +thresholdIndicator,2268 +tiggeCentre,2269 +tiggeLAMName,2270 +tiggeLocalVersion,2271 +tiggeModel,2272 +tiggeSection,2273 +tiggeSuiteID,2274 +tigge_name,2275 +tigge_short_name,2276 +tile,2277 +tileAttribute,2278 +tileClassification,2279 +tileGrouping,2280 +tileIndex,2281 +tileName,2282 +time,2283 +timeCoordinateDefinition,2284 +timeDomainTemplate,2285 +timeDomainTemplateNumber,2286 +timeIncrement,2287 +timeIncrementBetweenSuccessiveFields,2288 +timeOfAnalysis,2289 +timeOfForecast,2290 +timeOfForecastUsedInLocalTime,2291 +timeOfModelVersion,2292 +timeOfReference,2293 +timeRangeIndicator,2294 +timeRangeIndicatorFromStepRange,2295 +timeUnitFlag,2296 +timerepres,2297 +topLevel,2298 +total,2299 +totalAerosolBinsNumbers,2300 +totalInitialConditions,2301 +totalLength,2302 +totalNumber,2303 +totalNumberOfClusters,2304 +totalNumberOfDataValuesMissingInStatisticalProcess,2305 +totalNumberOfDirections,2306 +totalNumberOfForecastProbabilities,2307 +totalNumberOfFrequencies,2308 +totalNumberOfGridPoints,2309 +totalNumberOfIterations,2310 +totalNumberOfQuantiles,2311 +totalNumberOfRepetitions,2312 +totalNumberOfTileAttributeCombinations,2313 +totalNumberOfTileAttributePairs,2314 +totalNumberOfTubes,2315 +totalNumberOfValuesInUnpackedSubset,2316 +totalNumberOfWaveDirections,2317 +totalNumberOfWaveFrequencies,2318 +totalNumberOfdimensions,2319 +totalTileAttCombo,2320 +treatmentOfMissingData,2321 +true,2322 +trueLengthOfLastGroup,2323 +truncateDegrees,2324 +truncateLaplacian,2325 +tsectionNumber3,2326 +tsectionNumber4,2327 +tsectionNumber5,2328 +tubeDomain,2329 +tubeNumber,2330 +two,2331 +twoOrdersOfSPD,2332 +type,2333 +typeOfAnalysis,2334 +typeOfAuxiliaryInformation,2335 +typeOfCalendar,2336 +typeOfCompressionUsed,2337 +typeOfDistributionFunction,2338 +typeOfEnsembleForecast,2339 +typeOfEnsembleMember,2340 +typeOfFirstFixedSurface,2341 +typeOfGeneratingProcess,2342 +typeOfGrid,2343 +typeOfHorizontalLine,2344 +typeOfIntervalForFirstAndSecondSize,2345 +typeOfIntervalForFirstAndSecondWavelength,2346 +typeOfLevel,2347 +typeOfLevelECMF,2348 +typeOfOriginalFieldValues,2349 +typeOfPacking,2350 +typeOfPostProcessing,2351 +typeOfPreProcessing,2352 +typeOfProcessedData,2353 +typeOfReferenceDataset,2354 +typeOfRelationToReferenceDataset,2355 +typeOfSSTFieldUsed,2356 +typeOfSecondFixedSurface,2357 +typeOfSizeInterval,2358 +typeOfStatisticalPostProcessingOfEnsembleMembers,2359 +typeOfStatisticalProcessing,2360 +typeOfStatisticalProcessingForTimeRangeForReferencePeriod,2361 +typeOfTile,2362 +typeOfTimeIncrement,2363 +typeOfTimeIncrementBetweenSuccessiveFieldsUsedInTheStatisticalProcessing,2364 +typeOfWaveDirectionSequence,2365 +typeOfWaveFrequencySequence,2366 +typeOfWavePeriodInterval,2367 +typeOfWavelengthInterval,2368 +typicalCentury,2369 +typicalDate,2370 +typicalDateTime,2371 +typicalDay,2372 +typicalHour,2373 +typicalMinute,2374 +typicalMonth,2375 +typicalSecond,2376 +typicalTime,2377 +typicalYear,2378 +typicalYear2,2379 +typicalYearOfCentury,2380 +uco,2381 +ucs,2382 +uerraLocalVersion,2383 +uerraSection,2384 +unexpandedDescriptors,2385 +unexpandedDescriptorsEncoded,2386 +unitOfOffsetFromReferenceTime,2387 +unitOfTime,2388 +unitOfTimeIncrement,2389 +unitOfTimeRange,2390 +units,2391 +unitsBias,2392 +unitsConversionOffset,2393 +unitsConversionScaleFactor,2394 +unitsDecimalScaleFactor,2395 +unitsECMF,2396 +unitsFactor,2397 +unitsLegacyECMF,2398 +unitsOfFirstFixedSurface,2399 +unitsOfSecondFixedSurface,2400 +unknown,2401 +unpack,2402 +unpackedError,2403 +unpackedSubsetPrecision,2404 +unpackedValues,2405 +unsignedIntegers,2406 +unstructuredGrid,2407 +unstructuredGridSubtype,2408 +unstructuredGridType,2409 +unstructuredGridUUID,2410 +unusedBitsInBitmap,2411 +updateSequenceNumber,2412 +upperLimit,2413 +upperRange,2414 +upperThreshold,2415 +upperThresholdValue,2416 +userDateEnd,2417 +userDateStart,2418 +userDateTimeEnd,2419 +userDateTimeStart,2420 +userTimeEnd,2421 +userTimeStart,2422 +uuid,2423 +uuidOfDataGroup,2424 +uuidOfHGrid,2425 +uuidOfVGrid,2426 +uvRelativeToGrid,2427 +validityDate,2428 +validityDateTime,2429 +validityTime,2430 +values,2431 +variationOfVisibility,2432 +variationOfVisibilityDirection,2433 +variationOfVisibilityDirectionAngle,2434 +variationOfVisibilityDirectionTrend1,2435 +variationOfVisibilityDirectionTrend2,2436 +variationOfVisibilityDirectionTrend3,2437 +variationOfVisibilityDirectionTrend4,2438 +variationOfVisibilityTrend1,2439 +variationOfVisibilityTrend2,2440 +variationOfVisibilityTrend3,2441 +variationOfVisibilityTrend4,2442 +varno,2443 +verificationDate,2444 +verificationMonth,2445 +verificationYear,2446 +verifyingMonth,2447 +version,2448 +versionNumOfFilesFreeSpaceStorage,2449 +versionNumOfRootGroupSymbolTableEntry,2450 +versionNumOfSharedHeaderMessageFormat,2451 +versionNumberOfExperimentalSuite,2452 +versionNumberOfGribLocalTables,2453 +versionNumberOfSuperblock,2454 +versionOfModelClimate,2455 +verticalCoordinate,2456 +verticalCoordinateDefinition,2457 +verticalDomainTemplate,2458 +verticalDomainTemplateNumber,2459 +verticalVisibility,2460 +verticalVisibilityCoded,2461 +visibility,2462 +visibilityInKilometresTrend1,2463 +visibilityInKilometresTrend2,2464 +visibilityInKilometresTrend3,2465 +visibilityInKilometresTrend4,2466 +visibilityTrend1,2467 +visibilityTrend2,2468 +visibilityTrend3,2469 +visibilityTrend4,2470 +waveDirectionNumber,2471 +waveDomain,2472 +waveFrequencyNumber,2473 +waveLevType,2474 +weightAppliedToClimateMonth1,2475 +westLongitudeOfCluster,2476 +westLongitudeOfDomainOfTubing,2477 +westernLongitudeOfClusterDomain,2478 +westernLongitudeOfDomain,2479 +widthOfFirstOrderValues,2480 +widthOfLengths,2481 +widthOfSPD,2482 +widthOfWidths,2483 +windDirection,2484 +windDirectionTrend1,2485 +windDirectionTrend2,2486 +windDirectionTrend3,2487 +windDirectionTrend4,2488 +windGust,2489 +windGustTrend1,2490 +windGustTrend2,2491 +windGustTrend3,2492 +windGustTrend4,2493 +windPresent,2494 +windSpeed,2495 +windSpeedTrend1,2496 +windSpeedTrend2,2497 +windSpeedTrend3,2498 +windSpeedTrend4,2499 +windUnits,2500 +windUnitsTrend1,2501 +windUnitsTrend2,2502 +windUnitsTrend3,2503 +windUnitsTrend4,2504 +windVariableDirection,2505 +windVariableDirectionTrend1,2506 +windVariableDirectionTrend2,2507 +windVariableDirectionTrend3,2508 +windVariableDirectionTrend4,2509 +wrongPadding,2510 +xCoordinateOfOriginOfSectorImage,2511 +xCoordinateOfSubSatellitePoint,2512 +xDirectionGridLength,2513 +xDirectionGridLengthInMetres,2514 +xDirectionGridLengthInMillimetres,2515 +xFirst,2516 +xLast,2517 +yCoordinateOfOriginOfSectorImage,2518 +yCoordinateOfSubSatellitePoint,2519 +yDirectionGridLength,2520 +yDirectionGridLengthInMetres,2521 +yDirectionGridLengthInMillimetres,2522 +yFirst,2523 +yLast,2524 +year,2525 +yearOfAnalysis,2526 +yearOfCentury,2527 +yearOfEndOfOverallTimeInterval,2528 +yearOfForecast,2529 +yearOfForecastUsedInLocalTime,2530 +yearOfModelVersion,2531 +yearOfReference,2532 +yearOfStartOfReferencePeriod,2533 +zero,2534 +zeros,2535 From 5e2670ea884b8fd77413e3cf7ea4232e4a3f3dc4 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 7 Feb 2024 19:18:42 +0000 Subject: [PATCH 008/244] Dead code removal --- src/eccodes_prototypes.h | 1 - src/grib_query.cc | 30 ++++++++++++++---------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 2d3ddab7d..b072d5191 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1097,7 +1097,6 @@ int grib_type_to_int(char id); grib_accessors_list* grib_find_accessors_list(const grib_handle* h, const char* name); char* grib_split_name_attribute(grib_context* c, const char* name, char* attribute_name); grib_accessor* grib_find_accessor(const grib_handle* h, const char* name); -grib_accessor* grib_find_attribute(grib_handle* h, const char* name, const char* attr_name, int* err); grib_accessor* grib_find_accessor_fast(grib_handle* h, const char* name); /* grib_scaling.cc*/ diff --git a/src/grib_query.cc b/src/grib_query.cc index 634f0e600..253217c0b 100644 --- a/src/grib_query.cc +++ b/src/grib_query.cc @@ -592,22 +592,20 @@ grib_accessor* grib_find_accessor(const grib_handle* h, const char* name) return aret; } -grib_accessor* grib_find_attribute(grib_handle* h, const char* name, const char* attr_name, int* err) -{ - grib_accessor* a = NULL; - grib_accessor* act = NULL; - - if ((a = grib_find_accessor(h, name)) == NULL) { - *err = GRIB_NOT_FOUND; - return NULL; - } - - if ((act = grib_accessor_get_attribute(a, attr_name)) == NULL) { - *err = GRIB_ATTRIBUTE_NOT_FOUND; - return NULL; - } - return act; -} +// grib_accessor* grib_find_attribute(grib_handle* h, const char* name, const char* attr_name, int* err) +// { +// grib_accessor* a = NULL; +// grib_accessor* act = NULL; +// if ((a = grib_find_accessor(h, name)) == NULL) { +// *err = GRIB_NOT_FOUND; +// return NULL; +// } +// if ((act = grib_accessor_get_attribute(a, attr_name)) == NULL) { +// *err = GRIB_ATTRIBUTE_NOT_FOUND; +// return NULL; +// } +// return act; +// } /* Only look in trie. Used only in alias. Should not be used in other cases.*/ grib_accessor* grib_find_accessor_fast(grib_handle* h, const char* name) From dda8471d838ddfd48b311ae1c21d9a1bff7ea79e Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 7 Feb 2024 19:19:08 +0000 Subject: [PATCH 009/244] Testing: grib_handle_new_from_partial_message_copy --- tests/grib_partial_message.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/grib_partial_message.cc b/tests/grib_partial_message.cc index e2030b478..954d93bc6 100644 --- a/tests/grib_partial_message.cc +++ b/tests/grib_partial_message.cc @@ -48,6 +48,10 @@ int main(int argc, char** argv) grib_keys_iterator_delete(iter); grib_handle_delete(h_partial); + + h_partial = grib_handle_new_from_partial_message_copy(h_full->context, msg1, size1); + grib_handle_delete(h_partial); + grib_handle_delete(h_full); fclose(in); return 0; From 3722e3bfa0058048ef40e7c8edfcac8508f30fb4 Mon Sep 17 00:00:00 2001 From: Sebastien Villaume Date: Fri, 9 Feb 2024 11:37:03 +0000 Subject: [PATCH 010/244] adding a switch to stepRange instead of step for levtypes o2d and o3d for mmsf/fc --- definitions/mars/grib.mmsf.fc.def | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/definitions/mars/grib.mmsf.fc.def b/definitions/mars/grib.mmsf.fc.def index d213cee45..7adb27059 100644 --- a/definitions/mars/grib.mmsf.fc.def +++ b/definitions/mars/grib.mmsf.fc.def @@ -17,3 +17,9 @@ if (centre == 80 && subCentre == 98 && class is "c3") { } if (class is "ci") { unalias mars.method; } + +if (levtype is "o2d" || levtype is "o3d") { + alias mars.step = stepRange; +} else { + alias mars.step = endStep; +} From 10b39f703c422800f9fbc8b968c5f9e699f0dd32 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Fri, 9 Feb 2024 15:08:00 +0000 Subject: [PATCH 011/244] ECC-1765: GRIB2: Move upward sea water velocity encoding to correct typeOfLevel --- definitions/grib2/cfVarName.def | 8 ++++++-- definitions/grib2/cfVarName.legacy.def | 17 +++++++++++++++++ definitions/grib2/name.def | 8 ++++++-- definitions/grib2/name.legacy.def | 17 +++++++++++++++++ definitions/grib2/paramId.def | 8 ++++++-- definitions/grib2/paramId.legacy.def | 17 +++++++++++++++++ definitions/grib2/shortName.def | 8 ++++++-- definitions/grib2/shortName.legacy.def | 17 +++++++++++++++++ definitions/grib2/units.def | 8 ++++++-- definitions/grib2/units.legacy.def | 17 +++++++++++++++++ 10 files changed, 115 insertions(+), 10 deletions(-) diff --git a/definitions/grib2/cfVarName.def b/definitions/grib2/cfVarName.def index 3a2f1f247..889c839e3 100644 --- a/definitions/grib2/cfVarName.def +++ b/definitions/grib2/cfVarName.def @@ -7841,7 +7841,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; } #Sea water potential temperature tendency due to newtonian relaxation 'thetaodmp' = { @@ -9028,7 +9030,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; } #Time-mean sea water potential temperature tendency due to newtonian relaxation diff --git a/definitions/grib2/cfVarName.legacy.def b/definitions/grib2/cfVarName.legacy.def index 40534b276..38c2868e6 100644 --- a/definitions/grib2/cfVarName.legacy.def +++ b/definitions/grib2/cfVarName.legacy.def @@ -157,3 +157,20 @@ typeOfStatisticalProcessing = 1 ; lengthOfTimeRange = 24 ; } +#Upward sea water velocity +'wo' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; +} +#Time-mean upward sea water velocity +'avg_wo' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; + typeOfStatisticalProcessing = 0 ; +} diff --git a/definitions/grib2/name.def b/definitions/grib2/name.def index 2a8c0a64b..b3b91952a 100644 --- a/definitions/grib2/name.def +++ b/definitions/grib2/name.def @@ -7841,7 +7841,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; } #Sea water potential temperature tendency due to newtonian relaxation 'Sea water potential temperature tendency due to newtonian relaxation' = { @@ -9028,7 +9030,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; } #Time-mean sea water potential temperature tendency due to newtonian relaxation diff --git a/definitions/grib2/name.legacy.def b/definitions/grib2/name.legacy.def index 62e965b1c..d55237eb9 100644 --- a/definitions/grib2/name.legacy.def +++ b/definitions/grib2/name.legacy.def @@ -157,3 +157,20 @@ typeOfStatisticalProcessing = 1 ; lengthOfTimeRange = 24 ; } +#Upward sea water velocity +'Upward sea water velocity' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; +} +#Time-mean upward sea water velocity +'Time-mean upward sea water velocity' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; + typeOfStatisticalProcessing = 0 ; +} diff --git a/definitions/grib2/paramId.def b/definitions/grib2/paramId.def index 453a51920..4c79c56a5 100644 --- a/definitions/grib2/paramId.def +++ b/definitions/grib2/paramId.def @@ -7841,7 +7841,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; } #Sea water potential temperature tendency due to newtonian relaxation '262508' = { @@ -9028,7 +9030,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; } #Time-mean sea water potential temperature tendency due to newtonian relaxation diff --git a/definitions/grib2/paramId.legacy.def b/definitions/grib2/paramId.legacy.def index 489f33c41..ad0ba7521 100644 --- a/definitions/grib2/paramId.legacy.def +++ b/definitions/grib2/paramId.legacy.def @@ -157,3 +157,20 @@ typeOfStatisticalProcessing = 1 ; lengthOfTimeRange = 24 ; } +#Upward sea water velocity +'262507' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; +} +#Time-mean upward sea water velocity +'263507' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; + typeOfStatisticalProcessing = 0 ; +} diff --git a/definitions/grib2/shortName.def b/definitions/grib2/shortName.def index 806350301..614a8454d 100644 --- a/definitions/grib2/shortName.def +++ b/definitions/grib2/shortName.def @@ -7841,7 +7841,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; } #Sea water potential temperature tendency due to newtonian relaxation 'thetaodmp' = { @@ -9028,7 +9030,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; } #Time-mean sea water potential temperature tendency due to newtonian relaxation diff --git a/definitions/grib2/shortName.legacy.def b/definitions/grib2/shortName.legacy.def index 40534b276..38c2868e6 100644 --- a/definitions/grib2/shortName.legacy.def +++ b/definitions/grib2/shortName.legacy.def @@ -157,3 +157,20 @@ typeOfStatisticalProcessing = 1 ; lengthOfTimeRange = 24 ; } +#Upward sea water velocity +'wo' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; +} +#Time-mean upward sea water velocity +'avg_wo' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; + typeOfStatisticalProcessing = 0 ; +} diff --git a/definitions/grib2/units.def b/definitions/grib2/units.def index 411ec5996..d96d6bd9e 100644 --- a/definitions/grib2/units.def +++ b/definitions/grib2/units.def @@ -7841,7 +7841,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; } #Sea water potential temperature tendency due to newtonian relaxation 'K s**-1' = { @@ -9028,7 +9030,9 @@ parameterCategory = 4 ; parameterNumber = 27 ; typeOfFirstFixedSurface = 168 ; - typeOfSecondFixedSurface = 168 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfSecondFixedSurface = missing() ; + scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; } #Time-mean sea water potential temperature tendency due to newtonian relaxation diff --git a/definitions/grib2/units.legacy.def b/definitions/grib2/units.legacy.def index 145f4aaac..f05dae694 100644 --- a/definitions/grib2/units.legacy.def +++ b/definitions/grib2/units.legacy.def @@ -157,3 +157,20 @@ typeOfStatisticalProcessing = 1 ; lengthOfTimeRange = 24 ; } +#Upward sea water velocity +'m s**-1' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; +} +#Time-mean upward sea water velocity +'m s**-1' = { + discipline = 10 ; + parameterCategory = 4 ; + parameterNumber = 27 ; + typeOfFirstFixedSurface = 168 ; + typeOfSecondFixedSurface = 168 ; + typeOfStatisticalProcessing = 0 ; +} From 653e777275df8e1a16db01b59e978fe9d6605a22 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 12 Feb 2024 14:59:53 +0000 Subject: [PATCH 012/244] Leonardo HPC test failures --- examples/F90/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/F90/CMakeLists.txt b/examples/F90/CMakeLists.txt index e4104bd83..30a3de0e9 100644 --- a/examples/F90/CMakeLists.txt +++ b/examples/F90/CMakeLists.txt @@ -56,7 +56,6 @@ if( HAVE_BUILD_TOOLS ) grib_clone grib_ecc-1316 bufr_attributes - bufr_copy_data bufr_clone bufr_expanded bufr_get_keys @@ -130,6 +129,12 @@ foreach( atest ${tests_sanity} ) RESOURCES bufr_read_scatterometer_f.ref COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${atest}.sh ) endforeach() + +if( HAVE_BUILD_TOOLS AND NOT CMAKE_CXX_COMPILER_ID MATCHES NVHPC ) + # Test which fails on Leonardo + list( APPEND tests_extra bufr_copy_data ) +endif() + foreach( atest ${tests_extra} ) ecbuild_add_test( TARGET eccodes_f_${atest} SOURCES ${atest}.f90 From c7930a6dd10100e4b6ce1f0b6c117536197ea574 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 13 Feb 2024 12:38:26 +0000 Subject: [PATCH 013/244] Testing: codes_get_string errors --- src/grib_accessor_class_ascii.cc | 6 +++--- src/grib_accessor_class_bitmap.cc | 2 +- src/grib_accessor_class_non_alpha.cc | 14 +++++++------- src/grib_accessor_class_to_double.cc | 17 ++++++++--------- src/grib_accessor_class_to_integer.cc | 22 ++++++++++++---------- src/grib_accessor_class_to_string.cc | 16 +++++++++------- tests/codes_get_string.cc | 4 +++- 7 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/grib_accessor_class_ascii.cc b/src/grib_accessor_class_ascii.cc index 9d88fa9f9..b0c90182e 100644 --- a/src/grib_accessor_class_ascii.cc +++ b/src/grib_accessor_class_ascii.cc @@ -147,19 +147,19 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) grib_handle* hand = grib_handle_of_accessor(a); const size_t alen = a->length; - if (len[0] < (alen + 1)) { + if (*len < (alen + 1)) { const char* cclass_name = a->cclass->name; grib_context_log(a->context, GRIB_LOG_ERROR, "%s: Buffer too small for %s. It is %zu bytes long (len=%zu)", cclass_name, a->name, alen+1, *len); - len[0] = alen + 1; + *len = alen + 1; return GRIB_BUFFER_TOO_SMALL; } for (i = 0; i < alen; i++) val[i] = hand->buffer->data[a->offset + i]; val[i] = 0; - len[0] = i; + *len = i; return GRIB_SUCCESS; } diff --git a/src/grib_accessor_class_bitmap.cc b/src/grib_accessor_class_bitmap.cc index b3c371a35..bd52d16cd 100644 --- a/src/grib_accessor_class_bitmap.cc +++ b/src/grib_accessor_class_bitmap.cc @@ -297,7 +297,7 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) val[i] = hand->buffer->data[a->offset + i]; } - len[0] = a->length; + *len = a->length; return GRIB_SUCCESS; } diff --git a/src/grib_accessor_class_non_alpha.cc b/src/grib_accessor_class_non_alpha.cc index 55ee9f917..f324257fe 100644 --- a/src/grib_accessor_class_non_alpha.cc +++ b/src/grib_accessor_class_non_alpha.cc @@ -149,20 +149,20 @@ static int get_native_type(grib_accessor* a) static int unpack_string(grib_accessor* a, char* val, size_t* len) { grib_handle* hand = grib_handle_of_accessor(a); - int i = 0; + long i = 0; - if (len[0] < (a->length + 1)) { - grib_context_log(a->context, GRIB_LOG_ERROR, "unpack_string: Wrong size (%lu) for %s it contains %ld values", - len[0], a->name, a->length + 1); - len[0] = 0; - return GRIB_ARRAY_TOO_SMALL; + if (*len < (a->length + 1)) { + grib_context_log(a->context, GRIB_LOG_ERROR, "unpack_string: Wrong size (%lu) for %s, it contains %ld values", + *len, a->name, a->length + 1); + *len = a->length + 1; + return GRIB_BUFFER_TOO_SMALL; } for (i = 0; i < a->length; i++) { val[i] = hand->buffer->data[a->offset + i]; } val[i] = 0; - len[0] = i; + *len = i; return GRIB_SUCCESS; } diff --git a/src/grib_accessor_class_to_double.cc b/src/grib_accessor_class_to_double.cc index c9725e52d..69b06add9 100644 --- a/src/grib_accessor_class_to_double.cc +++ b/src/grib_accessor_class_to_double.cc @@ -166,18 +166,17 @@ static int get_native_type(grib_accessor* a) static int unpack_string(grib_accessor* a, char* val, size_t* len) { - int err = 0; grib_accessor_to_double* self = (grib_accessor_to_double*)a; - char buff[512] = {0,}; - size_t length; + + int err = 0; + char buff[512] = {0,}; size_t size = 512; + size_t length = string_length(a); - length = string_length(a); - - if (len[0] < length + 1) { + if (*len < length + 1) { grib_context_log(a->context, GRIB_LOG_ERROR, "unpack_string: Wrong size (%lu) for %s, it contains %ld values", - len[0], a->name, a->length + 1); - len[0] = 0; + *len, a->name, a->length + 1); + *len = length + 1; return GRIB_ARRAY_TOO_SMALL; } @@ -192,7 +191,7 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) memcpy(val, buff + self->start, length); val[length] = 0; - len[0] = length; + *len = length; return err; } diff --git a/src/grib_accessor_class_to_integer.cc b/src/grib_accessor_class_to_integer.cc index 787b122b8..76ce1205d 100644 --- a/src/grib_accessor_class_to_integer.cc +++ b/src/grib_accessor_class_to_integer.cc @@ -164,19 +164,21 @@ static int get_native_type(grib_accessor* a) static int unpack_string(grib_accessor* a, char* val, size_t* len) { - int err = 0; grib_accessor_to_integer* self = (grib_accessor_to_integer*)a; - char buff[512] = {0,}; - size_t length; + + int err = 0; + char buff[512] = {0,}; size_t size = 512; - length = string_length(a); + size_t length = string_length(a); - if (len[0] < length + 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "unpack_string: Wrong size (%lu) for %s, it contains %ld values", - len[0], a->name, a->length + 1); - len[0] = 0; - return GRIB_ARRAY_TOO_SMALL; + if (*len < length + 1) { + const char* cclass_name = a->cclass->name; + grib_context_log(a->context, GRIB_LOG_ERROR, + "%s: Buffer too small for %s. It is %zu bytes long (len=%zu)", + cclass_name, a->name, length+1, *len); + *len = length + 1; + return GRIB_BUFFER_TOO_SMALL; } err = grib_get_string(grib_handle_of_accessor(a), self->key, buff, &size); @@ -190,7 +192,7 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) memcpy(val, buff + self->start, length); val[length] = 0; - len[0] = length; + *len = length; return GRIB_SUCCESS; } diff --git a/src/grib_accessor_class_to_string.cc b/src/grib_accessor_class_to_string.cc index 818ad386d..648edd1aa 100644 --- a/src/grib_accessor_class_to_string.cc +++ b/src/grib_accessor_class_to_string.cc @@ -163,16 +163,18 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) { grib_accessor_to_string* self = (grib_accessor_to_string*)a; - int err = 0; + int err = 0; char buff[512] = {0,}; size_t length = string_length(a); - if (len[0] < length + 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "unpack_string: Wrong size (%lu) for %s, it contains %ld values", - len[0], a->name, a->length + 1); - len[0] = 0; - return GRIB_ARRAY_TOO_SMALL; + if (*len < length + 1) { + const char* cclass_name = a->cclass->name; + grib_context_log(a->context, GRIB_LOG_ERROR, + "%s: Buffer too small for %s. It is %zu bytes long (len=%zu)", + cclass_name, a->name, length+1, *len); + *len = length + 1; + return GRIB_BUFFER_TOO_SMALL; } size_t size = sizeof(buff); @@ -187,7 +189,7 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) memcpy(val, buff + self->start, length); val[length] = 0; - len[0] = length; + *len = length; return GRIB_SUCCESS; } diff --git a/tests/codes_get_string.cc b/tests/codes_get_string.cc index 2cc90798a..d0cf15192 100644 --- a/tests/codes_get_string.cc +++ b/tests/codes_get_string.cc @@ -35,8 +35,10 @@ int main(int argc, char* argv[]) len = 1; // Cause it to fail err = codes_get_string(h, key, kvalue, &len); - printf("err=%d kvalue=|%s|\n", err, kvalue); + //printf("err=%d kvalue=|%s|\n", err, kvalue); assert(err == CODES_BUFFER_TOO_SMALL); + // The correct len should have been set + assert(len > 1); codes_handle_delete(h); fclose(in); From 42f7ea1f746c12db0d296156ec6a5daa4be47394 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 13 Feb 2024 21:18:39 +0000 Subject: [PATCH 014/244] ECC-1364: GRIB: Geoiterator for Lambert Conformal in the southern hemisphere --- src/grib_iterator_class_lambert_conformal.cc | 76 ++++++++++++++++---- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/src/grib_iterator_class_lambert_conformal.cc b/src/grib_iterator_class_lambert_conformal.cc index 3e9d51055..b50ad72cf 100644 --- a/src/grib_iterator_class_lambert_conformal.cc +++ b/src/grib_iterator_class_lambert_conformal.cc @@ -162,6 +162,25 @@ static double calculate_eccentricity(double minor, double major) return sqrt(1.0 - temp * temp); } +static void inverse(double radius, double n, double f, double rho0_bare, double LoVInRadians, double x, double y, + double* latDeg, double* lonDeg) +{ + x /= radius; + y /= radius; + y = rho0_bare - y; + double rho = hypot(x, y); + Assert(rho != 0.0); + if (n < 0.0) { + rho = -rho; + x = -x; + y = -y; + } + double lp_phi = 2. * atan(pow(f / rho, 1.0/n)) - M_PI_2; + double lp_lam = atan2(x, y) / n; + *lonDeg = lp_lam*RAD2DEG + LoVInRadians*RAD2DEG; + *latDeg = lp_phi*RAD2DEG; +} + static int init_sphere(grib_handle* h, grib_iterator_lambert_conformal* self, size_t nv, long nx, long ny, @@ -171,8 +190,8 @@ static int init_sphere(grib_handle* h, double LoVInRadians, double Latin1InRadians, double Latin2InRadians, double LaDInRadians) { - int i, j; - double f, n, rho, rho0, angle, x0, y0, x, y, tmp, tmp2; + long i, j; + double f, n, rho, rho0, angle, x0, y0, x, y; double latDeg, lonDeg, lonDiff; if (fabs(Latin1InRadians - Latin2InRadians) < 1E-09) { @@ -185,8 +204,10 @@ static int init_sphere(grib_handle* h, f = (cos(Latin1InRadians) * pow(tan(M_PI_4 + Latin1InRadians / 2.0), n)) / n; rho = radius * f * pow(tan(M_PI_4 + latFirstInRadians / 2.0), -n); rho0 = radius * f * pow(tan(M_PI_4 + LaDInRadians / 2.0), -n); - if (n < 0) /* adjustment for southern hemisphere */ - rho0 = -rho0; + double rho0_bare = f * pow(tan(M_PI_4 + LaDInRadians / 2.0), -n); + + //if (n < 0) /* adjustment for southern hemisphere */ + // rho0 = -rho0; lonDiff = lonFirstInRadians - LoVInRadians; /* Adjust longitude to range -180 to 180 */ @@ -212,21 +233,52 @@ static int init_sphere(grib_handle* h, grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Error allocating %zu bytes", ITER, nv * sizeof(double)); return GRIB_OUT_OF_MEMORY; } - + + //------------PROJ lcc_e_inverse ------ + //double x0_bare = x0/radius; + //double y0_bare = y0/radius; + // y0_bare = rho0_bare - y0_bare; +// rho = hypot(x0_bare, y0_bare); +// Assert(rho != 0.0); +// if (n < 0.0) { +// rho = -rho; +// x0_bare = -x0_bare; +// y0_bare = -y0_bare; +// } +// double lp_phi = 2. * atan(pow(f / rho, 1./n)) - M_PI_2; +// double lp_lam = atan2(x0_bare, y0_bare) / n; +// lonDeg = lp_lam * RAD2DEG + LoVInDegrees; +// latDeg = lp_phi * RAD2DEG; +// printf("phi=%g lam=%g\n", lp_phi ,lp_lam); + //-------------------------------------- + //inverse(radius, n, f, rho0_bare, LoVInRadians, x0, y0, &latDeg, &lonDeg); + + for (j = 0; j < ny; j++) { + y = y0 + j * Dy; + for (i = 0; i < nx; i++) { + const long index = i + j * nx; + x = x0 + i * Dx; + inverse(radius, n, f, rho0_bare, LoVInRadians, x, y, &latDeg, &lonDeg); + self->lons[index] = lonDeg; + self->lats[index] = latDeg; + } + } +#if 0 /* Populate our arrays */ for (j = 0; j < ny; j++) { y = y0 + j * Dy; - if (n < 0) { /* adjustment for southern hemisphere */ - y = -y; - } + //if (n < 0) { /* adjustment for southern hemisphere */ + // y = -y; + //} tmp = rho0 - y; tmp2 = tmp * tmp; for (i = 0; i < nx; i++) { int index = i + j * nx; x = x0 + i * Dx; - if (n < 0) { /* adjustment for southern hemisphere */ - x = -x; - } + //printf("j=%d i=%d xy= %.6f %.6f\t",j,i,x,y); + //if (n < 0) { /* adjustment for southern hemisphere */ + // x = -x; + //} angle = atan2(x, tmp); /* See ECC-524 */ rho = sqrt(x * x + tmp2); if (n <= 0) rho = -rho; @@ -237,7 +289,7 @@ static int init_sphere(grib_handle* h, self->lats[index] = latDeg; } } - +#endif return GRIB_SUCCESS; } From 7a38c69aa457a9b70e9ee6277146cc9af73ba675 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 14 Feb 2024 10:48:24 +0000 Subject: [PATCH 015/244] ECC-1364: Cleanup --- src/grib_iterator_class_lambert_conformal.cc | 70 ++++++++------------ 1 file changed, 28 insertions(+), 42 deletions(-) diff --git a/src/grib_iterator_class_lambert_conformal.cc b/src/grib_iterator_class_lambert_conformal.cc index b50ad72cf..eea6f40c9 100644 --- a/src/grib_iterator_class_lambert_conformal.cc +++ b/src/grib_iterator_class_lambert_conformal.cc @@ -162,26 +162,32 @@ static double calculate_eccentricity(double minor, double major) return sqrt(1.0 - temp * temp); } -static void inverse(double radius, double n, double f, double rho0_bare, double LoVInRadians, double x, double y, +static void xy2latlon(double radius, double n, double f, double rho0_bare, double LoVInRadians, + double x, double y, double* latDeg, double* lonDeg) { x /= radius; y /= radius; y = rho0_bare - y; double rho = hypot(x, y); - Assert(rho != 0.0); - if (n < 0.0) { - rho = -rho; - x = -x; - y = -y; + if (rho != 0.0) { + if (n < 0.0) { + rho = -rho; + x = -x; + y = -y; + } + double lp_phi = 2. * atan(pow(f / rho, 1.0/n)) - M_PI_2; + double lp_lam = atan2(x, y) / n; + *lonDeg = lp_lam*RAD2DEG + LoVInRadians*RAD2DEG; + *latDeg = lp_phi*RAD2DEG; + } + else { + *lonDeg = 0.0; + *latDeg = (n > 0.0 ? M_PI_2 : -M_PI_2) * RAD2DEG; } - double lp_phi = 2. * atan(pow(f / rho, 1.0/n)) - M_PI_2; - double lp_lam = atan2(x, y) / n; - *lonDeg = lp_lam*RAD2DEG + LoVInRadians*RAD2DEG; - *latDeg = lp_phi*RAD2DEG; } -static int init_sphere(grib_handle* h, +static int init_sphere(const grib_handle* h, grib_iterator_lambert_conformal* self, size_t nv, long nx, long ny, double LoVInDegrees, @@ -190,9 +196,7 @@ static int init_sphere(grib_handle* h, double LoVInRadians, double Latin1InRadians, double Latin2InRadians, double LaDInRadians) { - long i, j; - double f, n, rho, rho0, angle, x0, y0, x, y; - double latDeg, lonDeg, lonDiff; + double n, angle, x0, y0, x, y; if (fabs(Latin1InRadians - Latin2InRadians) < 1E-09) { n = sin(Latin1InRadians); @@ -201,14 +205,14 @@ static int init_sphere(grib_handle* h, log(tan(M_PI_4 + Latin2InRadians / 2.0) / tan(M_PI_4 + Latin1InRadians / 2.0)); } - f = (cos(Latin1InRadians) * pow(tan(M_PI_4 + Latin1InRadians / 2.0), n)) / n; - rho = radius * f * pow(tan(M_PI_4 + latFirstInRadians / 2.0), -n); - rho0 = radius * f * pow(tan(M_PI_4 + LaDInRadians / 2.0), -n); + double f = (cos(Latin1InRadians) * pow(tan(M_PI_4 + Latin1InRadians / 2.0), n)) / n; + double rho = radius * f * pow(tan(M_PI_4 + latFirstInRadians / 2.0), -n); double rho0_bare = f * pow(tan(M_PI_4 + LaDInRadians / 2.0), -n); + double rho0 = radius * rho0_bare; //if (n < 0) /* adjustment for southern hemisphere */ // rho0 = -rho0; - lonDiff = lonFirstInRadians - LoVInRadians; + double lonDiff = lonFirstInRadians - LoVInRadians; /* Adjust longitude to range -180 to 180 */ if (lonDiff > M_PI) @@ -233,32 +237,14 @@ static int init_sphere(grib_handle* h, grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Error allocating %zu bytes", ITER, nv * sizeof(double)); return GRIB_OUT_OF_MEMORY; } - - //------------PROJ lcc_e_inverse ------ - //double x0_bare = x0/radius; - //double y0_bare = y0/radius; - // y0_bare = rho0_bare - y0_bare; -// rho = hypot(x0_bare, y0_bare); -// Assert(rho != 0.0); -// if (n < 0.0) { -// rho = -rho; -// x0_bare = -x0_bare; -// y0_bare = -y0_bare; -// } -// double lp_phi = 2. * atan(pow(f / rho, 1./n)) - M_PI_2; -// double lp_lam = atan2(x0_bare, y0_bare) / n; -// lonDeg = lp_lam * RAD2DEG + LoVInDegrees; -// latDeg = lp_phi * RAD2DEG; -// printf("phi=%g lam=%g\n", lp_phi ,lp_lam); - //-------------------------------------- - //inverse(radius, n, f, rho0_bare, LoVInRadians, x0, y0, &latDeg, &lonDeg); - - for (j = 0; j < ny; j++) { + + double latDeg = 0, lonDeg = 0; + for (long j = 0; j < ny; j++) { y = y0 + j * Dy; - for (i = 0; i < nx; i++) { + for (long i = 0; i < nx; i++) { const long index = i + j * nx; x = x0 + i * Dx; - inverse(radius, n, f, rho0_bare, LoVInRadians, x, y, &latDeg, &lonDeg); + xy2latlon(radius, n, f, rho0_bare, LoVInRadians, x, y, &latDeg, &lonDeg); self->lons[index] = lonDeg; self->lats[index] = latDeg; } @@ -294,7 +280,7 @@ static int init_sphere(grib_handle* h, } /* Oblate spheroid */ -static int init_oblate(grib_handle* h, +static int init_oblate(const grib_handle* h, grib_iterator_lambert_conformal* self, size_t nv, long nx, long ny, double LoVInDegrees, From 951ff99b50a06f2ef31e96df8c4725d53b123aa2 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 14 Feb 2024 12:07:42 +0000 Subject: [PATCH 016/244] Tools: Verbose messages --- tools/codes_split_file.cc | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tools/codes_split_file.cc b/tools/codes_split_file.cc index 384904602..62484b2e3 100644 --- a/tools/codes_split_file.cc +++ b/tools/codes_split_file.cc @@ -20,7 +20,7 @@ #include "grib_api_internal.h" #include -static int verbose = 0; +static bool verbose = false; static const char* OUTPUT_FILENAME_FORMAT = "%s_%03d"; /* x_001, x_002 etc */ static void usage(const char* prog) { @@ -29,6 +29,11 @@ static void usage(const char* prog) exit(1); } +static void print_num_messages_written(const char* output_filename, size_t n) +{ + printf("Wrote output file %s (%zu message%s)\n", output_filename, n, n==1?"":"s"); +} + static int split_file(FILE* in, const char* filename, const int nchunks, unsigned long* count) { void* mesg = NULL; @@ -76,8 +81,9 @@ static int split_file(FILE* in, const char* filename, const int nchunks, unsigne read_size += size; msg_size += size; if (read_size > chunk_size && msg_size < insize) { - if (verbose) - printf("Wrote output file %s (%zu msgs)\n", ofilename, num_msg); + if (verbose) { + print_num_messages_written(ofilename, num_msg); + } fclose(out); i++; /* Start writing to the next file */ @@ -95,8 +101,9 @@ static int split_file(FILE* in, const char* filename, const int nchunks, unsigne (*count)++; } } - if (verbose) - printf("Wrote output file %s (%zu msgs)\n", ofilename, num_msg - 1); + if (verbose) { + print_num_messages_written(ofilename, num_msg - 1); + } fclose(out); free(ofilename); @@ -118,7 +125,7 @@ int main(int argc, char* argv[]) i = 1; if (strcmp(argv[i], "-v") == 0) { i++; - verbose = 1; + verbose = true; if (argc != 4) usage(argv[0]); } From 404778c7c0a53a2c2b346ea7c9e31494a89898f2 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 14 Feb 2024 12:27:27 +0000 Subject: [PATCH 017/244] ECC-1364: Test --- tests/CMakeLists.txt | 1 + tests/grib_ecc-1364.sh | 52 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100755 tests/grib_ecc-1364.sh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 71babe949..32c20a5a5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -254,6 +254,7 @@ if( HAVE_BUILD_TOOLS ) grib_ecc-1000 grib_ecc-1001 grib_ecc-1030 + grib_ecc-1364 grib_ecc-1397 grib_ecc-1425 grib_ecc-1467 diff --git a/tests/grib_ecc-1364.sh b/tests/grib_ecc-1364.sh new file mode 100755 index 000000000..cb4555834 --- /dev/null +++ b/tests/grib_ecc-1364.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + + +# ECC-1364: GRIB: Geoiterator for Lambert Conformal in the southern hemisphere + +label="grib_ecc-1364_test" +tempGrib=temp.$label.grib +tempFilt=temp.$label.filt +tempLog=temp.$label.log +tempRef=temp.$label.ref + +sample_grib1=$ECCODES_SAMPLES_PATH/GRIB1.tmpl + +# Create a GRIB with a similar grid to the one in the JIRA issue +cat >$tempFilt< $tempLog + +${tools_dir}/grib_ls -l -11.6277,-47.9583,1 $tempGrib > $tempLog +grep -q "Grid Point chosen #1 index=1247750 " $tempLog +grep -q "index=1247750 .* distance=0.01 " $tempLog + + +# Clean up +rm -f $tempGrib $tempFilt $tempLog $tempRef From db48ecd3a938446a3a9a4ace7c5060e5fd6fb59b Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 14 Feb 2024 13:26:47 +0000 Subject: [PATCH 018/244] Examples: BUFR radiosonde updated Fortran code (From Bruce Ingleby) --- examples/F90/bufr_read_tempf.f90 | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/examples/F90/bufr_read_tempf.f90 b/examples/F90/bufr_read_tempf.f90 index 3d37c546e..99a8df742 100644 --- a/examples/F90/bufr_read_tempf.f90 +++ b/examples/F90/bufr_read_tempf.f90 @@ -25,9 +25,9 @@ program bufr_read_tempf integer :: ibufr integer :: i, count = 0 integer :: iflag - integer :: status_id, status_ht, status_time = 0, status_p - integer :: status_airt, status_dewt - integer :: status_rsno, status_rssoft, status_balloonwt + integer :: status_id, status_bl, status_num, status_ht, status_time = 0, status_p + integer :: status_airt, status_dewt, status_wdir, status_wsp + integer :: status_rsno, status_rssoft, status_balloonwt, statid_missing integer(kind=4) :: sizews integer(kind=4) :: blockNumber, stationNumber integer(kind=4) :: ymd, hms @@ -74,9 +74,10 @@ program bufr_read_tempf IF (status_id /= CODES_SUCCESS) statid = dropid ! call codes_is_missing(ibufr, 'shipOrMobileLandStationIdentifier', statid_missing) ! IF (statid_missing == 1) statid = "MISSING" - call codes_get(ibufr, 'blockNumber', blockNumber) - call codes_get(ibufr, 'stationNumber', stationNumber) - IF (blockNumber <= 99.0 .AND. stationNumber <= 1000) write (statid, '(I2.2,I3.3,3X)') blockNumber, stationNumber + blockNumber = 9999 + call codes_get(ibufr, 'blockNumber', blockNumber, status_bl) + call codes_get(ibufr, 'stationNumber', stationNumber, status_num) + IF (blockNumber <= 99 .AND. stationNumber <= 1000) write (statid, '(I2.2,I3.3,3X)') blockNumber, stationNumber call codes_get(ibufr, 'year', year) call codes_get(ibufr, 'month', month) @@ -118,8 +119,8 @@ program bufr_read_tempf call codes_get(ibufr, 'extendedVerticalSoundingSignificance', vssVal) call codes_get(ibufr, 'airTemperature', tVal, status_airt) call codes_get(ibufr, 'dewpointTemperature', tdVal, status_dewt) - call codes_get(ibufr, 'windDirection', wdirVal) - call codes_get(ibufr, 'windSpeed', wspVal) + call codes_get(ibufr, 'windDirection', wdirVal, status_wdir) + call codes_get(ibufr, 'windSpeed', wspVal, status_wsp) ! ---- Array sizes (pressure size can be larger - wind shear levels) sizews = size(wspVal) @@ -140,13 +141,21 @@ program bufr_read_tempf allocate(tdVal(sizews)) tdVal(:) = -999999999.0 END IF + IF (status_wdir /= CODES_SUCCESS) THEN + allocate(wdirVal(sizews)) + wdirVal(:) = -999999999.0 + END IF + IF (status_wsp /= CODES_SUCCESS) THEN + allocate(wspVal(sizews)) + wspVal(:) = -999999999.0 + END IF ! ---- Print the values -------------------------------- write (*, '(A,I7,A,A8,I9,I7.6,F9.3,F10.3,2F7.1,I4,I5)') 'Ob: ', count, & ' ', statid, ymd, hms, lat(1), lon(1), htg, htp, INT(sondeType), sizews IF (status_rsno == CODES_SUCCESS) write (*, '(A,A,A,F7.3)') & 'RS number/software/balloonwt: ', rsnumber, rssoftware, balloonwt - IF (status_ht == CODES_SUCCESS .AND. SIZE(lat) > 1) write (*, '(A,A,F9.3,F10.3,F7.1)') & + IF (status_ht == CODES_SUCCESS .AND. SIZE(lat) > 1) write (*, '(A,A10,F9.3,F10.3,F7.1)') & 'WMO list lat, lon, ht: ', statid, lat(2), lon(2), htec write (*, '(A)') 'level dtime dlat dlon pressure geopotH airTemp dewPtT windDir windSp signif' do i = 1, sizews From 6dbbf152b7a07cf2a2124cb0ac8e9257d1317c9a Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 14 Feb 2024 14:52:56 +0000 Subject: [PATCH 019/244] ECC-1364: Cleanup --- src/grib_iterator_class_lambert_conformal.cc | 135 +++++++++---------- 1 file changed, 66 insertions(+), 69 deletions(-) diff --git a/src/grib_iterator_class_lambert_conformal.cc b/src/grib_iterator_class_lambert_conformal.cc index eea6f40c9..5d15a67b6 100644 --- a/src/grib_iterator_class_lambert_conformal.cc +++ b/src/grib_iterator_class_lambert_conformal.cc @@ -85,21 +85,21 @@ static void init_class(grib_iterator_class* c) #define EPSILON 1.0e-10 #ifndef M_PI -#define M_PI 3.14159265358979323846 /* Whole pie */ +#define M_PI 3.14159265358979323846 // Whole pie #endif #ifndef M_PI_2 -#define M_PI_2 1.57079632679489661923 /* Half a pie */ +#define M_PI_2 1.57079632679489661923 // Half a pie #endif #ifndef M_PI_4 -#define M_PI_4 0.78539816339744830962 /* Quarter of a pie */ +#define M_PI_4 0.78539816339744830962 // Quarter of a pie #endif -#define RAD2DEG 57.29577951308232087684 /* 180 over pi */ -#define DEG2RAD 0.01745329251994329576 /* pi over 180 */ +#define RAD2DEG 57.29577951308232087684 // 180 over pi +#define DEG2RAD 0.01745329251994329576 // pi over 180 -/* Adjust longitude (in radians) to range -180 to 180 */ +// Adjust longitude (in radians) to range -180 to 180 static double adjust_lon_radians(double lon) { if (lon > M_PI) lon -= 2 * M_PI; @@ -107,16 +107,15 @@ static double adjust_lon_radians(double lon) return lon; } -/* Function to compute the latitude angle, phi2, for the inverse - * From the book "Map Projections-A Working Manual-John P. Snyder (1987)" - * Equation (7-9) involves rapidly converging iteration: Calculate t from (15-11) - * Then, assuming an initial trial phi equal to (pi/2 - 2*arctan t) in the right side of equation (7-9), - * calculate phi on the left side. Substitute the calculated phi) into the right side, - * calculate a new phi, etc., until phi does not change significantly from the preceding trial value of phi - */ +// Function to compute the latitude angle, phi2, for the inverse +// From the book "Map Projections-A Working Manual-John P. Snyder (1987)" +// Equation (7-9) involves rapidly converging iteration: Calculate t from (15-11) +// Then, assuming an initial trial phi equal to (pi/2 - 2*arctan t) in the right side of equation (7-9), +// calculate phi on the left side. Substitute the calculated phi) into the right side, +// calculate a new phi, etc., until phi does not change significantly from the preceding trial value of phi static double compute_phi( - double eccent, /* Spheroid eccentricity */ - double ts, /* Constant value t */ + double eccent, // Spheroid eccentricity + double ts, // Constant value t int* error) { double eccnth, phi, con, dphi, sinpi; @@ -136,19 +135,19 @@ static double compute_phi( return 0; } -/* Compute the constant small m which is the radius of - a parallel of latitude, phi, divided by the semimajor axis */ +// Compute the constant small m which is the radius of +// a parallel of latitude, phi, divided by the semimajor axis static double compute_m(double eccent, double sinphi, double cosphi) { const double con = eccent * sinphi; return ((cosphi / (sqrt(1.0 - con * con)))); } -/* Compute the constant small t for use in the forward computations */ +// Compute the constant small t for use in the forward computations static double compute_t( - double eccent, /* Eccentricity of the spheroid */ - double phi, /* Latitude phi */ - double sinphi) /* Sine of the latitude */ + double eccent, // Eccentricity of the spheroid + double phi, // Latitude phi + double sinphi) // Sine of the latitude { double con = eccent * sinphi; double com = 0.5 * eccent; @@ -162,10 +161,12 @@ static double calculate_eccentricity(double minor, double major) return sqrt(1.0 - temp * temp); } -static void xy2latlon(double radius, double n, double f, double rho0_bare, double LoVInRadians, +static void xy2lonlat(double radius, double n, double f, double rho0_bare, double LoVInRadians, double x, double y, - double* latDeg, double* lonDeg) + double* lonDeg, double* latDeg) { + DEBUG_ASSERT(radius > 0); + DEBUG_ASSERT(n != 0.0); x /= radius; y /= radius; y = rho0_bare - y; @@ -176,10 +177,10 @@ static void xy2latlon(double radius, double n, double f, double rho0_bare, doubl x = -x; y = -y; } - double lp_phi = 2. * atan(pow(f / rho, 1.0/n)) - M_PI_2; - double lp_lam = atan2(x, y) / n; - *lonDeg = lp_lam*RAD2DEG + LoVInRadians*RAD2DEG; - *latDeg = lp_phi*RAD2DEG; + double latRadians = 2. * atan(pow(f / rho, 1.0/n)) - M_PI_2; + double lonRadians = atan2(x, y) / n; + *lonDeg = (lonRadians + LoVInRadians) * RAD2DEG; + *latDeg = latRadians * RAD2DEG; } else { *lonDeg = 0.0; @@ -196,7 +197,7 @@ static int init_sphere(const grib_handle* h, double LoVInRadians, double Latin1InRadians, double Latin2InRadians, double LaDInRadians) { - double n, angle, x0, y0, x, y; + double n, x, y; if (fabs(Latin1InRadians - Latin2InRadians) < 1E-09) { n = sin(Latin1InRadians); @@ -208,25 +209,22 @@ static int init_sphere(const grib_handle* h, double f = (cos(Latin1InRadians) * pow(tan(M_PI_4 + Latin1InRadians / 2.0), n)) / n; double rho = radius * f * pow(tan(M_PI_4 + latFirstInRadians / 2.0), -n); double rho0_bare = f * pow(tan(M_PI_4 + LaDInRadians / 2.0), -n); - double rho0 = radius * rho0_bare; - - //if (n < 0) /* adjustment for southern hemisphere */ - // rho0 = -rho0; + double rho0 = radius * rho0_bare; // scaled double lonDiff = lonFirstInRadians - LoVInRadians; - /* Adjust longitude to range -180 to 180 */ + // Adjust longitude to range -180 to 180 if (lonDiff > M_PI) lonDiff -= 2 * M_PI; if (lonDiff < -M_PI) lonDiff += 2 * M_PI; - angle = n * lonDiff; - x0 = rho * sin(angle); - y0 = rho0 - rho * cos(angle); - /*Dx = iScansNegatively == 0 ? Dx : -Dx;*/ - /* GRIB-405: Don't change sign of Dy. Latitudes ALWAYS increase from latitudeOfFirstGridPoint */ - /*Dy = jScansPositively == 1 ? Dy : -Dy;*/ + double angle = n * lonDiff; + double x0 = rho * sin(angle); + double y0 = rho0 - rho * cos(angle); + // Dx = iScansNegatively == 0 ? Dx : -Dx; + // GRIB-405: Don't change sign of Dy. Latitudes ALWAYS increase from latitudeOfFirstGridPoint + // Dy = jScansPositively == 1 ? Dy : -Dy; - /* Allocate latitude and longitude arrays */ + // Allocate latitude and longitude arrays self->lats = (double*)grib_context_malloc(h->context, nv * sizeof(double)); if (!self->lats) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Error allocating %zu bytes", ITER, nv * sizeof(double)); @@ -244,13 +242,13 @@ static int init_sphere(const grib_handle* h, for (long i = 0; i < nx; i++) { const long index = i + j * nx; x = x0 + i * Dx; - xy2latlon(radius, n, f, rho0_bare, LoVInRadians, x, y, &latDeg, &lonDeg); + xy2lonlat(radius, n, f, rho0_bare, LoVInRadians, x, y, &lonDeg, &latDeg); self->lons[index] = lonDeg; self->lats[index] = latDeg; } } + #if 0 - /* Populate our arrays */ for (j = 0; j < ny; j++) { y = y0 + j * Dy; //if (n < 0) { /* adjustment for southern hemisphere */ @@ -260,8 +258,7 @@ static int init_sphere(const grib_handle* h, tmp2 = tmp * tmp; for (i = 0; i < nx; i++) { int index = i + j * nx; - x = x0 + i * Dx; - //printf("j=%d i=%d xy= %.6f %.6f\t",j,i,x,y); + x = x0 + i * Dx; //if (n < 0) { /* adjustment for southern hemisphere */ // x = -x; //} @@ -279,7 +276,7 @@ static int init_sphere(const grib_handle* h, return GRIB_SUCCESS; } -/* Oblate spheroid */ +// Oblate spheroid static int init_oblate(const grib_handle* h, grib_iterator_lambert_conformal* self, size_t nv, long nx, long ny, @@ -292,20 +289,20 @@ static int init_oblate(const grib_handle* h, { int i, j, err = 0; double x0, y0, x, y, latRad, lonRad, latDeg, lonDeg, sinphi, ts, rh1, theta; - double false_easting; /* x offset in meters */ - double false_northing; /* y offset in meters */ + double false_easting; // x offset in meters + double false_northing; // y offset in meters - double ns; /* ratio of angle between meridian */ - double F; /* flattening of ellipsoid */ - double rh; /* height above ellipsoid */ - double sin_po; /* sin value */ - double cos_po; /* cos value */ - double con; /* temporary variable */ - double ms1; /* small m 1 */ - double ms2; /* small m 2 */ - double ts0; /* small t 0 */ - double ts1; /* small t 1 */ - double ts2; /* small t 2 */ + double ns; // ratio of angle between meridian + double F; // flattening of ellipsoid + double rh; // height above ellipsoid + double sin_po; // sin value + double cos_po; // cos value + double con; // temporary variable + double ms1; // small m 1 + double ms2; // small m 2 + double ts0; // small t 0 + double ts1; // small t 1 + double ts2; // small t 2 double e = calculate_eccentricity(earthMinorAxisInMetres, earthMajorAxisInMetres); @@ -330,7 +327,7 @@ static int init_oblate(const grib_handle* h, F = ms1 / (ns * pow(ts1, ns)); rh = earthMajorAxisInMetres * F * pow(ts0, ns); - /* Forward projection: convert lat,lon to x,y */ + // Forward projection: convert lat,lon to x,y con = fabs(fabs(latFirstInRadians) - M_PI_2); if (con > EPSILON) { sinphi = sin(latFirstInRadians); @@ -350,7 +347,7 @@ static int init_oblate(const grib_handle* h, x0 = -x0; y0 = -y0; - /* Allocate latitude and longitude arrays */ + // Allocate latitude and longitude arrays self->lats = (double*)grib_context_malloc(h->context, nv * sizeof(double)); if (!self->lats) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Error allocating %zu bytes", ITER, nv * sizeof(double)); @@ -362,7 +359,7 @@ static int init_oblate(const grib_handle* h, return GRIB_OUT_OF_MEMORY; } - /* Populate our arrays */ + // Populate our arrays false_easting = x0; false_northing = y0; for (j = 0; j < ny; j++) { @@ -371,7 +368,7 @@ static int init_oblate(const grib_handle* h, const int index = i + j * nx; double _x, _y; x = i * Dx; - /* Inverse projection to convert from x,y to lat,lon */ + // Inverse projection to convert from x,y to lat,lon _x = x - false_easting; _y = rh - y + false_northing; rh1 = sqrt(_x * _x + _y * _y); @@ -401,7 +398,7 @@ static int init_oblate(const grib_handle* h, if (i == 0 && j == 0) { DEBUG_ASSERT(fabs(latFirstInRadians - latRad) <= EPSILON); } - latDeg = latRad * RAD2DEG; /* Convert to degrees */ + latDeg = latRad * RAD2DEG; // Convert to degrees lonDeg = normalise_longitude_in_degrees(lonRad * RAD2DEG); self->lons[index] = lonDeg; self->lats[index] = latDeg; @@ -431,7 +428,7 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) const char* sLatin2InDegrees = grib_arguments_get_name(h, args, self->carg++); const char* slatFirstInDegrees = grib_arguments_get_name(h, args, self->carg++); const char* slonFirstInDegrees = grib_arguments_get_name(h, args, self->carg++); - /* Dx and Dy are in Metres */ + // Dx and Dy are in Metres const char* sDx = grib_arguments_get_name(h, args, self->carg++); const char* sDy = grib_arguments_get_name(h, args, self->carg++); const char* siScansNegatively = grib_arguments_get_name(h, args, self->carg++); @@ -481,16 +478,16 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) if ((err = grib_get_long_internal(h, salternativeRowScanning, &alternativeRowScanning)) != GRIB_SUCCESS) return err; - /* Standard Parallels cannot be equal and on opposite sides of the equator */ + // Standard Parallels cannot be equal and on opposite sides of the equator if (fabs(Latin1InDegrees + Latin2InDegrees) < EPSILON) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Cannot have equal latitudes for standard parallels on opposite sides of equator", ITER); return GRIB_WRONG_GRID; } - /* - * See Wolfram MathWorld: http://mathworld.wolfram.com/LambertConformalConicProjection.html - */ + // + // See Wolfram MathWorld: http://mathworld.wolfram.com/LambertConformalConicProjection.html + // latFirstInRadians = latFirstInDegrees * DEG2RAD; lonFirstInRadians = lonFirstInDegrees * DEG2RAD; Latin1InRadians = Latin1InDegrees * DEG2RAD; @@ -516,7 +513,7 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) iter->e = -1; - /* Apply the scanning mode flags which may require data array to be transformed */ + // Apply the scanning mode flags which may require data array to be transformed err = transform_iterator_data(h->context, iter->data, iScansNegatively, jScansPositively, jPointsAreConsecutive, alternativeRowScanning, iter->nv, nx, ny); From 30d31f151d7d68d22f78358698f8727a5786e926 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 14 Feb 2024 20:29:46 +0000 Subject: [PATCH 020/244] ECC-1769: GRIB: Rename keys FirstLatitude and SecondLatitude --- definitions/grib2/template.3.30.def | 4 ++-- definitions/grib2/template.3.63.def | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/definitions/grib2/template.3.30.def b/definitions/grib2/template.3.30.def index 0168c967d..7bd63fc00 100644 --- a/definitions/grib2/template.3.30.def +++ b/definitions/grib2/template.3.30.def @@ -62,12 +62,12 @@ include "grib2/template.3.scanning_mode.def" # Latin 1 - first latitude from the pole at which the secant cone cuts the sphere signed[4] Latin1 : edition_specific; -alias FirstLatitude=Latin1; +alias firstLatitude=Latin1; meta geography.Latin1InDegrees scale(Latin1,one,grib2divider,truncateDegrees) : dump; # Latin 2 - second latitude from the pole at which the secant cone cuts the sphere signed[4] Latin2 : dump; -alias SecondLatitude=Latin2; +alias secondLatitude=Latin2; meta geography.Latin2InDegrees scale(Latin2,one,grib2divider,truncateDegrees) : dump; # Latitude of the southern pole of projection diff --git a/definitions/grib2/template.3.63.def b/definitions/grib2/template.3.63.def index 443283c5c..71db1eccc 100644 --- a/definitions/grib2/template.3.63.def +++ b/definitions/grib2/template.3.63.def @@ -38,12 +38,12 @@ flags[1] projectionCentreFlag 'grib2/tables/[tablesVersion]/3.5.table' : dump; # Latin 1 - first latitude from the pole at which the secant cone cuts the sphere signed[4] Latin1 : edition_specific; -alias FirstLatitude=Latin1; +alias firstLatitude=Latin1; meta geography.Latin1InDegrees scale(Latin1,one,grib2divider,truncateDegrees) : dump; # Latin 2 - second latitude from the pole at which the secant cone cuts the sphere signed[4] Latin2 : dump; -alias SecondLatitude=Latin2; +alias secondLatitude=Latin2; meta geography.Latin2InDegrees scale(Latin2,one,grib2divider,truncateDegrees) : dump; # Latitude of the southern pole of projection From 6eef31e2dd8aed0f5e9640b42dd8c82a5e4cdbbd Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 15 Feb 2024 12:03:30 +0000 Subject: [PATCH 021/244] ECC-1770: GRIB2: Template 4.1101 has incorrect octet layout --- definitions/grib2/template.4.1100.def | 1 + definitions/grib2/template.4.1101.def | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/definitions/grib2/template.4.1100.def b/definitions/grib2/template.4.1100.def index 76ebfc467..87016a586 100644 --- a/definitions/grib2/template.4.1100.def +++ b/definitions/grib2/template.4.1100.def @@ -1,6 +1,7 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 4.1100, Hovmoller-type grid with no averaging or other statistical processing +# This template is experimental, was not validated at the time of publication and should be used only for bilateral previously agreed tests include "grib2/template.4.parameter.def" include "grib2/template.4.generating_process.def" diff --git a/definitions/grib2/template.4.1101.def b/definitions/grib2/template.4.1101.def index ef9e951ed..6f27693f2 100644 --- a/definitions/grib2/template.4.1101.def +++ b/definitions/grib2/template.4.1101.def @@ -2,8 +2,26 @@ # TEMPLATE 4.1101, Hovmoller-type grid with averaging or other statistical processing +# This template is experimental, was not validated at the time of publication and should be used only for bilateral previously agreed tests. +# (Octets 35-50 are very similar to octets 43-58 of product definition template 4.8, but the meaning of some fields differs slightly) + include "grib2/template.4.parameter.def" include "grib2/template.4.generating_process.def" include "grib2/template.4.forecast_time.def" include "grib2/template.4.horizontal.def" -include "grib2/template.4.statistical.def" + +unsigned[4] numberOfMissingInStatisticalProcess = 0 : edition_specific; +alias totalNumberOfDataValuesMissingInStatisticalProcess=numberOfMissingInStatisticalProcess; + +codetable[1] typeOfStatisticalProcessing ('4.10.table',masterDir,localDir) : edition_specific; + +codetable[1] typeOfTimeIncrement ('4.11.table',masterDir,localDir) = 2 : edition_specific; +alias typeOfTimeIncrementBetweenSuccessiveFieldsUsedInTheStatisticalProcessing=typeOfTimeIncrement; + +codetable[1] indicatorOfUnitForTimeRange ('4.4.table',masterDir,localDir) =1 ; +unsigned[4] lengthOfTimeRange=0 ; +codetable[1] indicatorOfUnitForTimeIncrement ('4.4.table',masterDir,localDir)=255 ; +unsigned[4] timeIncrement=0 ; +alias timeIncrementBetweenSuccessiveFields=timeIncrement; + +# include "grib2/template.4.statistical.def" From d7111f0185107b11f3f876745d92bd94be73dedc Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 15 Feb 2024 12:18:36 +0000 Subject: [PATCH 022/244] ECC-1767: GRIB2: Add keys to properly compute wavelengths in section 4 optical templates --- definitions/grib2/template.4.optical.def | 9 +++++++++ tests/grib2_wave_spectra.sh | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/definitions/grib2/template.4.optical.def b/definitions/grib2/template.4.optical.def index e1f9867ca..a73181f89 100644 --- a/definitions/grib2/template.4.optical.def +++ b/definitions/grib2/template.4.optical.def @@ -8,3 +8,12 @@ signed[1] scaleFactorOfFirstWavelength : dump; signed[4] scaledValueOfFirstWavelength : dump; signed[1] scaleFactorOfSecondWavelength = missing(): can_be_missing,dump; signed[4] scaledValueOfSecondWavelength = missing(): can_be_missing,dump; + +meta firstWavelength from_scale_factor_scaled_value(scaleFactorOfFirstWavelength, scaledValueOfFirstWavelength); +meta secondWavelength from_scale_factor_scaled_value(scaleFactorOfSecondWavelength, scaledValueOfSecondWavelength); +alias firstWavelengthInMetres = firstWavelength; +alias secondWavelengthInMetres = secondWavelength; + +constant oneBillionth = 1.0 / 1000000000 : hidden; +meta firstWavelengthInNanometres divdouble(firstWavelength, oneBillionth); +meta secondWavelengthInNanometres divdouble(secondWavelength, oneBillionth); diff --git a/tests/grib2_wave_spectra.sh b/tests/grib2_wave_spectra.sh index f610a08bb..44b58add8 100755 --- a/tests/grib2_wave_spectra.sh +++ b/tests/grib2_wave_spectra.sh @@ -45,6 +45,12 @@ grib_check_key_equals $temp scaleFactorOfLowerWavePeriodLimit,scaledValueOfLower ${tools_dir}/grib_set -s tablesVersion=$latest,productDefinitionTemplateNumber=104 $sample2 $temp grib_check_key_equals $temp scaleFactorOfLowerWavePeriodLimit,scaledValueOfLowerWavePeriodLimit,perturbationNumber 'MISSING MISSING 0' +${tools_dir}/grib_set -s \ + tablesVersion=$latest,productDefinitionTemplateNumber=108,scaleFactorOfFirstWavelength=9,scaledValueOfFirstWavelength=12 \ +$sample2 $temp +grib_check_key_equals $temp firstWavelengthInNanometres '12' +grib_check_key_equals $temp firstWavelengthInMetres '1.2e-08' + # Clean up rm -f $tempSample $temp From d2e0ac57682c0b4ab291bd138174881da5c7f7d7 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 15 Feb 2024 15:02:51 +0000 Subject: [PATCH 023/244] Testing: Accessors 'sum' and 'suppressed' --- tests/grib_filter.sh | 13 +++++++++++++ tests/grib_suppressed.sh | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh index 9a836a898..951ea9433 100755 --- a/tests/grib_filter.sh +++ b/tests/grib_filter.sh @@ -237,6 +237,19 @@ grib_check_key_equals $tempGrib scaleFactorOfFirstFixedSurface MISSING grib_check_key_equals $tempGrib scaledValueOfFirstFixedSurface MISSING +echo "Test for the sum accessor" +# ------------------------------- +input="${samp_dir}/reduced_gg_pl_32_grib2.tmpl" +cat >$tempFilt < $tempOut + + echo "Test from_scale_factor_scaled_value" # ----------------------------------------- input="${samp_dir}/reduced_gg_pl_32_grib2.tmpl" diff --git a/tests/grib_suppressed.sh b/tests/grib_suppressed.sh index 2b8477064..39a42dbe4 100755 --- a/tests/grib_suppressed.sh +++ b/tests/grib_suppressed.sh @@ -39,6 +39,29 @@ EOF diff $tempRef $tempErr +# Try decoding as int and double too +cat > $tempFilt <$tempErr +status=$? +set -e +[ $status -ne 0 ] +grep -q "is unavailable" $tempErr + + +cat > $tempFilt <$tempErr +status=$? +set -e +[ $status -ne 0 ] +grep -q "is unavailable" $tempErr # Clean up rm -f $tempFilt $tempErr $tempRef From 8c1719dadd498ae2388e5099360b5d4b2e79100e Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 15 Feb 2024 15:22:32 +0000 Subject: [PATCH 024/244] Testing: Accessor suppressed --- tests/grib_suppressed.sh | 51 ++++++++++++---------------------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/tests/grib_suppressed.sh b/tests/grib_suppressed.sh index 39a42dbe4..046eebfb5 100755 --- a/tests/grib_suppressed.sh +++ b/tests/grib_suppressed.sh @@ -17,19 +17,6 @@ tempFilt=temp.${label}.filt tempRef=temp.${label}.ref sample2=$ECCODES_SAMPLES_PATH/GRIB2.tmpl -cat > $tempFilt <$tempErr -status=$? -set -e -[ $status -ne 0 ] - -cat $tempErr - cat > $tempRef < $tempFilt + set +e + ${tools_dir}/grib_filter $tempFilt $sample2 2>$tempErr + status=$? + set -e + [ $status -ne 0 ] + cat $tempErr + diff $tempRef $tempErr +} -# Try decoding as int and double too -cat > $tempFilt <$tempErr -status=$? -set -e -[ $status -ne 0 ] -grep -q "is unavailable" $tempErr +do_tests "" +do_tests ":i" +do_tests ":d" -cat > $tempFilt <$tempErr -status=$? -set -e -[ $status -ne 0 ] -grep -q "is unavailable" $tempErr - # Clean up rm -f $tempFilt $tempErr $tempRef From 9baed622acbb5fd1126569cd3f81a661fffcd7a3 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sat, 17 Feb 2024 19:30:26 +0000 Subject: [PATCH 025/244] Testing: Further tests for grib_util_set_spec --- tests/CMakeLists.txt | 2 + tests/grib_util_set_spec2.cc | 210 +++++++++++++++++++++++++++++++++++ tests/grib_util_set_spec2.sh | 18 +++ 3 files changed, 230 insertions(+) create mode 100644 tests/grib_util_set_spec2.cc create mode 100755 tests/grib_util_set_spec2.sh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 32c20a5a5..3edb8ee1e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -32,6 +32,7 @@ list(APPEND test_c_bins gauss_sub grib_nearest_test grib_util_set_spec + grib_util_set_spec2 grib_check_param_concepts grib_local_MeteoFrance grib_2nd_order_numValues @@ -356,6 +357,7 @@ if( HAVE_BUILD_TOOLS ) endif() if( ENABLE_EXTRA_TESTS ) list(APPEND tests_extra grib_util_set_spec) + list(APPEND tests_extra grib_util_set_spec2) list(APPEND tests_extra grib_padding) list(APPEND tests_extra grib_tigge_conversions1) list(APPEND tests_extra grib_tigge_conversions2) diff --git a/tests/grib_util_set_spec2.cc b/tests/grib_util_set_spec2.cc new file mode 100644 index 000000000..00f2111e3 --- /dev/null +++ b/tests/grib_util_set_spec2.cc @@ -0,0 +1,210 @@ +/* + * (C) Copyright 2005- ECMWF. + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + * + * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by + * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. + */ + +#include "grib_api_internal.h" +#include "eccodes.h" + +static void dump_it(grib_handle* h) +{ + int dump_flags = GRIB_DUMP_FLAG_CODED | GRIB_DUMP_FLAG_OCTET | GRIB_DUMP_FLAG_VALUES | GRIB_DUMP_FLAG_READ_ONLY; + grib_dump_content(h, stdout, "wmo", dump_flags, NULL); +} + +// Lambert conformal +static void test0() +{ + int err = 0; + grib_handle* finalh = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2, 3.3, 0.4}; + int set_spec_flags = 0; + size_t outlen = 4; + + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_set_long(handle, "tablesVersion", 32); + spec.grid_type = GRIB_UTIL_GRID_SPEC_LAMBERT_CONFORMAL; + spec.N = 2; + + // packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE; + // packing_spec.bitsPerValue = 16; + // packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; + // packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; + + finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(finalh); + Assert(err == 0); + dump_it(finalh); +} + +// Lambert azimuthal +static void test1() +{ + int err = 0; + grib_handle* finalh = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2, 3.3, 0.4}; + int set_spec_flags = 0; + size_t outlen = 4; + + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_set_long(handle, "tablesVersion", 32); + spec.grid_type = GRIB_UTIL_GRID_SPEC_LAMBERT_AZIMUTHAL_EQUAL_AREA; + + finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(finalh); + Assert(err == 0); + dump_it(finalh); +} + +// HEALPix +static void test2() +{ + int err = 0; + grib_handle* finalh = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2, 3.3, 0.4}; + int set_spec_flags = 0; + size_t outlen = 0; + + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_set_long(handle, "tablesVersion", 32); + spec.grid_type = GRIB_UTIL_GRID_SPEC_HEALPIX; + spec.N = 2; + outlen = 4; + + packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE; + packing_spec.bitsPerValue = 16; + packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; + packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; + + finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(finalh); + Assert(err == 0); + dump_it(finalh); +} + +// Spherical harmonics +static void test3() +{ + int err = 0; + grib_handle* finalh = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2}; + int set_spec_flags = 0; + size_t outlen = 0; + + grib_handle* handle = grib_handle_new_from_samples(0, "sh_pl_grib2"); + grib_set_long(handle, "tablesVersion", 32); + spec.grid_type = GRIB_UTIL_GRID_SPEC_SH; + spec.truncation = 20; + outlen = 2; + + packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_SPECTRAL_SIMPLE; + packing_spec.bitsPerValue = 16; + packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; + packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; + + finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(finalh); + Assert(err == 0); + dump_it(finalh); +} + +// Polar stereo +static void test4() +{ + int err = 0; + grib_handle* finalh = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2, 3.3, 0.4}; + int set_spec_flags = 0; + size_t outlen = 0; + + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_set_long(handle, "tablesVersion", 32); + spec.grid_type = GRIB_UTIL_GRID_SPEC_POLAR_STEREOGRAPHIC; + outlen = 4; + + finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(finalh); + Assert(err == 0); + dump_it(finalh); +} + +int main() +{ + test0(); + test1(); + test2(); + test3(); + test4(); + return 0; +} + +#if 0 +int main(int argc, char* argv[]) +{ + int i = 0, remove_local_def = 0; + int edition = 0; + char* packingType = NULL; + const char* prog = argv[0]; + char* infile_name = NULL; + char* outfile_name = NULL; + + if (argc == 1 || argc > 8) usage(prog); + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-p") == 0) { + packingType = argv[i + 1]; + ++i; + } + else if (strcmp(argv[i], "-e") == 0) { + edition = atoi(argv[i + 1]); + ++i; + } + else if (strcmp(argv[i], "-r") == 0) { + remove_local_def = 1; + } + else { + /* Expect 2 filenames */ + infile_name = argv[i]; + outfile_name = argv[i + 1]; + break; + } + } +#if 0 + printf("DEBUG remove_local_def = %d\n", remove_local_def); + printf("DEBUG edition = %d\n", edition); + printf("DEBUG packingType = %s\n", packingType); + printf("DEBUG infile_name = %s\n", infile_name); + printf("DEBUG outfile_name = %s\n", outfile_name); +#endif + test_regular_ll(remove_local_def, edition, packingType, infile_name, outfile_name); + test_reduced_gg(remove_local_def, edition, packingType, infile_name, outfile_name); + /*test_grid_complex_spatial_differencing(remove_local_def, edition, packingType, infile_name, outfile_name);*/ + + return 0; +} +#endif diff --git a/tests/grib_util_set_spec2.sh b/tests/grib_util_set_spec2.sh new file mode 100755 index 000000000..6dd54373a --- /dev/null +++ b/tests/grib_util_set_spec2.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +grib_util_set_spec=${test_dir}/grib_util_set_spec2 +$EXEC $grib_util_set_spec + + +### Clean up + From 5cdd9d17cb1111605e1d5639d8261d09f1b7b859 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sat, 17 Feb 2024 20:38:38 +0000 Subject: [PATCH 026/244] grib_util_set_spec: Support reduced latlon --- src/grib_util.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/grib_util.cc b/src/grib_util.cc index ab6283987..c559eeacb 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -897,6 +897,9 @@ static int get_grib_sample_name(grib_handle* h, long editionNumber, case GRIB_UTIL_GRID_SPEC_HEALPIX: snprintf(sample_name, sample_name_len, "GRIB%ld", editionNumber); break; + case GRIB_UTIL_GRID_SPEC_REDUCED_LL: + snprintf(sample_name, sample_name_len, "%s_sfc_grib%ld", grid_type, editionNumber); + break; default: snprintf(sample_name, sample_name_len, "%s_pl_grib%ld", grid_type, editionNumber); } From e89dfad0ba4a69fb344c8e8bb7191a63df448f62 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sat, 17 Feb 2024 20:39:03 +0000 Subject: [PATCH 027/244] Testing: grib_util_set_spec for reduced ll --- tests/grib_util_set_spec2.cc | 127 +++++++++++++++++------------------ tests/grib_util_set_spec2.sh | 7 +- 2 files changed, 63 insertions(+), 71 deletions(-) diff --git a/tests/grib_util_set_spec2.cc b/tests/grib_util_set_spec2.cc index 00f2111e3..5231ffd90 100644 --- a/tests/grib_util_set_spec2.cc +++ b/tests/grib_util_set_spec2.cc @@ -21,7 +21,6 @@ static void dump_it(grib_handle* h) static void test0() { int err = 0; - grib_handle* finalh = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; double values[4] = {1.1, 2.2, 3.3, 0.4}; @@ -29,16 +28,20 @@ static void test0() size_t outlen = 4; grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); - grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_LAMBERT_CONFORMAL; spec.N = 2; + packing_spec.extra_settings_count = 1; + packing_spec.extra_settings[0].type = GRIB_TYPE_LONG; + packing_spec.extra_settings[0].name = "tablesVersion"; + packing_spec.extra_settings[0].long_value = 32; + // packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE; // packing_spec.bitsPerValue = 16; - // packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; + // packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; // packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; - finalh = grib_util_set_spec( + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); Assert(finalh); @@ -50,7 +53,6 @@ static void test0() static void test1() { int err = 0; - grib_handle* finalh = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; double values[4] = {1.1, 2.2, 3.3, 0.4}; @@ -61,7 +63,7 @@ static void test1() grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_LAMBERT_AZIMUTHAL_EQUAL_AREA; - finalh = grib_util_set_spec( + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); Assert(finalh); @@ -73,25 +75,18 @@ static void test1() static void test2() { int err = 0; - grib_handle* finalh = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; double values[4] = {1.1, 2.2, 3.3, 0.4}; int set_spec_flags = 0; - size_t outlen = 0; + size_t outlen = 4; grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_HEALPIX; spec.N = 2; - outlen = 4; - packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE; - packing_spec.bitsPerValue = 16; - packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; - packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; - - finalh = grib_util_set_spec( + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); Assert(finalh); @@ -103,7 +98,6 @@ static void test2() static void test3() { int err = 0; - grib_handle* finalh = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; double values[4] = {1.1, 2.2}; @@ -121,7 +115,7 @@ static void test3() packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; - finalh = grib_util_set_spec( + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); Assert(finalh); @@ -133,7 +127,6 @@ static void test3() static void test4() { int err = 0; - grib_handle* finalh = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; double values[4] = {1.1, 2.2, 3.3, 0.4}; @@ -145,7 +138,55 @@ static void test4() spec.grid_type = GRIB_UTIL_GRID_SPEC_POLAR_STEREOGRAPHIC; outlen = 4; - finalh = grib_util_set_spec( + grib_handle* finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(finalh); + Assert(err == 0); + dump_it(finalh); +} + +// Regular Gaussian +static void test5() +{ + int err = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2, 3.3, 0.4}; + int set_spec_flags = 0; + size_t outlen = 0; + + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_set_long(handle, "tablesVersion", 32); + spec.grid_type = GRIB_UTIL_GRID_SPEC_REGULAR_GG; + spec.Ni = spec.Nj = 2; + outlen = 4; + + grib_handle* finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(finalh); + Assert(err == 0); + dump_it(finalh); +} + +// Reduced LL +static void test6() +{ + int err = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2, 3.3, 0.4}; + int set_spec_flags = 0; + size_t outlen = 0; + + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_set_long(handle, "tablesVersion", 32); + spec.grid_type = GRIB_UTIL_GRID_SPEC_REDUCED_LL; + spec.Nj = 2; + outlen = 4; + + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); Assert(finalh); @@ -160,51 +201,7 @@ int main() test2(); test3(); test4(); + test5(); + test6(); return 0; } - -#if 0 -int main(int argc, char* argv[]) -{ - int i = 0, remove_local_def = 0; - int edition = 0; - char* packingType = NULL; - const char* prog = argv[0]; - char* infile_name = NULL; - char* outfile_name = NULL; - - if (argc == 1 || argc > 8) usage(prog); - - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-p") == 0) { - packingType = argv[i + 1]; - ++i; - } - else if (strcmp(argv[i], "-e") == 0) { - edition = atoi(argv[i + 1]); - ++i; - } - else if (strcmp(argv[i], "-r") == 0) { - remove_local_def = 1; - } - else { - /* Expect 2 filenames */ - infile_name = argv[i]; - outfile_name = argv[i + 1]; - break; - } - } -#if 0 - printf("DEBUG remove_local_def = %d\n", remove_local_def); - printf("DEBUG edition = %d\n", edition); - printf("DEBUG packingType = %s\n", packingType); - printf("DEBUG infile_name = %s\n", infile_name); - printf("DEBUG outfile_name = %s\n", outfile_name); -#endif - test_regular_ll(remove_local_def, edition, packingType, infile_name, outfile_name); - test_reduced_gg(remove_local_def, edition, packingType, infile_name, outfile_name); - /*test_grid_complex_spatial_differencing(remove_local_def, edition, packingType, infile_name, outfile_name);*/ - - return 0; -} -#endif diff --git a/tests/grib_util_set_spec2.sh b/tests/grib_util_set_spec2.sh index 6dd54373a..95fc00c01 100755 --- a/tests/grib_util_set_spec2.sh +++ b/tests/grib_util_set_spec2.sh @@ -10,9 +10,4 @@ . ./include.ctest.sh -grib_util_set_spec=${test_dir}/grib_util_set_spec2 -$EXEC $grib_util_set_spec - - -### Clean up - +$EXEC ${test_dir}/grib_util_set_spec2 From 6a41db4730a4cc1a9835b9b0df23118cf56cccf9 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sat, 17 Feb 2024 22:17:18 +0000 Subject: [PATCH 028/244] Testing: grib_util_set_spec cleanup --- tests/grib_util_set_spec2.cc | 92 +++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/tests/grib_util_set_spec2.cc b/tests/grib_util_set_spec2.cc index 5231ffd90..11e86a915 100644 --- a/tests/grib_util_set_spec2.cc +++ b/tests/grib_util_set_spec2.cc @@ -18,7 +18,7 @@ static void dump_it(grib_handle* h) } // Lambert conformal -static void test0() +static grib_handle* test0() { int err = 0; grib_util_grid_spec spec = {0,}; @@ -27,14 +27,10 @@ static void test0() int set_spec_flags = 0; size_t outlen = 4; - grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB1"); spec.grid_type = GRIB_UTIL_GRID_SPEC_LAMBERT_CONFORMAL; - spec.N = 2; - - packing_spec.extra_settings_count = 1; - packing_spec.extra_settings[0].type = GRIB_TYPE_LONG; - packing_spec.extra_settings[0].name = "tablesVersion"; - packing_spec.extra_settings[0].long_value = 32; + spec.Ni = 2; + spec.Nj = 2; // packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE; // packing_spec.bitsPerValue = 16; @@ -44,13 +40,12 @@ static void test0() grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); - Assert(finalh); Assert(err == 0); - dump_it(finalh); + return finalh; } // Lambert azimuthal -static void test1() +static grib_handle* test1() { int err = 0; grib_util_grid_spec spec = {0,}; @@ -66,13 +61,12 @@ static void test1() grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); - Assert(finalh); Assert(err == 0); - dump_it(finalh); + return finalh; } // HEALPix -static void test2() +static grib_handle* test2() { int err = 0; grib_util_grid_spec spec = {0,}; @@ -82,20 +76,23 @@ static void test2() size_t outlen = 4; grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); - grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_HEALPIX; spec.N = 2; + packing_spec.extra_settings_count = 1; + packing_spec.extra_settings[0].type = GRIB_TYPE_LONG; + packing_spec.extra_settings[0].name = "tablesVersion"; + packing_spec.extra_settings[0].long_value = 32; + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); - Assert(finalh); Assert(err == 0); - dump_it(finalh); + return finalh; } // Spherical harmonics -static void test3() +static grib_handle* test3() { int err = 0; grib_util_grid_spec spec = {0,}; @@ -105,7 +102,6 @@ static void test3() size_t outlen = 0; grib_handle* handle = grib_handle_new_from_samples(0, "sh_pl_grib2"); - grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_SH; spec.truncation = 20; outlen = 2; @@ -118,13 +114,12 @@ static void test3() grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); - Assert(finalh); Assert(err == 0); - dump_it(finalh); + return finalh; } // Polar stereo -static void test4() +static grib_handle* test4() { int err = 0; grib_util_grid_spec spec = {0,}; @@ -141,13 +136,12 @@ static void test4() grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); - Assert(finalh); Assert(err == 0); - dump_it(finalh); + return finalh; } // Regular Gaussian -static void test5() +static grib_handle* test5() { int err = 0; grib_util_grid_spec spec = {0,}; @@ -157,7 +151,6 @@ static void test5() size_t outlen = 0; grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); - grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_REGULAR_GG; spec.Ni = spec.Nj = 2; outlen = 4; @@ -165,13 +158,12 @@ static void test5() grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); - Assert(finalh); Assert(err == 0); - dump_it(finalh); + return finalh; } // Reduced LL -static void test6() +static grib_handle* test6() { int err = 0; grib_util_grid_spec spec = {0,}; @@ -181,7 +173,6 @@ static void test6() size_t outlen = 0; grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); - grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_REDUCED_LL; spec.Nj = 2; outlen = 4; @@ -189,19 +180,42 @@ static void test6() grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); - Assert(finalh); Assert(err == 0); - dump_it(finalh); + return finalh; +} + +// Unstructured +static grib_handle* test7() +{ + int err = 0; + grib_util_grid_spec spec = {0,}; + grib_util_packing_spec packing_spec = {0,}; + double values[4] = {1.1, 2.2, 3.3, 0.4}; + int set_spec_flags = 0; + size_t outlen = 4; + + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + spec.grid_type = GRIB_UTIL_GRID_SPEC_UNSTRUCTURED; + + grib_handle* finalh = grib_util_set_spec( + handle, &spec, &packing_spec, set_spec_flags, + values, outlen, &err); + Assert(err == 0); + return finalh; } int main() { - test0(); - test1(); - test2(); - test3(); - test4(); - test5(); - test6(); + typedef grib_handle* (*test_func)(void); + test_func funcs[] = {test0, test1, test2, test3, test4, test5, test6, test7}; + + //grib_handle* (*p[8]) (void) = {test0, test1, test2, test3, test4, test5, test6, test7}; + + const size_t num_tests = sizeof(funcs)/sizeof(funcs[0]); + for (size_t i = 0; i < num_tests; i++) { + grib_handle* result = funcs[i](); + Assert(result); + dump_it(result); + } return 0; } From 95bd0bc0066ea9bdf0b3890ef68fa865edcc4694 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sun, 18 Feb 2024 13:12:13 +0000 Subject: [PATCH 029/244] Testing: Secondary bitmaps (GRIB1) --- tests/grib_secondary_bitmap.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/grib_secondary_bitmap.sh b/tests/grib_secondary_bitmap.sh index 11af77e6b..05cfb5951 100755 --- a/tests/grib_secondary_bitmap.sh +++ b/tests/grib_secondary_bitmap.sh @@ -18,6 +18,7 @@ tempLog=temp.$label.log tempRef=temp.$label.ref # Use a GRIB2 input with a bitmap +# ---------------------------------- input=$data_dir/reduced_latlon_surface.grib2 grib_check_key_equals $input bitmapPresent 1 ${tools_dir}/grib_set -s packingType=grid_simple_matrix,NC=1,NR=1 $input $tempGribA @@ -26,10 +27,23 @@ ${tools_dir}/grib_dump -O $tempGribB ${tools_dir}/grib_dump -Dat $tempGribB # Call pack_double and unpack_double +# ---------------------------------- cat >$tempFilt<$tempFilt< Date: Sun, 18 Feb 2024 13:14:07 +0000 Subject: [PATCH 030/244] Cleanup --- definitions/boot.def | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/definitions/boot.def b/definitions/boot.def index 61a7b7be0..8111e1634 100644 --- a/definitions/boot.def +++ b/definitions/boot.def @@ -18,12 +18,12 @@ constant defaultTypeOfLevel="unknown" : hidden; gribDataQualityChecks = getenv("ECCODES_GRIB_DATA_QUALITY_CHECKS","0") : hidden; if (gribDataQualityChecks) { - template LIMITS "param_limits.def"; + template LIMITS "param_limits.def"; } # GRIBEX special boustrophedonic mode. See GRIB-472 # If the environment variable is not defined, the key will be 0 -GRIBEX_boustrophedonic = getenv("ECCODES_GRIBEX_BOUSTROPHEDONIC","0") :hidden; +GRIBEX_boustrophedonic = getenv("ECCODES_GRIBEX_BOUSTROPHEDONIC","0") :hidden; constant zero=0 : hidden; constant one=1 : hidden; @@ -61,65 +61,65 @@ transient produceLargeConstantFields = 0 : hidden; meta libraryVersion library_version() : hidden; -lookup[4] kindOfProduct (0,identifier) : hidden; +lookup[4] kindOfProduct (0,identifier) : hidden; # grib templates # `ABCD` is a number, each letter being a byte if(kindOfProduct == `GRIB`){ - lookup[1] GRIBEditionNumber (7,editionNumber) : edition_specific ; - template GRIB "grib[GRIBEditionNumber:l]/boot.def" ; + lookup[1] GRIBEditionNumber (7,editionNumber) : edition_specific; + template GRIB "grib[GRIBEditionNumber:l]/boot.def" ; } if(kindOfProduct == `BUDG` ){ - template BUDG "budg/boot.def" ; + template BUDG "budg/boot.def" ; } if(kindOfProduct == `DIAG`){ - template DIAG "diag/boot.def" ; + template DIAG "diag/boot.def" ; } if(kindOfProduct == `TIDE`){ - template TIDE "tide/boot.def" ; + template TIDE "tide/boot.def" ; } if(kindOfProduct == `BUFR`){ - template BUFR "bufr/boot.def" ; + template BUFR "bufr/boot.def" ; #constant BUFRstr="BUFR"; #ECC-742 #alias identifier=BUFRstr; } if(kindOfProduct == `CDFX`){ - template CDF "cdf/boot.def" ; - constant CDFstr="netCDF"; + template CDF "cdf/boot.def" ; + constant CDFstr="netCDF"; alias ls.identifier=CDFstr; } if(kindOfProduct == 17632522 ){ - template GTS "gts/boot.def" ; + template GTS "gts/boot.def" ; constant GTSstr="GTS"; alias ls.identifier=GTSstr; } if(kindOfProduct == `META` ){ - template METAR "metar/boot.def" ; + template METAR "metar/boot.def" ; constant METARstr="METAR"; alias identifier=METARstr; } if(kindOfProduct == `TAF ` ){ - template TAF "taf/boot.def" ; + template TAF "taf/boot.def" ; constant TAFstr="TAF"; alias ls.identifier=TAFstr; } if(kindOfProduct == 2303214662){ - template HDF5 "hdf5/boot.def" ; - constant HDF5str="HDF5"; + template HDF5 "hdf5/boot.def" ; + constant HDF5str="HDF5"; alias ls.identifier=HDF5str; } if(kindOfProduct == `WRAP`){ - template WRAP "wrap/boot.def" ; - constant WRAPstr="WRAP"; + template WRAP "wrap/boot.def" ; + constant WRAPstr="WRAP"; alias ls.identifier=WRAPstr; } From 2535d2ec0ca851559e05cad3d303d8b087861877 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sun, 18 Feb 2024 14:09:35 +0000 Subject: [PATCH 031/244] Testing: signed_bits --- tests/grib_filter.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh index 951ea9433..c932cf026 100755 --- a/tests/grib_filter.sh +++ b/tests/grib_filter.sh @@ -467,6 +467,18 @@ set -e [ $status -ne 0 ] grep -q "Unable to open file" $tempOut +# Signed bits +# ----------- +cat >$tempFilt < $tempOut 2>&1 +status=$? +set -e +[ $status -ne 0 ] + # Setting step # ------------- From f691cd9d0c90ce699114d41db232bc9cbc405114 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sun, 18 Feb 2024 14:24:37 +0000 Subject: [PATCH 032/244] cppcheck warnings --- src/grib_accessor.cc | 117 +++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 60 deletions(-) diff --git a/src/grib_accessor.cc b/src/grib_accessor.cc index 62d4c5e59..0b4b7ed99 100644 --- a/src/grib_accessor.cc +++ b/src/grib_accessor.cc @@ -10,13 +10,12 @@ /*************************************************************************** * Jean Baptiste Filippi - 01.11.2005 - * Enrico Fucile ***************************************************************************/ #include "grib_accessor.h" -/* Note: A fast cut-down version of strcmp which does NOT return -1 */ -/* 0 means input strings are equal and 1 means not equal */ +// Note: A fast cut-down version of strcmp which does NOT return -1 +// 0 means input strings are equal and 1 means not equal GRIB_INLINE static int grib_inline_strcmp(const char* a, const char* b) { if (*a != *b) @@ -44,7 +43,7 @@ void grib_accessor_dump(grib_accessor* a, grib_dumper* f) int grib_pack_missing(grib_accessor* a) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->pack_missing) { return c->pack_missing(a); @@ -58,7 +57,6 @@ int grib_pack_missing(grib_accessor* a) int grib_pack_zero(grib_accessor* a) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ while (c) { if (c->clear) { return c->clear(a); @@ -72,7 +70,8 @@ int grib_pack_zero(grib_accessor* a) int grib_is_missing_internal(grib_accessor* a) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + // grib_context_log(a->context, GRIB_LOG_DEBUG, + // "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->is_missing) { return c->is_missing(a); @@ -86,7 +85,7 @@ int grib_is_missing_internal(grib_accessor* a) int grib_pack_double(grib_accessor* a, const double* v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->pack_double) { return c->pack_double(a, v, len); @@ -113,7 +112,7 @@ int grib_pack_float(grib_accessor* a, const float* v, size_t* len) int grib_pack_expression(grib_accessor* a, grib_expression* e) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->pack_expression) { return c->pack_expression(a, e); @@ -127,7 +126,7 @@ int grib_pack_expression(grib_accessor* a, grib_expression* e) int grib_pack_string(grib_accessor* a, const char* v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (string) %s",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?v:"(null)");*/ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (string) %s",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?v:"(null)"); while (c) { if (c->pack_string) { return c->pack_string(a, v, len); @@ -141,7 +140,7 @@ int grib_pack_string(grib_accessor* a, const char* v, size_t* len) int grib_pack_string_array(grib_accessor* a, const char** v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (string) %s",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?v:"(null)");*/ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (string) %s",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?v:"(null)"); while (c) { if (c->pack_string_array) { return c->pack_string_array(a, v, len); @@ -155,7 +154,7 @@ int grib_pack_string_array(grib_accessor* a, const char** v, size_t* len) int grib_pack_long(grib_accessor* a, const long* v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (long) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (long) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->pack_long) { return c->pack_long(a, v, len); @@ -169,7 +168,7 @@ int grib_pack_long(grib_accessor* a, const long* v, size_t* len) int grib_pack_bytes(grib_accessor* a, const unsigned char* v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (bytes) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (bytes) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->pack_bytes) { return c->pack_bytes(a, v, len); @@ -183,7 +182,7 @@ int grib_pack_bytes(grib_accessor* a, const unsigned char* v, size_t* len) int grib_unpack_bytes(grib_accessor* a, unsigned char* v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (bytes)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (bytes)",(a->parent->owner)?(a->parent->owner->name):"root", a->name); while (c) { if (c->unpack_bytes) { return c->unpack_bytes(a, v, len); @@ -210,7 +209,7 @@ int grib_unpack_double_subarray(grib_accessor* a, double* v, size_t start, size_ int grib_unpack_double(grib_accessor* a, double* v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (double)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (double)",(a->parent->owner)?(a->parent->owner->name):"root", a->name); while (c) { if (c->unpack_double) { return c->unpack_double(a, v, len); @@ -225,7 +224,7 @@ int grib_unpack_float(grib_accessor* a, float* v, size_t* len) { grib_accessor_class* c = a->cclass; while (c) { - /* printf("grib_accessor.c grib_unpack_float:: c->name=%s\n",c->name); */ + //printf("grib_accessor.c grib_unpack_float:: c->name=%s\n",c->name); if (c->unpack_float) { return c->unpack_float(a, v, len); } @@ -260,20 +259,19 @@ int grib_unpack_double_element(grib_accessor* a, size_t i, double* v) } int grib_unpack_float_element(grib_accessor* a, size_t i, float* v) { - /* grib_accessor_class* c = a->cclass; - * while (c) { - * if (c->unpack_float_element) { - * return c->unpack_float_element(a, i, v); - * } - * c = c->super ? *(c->super) : NULL; - * } - */ + // grib_accessor_class* c = a->cclass; + // while (c) { + // if (c->unpack_float_element) { + // return c->unpack_float_element(a, i, v); + // } + // c = c->super ? *(c->super) : NULL; + //} + return GRIB_NOT_IMPLEMENTED; } -/* Get the values for the indices passed in. - * The length of the 'index_array' argument should be 'len' and 'val_array' should also contain at least 'len' elements - */ +// Get the values for the indices passed in. +// The length of the 'index_array' argument should be 'len' and 'val_array' should also contain at least 'len' elements int grib_unpack_double_element_set(grib_accessor* a, const size_t* index_array, size_t len, double* val_array) { grib_accessor_class* c = a->cclass; @@ -288,23 +286,22 @@ int grib_unpack_double_element_set(grib_accessor* a, const size_t* index_array, } int grib_unpack_float_element_set(grib_accessor* a, const size_t* index_array, size_t len, float* val_array) { - /* - *grib_accessor_class* c = a->cclass; - *DEBUG_ASSERT(len > 0); - *while (c) { - * if (c->unpack_float_element_set) { - * return c->unpack_float_element_set(a, index_array, len, val_array); - * } - * c = c->super ? *(c->super) : NULL; - *} - */ + // grib_accessor_class* c = a->cclass; + // DEBUG_ASSERT(len > 0); + // while (c) { + // if (c->unpack_float_element_set) { + // return c->unpack_float_element_set(a, index_array, len, val_array); + // } + // c = c->super ? *(c->super) : NULL; + // } + return GRIB_NOT_IMPLEMENTED; } int grib_unpack_string(grib_accessor* a, char* v, size_t* len) { grib_accessor_class* c = a->cclass; - /* grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (string)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (string)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); while (c) { if (c->unpack_string) { return c->unpack_string(a, v, len); @@ -399,7 +396,7 @@ int grib_accessors_list_unpack_string(grib_accessors_list* al, char** val, size_ int grib_unpack_long(grib_accessor* a, long* v, size_t* len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (long)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is unpacking (long)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); while (c) { if (c->unpack_long) { return c->unpack_long(a, v, len); @@ -428,7 +425,8 @@ long grib_accessor_get_native_type(grib_accessor* a) long grib_get_next_position_offset(grib_accessor* a) { grib_accessor_class* c = NULL; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is checking next (long)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, + // "(%s)%s is checking next (long)",(a->parent->owner)?(a->parent->owner->name):"root", a->name ); if (a) c = a->cclass; @@ -533,8 +531,7 @@ int grib_accessor_notify_change(grib_accessor* a, grib_accessor* changed) return 0; } -/* For this one, ALL init are called */ - +// For this one, ALL init are called static void init_accessor(grib_accessor_class* c, grib_accessor* a, const long len, grib_arguments* args) { if (c) { @@ -550,27 +547,26 @@ void grib_init_accessor(grib_accessor* a, const long len, grib_arguments* args) init_accessor(a->cclass, a, len, args); } -/* For this one, ALL destroy are called */ - +// For this one, ALL destroy are called void grib_accessor_delete(grib_context* ct, grib_accessor* a) { grib_accessor_class* c = a->cclass; while (c) { grib_accessor_class* s = c->super ? *(c->super) : NULL; - /*printf("grib_accessor_delete: before destroy a=%p c->name=%s ==> a->name=%s\n", (void*)a, c->name, a->name);*/ + //printf("grib_accessor_delete: before destroy a=%p c->name=%s ==> a->name=%s\n", (void*)a, c->name, a->name); if (c->destroy) { c->destroy(ct, a); } c = s; } - /*printf("grib_accessor_delete before free a=%p\n", (void*)a);*/ + // printf("grib_accessor_delete before free a=%p\n", (void*)a); grib_context_free(ct, a); } grib_accessor* grib_accessor_clone(grib_accessor* a, grib_section* s, int* err) { grib_accessor_class* c = a->cclass; - grib_context* ct = a->context; + const grib_context* ct = a->context; while (c) { grib_accessor_class* super = c->super ? *(c->super) : NULL; grib_context_log(ct, GRIB_LOG_DEBUG, "clone %s ==> %s", c->name, a->name); @@ -585,7 +581,8 @@ grib_accessor* grib_accessor_clone(grib_accessor* a, grib_section* s, int* err) void grib_update_size(grib_accessor* a, size_t len) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, + // "(%s)%s is packing (double) %g",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->update_size) { c->update_size(a, len); @@ -613,7 +610,8 @@ int grib_nearest_smaller_value(grib_accessor* a, double val, double* nearest) size_t grib_preferred_size(grib_accessor* a, int from_handle) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (long) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + // grib_context_log(a->context, GRIB_LOG_DEBUG, + // "(%s)%s is packing (long) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->preferred_size) { return c->preferred_size(a, from_handle); @@ -640,7 +638,8 @@ grib_accessor* grib_next_accessor(grib_accessor* a) void grib_resize(grib_accessor* a, size_t new_size) { grib_accessor_class* c = a->cclass; - /*grib_context_log(a->context, GRIB_LOG_DEBUG, "(%s)%s is packing (long) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); */ + //grib_context_log(a->context, GRIB_LOG_DEBUG, + // "(%s)%s is packing (long) %d",(a->parent->owner)?(a->parent->owner->name):"root", a->name ,v?(*v):0); while (c) { if (c->resize) { c->resize(a, new_size); @@ -714,7 +713,7 @@ int grib_accessor_add_attribute(grib_accessor* a, grib_accessor* attr, int nest_ for (id = 0; id < MAX_ACCESSOR_ATTRIBUTES; id++) { if (aloc->attributes[id] == NULL) { - /* attr->parent=a->parent; */ + // attr->parent=a->parent; aloc->attributes[id] = attr; attr->parent_as_attribute = aloc; if (aloc->same) @@ -823,7 +822,7 @@ grib_accessors_list* grib_accessors_list_create(grib_context* c) void grib_accessors_list_push(grib_accessors_list* al, grib_accessor* a, int rank) { grib_accessors_list* last; - grib_context* c = a->context; + const grib_context* c = a->context; last = grib_accessors_list_last(al); if (last && last->accessor) { @@ -842,15 +841,13 @@ void grib_accessors_list_push(grib_accessors_list* al, grib_accessor* a, int ran grib_accessors_list* grib_accessors_list_last(grib_accessors_list* al) { - /*grib_accessors_list* last=al;*/ - /*grib_accessors_list* next=al->next;*/ + // grib_accessors_list* last=al; + // grib_accessors_list* next=al->next; + // while(next) { + // last=next; + // next=last->next; + // } - /* - while(next) { - last=next; - next=last->next; - } - */ return al->last; } @@ -875,7 +872,7 @@ void grib_accessors_list_delete(grib_context* c, grib_accessors_list* al) while (al) { tmp = al->next; - /*grib_accessor_delete(c, al->accessor);*/ + //grib_accessor_delete(c, al->accessor); grib_context_free(c, al); al = tmp; } From 2925ec7c91e30c4035f32537569ee81fe39bfa49 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sun, 18 Feb 2024 14:28:25 +0000 Subject: [PATCH 033/244] cppcheck warnings --- src/action_class_set_darray.cc | 5 ++--- src/action_class_set_missing.cc | 10 ++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/action_class_set_darray.cc b/src/action_class_set_darray.cc index 97211a219..bbf36f1d6 100644 --- a/src/action_class_set_darray.cc +++ b/src/action_class_set_darray.cc @@ -98,15 +98,14 @@ grib_action* grib_action_create_set_darray(grib_context* context, static int execute(grib_action* a, grib_handle* h) { - grib_action_set_darray* self = (grib_action_set_darray*)a; - + const grib_action_set_darray* self = (grib_action_set_darray*)a; return grib_set_double_array(h, self->name, self->darray->v, self->darray->n); } static void dump(grib_action* act, FILE* f, int lvl) { int i = 0; - grib_action_set_darray* self = (grib_action_set_darray*)act; + const grib_action_set_darray* self = (grib_action_set_darray*)act; for (i = 0; i < lvl; i++) grib_context_print(act->context, f, " "); grib_context_print(act->context, f, self->name); diff --git a/src/action_class_set_missing.cc b/src/action_class_set_missing.cc index 84b5fe085..3a40038b5 100644 --- a/src/action_class_set_missing.cc +++ b/src/action_class_set_missing.cc @@ -73,8 +73,7 @@ static void init_class(grib_action_class* c) } /* END_CLASS_IMP */ -grib_action* grib_action_create_set_missing(grib_context* context, - const char* name) +grib_action* grib_action_create_set_missing(grib_context* context, const char* name) { char buf[1024]; @@ -98,15 +97,14 @@ grib_action* grib_action_create_set_missing(grib_context* context, static int execute(grib_action* a, grib_handle* h) { - grib_action_set_missing* self = (grib_action_set_missing*)a; - + const grib_action_set_missing* self = (grib_action_set_missing*)a; return grib_set_missing(h, self->name); } static void dump(grib_action* act, FILE* f, int lvl) { - int i = 0; - grib_action_set_missing* self = (grib_action_set_missing*)act; + int i = 0; + const grib_action_set_missing* self = (grib_action_set_missing*)act; for (i = 0; i < lvl; i++) grib_context_print(act->context, f, " "); grib_context_print(act->context, f, self->name); From bbc8d4790ee1e3bb867fcbd483274683f2c6a5de Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sun, 18 Feb 2024 14:35:19 +0000 Subject: [PATCH 034/244] Const correctness --- src/action_class_concept.cc | 6 +++--- src/action_class_set_sarray.cc | 9 +++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/action_class_concept.cc b/src/action_class_concept.cc index 74fb25588..3f42fb9e5 100644 --- a/src/action_class_concept.cc +++ b/src/action_class_concept.cc @@ -128,7 +128,7 @@ grib_concept_value* action_concept_get_concept(grib_accessor* a) int action_concept_get_nofail(grib_accessor* a) { - grib_action_concept* self = (grib_action_concept*)a->creator; + const grib_action_concept* self = (grib_action_concept*)a->creator; return self->nofail; } @@ -397,9 +397,9 @@ int get_concept_condition_string(grib_handle* h, const char* key, const char* va grib_concept_condition* concept_condition = concept_value->conditions; if (strcmp(pValue, concept_value->name) == 0) { while (concept_condition) { - grib_expression* expression = concept_condition->expression; + //grib_expression* expression = concept_condition->expression; const char* condition_name = concept_condition->name; - Assert(expression); + //Assert(expression); if (concept_condition_expression_true(h, concept_condition, exprVal) && strcmp(condition_name, "one") != 0) { length += snprintf(result + length, 2048, "%s%s=%s", (length == 0 ? "" : ","), condition_name, exprVal); diff --git a/src/action_class_set_sarray.cc b/src/action_class_set_sarray.cc index 3b670aa87..bc51c2475 100644 --- a/src/action_class_set_sarray.cc +++ b/src/action_class_set_sarray.cc @@ -72,9 +72,7 @@ static void init_class(grib_action_class* c) } /* END_CLASS_IMP */ -grib_action* grib_action_create_set_sarray(grib_context* context, - const char* name, - grib_sarray* sarray) +grib_action* grib_action_create_set_sarray(grib_context* context, const char* name, grib_sarray* sarray) { char buf[1024]; @@ -100,14 +98,13 @@ grib_action* grib_action_create_set_sarray(grib_context* context, static int execute(grib_action* a, grib_handle* h) { grib_action_set_sarray* self = (grib_action_set_sarray*)a; - return grib_set_string_array(h, self->name, (const char**)self->sarray->v, self->sarray->n); } static void dump(grib_action* act, FILE* f, int lvl) { - int i = 0; - grib_action_set_sarray* self = (grib_action_set_sarray*)act; + int i = 0; + const grib_action_set_sarray* self = (grib_action_set_sarray*)act; for (i = 0; i < lvl; i++) grib_context_print(act->context, f, " "); grib_context_print(act->context, f, self->name); From 64f3b3c7dfe29b1e3024d47691893256defeefee Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Sun, 18 Feb 2024 15:39:32 +0000 Subject: [PATCH 035/244] Testing: JPEG and lib version tests --- tests/grib2_version.sh | 19 +++++++++++++++++-- tests/grib_jpeg.sh | 8 ++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/tests/grib2_version.sh b/tests/grib2_version.sh index 1f7cbe8b5..6e6daef42 100755 --- a/tests/grib2_version.sh +++ b/tests/grib2_version.sh @@ -17,6 +17,8 @@ if [ ! -d "$ECCODES_DEFINITION_PATH" ]; then fi temp=temp.$label.grib2 +tempFilt=temp.$label.filt +tempText=temp.$label.txt sample1=$ECCODES_SAMPLES_PATH/GRIB1.tmpl sample2=$ECCODES_SAMPLES_PATH/GRIB2.tmpl tables_dir="$ECCODES_DEFINITION_PATH/grib2/tables" @@ -34,7 +36,6 @@ fi cd $test_dir # Check table 1.0 # Check it has the latest with description matching "Version implemented on DD MM YYYY" -tempText=temp.$label.txt ${tools_dir}/grib_set -s tablesVersion=$latest $sample2 $temp ${tools_dir}/grib_dump -O -p tablesVersion $temp > $tempText grep -q "Version implemented on" $tempText @@ -50,4 +51,18 @@ if [ "$tablesVersion" != "$latestOfficial" ]; then exit 1 fi -rm -f $temp +# Library and definitions versions +cat >$tempFilt< $tempText 2>&1 +status=$? +set -e +[ $status -ne 0 ] +cat $tempText +grep -q "Definition files version .* is greater than engine version" $tempText + +rm -f $tempFilt $temp $tempText diff --git a/tests/grib_jpeg.sh b/tests/grib_jpeg.sh index 69210430e..43575651c 100755 --- a/tests/grib_jpeg.sh +++ b/tests/grib_jpeg.sh @@ -164,6 +164,14 @@ if [ $HAVE_LIBJASPER -eq 0 ]; then set -e [ $status -ne 0 ] grep -q "JasPer JPEG support not enabled" $tempDump + + infile=$data_dir/sample.grib2 + set +e + ECCODES_GRIB_JPEG=jasper ${tools_dir}/grib_set -rs packingType=grid_jpeg $infile $outfile1 > $tempDump 2>&1 + status=$? + set -e + [ $status -ne 0 ] + grep -q "JasPer JPEG support not enabled" $tempDump fi # Clean up From b0f949187c6fa95e3a409c34e24aede81878b238 Mon Sep 17 00:00:00 2001 From: Sebastien Villaume Date: Mon, 19 Feb 2024 10:48:31 +0000 Subject: [PATCH 036/244] move block for stepRange in mmsf/fc to top of grib.mmsf.fc.def --- definitions/mars/grib.mmsf.fc.def | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/definitions/mars/grib.mmsf.fc.def b/definitions/mars/grib.mmsf.fc.def index 7adb27059..f1820336a 100644 --- a/definitions/mars/grib.mmsf.fc.def +++ b/definitions/mars/grib.mmsf.fc.def @@ -1,4 +1,9 @@ -alias mars.step = endStep; +if (levtype is "o2d" || levtype is "o3d") { + alias mars.step = stepRange; +} else { + alias mars.step = endStep; +} + if (class is "od") { alias mars.system = systemNumber; } if (class is "me") { alias mars.system = systemNumber; } if (class is "en") { alias mars.system = systemNumber; } @@ -18,8 +23,3 @@ if (centre == 80 && subCentre == 98 && class is "c3") { if (class is "ci") { unalias mars.method; } -if (levtype is "o2d" || levtype is "o3d") { - alias mars.step = stepRange; -} else { - alias mars.step = endStep; -} From 0dc3c273cc5065c6d6980cb610b7e40649aa9c09 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 11:26:59 +0000 Subject: [PATCH 037/244] ECC-1768: GRIB2: Issue with setting PDTN 8, stepUnits and step at the same time (Initial try) --- src/grib_accessor_class_g2step_range.cc | 5 +++++ tests/bufr_compare.sh | 25 +++++++++++++++++++++++++ tests/grib_sub_hourly.sh | 14 ++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/grib_accessor_class_g2step_range.cc b/src/grib_accessor_class_g2step_range.cc index c39601a40..685c8a29b 100644 --- a/src/grib_accessor_class_g2step_range.cc +++ b/src/grib_accessor_class_g2step_range.cc @@ -211,6 +211,11 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) if ((ret = grib_get_long_internal(h, "forceStepUnits", &force_step_units)) != GRIB_SUCCESS) return ret; + // TODO(maee): A better solution should be found + if (h->loader) { // h->loader is set only when rebuilding or reparsing + force_step_units = 255; // See ECC-1768 + } + try { std::vector steps = parse_range(val, eccodes::Unit{force_step_units}); if (steps.size() == 0) { diff --git a/tests/bufr_compare.sh b/tests/bufr_compare.sh index 882fa3293..27f0c071b 100755 --- a/tests/bufr_compare.sh +++ b/tests/bufr_compare.sh @@ -351,6 +351,31 @@ set -e [ $status -ne 0 ] grep -q "unreadable message" $fLog +###??? +f1="aaen_55.bufr" +f2="aaen_55.bufr" +set +e +${tools_dir}/bufr_compare -H -c edition $f1 $f2 > $fLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "options are incompatible" $fLog + +set +e +${tools_dir}/bufr_compare -a edition $f1 $f2 > $fLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "a option requires -c option" $fLog + + +set +e +${tools_dir}/bufr_compare nosuchfile $f1 > $fLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] + + # Clean up # ------------- diff --git a/tests/grib_sub_hourly.sh b/tests/grib_sub_hourly.sh index 75b113b7e..fdd174c28 100755 --- a/tests/grib_sub_hourly.sh +++ b/tests/grib_sub_hourly.sh @@ -520,6 +520,20 @@ cat $tempFilt ${tools_dir}/grib_filter $tempFilt $data_dir/constant_field.grib2 unset ECCODES_GRIB_HOURLY_STEPS_WITH_UNITS + +# Changing the product definition template +# ---------------------------------------- +# See ECC-1768 +${tools_dir}/grib_set -s step=62m $sample_g2 $temp +${tools_dir}/grib_set -s productDefinitionTemplateNumber=8 $temp $temp2 + +${tools_dir}/grib_set -s productDefinitionTemplateNumber=8,stepUnits=s,step=0 $sample_g2 $temp +grib_check_key_equals $temp '-p stepUnits:s,startStep,productDefinitionTemplateNumber' 's 0s 8' + +${tools_dir}/grib_set -s productDefinitionTemplateNumber=8,stepUnits=m,step=60 $sample_g2 $temp +grib_check_key_equals $temp '-p stepUnits:s,productDefinitionTemplateNumber' 'h 8' + + # Bad stepUnits set +e ${tools_dir}/grib_set -s stepUnits=190 $sample_g2 $temp > $tempText 2>&1 From fa65a96e885c748517436d957eedce96d1147a54 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 11:41:47 +0000 Subject: [PATCH 038/244] Testing: Rename --- tests/CMakeLists.txt | 6 +++--- tests/{bufr_threads_ecc-604.cc => bufr_encode_pthreads.cc} | 0 tests/{bufr_threads_ecc-604.sh => bufr_encode_pthreads.sh} | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename tests/{bufr_threads_ecc-604.cc => bufr_encode_pthreads.cc} (100%) rename tests/{bufr_threads_ecc-604.sh => bufr_encode_pthreads.sh} (95%) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3edb8ee1e..a944a448a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -445,7 +445,7 @@ if( HAVE_BUILD_TOOLS ) TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_encode_pthreads.sh ) - foreach( test grib_threads_ecc-604 grib_threads_ecc-604-encode bufr_threads_ecc-604 ) + foreach( test grib_threads_ecc-604 grib_threads_ecc-604-encode bufr_encode_pthreads ) ecbuild_add_executable( TARGET ${test} NOINSTALL SOURCES ${test}.cc @@ -455,10 +455,10 @@ if( HAVE_BUILD_TOOLS ) TYPE SCRIPT TEST_DEPENDS eccodes_download_gribs COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_threads_ecc-604.sh ) - ecbuild_add_test( TARGET eccodes_t_bufr_threads_ecc-604 + ecbuild_add_test( TARGET eccodes_t_bufr_encode_pthreads TYPE SCRIPT TEST_DEPENDS eccodes_download_bufrs - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bufr_threads_ecc-604.sh ) + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bufr_encode_pthreads.sh ) endif() if( NOT ECCODES_ON_WINDOWS ) diff --git a/tests/bufr_threads_ecc-604.cc b/tests/bufr_encode_pthreads.cc similarity index 100% rename from tests/bufr_threads_ecc-604.cc rename to tests/bufr_encode_pthreads.cc diff --git a/tests/bufr_threads_ecc-604.sh b/tests/bufr_encode_pthreads.sh similarity index 95% rename from tests/bufr_threads_ecc-604.sh rename to tests/bufr_encode_pthreads.sh index 7b7a886a9..b6262e76d 100755 --- a/tests/bufr_threads_ecc-604.sh +++ b/tests/bufr_encode_pthreads.sh @@ -10,13 +10,13 @@ . ./include.ctest.sh -label="bufr_threads_ecc-604" +label="bufr_encode_pthreads_test" temp_dir=tempdir.${label} NUM_THREADS=3 NUM_ITER=5 OUTPUT=output -PROG="${test_dir}/bufr_threads_ecc-604" +PROG="${test_dir}/bufr_encode_pthreads" validate() { From e938f1da0cdda177bf3c4bb6ecc17fe6dd702d23 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 12:30:36 +0000 Subject: [PATCH 039/244] Testing: Rename --- tests/CMakeLists.txt | 6 +++--- tests/{grib_threads_ecc-604.cc => grib_encode_pthreads2.cc} | 0 tests/{grib_threads_ecc-604.sh => grib_encode_pthreads2.sh} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename tests/{grib_threads_ecc-604.cc => grib_encode_pthreads2.cc} (100%) rename tests/{grib_threads_ecc-604.sh => grib_encode_pthreads2.sh} (98%) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a944a448a..21640b8bb 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -445,16 +445,16 @@ if( HAVE_BUILD_TOOLS ) TYPE SCRIPT COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_encode_pthreads.sh ) - foreach( test grib_threads_ecc-604 grib_threads_ecc-604-encode bufr_encode_pthreads ) + foreach( test grib_encode_pthreads2 grib_threads_ecc-604-encode bufr_encode_pthreads ) ecbuild_add_executable( TARGET ${test} NOINSTALL SOURCES ${test}.cc LIBS eccodes ${CMAKE_THREAD_LIBS_INIT} ) endforeach() - ecbuild_add_test( TARGET eccodes_t_grib_threads_ecc-604 + ecbuild_add_test( TARGET eccodes_t_grib_encode_pthreads2 TYPE SCRIPT TEST_DEPENDS eccodes_download_gribs - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_threads_ecc-604.sh ) + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/grib_encode_pthreads2.sh ) ecbuild_add_test( TARGET eccodes_t_bufr_encode_pthreads TYPE SCRIPT TEST_DEPENDS eccodes_download_bufrs diff --git a/tests/grib_threads_ecc-604.cc b/tests/grib_encode_pthreads2.cc similarity index 100% rename from tests/grib_threads_ecc-604.cc rename to tests/grib_encode_pthreads2.cc diff --git a/tests/grib_threads_ecc-604.sh b/tests/grib_encode_pthreads2.sh similarity index 98% rename from tests/grib_threads_ecc-604.sh rename to tests/grib_encode_pthreads2.sh index c2d491ffb..56d894013 100755 --- a/tests/grib_threads_ecc-604.sh +++ b/tests/grib_encode_pthreads2.sh @@ -16,7 +16,7 @@ temp_dir=tempdir.${label} NUM_THREADS=3 NUM_ITER=10 OUTPUT=output -PROG="${test_dir}/grib_threads_ecc-604" +PROG="${test_dir}/grib_encode_pthreads2" validate() { From 1e24c813f56e9b0a8cb43e413a611041bf5ef5d6 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 12:37:48 +0000 Subject: [PATCH 040/244] Definitions: Formatting --- definitions/boot.def | 2 +- definitions/grib2/boot.def | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/definitions/boot.def b/definitions/boot.def index 8111e1634..bb8991382 100644 --- a/definitions/boot.def +++ b/definitions/boot.def @@ -84,7 +84,7 @@ if(kindOfProduct == `TIDE`){ if(kindOfProduct == `BUFR`){ template BUFR "bufr/boot.def" ; - #constant BUFRstr="BUFR"; #ECC-742 + #constant BUFRstr="BUFR"; #ECC-742 #alias identifier=BUFRstr; } diff --git a/definitions/grib2/boot.def b/definitions/grib2/boot.def index 61f3c000d..4ed94b503 100644 --- a/definitions/grib2/boot.def +++ b/definitions/grib2/boot.def @@ -16,9 +16,9 @@ constant tablesVersionLatest = 32 : edition_specific; constant false = 0 : hidden; constant true = 1 : hidden; constant million = 1000000 : hidden; -constant grib2divider = 1000000; -alias extraDimensionPresent=zero; -transient angleSubdivisions=grib2divider; # micro degrees +constant grib2divider = 1000000; +alias extraDimensionPresent = zero; +transient angleSubdivisions = grib2divider; # micro degrees transient forceStepUnits = 255 : hidden; meta gts_header gts_header() : no_copy,hidden,read_only; @@ -26,8 +26,8 @@ meta gts_TTAAii gts_header(20,6) : no_copy,hidden,read_only; meta gts_CCCC gts_header(27,4) : no_copy,hidden,read_only; meta gts_ddhh00 gts_header(32,6) : no_copy,hidden,read_only; -transient missingValue = 9999; -constant ieeeFloats = 1 : edition_specific; +transient missingValue = 9999; +constant ieeeFloats = 1 : edition_specific; constant isHindcast = 0; include "grib2/section.0.def" From d9dacdd3d7dbfdce21a30f063d73a540d27b7aac Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 13:34:02 +0000 Subject: [PATCH 041/244] Accessors: Do not assert on error --- definitions/grib2/template.4.optical.def | 6 +- src/CMakeLists.txt | 1 + src/grib_accessor_class.h | 1 + src/grib_accessor_class_divdouble.cc | 18 +-- src/grib_accessor_class_multdouble.cc | 133 +++++++++++++++++++ src/grib_accessor_classes_hash.cc | 157 ++++++++++++----------- src/grib_accessor_factory.h | 1 + src/grib_accessor_factory_hash_list | 1 + 8 files changed, 226 insertions(+), 92 deletions(-) create mode 100644 src/grib_accessor_class_multdouble.cc diff --git a/definitions/grib2/template.4.optical.def b/definitions/grib2/template.4.optical.def index a73181f89..385513edc 100644 --- a/definitions/grib2/template.4.optical.def +++ b/definitions/grib2/template.4.optical.def @@ -14,6 +14,6 @@ meta secondWavelength from_scale_factor_scaled_value(scaleFactorOfSecondWaveleng alias firstWavelengthInMetres = firstWavelength; alias secondWavelengthInMetres = secondWavelength; -constant oneBillionth = 1.0 / 1000000000 : hidden; -meta firstWavelengthInNanometres divdouble(firstWavelength, oneBillionth); -meta secondWavelengthInNanometres divdouble(secondWavelength, oneBillionth); +constant billion = 1000000000 : hidden; +meta firstWavelengthInNanometres multdouble(firstWavelength, billion); +meta secondWavelengthInNanometres multdouble(secondWavelength, billion); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f040434b7..97cd81dfc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -80,6 +80,7 @@ list( APPEND eccodes_src_files grib_accessor_class_hash_array.cc grib_accessor_class_decimal_precision.cc grib_accessor_class_divdouble.cc + grib_accessor_class_multdouble.cc grib_accessor_class_budgdate.cc grib_accessor_class_validity_date.cc grib_accessor_class_validity_time.cc diff --git a/src/grib_accessor_class.h b/src/grib_accessor_class.h index 8352a8d27..0c569decd 100644 --- a/src/grib_accessor_class.h +++ b/src/grib_accessor_class.h @@ -131,6 +131,7 @@ extern grib_accessor_class* grib_accessor_class_mars_step; extern grib_accessor_class* grib_accessor_class_md5; extern grib_accessor_class* grib_accessor_class_message; extern grib_accessor_class* grib_accessor_class_message_copy; +extern grib_accessor_class* grib_accessor_class_multdouble; extern grib_accessor_class* grib_accessor_class_nearest; extern grib_accessor_class* grib_accessor_class_non_alpha; extern grib_accessor_class* grib_accessor_class_number_of_coded_values; diff --git a/src/grib_accessor_class_divdouble.cc b/src/grib_accessor_class_divdouble.cc index e4e5442ef..f9586e9d7 100644 --- a/src/grib_accessor_class_divdouble.cc +++ b/src/grib_accessor_class_divdouble.cc @@ -7,11 +7,6 @@ * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ - -/***************************************** - * Enrico Fucile - ****************************************/ - #include "grib_api_internal.h" /* This is used by make_class.pl @@ -108,7 +103,7 @@ grib_accessor_class* grib_accessor_class_divdouble = &_grib_accessor_class_divdo static void init(grib_accessor* a, const long l, grib_arguments* c) { grib_accessor_divdouble* self = (grib_accessor_divdouble*)a; - int n = 0; + int n = 0; self->val = grib_arguments_get_name(grib_handle_of_accessor(a), c, n++); self->divisor = grib_arguments_get_double(grib_handle_of_accessor(a), c, n++); @@ -116,9 +111,9 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) static int unpack_double(grib_accessor* a, double* val, size_t* len) { - grib_accessor_divdouble* self = (grib_accessor_divdouble*)a; - int ret = GRIB_SUCCESS; - double value = 0; + const grib_accessor_divdouble* self = (grib_accessor_divdouble*)a; + int ret = GRIB_SUCCESS; + double value = 0; if (*len < 1) { *len = 1; @@ -130,8 +125,9 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) if (ret != GRIB_SUCCESS) return ret; - /* fprintf(stdout,"\nname %s %s %g/%g\n",a->name ,self->val,value,divisor);*/ - Assert(self->divisor != 0); + if (self->divisor == 0) { + return GRIB_INVALID_ARGUMENT; + } *val = value / self->divisor; *len = 1; diff --git a/src/grib_accessor_class_multdouble.cc b/src/grib_accessor_class_multdouble.cc new file mode 100644 index 000000000..920b48f53 --- /dev/null +++ b/src/grib_accessor_class_multdouble.cc @@ -0,0 +1,133 @@ +/* + * (C) Copyright 2005- ECMWF. + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + * + * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by + * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. + */ + +#include "grib_api_internal.h" +/* + This is used by make_class.pl + + START_CLASS_DEF + CLASS = accessor + SUPER = grib_accessor_class_double + IMPLEMENTS = unpack_double + IMPLEMENTS = init + MEMBERS = const char* val + MEMBERS = double multiplier + END_CLASS_DEF + + */ + +/* START_CLASS_IMP */ + +/* + +Don't edit anything between START_CLASS_IMP and END_CLASS_IMP +Instead edit values between START_CLASS_DEF and END_CLASS_DEF +or edit "accessor.class" and rerun ./make_class.pl + +*/ + +static int unpack_double(grib_accessor*, double* val, size_t* len); +static void init(grib_accessor*, const long, grib_arguments*); + +typedef struct grib_accessor_multdouble +{ + grib_accessor att; + /* Members defined in gen */ + /* Members defined in double */ + /* Members defined in multdouble */ + const char* val; + double multiplier; +} grib_accessor_multdouble; + +extern grib_accessor_class* grib_accessor_class_double; + +static grib_accessor_class _grib_accessor_class_multdouble = { + &grib_accessor_class_double, /* super */ + "multdouble", /* name */ + sizeof(grib_accessor_multdouble), /* size */ + 0, /* inited */ + 0, /* init_class */ + &init, /* init */ + 0, /* post_init */ + 0, /* destroy */ + 0, /* dump */ + 0, /* next_offset */ + 0, /* get length of string */ + 0, /* get number of values */ + 0, /* get number of bytes */ + 0, /* get offset to bytes */ + 0, /* get native type */ + 0, /* get sub_section */ + 0, /* pack_missing */ + 0, /* is_missing */ + 0, /* pack_long */ + 0, /* unpack_long */ + 0, /* pack_double */ + 0, /* pack_float */ + &unpack_double, /* unpack_double */ + 0, /* unpack_float */ + 0, /* pack_string */ + 0, /* unpack_string */ + 0, /* pack_string_array */ + 0, /* unpack_string_array */ + 0, /* pack_bytes */ + 0, /* unpack_bytes */ + 0, /* pack_expression */ + 0, /* notify_change */ + 0, /* update_size */ + 0, /* preferred_size */ + 0, /* resize */ + 0, /* nearest_smaller_value */ + 0, /* next accessor */ + 0, /* compare vs. another accessor */ + 0, /* unpack only ith value (double) */ + 0, /* unpack only ith value (float) */ + 0, /* unpack a given set of elements (double) */ + 0, /* unpack a given set of elements (float) */ + 0, /* unpack a subarray */ + 0, /* clear */ + 0, /* clone accessor */ +}; + + +grib_accessor_class* grib_accessor_class_multdouble = &_grib_accessor_class_multdouble; + +/* END_CLASS_IMP */ + +static void init(grib_accessor* a, const long l, grib_arguments* c) +{ + grib_accessor_multdouble* self = (grib_accessor_multdouble*)a; + int n = 0; + + self->val = grib_arguments_get_name(grib_handle_of_accessor(a), c, n++); + self->multiplier = grib_arguments_get_double(grib_handle_of_accessor(a), c, n++); +} + +static int unpack_double(grib_accessor* a, double* val, size_t* len) +{ + grib_accessor_multdouble* self = (grib_accessor_multdouble*)a; + int ret = GRIB_SUCCESS; + double value = 0; + + if (*len < 1) { + *len = 1; + return GRIB_ARRAY_TOO_SMALL; + } + + ret = grib_get_double_internal(grib_handle_of_accessor(a), self->val, &value); + + if (ret != GRIB_SUCCESS) + return ret; + + *val = value * self->multiplier; + + *len = 1; + return GRIB_SUCCESS; +} diff --git a/src/grib_accessor_classes_hash.cc b/src/grib_accessor_classes_hash.cc index cb9a8b437..2643a32fb 100644 --- a/src/grib_accessor_classes_hash.cc +++ b/src/grib_accessor_classes_hash.cc @@ -37,7 +37,7 @@ #line 6 "accessor_class_list.gperf" struct accessor_class_hash { char *name; grib_accessor_class **cclass;}; -#define TOTAL_KEYWORDS 204 +#define TOTAL_KEYWORDS 205 #define MIN_WORD_LENGTH 1 #define MAX_WORD_LENGTH 44 #define MIN_HASH_VALUE 1 @@ -117,21 +117,21 @@ static const struct accessor_class_hash classes[] = #line 9 "accessor_class_list.gperf" {" "}, {""}, {""}, {""}, {""}, -#line 178 "accessor_class_list.gperf" +#line 179 "accessor_class_list.gperf" {"size", &grib_accessor_class_size}, #line 12 "accessor_class_list.gperf" {"ascii", &grib_accessor_class_ascii}, -#line 175 "accessor_class_list.gperf" +#line 176 "accessor_class_list.gperf" {"signed", &grib_accessor_class_signed}, -#line 155 "accessor_class_list.gperf" +#line 156 "accessor_class_list.gperf" {"pad", &grib_accessor_class_pad}, -#line 181 "accessor_class_list.gperf" +#line 182 "accessor_class_list.gperf" {"spd", &grib_accessor_class_spd}, {""}, #line 75 "accessor_class_list.gperf" {"dirty", &grib_accessor_class_dirty}, {""}, -#line 176 "accessor_class_list.gperf" +#line 177 "accessor_class_list.gperf" {"signed_bits", &grib_accessor_class_signed_bits}, {""}, #line 66 "accessor_class_list.gperf" @@ -141,7 +141,7 @@ static const struct accessor_class_hash classes[] = {"data_simple_packing", &grib_accessor_class_data_simple_packing}, #line 68 "accessor_class_list.gperf" {"data_secondary_bitmap", &grib_accessor_class_data_secondary_bitmap}, -#line 169 "accessor_class_list.gperf" +#line 170 "accessor_class_list.gperf" {"section", &grib_accessor_class_section}, #line 43 "accessor_class_list.gperf" {"data_apply_bitmap", &grib_accessor_class_data_apply_bitmap}, @@ -155,36 +155,36 @@ static const struct accessor_class_hash classes[] = {"data_jpeg2000_packing", &grib_accessor_class_data_jpeg2000_packing}, #line 65 "accessor_class_list.gperf" {"data_png_packing", &grib_accessor_class_data_png_packing}, -#line 171 "accessor_class_list.gperf" - {"section_padding", &grib_accessor_class_section_padding}, #line 172 "accessor_class_list.gperf" + {"section_padding", &grib_accessor_class_section_padding}, +#line 173 "accessor_class_list.gperf" {"section_pointer", &grib_accessor_class_section_pointer}, #line 44 "accessor_class_list.gperf" {"data_apply_boustrophedonic", &grib_accessor_class_data_apply_boustrophedonic}, {""}, {""}, {""}, {""}, #line 80 "accessor_class_list.gperf" {"expanded_descriptors", &grib_accessor_class_expanded_descriptors}, -#line 156 "accessor_class_list.gperf" +#line 157 "accessor_class_list.gperf" {"padding", &grib_accessor_class_padding}, #line 45 "accessor_class_list.gperf" {"data_apply_boustrophedonic_bitmap", &grib_accessor_class_data_apply_boustrophedonic_bitmap}, #line 110 "accessor_class_list.gperf" {"gds_is_present", &grib_accessor_class_gds_is_present}, -#line 168 "accessor_class_list.gperf" +#line 169 "accessor_class_list.gperf" {"second_order_bits_per_value", &grib_accessor_class_second_order_bits_per_value}, -#line 170 "accessor_class_list.gperf" +#line 171 "accessor_class_list.gperf" {"section_length", &grib_accessor_class_section_length}, #line 113 "accessor_class_list.gperf" {"getenv", &grib_accessor_class_getenv}, #line 57 "accessor_class_list.gperf" {"data_g22order_packing", &grib_accessor_class_data_g22order_packing}, -#line 190 "accessor_class_list.gperf" +#line 191 "accessor_class_list.gperf" {"time", &grib_accessor_class_time}, {""}, #line 61 "accessor_class_list.gperf" {"data_g2shsimple_packing", &grib_accessor_class_data_g2shsimple_packing}, {""}, -#line 154 "accessor_class_list.gperf" +#line 155 "accessor_class_list.gperf" {"packing_type", &grib_accessor_class_packing_type}, #line 62 "accessor_class_list.gperf" {"data_g2simple_packing", &grib_accessor_class_data_g2simple_packing}, @@ -198,28 +198,28 @@ static const struct accessor_class_hash classes[] = {"g2end_step", &grib_accessor_class_g2end_step}, #line 98 "accessor_class_list.gperf" {"g2_eps", &grib_accessor_class_g2_eps}, -#line 141 "accessor_class_list.gperf" +#line 142 "accessor_class_list.gperf" {"nearest", &grib_accessor_class_nearest}, {""}, -#line 157 "accessor_class_list.gperf" +#line 158 "accessor_class_list.gperf" {"padto", &grib_accessor_class_padto}, -#line 188 "accessor_class_list.gperf" +#line 189 "accessor_class_list.gperf" {"sum", &grib_accessor_class_sum}, {""}, #line 107 "accessor_class_list.gperf" {"g2lon", &grib_accessor_class_g2lon}, -#line 202 "accessor_class_list.gperf" +#line 203 "accessor_class_list.gperf" {"uint8", &grib_accessor_class_uint8}, {""}, -#line 187 "accessor_class_list.gperf" +#line 188 "accessor_class_list.gperf" {"step_in_units", &grib_accessor_class_step_in_units}, #line 63 "accessor_class_list.gperf" {"data_g2simple_packing_with_preprocessing", &grib_accessor_class_data_g2simple_packing_with_preprocessing}, -#line 200 "accessor_class_list.gperf" +#line 201 "accessor_class_list.gperf" {"uint64", &grib_accessor_class_uint64}, #line 47 "accessor_class_list.gperf" {"data_complex_packing", &grib_accessor_class_data_complex_packing}, -#line 198 "accessor_class_list.gperf" +#line 199 "accessor_class_list.gperf" {"uint32", &grib_accessor_class_uint32}, #line 13 "accessor_class_list.gperf" {"bit", &grib_accessor_class_bit}, @@ -233,7 +233,7 @@ static const struct accessor_class_hash classes[] = {"julian_day", &grib_accessor_class_julian_day}, #line 123 "accessor_class_list.gperf" {"julian_date", &grib_accessor_class_julian_date}, -#line 142 "accessor_class_list.gperf" +#line 143 "accessor_class_list.gperf" {"non_alpha", &grib_accessor_class_non_alpha}, {""}, #line 29 "accessor_class_list.gperf" @@ -245,14 +245,14 @@ static const struct accessor_class_hash classes[] = #line 16 "accessor_class_list.gperf" {"bits_per_value", &grib_accessor_class_bits_per_value}, {""}, {""}, {""}, {""}, {""}, -#line 166 "accessor_class_list.gperf" +#line 167 "accessor_class_list.gperf" {"scale", &grib_accessor_class_scale}, {""}, -#line 184 "accessor_class_list.gperf" +#line 185 "accessor_class_list.gperf" {"statistics", &grib_accessor_class_statistics}, #line 102 "accessor_class_list.gperf" {"g2date", &grib_accessor_class_g2date}, -#line 144 "accessor_class_list.gperf" +#line 145 "accessor_class_list.gperf" {"number_of_points", &grib_accessor_class_number_of_points}, #line 100 "accessor_class_list.gperf" {"g2bitmap", &grib_accessor_class_g2bitmap}, @@ -265,13 +265,13 @@ static const struct accessor_class_hash classes[] = {"gds_not_present_bitmap", &grib_accessor_class_gds_not_present_bitmap}, #line 122 "accessor_class_list.gperf" {"iterator", &grib_accessor_class_iterator}, -#line 185 "accessor_class_list.gperf" +#line 186 "accessor_class_list.gperf" {"statistics_spectral", &grib_accessor_class_statistics_spectral}, #line 46 "accessor_class_list.gperf" {"data_ccsds_packing", &grib_accessor_class_data_ccsds_packing}, -#line 145 "accessor_class_list.gperf" +#line 146 "accessor_class_list.gperf" {"number_of_points_gaussian", &grib_accessor_class_number_of_points_gaussian}, -#line 205 "accessor_class_list.gperf" +#line 206 "accessor_class_list.gperf" {"unsigned", &grib_accessor_class_unsigned}, #line 138 "accessor_class_list.gperf" {"md5", &grib_accessor_class_md5}, @@ -280,30 +280,30 @@ static const struct accessor_class_hash classes[] = {"g2_aerosol", &grib_accessor_class_g2_aerosol}, #line 139 "accessor_class_list.gperf" {"message", &grib_accessor_class_message}, -#line 206 "accessor_class_list.gperf" +#line 207 "accessor_class_list.gperf" {"unsigned_bits", &grib_accessor_class_unsigned_bits}, -#line 173 "accessor_class_list.gperf" +#line 174 "accessor_class_list.gperf" {"select_step_template", &grib_accessor_class_select_step_template}, #line 136 "accessor_class_list.gperf" {"mars_param", &grib_accessor_class_mars_param}, -#line 203 "accessor_class_list.gperf" +#line 204 "accessor_class_list.gperf" {"unexpanded_descriptors", &grib_accessor_class_unexpanded_descriptors}, -#line 192 "accessor_class_list.gperf" +#line 193 "accessor_class_list.gperf" {"to_integer", &grib_accessor_class_to_integer}, {""}, {""}, {""}, -#line 177 "accessor_class_list.gperf" +#line 178 "accessor_class_list.gperf" {"simple_packing_error", &grib_accessor_class_simple_packing_error}, -#line 186 "accessor_class_list.gperf" +#line 187 "accessor_class_list.gperf" {"step_human_readable", &grib_accessor_class_step_human_readable}, #line 140 "accessor_class_list.gperf" {"message_copy", &grib_accessor_class_message_copy}, -#line 162 "accessor_class_list.gperf" +#line 163 "accessor_class_list.gperf" {"raw", &grib_accessor_class_raw}, {""}, {""}, -#line 201 "accessor_class_list.gperf" +#line 202 "accessor_class_list.gperf" {"uint64_little_endian", &grib_accessor_class_uint64_little_endian}, {""}, -#line 199 "accessor_class_list.gperf" +#line 200 "accessor_class_list.gperf" {"uint32_little_endian", &grib_accessor_class_uint32_little_endian}, #line 114 "accessor_class_list.gperf" {"global_gaussian", &grib_accessor_class_global_gaussian}, @@ -311,20 +311,20 @@ static const struct accessor_class_hash classes[] = #line 76 "accessor_class_list.gperf" {"divdouble", &grib_accessor_class_divdouble}, {""}, -#line 174 "accessor_class_list.gperf" +#line 175 "accessor_class_list.gperf" {"sexagesimal2decimal", &grib_accessor_class_sexagesimal2decimal}, #line 99 "accessor_class_list.gperf" {"g2_mars_labeling", &grib_accessor_class_g2_mars_labeling}, #line 78 "accessor_class_list.gperf" {"element", &grib_accessor_class_element}, -#line 159 "accessor_class_list.gperf" +#line 160 "accessor_class_list.gperf" {"padtomultiple", &grib_accessor_class_padtomultiple}, #line 127 "accessor_class_list.gperf" {"latitudes", &grib_accessor_class_latitudes}, -#line 163 "accessor_class_list.gperf" +#line 164 "accessor_class_list.gperf" {"rdbtime_guess_date", &grib_accessor_class_rdbtime_guess_date}, {""}, {""}, {""}, -#line 193 "accessor_class_list.gperf" +#line 194 "accessor_class_list.gperf" {"to_string", &grib_accessor_class_to_string}, #line 132 "accessor_class_list.gperf" {"long", &grib_accessor_class_long}, @@ -348,20 +348,20 @@ static const struct accessor_class_hash classes[] = {""}, #line 28 "accessor_class_list.gperf" {"bufrdc_expanded_descriptors", &grib_accessor_class_bufrdc_expanded_descriptors}, -#line 160 "accessor_class_list.gperf" +#line 161 "accessor_class_list.gperf" {"position", &grib_accessor_class_position}, {""}, {""}, {""}, #line 17 "accessor_class_list.gperf" {"blob", &grib_accessor_class_blob}, #line 109 "accessor_class_list.gperf" {"gaussian_grid_name", &grib_accessor_class_gaussian_grid_name}, -#line 196 "accessor_class_list.gperf" +#line 197 "accessor_class_list.gperf" {"trim", &grib_accessor_class_trim}, {""}, {""}, #line 119 "accessor_class_list.gperf" {"ibmfloat", &grib_accessor_class_ibmfloat}, {""}, {""}, -#line 194 "accessor_class_list.gperf" +#line 195 "accessor_class_list.gperf" {"transient", &grib_accessor_class_transient}, #line 55 "accessor_class_list.gperf" {"data_g1shsimple_packing", &grib_accessor_class_data_g1shsimple_packing}, @@ -370,15 +370,15 @@ static const struct accessor_class_hash classes[] = {"data_g1simple_packing", &grib_accessor_class_data_g1simple_packing}, #line 49 "accessor_class_list.gperf" {"data_g1complex_packing", &grib_accessor_class_data_g1complex_packing}, -#line 165 "accessor_class_list.gperf" +#line 166 "accessor_class_list.gperf" {"round", &grib_accessor_class_round}, -#line 195 "accessor_class_list.gperf" +#line 196 "accessor_class_list.gperf" {"transient_darray", &grib_accessor_class_transient_darray}, #line 18 "accessor_class_list.gperf" {"budgdate", &grib_accessor_class_budgdate}, -#line 209 "accessor_class_list.gperf" +#line 210 "accessor_class_list.gperf" {"values", &grib_accessor_class_values}, -#line 143 "accessor_class_list.gperf" +#line 144 "accessor_class_list.gperf" {"number_of_coded_values", &grib_accessor_class_number_of_coded_values}, #line 126 "accessor_class_list.gperf" {"label", &grib_accessor_class_label}, @@ -386,30 +386,30 @@ static const struct accessor_class_hash classes[] = #line 38 "accessor_class_list.gperf" {"concept", &grib_accessor_class_concept}, {""}, -#line 182 "accessor_class_list.gperf" +#line 183 "accessor_class_list.gperf" {"spectral_truncation", &grib_accessor_class_spectral_truncation}, {""}, {""}, #line 83 "accessor_class_list.gperf" {"g1_message_length", &grib_accessor_class_g1_message_length}, -#line 183 "accessor_class_list.gperf" +#line 184 "accessor_class_list.gperf" {"sprintf", &grib_accessor_class_sprintf}, -#line 189 "accessor_class_list.gperf" +#line 190 "accessor_class_list.gperf" {"suppressed", &grib_accessor_class_suppressed}, {""}, -#line 212 "accessor_class_list.gperf" +#line 213 "accessor_class_list.gperf" {"when", &grib_accessor_class_when}, {""}, {""}, -#line 179 "accessor_class_list.gperf" +#line 180 "accessor_class_list.gperf" {"smart_table", &grib_accessor_class_smart_table}, {""}, #line 39 "accessor_class_list.gperf" {"constant", &grib_accessor_class_constant}, {""}, {""}, -#line 161 "accessor_class_list.gperf" +#line 162 "accessor_class_list.gperf" {"proj_string", &grib_accessor_class_proj_string}, -#line 149 "accessor_class_list.gperf" +#line 150 "accessor_class_list.gperf" {"octet_number", &grib_accessor_class_octet_number}, -#line 180 "accessor_class_list.gperf" +#line 181 "accessor_class_list.gperf" {"smart_table_column", &grib_accessor_class_smart_table_column}, {""}, #line 135 "accessor_class_list.gperf" @@ -426,7 +426,7 @@ static const struct accessor_class_hash classes[] = {"data_sh_unpacked", &grib_accessor_class_data_sh_unpacked}, #line 27 "accessor_class_list.gperf" {"bufr_string_values", &grib_accessor_class_bufr_string_values}, -#line 197 "accessor_class_list.gperf" +#line 198 "accessor_class_list.gperf" {"uint16", &grib_accessor_class_uint16}, {""}, {""}, #line 71 "accessor_class_list.gperf" @@ -439,26 +439,27 @@ static const struct accessor_class_hash classes[] = {""}, #line 54 "accessor_class_list.gperf" {"data_g1secondary_bitmap", &grib_accessor_class_data_g1secondary_bitmap}, -#line 191 "accessor_class_list.gperf" +#line 192 "accessor_class_list.gperf" {"to_double", &grib_accessor_class_to_double}, #line 101 "accessor_class_list.gperf" {"g2bitmap_present", &grib_accessor_class_g2bitmap_present}, #line 120 "accessor_class_list.gperf" {"ieeefloat", &grib_accessor_class_ieeefloat}, -#line 150 "accessor_class_list.gperf" +#line 151 "accessor_class_list.gperf" {"offset_file", &grib_accessor_class_offset_file}, -#line 207 "accessor_class_list.gperf" - {"validity_date", &grib_accessor_class_validity_date}, #line 208 "accessor_class_list.gperf" + {"validity_date", &grib_accessor_class_validity_date}, +#line 209 "accessor_class_list.gperf" {"validity_time", &grib_accessor_class_validity_time}, {""}, #line 130 "accessor_class_list.gperf" {"library_version", &grib_accessor_class_library_version}, -#line 211 "accessor_class_list.gperf" +#line 212 "accessor_class_list.gperf" {"vector", &grib_accessor_class_vector}, #line 84 "accessor_class_list.gperf" {"g1_section4_length", &grib_accessor_class_g1_section4_length}, - {""}, +#line 141 "accessor_class_list.gperf" + {"multdouble", &grib_accessor_class_multdouble}, #line 52 "accessor_class_list.gperf" {"data_g1second_order_general_packing", &grib_accessor_class_data_g1second_order_general_packing}, {""}, {""}, @@ -467,7 +468,7 @@ static const struct accessor_class_hash classes[] = {""}, #line 24 "accessor_class_list.gperf" {"bufr_extract_subsets", &grib_accessor_class_bufr_extract_subsets}, -#line 158 "accessor_class_list.gperf" +#line 159 "accessor_class_list.gperf" {"padtoeven", &grib_accessor_class_padtoeven}, #line 50 "accessor_class_list.gperf" {"data_g1second_order_constant_width_packing", &grib_accessor_class_data_g1second_order_constant_width_packing}, @@ -483,7 +484,7 @@ static const struct accessor_class_hash classes[] = #line 21 "accessor_class_list.gperf" {"bufr_elements_table", &grib_accessor_class_bufr_elements_table}, {""}, {""}, {""}, {""}, -#line 153 "accessor_class_list.gperf" +#line 154 "accessor_class_list.gperf" {"pack_bufr_values", &grib_accessor_class_pack_bufr_values}, #line 35 "accessor_class_list.gperf" {"codetable", &grib_accessor_class_codetable}, @@ -495,7 +496,7 @@ static const struct accessor_class_hash classes[] = {""}, #line 88 "accessor_class_list.gperf" {"g1end_of_interval_monthly", &grib_accessor_class_g1end_of_interval_monthly}, -#line 146 "accessor_class_list.gperf" +#line 147 "accessor_class_list.gperf" {"number_of_values", &grib_accessor_class_number_of_values}, {""}, #line 116 "accessor_class_list.gperf" @@ -503,26 +504,26 @@ static const struct accessor_class_hash classes[] = {""}, #line 33 "accessor_class_list.gperf" {"closest_date", &grib_accessor_class_closest_date}, -#line 152 "accessor_class_list.gperf" +#line 153 "accessor_class_list.gperf" {"optimal_step_units", &grib_accessor_class_optimal_step_units}, {""}, -#line 210 "accessor_class_list.gperf" +#line 211 "accessor_class_list.gperf" {"variable", &grib_accessor_class_variable}, #line 133 "accessor_class_list.gperf" {"long_vector", &grib_accessor_class_long_vector}, -#line 167 "accessor_class_list.gperf" +#line 168 "accessor_class_list.gperf" {"scale_values", &grib_accessor_class_scale_values}, {""}, {""}, {""}, #line 128 "accessor_class_list.gperf" {"latlon_increment", &grib_accessor_class_latlon_increment}, {""}, {""}, {""}, -#line 147 "accessor_class_list.gperf" +#line 148 "accessor_class_list.gperf" {"number_of_values_data_raw_packing", &grib_accessor_class_number_of_values_data_raw_packing}, {""}, #line 79 "accessor_class_list.gperf" {"evaluate", &grib_accessor_class_evaluate}, {""}, {""}, {""}, {""}, {""}, -#line 151 "accessor_class_list.gperf" +#line 152 "accessor_class_list.gperf" {"offset_values", &grib_accessor_class_offset_values}, #line 69 "accessor_class_list.gperf" {"data_sh_packed", &grib_accessor_class_data_sh_packed}, @@ -535,7 +536,7 @@ static const struct accessor_class_hash classes[] = {""}, {""}, #line 41 "accessor_class_list.gperf" {"count_missing", &grib_accessor_class_count_missing}, -#line 204 "accessor_class_list.gperf" +#line 205 "accessor_class_list.gperf" {"unpack_bufr_values", &grib_accessor_class_unpack_bufr_values}, {""}, {""}, #line 121 "accessor_class_list.gperf" @@ -569,7 +570,7 @@ static const struct accessor_class_hash classes[] = #line 31 "accessor_class_list.gperf" {"change_scanning_direction", &grib_accessor_class_change_scanning_direction}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 148 "accessor_class_list.gperf" +#line 149 "accessor_class_list.gperf" {"octahedral_gaussian", &grib_accessor_class_octahedral_gaussian}, #line 10 "accessor_class_list.gperf" {"abstract_long_vector", &grib_accessor_class_abstract_long_vector}, @@ -600,7 +601,7 @@ static const struct accessor_class_hash classes[] = #line 87 "accessor_class_list.gperf" {"g1day_of_the_year_date", &grib_accessor_class_g1day_of_the_year_date}, {""}, {""}, {""}, {""}, {""}, -#line 164 "accessor_class_list.gperf" +#line 165 "accessor_class_list.gperf" {"reference_value_error", &grib_accessor_class_reference_value_error}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -621,11 +622,11 @@ static const struct accessor_class_hash classes[] = }; static const struct accessor_class_hash* grib_accessor_classes_hash(const char *str, size_t len) -{ - unsigned int key = grib_accessor_classes_get_id (str, len); + { + unsigned int key = grib_accessor_classes_get_id (str, len); #ifdef DEBUG - { + { const char *s; Assert( len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH ); Assert( key <= MAX_HASH_VALUE ); @@ -634,5 +635,5 @@ static const struct accessor_class_hash* grib_accessor_classes_hash(const char * } #endif - return &classes[key]; + return &classes[key]; } diff --git a/src/grib_accessor_factory.h b/src/grib_accessor_factory.h index 00112e240..2f889a0c6 100644 --- a/src/grib_accessor_factory.h +++ b/src/grib_accessor_factory.h @@ -130,6 +130,7 @@ { "md5", &grib_accessor_class_md5, }, { "message", &grib_accessor_class_message, }, { "message_copy", &grib_accessor_class_message_copy, }, +{ "multdouble", &grib_accessor_class_multdouble, }, { "nearest", &grib_accessor_class_nearest, }, { "non_alpha", &grib_accessor_class_non_alpha, }, { "number_of_coded_values", &grib_accessor_class_number_of_coded_values, }, diff --git a/src/grib_accessor_factory_hash_list b/src/grib_accessor_factory_hash_list index 54627c6ad..1f7687f38 100644 --- a/src/grib_accessor_factory_hash_list +++ b/src/grib_accessor_factory_hash_list @@ -131,6 +131,7 @@ mars_step, &grib_accessor_class_mars_step md5, &grib_accessor_class_md5 message, &grib_accessor_class_message message_copy, &grib_accessor_class_message_copy +multdouble, &grib_accessor_class_multdouble nearest, &grib_accessor_class_nearest non_alpha, &grib_accessor_class_non_alpha number_of_coded_values, &grib_accessor_class_number_of_coded_values From fcd51754fc8848c97f39b0ac15b4bf273d796ee7 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 13:34:38 +0000 Subject: [PATCH 042/244] Accessor: multdouble --- definitions/grib1/mars_labeling.4.def | 22 +++++++++---------- .../grib2/template.3.shape_of_the_earth.def | 6 ++--- .../grib3/template.3.shape_of_the_earth.def | 6 ++--- src/grib_accessor_class_multdouble.cc | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/definitions/grib1/mars_labeling.4.def b/definitions/grib1/mars_labeling.4.def index d75df1341..e0984d22b 100644 --- a/definitions/grib1/mars_labeling.4.def +++ b/definitions/grib1/mars_labeling.4.def @@ -89,7 +89,7 @@ if (horizontalCoordinateDefinition == 0) { { meta coordinateIndexNumber evaluate(coordinate4Flag+coordinate3Flag); -# levelist latitude longitude + # levelist latitude longitude if (coordinateIndexNumber== 3) { meta marsLatitude divdouble( coordinate1Start,1000000); meta marsLongitude divdouble( coordinate2Start,1000000); @@ -145,15 +145,15 @@ if (horizontalCoordinateDefinition == 0) { alias mars.range = marsRange; } } -# product - alias mars.product = coordAveragingTims; -# date - if (marsType == TYPE_OR && averaging1Flag == P_INST) { - #remove mars.date; - alias mars.date = verificationDate; - #remove mars.step; - constant stepZero = 0; - alias mars.step =stepZero; - } + # product + alias mars.product = coordAveragingTims; + # date + if (marsType == TYPE_OR && averaging1Flag == P_INST) { + #remove mars.date; + alias mars.date = verificationDate; + #remove mars.step; + constant stepZero = 0; + alias mars.step =stepZero; + } } } diff --git a/definitions/grib2/template.3.shape_of_the_earth.def b/definitions/grib2/template.3.shape_of_the_earth.def index fcee8e659..ae21ef48a 100644 --- a/definitions/grib2/template.3.shape_of_the_earth.def +++ b/definitions/grib2/template.3.shape_of_the_earth.def @@ -73,12 +73,12 @@ _if (shapeOfTheEarth == 3){ # ECC-979 # The 'scale' accessor works with integers so rounds its first argument # which is not what we want because the inputs are doubles with decimal - # expansions. So use the trick of dividing by 0.001 to multiply by 1000 + # expansions. # # meta earthMajorAxisInMetres scale(earthMajorAxis, thousand, one, zero); # meta earthMinorAxisInMetres scale(earthMinorAxis, thousand, one, zero); - meta earthMajorAxisInMetres divdouble(earthMajorAxis, 0.001); - meta earthMinorAxisInMetres divdouble(earthMinorAxis, 0.001); + meta earthMajorAxisInMetres multdouble(earthMajorAxis, 1000); + meta earthMinorAxisInMetres multdouble(earthMinorAxis, 1000); } _if (shapeOfTheEarth == 7){ # Major and minor axes specified (in m) by data producer diff --git a/definitions/grib3/template.3.shape_of_the_earth.def b/definitions/grib3/template.3.shape_of_the_earth.def index 2ff2dcdf0..434459ec9 100644 --- a/definitions/grib3/template.3.shape_of_the_earth.def +++ b/definitions/grib3/template.3.shape_of_the_earth.def @@ -73,12 +73,12 @@ _if (shapeOfTheEarth == 3){ # ECC-979 # The 'scale' accessor works with integers so rounds its first argument # which is not what we want because the inputs are doubles with decimal - # expansions. So use the trick of dividing by 0.001 to multiply by 1000 + # expansions. # # meta earthMajorAxisInMetres scale(earthMajorAxis, thousand, one, zero); # meta earthMinorAxisInMetres scale(earthMinorAxis, thousand, one, zero); - meta earthMajorAxisInMetres divdouble(earthMajorAxis, 0.001); - meta earthMinorAxisInMetres divdouble(earthMinorAxis, 0.001); + meta earthMajorAxisInMetres multdouble(earthMajorAxis, 1000); + meta earthMinorAxisInMetres multdouble(earthMinorAxis, 1000); } _if (shapeOfTheEarth == 7){ # Major and minor axes specified (in m) by data producer diff --git a/src/grib_accessor_class_multdouble.cc b/src/grib_accessor_class_multdouble.cc index 920b48f53..437031852 100644 --- a/src/grib_accessor_class_multdouble.cc +++ b/src/grib_accessor_class_multdouble.cc @@ -112,7 +112,7 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) static int unpack_double(grib_accessor* a, double* val, size_t* len) { - grib_accessor_multdouble* self = (grib_accessor_multdouble*)a; + const grib_accessor_multdouble* self = (grib_accessor_multdouble*)a; int ret = GRIB_SUCCESS; double value = 0; From b85b85348bc346bc6abaf1436d6f13714bfb634e Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 14:43:23 +0000 Subject: [PATCH 043/244] Accessors: Refactoring --- src/grib_accessor_class_divdouble.cc | 6 ------ src/grib_accessor_class_multdouble.cc | 6 ------ tools/grib_options.cc | 2 +- tools/grib_tools.cc | 2 +- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/grib_accessor_class_divdouble.cc b/src/grib_accessor_class_divdouble.cc index f9586e9d7..8ab86e22e 100644 --- a/src/grib_accessor_class_divdouble.cc +++ b/src/grib_accessor_class_divdouble.cc @@ -115,13 +115,7 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) int ret = GRIB_SUCCESS; double value = 0; - if (*len < 1) { - *len = 1; - return GRIB_ARRAY_TOO_SMALL; - } - ret = grib_get_double_internal(grib_handle_of_accessor(a), self->val, &value); - if (ret != GRIB_SUCCESS) return ret; diff --git a/src/grib_accessor_class_multdouble.cc b/src/grib_accessor_class_multdouble.cc index 437031852..ac5771627 100644 --- a/src/grib_accessor_class_multdouble.cc +++ b/src/grib_accessor_class_multdouble.cc @@ -116,13 +116,7 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) int ret = GRIB_SUCCESS; double value = 0; - if (*len < 1) { - *len = 1; - return GRIB_ARRAY_TOO_SMALL; - } - ret = grib_get_double_internal(grib_handle_of_accessor(a), self->val, &value); - if (ret != GRIB_SUCCESS) return ret; diff --git a/tools/grib_options.cc b/tools/grib_options.cc index 3d792ca4e..f9ef49400 100644 --- a/tools/grib_options.cc +++ b/tools/grib_options.cc @@ -256,7 +256,7 @@ int grib_process_runtime_options(grib_context* context, int argc, char** argv, g #ifndef ECCODES_ON_WINDOWS /* Check at compile time to ensure our file offset is at least 64 bits */ - COMPILE_TIME_ASSERT(sizeof(options->infile_offset) >= 8); + static_assert(sizeof(options->infile_offset) >= 8); #endif has_output = grib_options_on("U"); diff --git a/tools/grib_tools.cc b/tools/grib_tools.cc index 7a79fd718..2124bc0ab 100644 --- a/tools/grib_tools.cc +++ b/tools/grib_tools.cc @@ -340,7 +340,7 @@ static int grib_tool_without_orderby(grib_runtime_options* options) if (options->infile_offset) { #ifndef ECCODES_ON_WINDOWS /* Check at compile time to ensure our file offset is at least 64 bits */ - COMPILE_TIME_ASSERT(sizeof(options->infile_offset) >= 8); + static_assert(sizeof(options->infile_offset) >= 8); #endif err = fseeko(infile->file, options->infile_offset, SEEK_SET); if (err) { From 9cde3aaef7e4967e06f8527bae551dd40c3c7911 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 14:44:29 +0000 Subject: [PATCH 044/244] Macros: No need for COMPILE_TIME_ASSERT; just use the C++ static_assert --- src/grib_api_internal.h | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/grib_api_internal.h b/src/grib_api_internal.h index cea8a7de1..0b516c99b 100644 --- a/src/grib_api_internal.h +++ b/src/grib_api_internal.h @@ -171,20 +171,6 @@ extern int pthread_mutexattr_settype(pthread_mutexattr_t* attr, int type); if (!(a)) codes_assertion_failed(#a, __FILE__, __LINE__); \ } while (0) -#ifdef __gnu_hurd__ -#define COMPILE_TIME_ASSERT(condition) \ - extern int compile_time_assert[!!(condition)-1] -#else -/* Compile time assertion - Thanks to Ralf Holly */ -#define COMPILE_TIME_ASSERT(condition) \ - do { \ - enum \ - { \ - assert_static__ = 1 / (condition) \ - }; \ - } while (0) -#endif - #ifdef DEBUG #define DEBUG_ASSERT(a) Assert(a) #define DEBUG_ASSERT_ACCESS(array, index, size) \ From af517c94a8439734ef74179b7436b04b8b5ac970 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 14:44:59 +0000 Subject: [PATCH 045/244] Fix compiler warnings --- src/grib_dumper_class_serialize.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/grib_dumper_class_serialize.cc b/src/grib_dumper_class_serialize.cc index 163a01f6b..6dc4d5c87 100644 --- a/src/grib_dumper_class_serialize.cc +++ b/src/grib_dumper_class_serialize.cc @@ -408,11 +408,10 @@ static void dump_label(grib_dumper* d, grib_accessor* a, const char* comment) static void dump_section(grib_dumper* d, grib_accessor* a, grib_block_of_accessors* block) { - const char* secstr = "section"; - int len = 0; + const char* secstr = "section"; grib_dumper_serialize* self = (grib_dumper_serialize*)d; - len = strlen(secstr); + size_t len = strlen(secstr); if (a->name[0] == '_') { grib_dump_accessors_block(d, block); From 4f3da1926000fe11f30a46569e9d5174d02c5e05 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 14:53:07 +0000 Subject: [PATCH 046/244] Fix compiler warnings --- src/grib_accessor_class_expanded_descriptors.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grib_accessor_class_expanded_descriptors.cc b/src/grib_accessor_class_expanded_descriptors.cc index 5b7002bf8..d515e4dcb 100644 --- a/src/grib_accessor_class_expanded_descriptors.cc +++ b/src/grib_accessor_class_expanded_descriptors.cc @@ -223,7 +223,7 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_ * Its max size is X (from FXY) which is 6 bits so no need for malloc */ bufr_descriptor* ur[65] = {0,}; bufr_descriptor* urc = NULL; - int idx; + size_t idx = 0; bufr_descriptor* u0 = NULL; grib_context* c = a->context; bufr_descriptor* us = NULL; From 54f385b89722c639598ca7f4dd40f0bce873c922 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 14:56:27 +0000 Subject: [PATCH 047/244] Fix compiler warnings --- src/grib_nearest.cc | 4 ++-- src/grib_trie_with_rank.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/grib_nearest.cc b/src/grib_nearest.cc index 1367daaf3..d440771f7 100644 --- a/src/grib_nearest.cc +++ b/src/grib_nearest.cc @@ -341,8 +341,8 @@ int grib_nearest_find_generic( double lat1 = 0, lat2 = 0; /* inlat will be between these */ const double LAT_DELTA = 10.0; /* in degrees */ - *out_lons_count = nvalues; /* Maybe overestimate but safe */ - *out_lats_count = nvalues; + *out_lons_count = (int)nvalues; /* Maybe overestimate but safe */ + *out_lats_count = (int)nvalues; if (*out_lats) grib_context_free(nearest->context, *out_lats); diff --git a/src/grib_trie_with_rank.cc b/src/grib_trie_with_rank.cc index d999f9f1f..8b74b6ca6 100644 --- a/src/grib_trie_with_rank.cc +++ b/src/grib_trie_with_rank.cc @@ -485,7 +485,7 @@ int grib_trie_with_rank_insert(grib_trie_with_rank* t, const char* key, void* da grib_oarray_push(t->context, t->objs, data); /* grib_trie_with_rank_insert_in_list(t,data); */ GRIB_MUTEX_UNLOCK(&mutex); - return t->objs->n; + return (int)t->objs->n; } /* From 5918bee6453b4d93cbb56e5012c1804318d85e0a Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 17:14:32 +0000 Subject: [PATCH 048/244] Fix compiler warnings --- src/grib_nearest_class_latlon_reduced.cc | 2 +- src/grib_nearest_class_reduced.cc | 2 +- src/grib_nearest_class_regular.cc | 2 +- tests/grib_nearest_test.cc | 7 +++---- tools/grib_histogram.cc | 3 ++- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/grib_nearest_class_latlon_reduced.cc b/src/grib_nearest_class_latlon_reduced.cc index 992b29f2e..e38978188 100644 --- a/src/grib_nearest_class_latlon_reduced.cc +++ b/src/grib_nearest_class_latlon_reduced.cc @@ -409,7 +409,7 @@ static int find_global(grib_nearest* nearest, grib_handle* h, if (values) { /* ECC-499 */ grib_get_double_element_internal(h, self->values_key, self->k[kk], &(values[kk])); } - indexes[kk] = self->k[kk]; + indexes[kk] = (int)self->k[kk]; kk++; } } diff --git a/src/grib_nearest_class_reduced.cc b/src/grib_nearest_class_reduced.cc index 603c1a441..f17d3b4e3 100644 --- a/src/grib_nearest_class_reduced.cc +++ b/src/grib_nearest_class_reduced.cc @@ -490,7 +490,7 @@ static int find_global(grib_nearest* nearest, grib_handle* h, grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_reduced: Unable to compute index. Value too large"); return GRIB_OUT_OF_RANGE; } else { - indexes[kk] = self->k[kk]; + indexes[kk] = (int)self->k[kk]; } kk++; } diff --git a/src/grib_nearest_class_regular.cc b/src/grib_nearest_class_regular.cc index 4e007ce7a..7ff90e38f 100644 --- a/src/grib_nearest_class_regular.cc +++ b/src/grib_nearest_class_regular.cc @@ -351,7 +351,7 @@ static int find(grib_nearest* nearest, grib_handle* h, grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_regular: Unable to compute index. Value too large"); return GRIB_OUT_OF_RANGE; } else { - indexes[kk] = self->k[kk]; + indexes[kk] = (int)self->k[kk]; } kk++; } diff --git a/tests/grib_nearest_test.cc b/tests/grib_nearest_test.cc index 5731f6bb2..24b76f457 100644 --- a/tests/grib_nearest_test.cc +++ b/tests/grib_nearest_test.cc @@ -31,10 +31,9 @@ int main(int argc, char** argv) { int err = 0; long step = 0; - size_t nfiles = 0; - size_t i = 0, j = 0; - codes_fieldset* set = NULL; - const size_t max_numfiles = 100; + int nfiles = 0, i = 0, j = 0; + codes_fieldset* set = NULL; + const int max_numfiles = 100; codes_handle* h = NULL; char param[20] = {0,}; size_t len = 20; diff --git a/tools/grib_histogram.cc b/tools/grib_histogram.cc index 08ce17f89..90a7e8532 100644 --- a/tools/grib_histogram.cc +++ b/tools/grib_histogram.cc @@ -58,10 +58,11 @@ int grib_tool_new_file_action(grib_runtime_options* options, grib_tools_file* fi */ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) { - size_t i, j, err = 0; + size_t i, j; size_t last_size = 0; long missingValuesPresent; double delta; + int err = 0; double* values = NULL; size_t size; From 141e2acc0d2cdc50a8f5915a023d86732fca2953 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 22:08:24 +0000 Subject: [PATCH 049/244] Dead code removal --- src/eccodes_prototypes.h | 1 - src/grib_expression.cc | 75 ++++++++++++++++++---------------------- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index b072d5191..3537fc05f 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1311,7 +1311,6 @@ const char* grib_expression_get_name(grib_expression* g); void grib_expression_print(grib_context* ctx, grib_expression* g, grib_handle* f); void grib_expression_free(grib_context* ctx, grib_expression* g); void grib_expression_add_dependency(grib_expression* e, grib_accessor* observer); -int grib_expression_set_value(grib_handle* h, grib_expression* g, grib_values* v); grib_arguments* grib_arguments_new(grib_context* c, grib_expression* g, grib_arguments* n); void grib_arguments_free(grib_context* c, grib_arguments* g); void grib_arguments_print(grib_context* c, grib_arguments* g, grib_handle* f); diff --git a/src/grib_expression.cc b/src/grib_expression.cc index c3cd36305..4c1109640 100644 --- a/src/grib_expression.cc +++ b/src/grib_expression.cc @@ -19,8 +19,7 @@ int grib_expression_native_type(grib_handle* h, grib_expression* g) c = c->super ? *(c->super) : NULL; } if (g->cclass) - grib_context_log(h->context, GRIB_LOG_ERROR, "No native_type() in %s", g->cclass->name); - Assert(1 == 0); + grib_context_log(h->context, GRIB_LOG_FATAL, "%s: No native_type() in %s", __func__, g->cclass->name); return 0; } @@ -55,7 +54,7 @@ const char* grib_expression_evaluate_string(grib_handle* h, grib_expression* g, c = c->super ? *(c->super) : NULL; } if (g->cclass) - grib_context_log(h->context, GRIB_LOG_ERROR, "No evaluate_string() in %s", g->cclass->name); + grib_context_log(h->context, GRIB_LOG_ERROR, "%s: No evaluate_string() in %s", __func__, g->cclass->name); *err = GRIB_INVALID_TYPE; return 0; @@ -69,8 +68,9 @@ const char* grib_expression_get_name(grib_expression* g) return c->get_name(g); c = c->super ? *(c->super) : NULL; } - if (g->cclass) printf("No expression_get_name() in %s\n", g->cclass->name); - Assert(1 == 0); + if (g->cclass) { + grib_context_log(grib_context_get_default(), GRIB_LOG_FATAL, "%s: No get_name() in %s", __func__, g->cclass->name); + } return 0; } @@ -84,7 +84,6 @@ void grib_expression_print(grib_context* ctx, grib_expression* g, grib_handle* f } c = c->super ? *(c->super) : NULL; } - Assert(1 == 0); } void grib_expression_free(grib_context* ctx, grib_expression* g) @@ -110,43 +109,37 @@ void grib_expression_add_dependency(grib_expression* e, grib_accessor* observer) } c = c->super ? *(c->super) : NULL; } - Assert(1 == 0); } -/*----------------------------------------*/ -int grib_expression_set_value(grib_handle* h, grib_expression* g, grib_values* v) -{ - char buffer[1024]; - int ret = 0; - size_t size = sizeof(buffer); - - switch (v->type = grib_expression_native_type(h, g)) { - case GRIB_TYPE_LONG: - return grib_expression_evaluate_long(h, g, &v->long_value); - break; - - case GRIB_TYPE_DOUBLE: - return grib_expression_evaluate_double(h, g, &v->double_value); - break; - - case GRIB_TYPE_STRING: - v->string_value = grib_expression_evaluate_string(h, g, buffer, &size, &ret); - if (ret != GRIB_SUCCESS) { - grib_context_log(h->context, GRIB_LOG_ERROR, - "grib_expression_set_value: unable to evaluate %s as string", - grib_expression_get_name(g)); - return ret; - } - Assert(v->string_value != buffer); - Assert(v->string_value); - break; - - default: - Assert(1 == 0); - break; - } - return 0; -} +// int grib_expression_set_value(grib_handle* h, grib_expression* g, grib_values* v) +// { +// char buffer[1024]; +// int ret = 0; +// size_t size = sizeof(buffer); +// switch (v->type = grib_expression_native_type(h, g)) { +// case GRIB_TYPE_LONG: +// return grib_expression_evaluate_long(h, g, &v->long_value); +// break; +// case GRIB_TYPE_DOUBLE: +// return grib_expression_evaluate_double(h, g, &v->double_value); +// break; +// case GRIB_TYPE_STRING: +// v->string_value = grib_expression_evaluate_string(h, g, buffer, &size, &ret); +// if (ret != GRIB_SUCCESS) { +// grib_context_log(h->context, GRIB_LOG_ERROR, +// "grib_expression_set_value: unable to evaluate %s as string", +// grib_expression_get_name(g)); +// return ret; +// } +// Assert(v->string_value != buffer); +// Assert(v->string_value); +// break; +// default: +// Assert(!"grib_expression_set_value"); +// break; +// } +// return 0; +// } /*----------------------------------------*/ grib_arguments* grib_arguments_new(grib_context* c, grib_expression* g, grib_arguments* n) From 2a7bf810c5e2b4ce46ce4bf034c36ef1a5bfe0c8 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 22:08:47 +0000 Subject: [PATCH 050/244] Error messages --- src/grib_accessor_class_non_alpha.cc | 2 -- src/grib_handle.cc | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/grib_accessor_class_non_alpha.cc b/src/grib_accessor_class_non_alpha.cc index f324257fe..821f2311f 100644 --- a/src/grib_accessor_class_non_alpha.cc +++ b/src/grib_accessor_class_non_alpha.cc @@ -190,7 +190,6 @@ static int unpack_long(grib_accessor* a, long* v, size_t* len) *v = strtol(val, &last, 10); - grib_context_log(a->context, GRIB_LOG_DEBUG, " Casting string %s to long", a->name); return GRIB_SUCCESS; } @@ -204,7 +203,6 @@ static int unpack_double(grib_accessor* a, double* v, size_t* len) *v = strtod(val, &last); if (*last == 0) { - grib_context_log(a->context, GRIB_LOG_DEBUG, " Casting string %s to long", a->name); return GRIB_SUCCESS; } diff --git a/src/grib_handle.cc b/src/grib_handle.cc index 8a7719234..e1c361eba 100644 --- a/src/grib_handle.cc +++ b/src/grib_handle.cc @@ -375,7 +375,7 @@ grib_handle* grib_handle_clone_headers_only(const grib_handle* h) const int sections_to_copy = GRIB_SECTION_PRODUCT | GRIB_SECTION_LOCAL | GRIB_SECTION_GRID; result = grib_util_sections_copy((grib_handle*)h, h_sample, sections_to_copy, &err); if (!result || err) { - grib_context_log(c, GRIB_LOG_ERROR, "Failed to create headers_only clone: Unable to copy sections"); + grib_context_log(c, GRIB_LOG_ERROR, "%s failed: Unable to copy sections (%s)", __func__, grib_get_error_message(err)); grib_handle_delete(h_sample); return NULL; } From 24bf6f18465b2826a9950dd3635efcad36ff5ff5 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 19 Feb 2024 22:09:03 +0000 Subject: [PATCH 051/244] Testing: Octahedral --- tests/grib_octahedral.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/grib_octahedral.sh b/tests/grib_octahedral.sh index 967eecc1a..6ed838d99 100755 --- a/tests/grib_octahedral.sh +++ b/tests/grib_octahedral.sh @@ -33,4 +33,12 @@ if [ $HAVE_EXTRA_TESTS -eq 1 ]; then [ "$numlines" = "6599681" ] # 1 + numberOfDataPoints fi +# Regular Gaussian (no pl array) +input=${data_dir}/regular_gaussian_model_level.grib2 +grib_check_key_equals $input isOctahedral 0 + +result=$( $tools_dir/grib_get -s Ni=missing -p isOctahedral $input ) +[ $result -eq 0 ] + +# Clean up rm -f $temp From c6bc2dc027e362519139dd880ad78c4ca4ad84ea Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 20 Feb 2024 13:57:38 +0000 Subject: [PATCH 052/244] Testing: Consistent naming --- tests/bufr_ecc-1028.sh | 8 ++++---- tests/bufr_extract_headers.cc | 26 -------------------------- tests/grib_grid_healpix.sh | 18 +++++++++--------- tests/grib_grid_lambert_conformal.sh | 12 ++++++------ tests/grib_grid_mercator.sh | 8 ++++---- tests/grib_grid_polar_stereographic.sh | 6 +++--- tests/grib_grid_space_view.sh | 12 ++++++------ tests/grib_second_order.sh | 20 ++++++++++---------- 8 files changed, 42 insertions(+), 68 deletions(-) diff --git a/tests/bufr_ecc-1028.sh b/tests/bufr_ecc-1028.sh index a68b1c43c..36016648a 100755 --- a/tests/bufr_ecc-1028.sh +++ b/tests/bufr_ecc-1028.sh @@ -11,15 +11,15 @@ . ./include.ctest.sh set -u label="bufr_ecc-1028_test" -tempFilter=temp.$label.filt +tempFilt=temp.$label.filt tempError=temp.$label.err sample_bufr4=$ECCODES_SAMPLES_PATH/BUFR4.tmpl # Incorrect replication. Encoding should fail -echo "set unexpandedDescriptors={ 101000, 31002 }; write;" > $tempFilter +echo "set unexpandedDescriptors={ 101000, 31002 }; write;" > $tempFilt set +e -${tools_dir}/bufr_filter $tempFilter $sample_bufr4 2>$tempError +${tools_dir}/bufr_filter $tempFilt $sample_bufr4 2>$tempError status=$? set -e [ $status -ne 0 ] @@ -27,4 +27,4 @@ set -e grep -q "Delayed replication: 101000: expected 1 but only found 0 elements" $tempError -rm -f $tempFilter $tempError +rm -f $tempFilt $tempError diff --git a/tests/bufr_extract_headers.cc b/tests/bufr_extract_headers.cc index a963a32f0..aacc7f1bc 100644 --- a/tests/bufr_extract_headers.cc +++ b/tests/bufr_extract_headers.cc @@ -13,31 +13,6 @@ #include #define MAX_KEYS 100 -#if 0 -int main(int argc, char* argv[]) -{ - char *filename; - int err = 0; - int num_messages = 0, i =0; - off_t* offsets = NULL; - codes_context* c = codes_context_get_default(); - const int strict_mode = 1; - - /* Usage: prog file */ - assert(argc == 2); - - filename = argv[1]; - err = codes_extract_offsets_malloc(c, filename, PRODUCT_GRIB, &offsets, &num_messages, strict_mode); - assert(!err); - - for (i = 0; i < num_messages; ++i) { - printf("Message #%d: %lu\n", i, offsets[i]); - } - free(offsets); - return 0; -} -#endif -#if 1 int main(int argc, char* argv[]) { char *filename, *keys; @@ -85,4 +60,3 @@ int main(int argc, char* argv[]) return 0; } -#endif diff --git a/tests/grib_grid_healpix.sh b/tests/grib_grid_healpix.sh index 82ee2b257..9b3560693 100755 --- a/tests/grib_grid_healpix.sh +++ b/tests/grib_grid_healpix.sh @@ -11,7 +11,7 @@ # Define a common label for all the tmp files label="grib_healpix_test" -tempFilter="temp.${label}.filt" +tempFilt="temp.${label}.filt" tempGrib="temp.${label}.grib" tempLog="temp.${label}.log" @@ -20,7 +20,7 @@ input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl latest=`${tools_dir}/grib_get -p tablesVersionLatest $input` # Create a filter -cat > $tempFilter < $tempFilt < $tempFilter <&2 exit 1 @@ -47,7 +47,7 @@ ${tools_dir}/grib_ls -jn geography $tempGrib # Geoiterator # ------------- rm -f $tempGrib -cat > $tempFilter < $tempFilt < $tempFilter < $tempFilter < $tempFilt < $tempFilter < $tempFilter < $tempFilt < $tempFilter <&2 exit 1 @@ -49,7 +49,7 @@ ${tools_dir}/grib_ls -l 50,0 $tempGrib # Oblate earth # -------------- -cat > $tempFilter < $tempFilt < $tempFilter <&2 exit 1 @@ -83,4 +83,4 @@ ${tools_dir}/grib_ls -l 40.44,353.56 $tempGrib # Clean up -rm -f $tempFilter $tempGrib $tempOut +rm -f $tempFilt $tempGrib $tempOut diff --git a/tests/grib_grid_mercator.sh b/tests/grib_grid_mercator.sh index 5846b08a8..4ba2d43d6 100755 --- a/tests/grib_grid_mercator.sh +++ b/tests/grib_grid_mercator.sh @@ -12,7 +12,7 @@ # Define a common label for all the tmp files label="grib_mercator_test" tempOut="temp.${label}.out" -tempFilter="temp.${label}.filt" +tempFilt="temp.${label}.filt" input=${data_dir}/mercator.grib2 grib_check_key_equals $input "gridType" "mercator" @@ -22,17 +22,17 @@ numlines=`wc -l $tempOut | awk '{print $1}'` # Check other iterator-related keys -cat > $tempFilter < $tempFilt < $tempOut grep -q "Point chosen #1 index=618" $tempOut # Clean up -rm -f $tempFilter $tempOut +rm -f $tempFilt $tempOut diff --git a/tests/grib_grid_polar_stereographic.sh b/tests/grib_grid_polar_stereographic.sh index 251dd0095..b8758000b 100755 --- a/tests/grib_grid_polar_stereographic.sh +++ b/tests/grib_grid_polar_stereographic.sh @@ -11,7 +11,7 @@ # Define a common label for all the tmp files label="grib_polar_stereographic_test" -tempFilter="temp.${label}.filt" +tempFilt="temp.${label}.filt" tempGrib="temp.${label}.grib" tempOut="temp.${label}.out" @@ -19,7 +19,7 @@ input=$ECCODES_SAMPLES_PATH/polar_stereographic_pl_grib2.tmpl # Invoke Geoiterator ${tools_dir}/grib_get_data $input > $tempOut - +# Nearest ${tools_dir}/grib_ls -l 60,0 $input # Scanning mode @@ -27,4 +27,4 @@ ${tools_dir}/grib_get_data -s iScansNegatively=1 $input > $tempOut # Clean up -rm -f $tempFilter $tempGrib $tempOut +rm -f $tempFilt $tempGrib $tempOut diff --git a/tests/grib_grid_space_view.sh b/tests/grib_grid_space_view.sh index 5b987cd53..71b1759cf 100755 --- a/tests/grib_grid_space_view.sh +++ b/tests/grib_grid_space_view.sh @@ -11,7 +11,7 @@ # Define a common label for all the tmp files label="grib_space_view_test" -tempFilter="temp.${label}.filt" +tempFilt="temp.${label}.filt" tempGrib1="temp.${label}.grib1" tempGrib2="temp.${label}.grib2" tempOut="temp.${label}.out" @@ -20,7 +20,7 @@ tempOut="temp.${label}.out" # GRIB2 # ----------- input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl -cat > $tempFilter < $tempFilt < $tempFilter <&2 exit 1 @@ -66,7 +66,7 @@ rm -f $tempGrib2 $tempOut # GRIB1 # ----------- input=$ECCODES_SAMPLES_PATH/GRIB1.tmpl -cat > $tempFilter < $tempFilt < $tempFilter < $tempOut ${tools_dir}/grib_set -s edition=2 $tempGrib1 $tempGrib2 @@ -85,4 +85,4 @@ ${tools_dir}/grib_compare -e -b param $tempGrib1 $tempGrib2 # Clean up -rm -f $tempFilter $tempGrib1 $tempGrib2 $tempOut +rm -f $tempFilt $tempGrib1 $tempGrib2 $tempOut diff --git a/tests/grib_second_order.sh b/tests/grib_second_order.sh index 37bc89cd5..1dc6092df 100755 --- a/tests/grib_second_order.sh +++ b/tests/grib_second_order.sh @@ -20,7 +20,7 @@ cd ${data_dir} encoding=1 simple_no_bitmap=simple.grib simple_bitmap=simple_bitmap.grib -test_filter=temp.$label.filter +tempFilt=temp.$label.filter files_no_bitmap="gen_ext.grib \ gen_ext_boust.grib \ @@ -41,11 +41,11 @@ simple_bitmap.grib" no_packing="gen.grib|row.grib|gen_bitmap.grib|constant_width_bitmap.grib|constant_width_boust_bitmap.grib" test_data() { - ${tools_dir}/grib_filter $test_filter $simple > $simple.data + ${tools_dir}/grib_filter $tempFilt $simple > $simple.data for f in $files do - ${tools_dir}/grib_filter $test_filter $f > $f.data + ${tools_dir}/grib_filter $tempFilt $f > $f.data diff $simple.data $f.data > /dev/null ${tools_dir}/grib_compare -cvalues $f $simple echo $f decoding test passed > $REDIRECT @@ -55,7 +55,7 @@ test_data() { then rm -f $f.copied ${tools_dir}/grib_copy -r $f $f.copied - ${tools_dir}/grib_filter $test_filter $f.copied > $f.copied.data + ${tools_dir}/grib_filter $tempFilt $f.copied > $f.copied.data diff $simple.data $f.copied.data > /dev/null ${tools_dir}/grib_compare -cvalues $f.copied $simple echo $f encoding test passed > $REDIRECT @@ -67,7 +67,7 @@ test_data() { } -cat > $test_filter< $tempFilt< $test_filter< $tempFilt<$tempText grib_check_key_equals $temp3 packingType,accuracy 'grid_simple 24' grep -q "Packing not changed" $tempText # Three coded values: Now we can change to 2nd order -cat > $test_filter< $tempFilt< Date: Tue, 20 Feb 2024 19:18:08 +0000 Subject: [PATCH 053/244] Definitions: countOfGroupLengths not used --- definitions/grib2/template.7.50001.def | 6 ++---- definitions/grib2/template.7.50002.def | 9 +++------ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/definitions/grib2/template.7.50001.def b/definitions/grib2/template.7.50001.def index 18bc0ca32..882379f36 100644 --- a/definitions/grib2/template.7.50001.def +++ b/definitions/grib2/template.7.50001.def @@ -6,13 +6,13 @@ if (bitsPerValue) { meta groupWidths unsigned_bits(widthOfWidths,numberOfGroups) : read_only; meta groupLengths unsigned_bits(widthOfLengths,numberOfGroups) : read_only; meta firstOrderValues unsigned_bits(widthOfFirstOrderValues,numberOfGroups) : read_only; - meta countOfGroupLengths sum(groupLengths); + # meta countOfGroupLengths sum(groupLengths); } transient halfByte=0; position offsetBeforeData; -if(bitmapPresent) { +if(bitmapPresent) { meta codedValues data_g1second_order_general_extended_packing( #simple_packing args section7Length, @@ -49,7 +49,6 @@ if(bitmapPresent) { widthOfSPD, orderOfSPD, numberOfPoints - ): read_only; alias data.packedValues = codedValues; @@ -91,7 +90,6 @@ if(bitmapPresent) { widthOfSPD, orderOfSPD, numberOfPoints - ) : dump; alias codedValues=values; alias data.packedValues = values; diff --git a/definitions/grib2/template.7.50002.def b/definitions/grib2/template.7.50002.def index be47b0604..7ca21e92a 100644 --- a/definitions/grib2/template.7.50002.def +++ b/definitions/grib2/template.7.50002.def @@ -5,12 +5,12 @@ meta groupWidths unsigned_bits(widthOfWidths,numberOfGroups) : read_only; meta groupLengths unsigned_bits(widthOfLengths,numberOfGroups) : read_only; meta firstOrderValues unsigned_bits(widthOfFirstOrderValues,numberOfGroups) : read_only; -meta countOfGroupLengths sum(groupLengths); +# meta countOfGroupLengths sum(groupLengths); transient halfByte=0; position offsetBeforeData; -if(bitmapPresent) { +if(bitmapPresent) { meta codedValues data_g1second_order_general_extended_packing( #simple_packing args section7Length, @@ -47,7 +47,6 @@ if(bitmapPresent) { widthOfSPD, orderOfSPD, numberOfPoints - ): read_only; alias data.packedValues = codedValues; @@ -96,8 +95,7 @@ if(bitmapPresent) { widthOfSPD, orderOfSPD, numberOfPoints - - ) : dump; + ) : dump; meta values data_apply_boustrophedonic(codedValues,numberOfRows,numberOfColumns,numberOfPoints,pl) : dump; @@ -138,7 +136,6 @@ if(bitmapPresent) { widthOfSPD, orderOfSPD, numberOfPoints - ) : dump; alias codedValues=values; } From c84361c9f1f13d190872457302f8e67e3b6a7ec6 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 20 Feb 2024 19:18:28 +0000 Subject: [PATCH 054/244] Testing: bufr_compare options --- tests/bufr_compare.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/bufr_compare.sh b/tests/bufr_compare.sh index 27f0c071b..de19abc1c 100755 --- a/tests/bufr_compare.sh +++ b/tests/bufr_compare.sh @@ -351,7 +351,8 @@ set -e [ $status -ne 0 ] grep -q "unreadable message" $fLog -###??? +# Options +# ---------- f1="aaen_55.bufr" f2="aaen_55.bufr" set +e @@ -368,7 +369,6 @@ set -e [ $status -ne 0 ] grep -q "a option requires -c option" $fLog - set +e ${tools_dir}/bufr_compare nosuchfile $f1 > $fLog 2>&1 status=$? From 5eb158decf4b61946505c1b9d13444207cfc7dd0 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 21 Feb 2024 10:26:35 +0000 Subject: [PATCH 055/244] Const correctness and cppcheck warnings --- src/grib_expression_class_accessor.cc | 14 ++++++------- src/grib_expression_class_column.cc | 8 +------ src/grib_expression_class_constant.cc | 10 ++------- src/grib_expression_class_double.cc | 14 ++++++------- src/grib_expression_class_functor.cc | 6 +++--- src/grib_expression_class_is_in_dict.cc | 20 +++++++++--------- src/grib_expression_class_is_in_list.cc | 24 +++++++++------------ src/grib_expression_class_is_integer.cc | 12 +++++------ src/grib_expression_class_length.cc | 28 ++++++++++++------------- src/grib_expression_class_long.cc | 14 ++++++------- src/grib_expression_class_string.cc | 6 +++--- src/grib_expression_class_sub_string.cc | 6 +++--- 12 files changed, 73 insertions(+), 89 deletions(-) diff --git a/src/grib_expression_class_accessor.cc b/src/grib_expression_class_accessor.cc index e806a3e1a..67ffbea9a 100644 --- a/src/grib_expression_class_accessor.cc +++ b/src/grib_expression_class_accessor.cc @@ -92,25 +92,25 @@ static void init_class(grib_expression_class* c) static const char* get_name(grib_expression* g) { - grib_expression_accessor* e = (grib_expression_accessor*)g; + const grib_expression_accessor* e = (grib_expression_accessor*)g; return e->name; } static int evaluate_long(grib_expression* g, grib_handle* h, long* result) { - grib_expression_accessor* e = (grib_expression_accessor*)g; + const grib_expression_accessor* e = (grib_expression_accessor*)g; return grib_get_long_internal(h, e->name, result); } static int evaluate_double(grib_expression* g, grib_handle* h, double* result) { - grib_expression_accessor* e = (grib_expression_accessor*)g; + const grib_expression_accessor* e = (grib_expression_accessor*)g; return grib_get_double_internal(h, e->name, result); } static string evaluate_string(grib_expression* g, grib_handle* h, char* buf, size_t* size, int* err) { - grib_expression_accessor* e = (grib_expression_accessor*)g; + const grib_expression_accessor* e = (grib_expression_accessor*)g; char mybuf[1024] = {0,}; long start = e->start; if (e->length > sizeof(mybuf)) { @@ -141,7 +141,7 @@ static string evaluate_string(grib_expression* g, grib_handle* h, char* buf, siz static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_accessor* e = (grib_expression_accessor*)g; + const grib_expression_accessor* e = (grib_expression_accessor*)g; printf("access('%s", e->name); if (f) { long s = 0; @@ -159,8 +159,8 @@ static void destroy(grib_context* c, grib_expression* g) static void add_dependency(grib_expression* g, grib_accessor* observer) { - grib_expression_accessor* e = (grib_expression_accessor*)g; - grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->name); + const grib_expression_accessor* e = (grib_expression_accessor*)g; + grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->name); if (!observed) { /* grib_context_log(observer->context, GRIB_LOG_ERROR, */ diff --git a/src/grib_expression_class_column.cc b/src/grib_expression_class_column.cc index b683b93a5..fefdaca0a 100644 --- a/src/grib_expression_class_column.cc +++ b/src/grib_expression_class_column.cc @@ -8,11 +8,6 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/************************************** - * Enrico Fucile - **************************************/ - - #include "grib_api_internal.h" /* @@ -89,7 +84,7 @@ static void init_class(grib_expression_class* c) static const char* get_name(grib_expression* g) { - grib_expression_column* e = (grib_expression_column*)g; + const grib_expression_column* e = (grib_expression_column*)g; return e->name; } @@ -131,7 +126,6 @@ static void destroy(grib_context* c, grib_expression* g) grib_context_free_persistent(c, e->name); } - grib_expression* new_column_expression(grib_context* c, const char* name) { grib_expression_column* e = grib_context_malloc_clear_persistent(c, sizeof(grib_expression_column)); diff --git a/src/grib_expression_class_constant.cc b/src/grib_expression_class_constant.cc index 7bd817678..e669a6049 100644 --- a/src/grib_expression_class_constant.cc +++ b/src/grib_expression_class_constant.cc @@ -8,11 +8,6 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/************************************** - * Enrico Fucile - **************************************/ - - #include "grib_api_internal.h" /* @@ -85,13 +80,13 @@ static void init_class(grib_expression_class* c) static long evaluate(grib_expression* g, grib_handle* h) { - grib_expression_constant* e = (grib_expression_constant*)g; + const grib_expression_constant* e = (grib_expression_constant*)g; return e->value; } static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_constant* e = (grib_expression_constant*)g; + const grib_expression_constant* e = (grib_expression_constant*)g; printf("constant(%ld)", e->value); } @@ -100,7 +95,6 @@ static void destroy(grib_context* c, grib_expression* g) /* grib_expression_constant* e = (grib_expression_constant*)g; */ } - static void add_dependency(grib_expression* g, grib_accessor* observer) { /* grib_expression_constant* e = (grib_expression_constant*)g; */ diff --git a/src/grib_expression_class_double.cc b/src/grib_expression_class_double.cc index f904c887e..0c0f87a16 100644 --- a/src/grib_expression_class_double.cc +++ b/src/grib_expression_class_double.cc @@ -84,21 +84,21 @@ static void init_class(grib_expression_class* c) static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) { - grib_expression_double* e = (grib_expression_double*)g; - *lres = e->value; + const grib_expression_double* e = (grib_expression_double*)g; + *lres = e->value; return GRIB_SUCCESS; } static int evaluate_double(grib_expression* g, grib_handle* h, double* dres) { - grib_expression_double* e = (grib_expression_double*)g; - *dres = e->value; + const grib_expression_double* e = (grib_expression_double*)g; + *dres = e->value; return GRIB_SUCCESS; } static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_double* e = (grib_expression_double*)g; + const grib_expression_double* e = (grib_expression_double*)g; printf("double(%g)", e->value); } @@ -115,8 +115,8 @@ static void add_dependency(grib_expression* g, grib_accessor* observer) grib_expression* new_double_expression(grib_context* c, double value) { grib_expression_double* e = (grib_expression_double*)grib_context_malloc_clear_persistent(c, sizeof(grib_expression_double)); - e->base.cclass = grib_expression_class_double; - e->value = value; + e->base.cclass = grib_expression_class_double; + e->value = value; return (grib_expression*)e; } diff --git a/src/grib_expression_class_functor.cc b/src/grib_expression_class_functor.cc index 89c4d8a6a..16153620d 100644 --- a/src/grib_expression_class_functor.cc +++ b/src/grib_expression_class_functor.cc @@ -134,7 +134,7 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) const char* p = grib_arguments_get_name(h, e->args, 0); if (p) { - grib_accessor* a = grib_find_accessor(h, p); + const grib_accessor* a = grib_find_accessor(h, p); *lres = a != NULL ? 1 : 0; return GRIB_SUCCESS; } @@ -149,7 +149,7 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) // 2. Cannot deal with string values const char* p = grib_arguments_get_name(h, e->args, 0); if (p) { - char* env = getenv(p); + const char* env = getenv(p); if (env) { long lval = 0; if (string_to_long(env, &lval, 1) == GRIB_SUCCESS) { @@ -177,7 +177,7 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_functor* e = (grib_expression_functor*)g; + const grib_expression_functor* e = (grib_expression_functor*)g; printf("%s(", e->name); // grib_expression_print(c,e->args,f); printf(")"); diff --git a/src/grib_expression_class_is_in_dict.cc b/src/grib_expression_class_is_in_dict.cc index a2ad355ab..27856cc2d 100644 --- a/src/grib_expression_class_is_in_dict.cc +++ b/src/grib_expression_class_is_in_dict.cc @@ -94,10 +94,10 @@ static grib_trie* load_dictionary(grib_context* c, grib_expression* e, int* err) char* filename = NULL; char line[1024] = {0,}; char key[1024] = {0,}; - char* list = 0; + char* list = 0; grib_trie* dictionary = NULL; - FILE* f = NULL; - int i = 0; + FILE* f = NULL; + int i = 0; *err = GRIB_SUCCESS; @@ -148,15 +148,15 @@ static grib_trie* load_dictionary(grib_context* c, grib_expression* e, int* err) static const char* get_name(grib_expression* g) { - grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; + const grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; return e->key; } static int evaluate_long(grib_expression* g, grib_handle* h, long* result) { - grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; - int err = 0; - char mybuf[1024] = {0,}; + const grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; + int err = 0; + char mybuf[1024] = {0,}; size_t size = 1024; grib_trie* dict = load_dictionary(h->context, g, &err); @@ -213,7 +213,7 @@ static string evaluate_string(grib_expression* g, grib_handle* h, char* buf, siz static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; + const grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; printf("access('%s", e->key); if (f) { long s = 0; @@ -239,8 +239,8 @@ static int native_type(grib_expression* g, grib_handle* h) static void add_dependency(grib_expression* g, grib_accessor* observer) { - grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; - grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->key); + const grib_expression_is_in_dict* e = (grib_expression_is_in_dict*)g; + grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->key); if (!observed) { /* grib_context_log(observer->context, GRIB_LOG_ERROR, */ diff --git a/src/grib_expression_class_is_in_list.cc b/src/grib_expression_class_is_in_list.cc index 0d61cf82c..46310bcd3 100644 --- a/src/grib_expression_class_is_in_list.cc +++ b/src/grib_expression_class_is_in_list.cc @@ -147,15 +147,15 @@ static grib_trie* load_list(grib_context* c, grib_expression* e, int* err) static const char* get_name(grib_expression* g) { - grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; + const grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; return e->name; } static int evaluate_long(grib_expression* g, grib_handle* h, long* result) { - grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; - int err = 0; - char mybuf[1024] = {0,}; + const grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; + int err = 0; + char mybuf[1024] = {0,}; size_t size = 1024; grib_trie* list = load_list(h->context, g, &err); @@ -178,24 +178,20 @@ static int evaluate_double(grib_expression* g, grib_handle* h, double* result) // int err = 0; // char mybuf[1024] = {0,}; // size_t size = 1024; - // grib_trie* list = load_list(h->context, g, &err); - // if ((err = grib_get_string_internal(h, e->name, mybuf, &size)) != GRIB_SUCCESS) // return err; - // if (grib_trie_get(list, mybuf)) // *result = 1; // else // *result = 0; - // return err; } static string evaluate_string(grib_expression* g, grib_handle* h, char* buf, size_t* size, int* err) { - grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; - char mybuf[1024] = {0,}; + const grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; + char mybuf[1024] = {0,}; size_t sizebuf = 1024; long result; @@ -216,7 +212,7 @@ static string evaluate_string(grib_expression* g, grib_handle* h, char* buf, siz static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; + const grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; printf("access('%s", e->name); if (f) { long s = 0; @@ -232,8 +228,8 @@ static void destroy(grib_context* c, grib_expression* g) static void add_dependency(grib_expression* g, grib_accessor* observer) { - grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; - grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->name); + const grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; + grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->name); if (!observed) { /* grib_context_log(observer->context, GRIB_LOG_ERROR, */ @@ -257,7 +253,7 @@ grib_expression* new_is_in_list_expression(grib_context* c, const char* name, co static int native_type(grib_expression* g, grib_handle* h) { grib_expression_is_in_list* e = (grib_expression_is_in_list*)g; - int type = 0; + int type = 0; int err; if ((err = grib_get_native_type(h, e->name, &type)) != GRIB_SUCCESS) grib_context_log(h->context, GRIB_LOG_ERROR, diff --git a/src/grib_expression_class_is_integer.cc b/src/grib_expression_class_is_integer.cc index 03554ece7..460170e6e 100644 --- a/src/grib_expression_class_is_integer.cc +++ b/src/grib_expression_class_is_integer.cc @@ -92,15 +92,15 @@ static void init_class(grib_expression_class* c) static const char* get_name(grib_expression* g) { - grib_expression_is_integer* e = (grib_expression_is_integer*)g; + const grib_expression_is_integer* e = (grib_expression_is_integer*)g; return e->name; } static int evaluate_long(grib_expression* g, grib_handle* h, long* result) { grib_expression_is_integer* e = (grib_expression_is_integer*)g; - int err = 0; - char mybuf[1024] = {0,}; + int err = 0; + char mybuf[1024] = {0,}; size_t size = 1024; char* p = 0; long val = 0; @@ -127,10 +127,10 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* result) static int evaluate_double(grib_expression* g, grib_handle* h, double* result) { - int err = 0; + int err = 0; long lresult = 0; - err = evaluate_long(g, h, &lresult); + err = evaluate_long(g, h, &lresult); *result = lresult; return err; } @@ -174,7 +174,7 @@ static void destroy(grib_context* c, grib_expression* g) static void add_dependency(grib_expression* g, grib_accessor* observer) { - grib_expression_is_integer* e = (grib_expression_is_integer*)g; + const grib_expression_is_integer* e = (grib_expression_is_integer*)g; grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->name); if (!observed) { diff --git a/src/grib_expression_class_length.cc b/src/grib_expression_class_length.cc index c685f2186..23ac0f591 100644 --- a/src/grib_expression_class_length.cc +++ b/src/grib_expression_class_length.cc @@ -92,15 +92,15 @@ static void init_class(grib_expression_class* c) static const char* get_name(grib_expression* g) { - grib_expression_length* e = (grib_expression_length*)g; + const grib_expression_length* e = (grib_expression_length*)g; return e->name; } static int evaluate_long(grib_expression* g, grib_handle* h, long* result) { - grib_expression_length* e = (grib_expression_length*)g; - int err = 0; - char mybuf[1024] = {0,}; + const grib_expression_length* e = (grib_expression_length*)g; + int err = 0; + char mybuf[1024] = {0,}; size_t size = 1024; if ((err = grib_get_string_internal(h, e->name, mybuf, &size)) != GRIB_SUCCESS) return err; @@ -111,10 +111,10 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* result) static int evaluate_double(grib_expression* g, grib_handle* h, double* result) { - grib_expression_length* e = (grib_expression_length*)g; - char mybuf[1024] = {0,}; + const grib_expression_length* e = (grib_expression_length*)g; + char mybuf[1024] = {0,}; size_t size = 1024; - int err = 0; + int err = 0; if ((err = grib_get_string_internal(h, e->name, mybuf, &size)) != GRIB_SUCCESS) return err; @@ -124,8 +124,8 @@ static int evaluate_double(grib_expression* g, grib_handle* h, double* result) static string evaluate_string(grib_expression* g, grib_handle* h, char* buf, size_t* size, int* err) { - grib_expression_length* e = (grib_expression_length*)g; - char mybuf[1024] = {0,}; + const grib_expression_length* e = (grib_expression_length*)g; + char mybuf[1024] = {0,}; Assert(buf); if ((*err = grib_get_string_internal(h, e->name, mybuf, size)) != GRIB_SUCCESS) return NULL; @@ -136,7 +136,7 @@ static string evaluate_string(grib_expression* g, grib_handle* h, char* buf, siz static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_length* e = (grib_expression_length*)g; + const grib_expression_length* e = (grib_expression_length*)g; printf("access('%s", e->name); if (f) { long s = 0; @@ -154,8 +154,8 @@ static void destroy(grib_context* c, grib_expression* g) static void add_dependency(grib_expression* g, grib_accessor* observer) { - grib_expression_length* e = (grib_expression_length*)g; - grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->name); + const grib_expression_length* e = (grib_expression_length*)g; + grib_accessor* observed = grib_find_accessor(grib_handle_of_accessor(observer), e->name); if (!observed) { /* grib_context_log(observer->context, GRIB_LOG_ERROR, */ @@ -170,8 +170,8 @@ static void add_dependency(grib_expression* g, grib_accessor* observer) grib_expression* new_length_expression(grib_context* c, const char* name) { grib_expression_length* e = (grib_expression_length*)grib_context_malloc_clear_persistent(c, sizeof(grib_expression_length)); - e->base.cclass = grib_expression_class_length; - e->name = grib_context_strdup_persistent(c, name); + e->base.cclass = grib_expression_class_length; + e->name = grib_context_strdup_persistent(c, name); return (grib_expression*)e; } diff --git a/src/grib_expression_class_long.cc b/src/grib_expression_class_long.cc index 481e143c8..e2c43b9ce 100644 --- a/src/grib_expression_class_long.cc +++ b/src/grib_expression_class_long.cc @@ -84,21 +84,21 @@ static void init_class(grib_expression_class* c) static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) { - grib_expression_long* e = (grib_expression_long*)g; - *lres = e->value; + const grib_expression_long* e = (grib_expression_long*)g; + *lres = e->value; return GRIB_SUCCESS; } static int evaluate_double(grib_expression* g, grib_handle* h, double* dres) { - grib_expression_long* e = (grib_expression_long*)g; - *dres = e->value; + const grib_expression_long* e = (grib_expression_long*)g; + *dres = e->value; return GRIB_SUCCESS; } static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_long* e = (grib_expression_long*)g; + const grib_expression_long* e = (grib_expression_long*)g; printf("long(%ld)", e->value); } @@ -115,8 +115,8 @@ static void add_dependency(grib_expression* g, grib_accessor* observer) grib_expression* new_long_expression(grib_context* c, long value) { grib_expression_long* e = (grib_expression_long*)grib_context_malloc_clear_persistent(c, sizeof(grib_expression_long)); - e->base.cclass = grib_expression_class_long; - e->value = value; + e->base.cclass = grib_expression_class_long; + e->value = value; return (grib_expression*)e; } diff --git a/src/grib_expression_class_string.cc b/src/grib_expression_class_string.cc index 1d6734c4c..962afeaf8 100644 --- a/src/grib_expression_class_string.cc +++ b/src/grib_expression_class_string.cc @@ -82,14 +82,14 @@ static void init_class(grib_expression_class* c) static const char* evaluate_string(grib_expression* g, grib_handle* h, char* buf, size_t* size, int* err) { - grib_expression_string* e = (grib_expression_string*)g; - *err = 0; + const grib_expression_string* e = (grib_expression_string*)g; + *err = 0; return e->value; } static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_string* e = (grib_expression_string*)g; + const grib_expression_string* e = (grib_expression_string*)g; printf("string('%s')", e->value); } diff --git a/src/grib_expression_class_sub_string.cc b/src/grib_expression_class_sub_string.cc index 0a53638bc..988a5d0ba 100644 --- a/src/grib_expression_class_sub_string.cc +++ b/src/grib_expression_class_sub_string.cc @@ -82,14 +82,14 @@ static void init_class(grib_expression_class* c) static const char* evaluate_string(grib_expression* g, grib_handle* h, char* buf, size_t* size, int* err) { - grib_expression_sub_string* e = (grib_expression_sub_string*)g; - *err = 0; + const grib_expression_sub_string* e = (grib_expression_sub_string*)g; + *err = 0; return e->value; } static void print(grib_context* c, grib_expression* g, grib_handle* f) { - grib_expression_sub_string* e = (grib_expression_sub_string*)g; + const grib_expression_sub_string* e = (grib_expression_sub_string*)g; printf("string('%s')", e->value); } From 474f50aa6ff78db5fd7f8577e4077a9a5fa00673 Mon Sep 17 00:00:00 2001 From: Eugen Betke Date: Wed, 21 Feb 2024 13:14:14 +0000 Subject: [PATCH 056/244] ECC-1768: Add no_copy attribute to stepUnits --- definitions/grib2/stepUnits.def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/definitions/grib2/stepUnits.def b/definitions/grib2/stepUnits.def index cffc236be..684aa1f72 100644 --- a/definitions/grib2/stepUnits.def +++ b/definitions/grib2/stepUnits.def @@ -4,7 +4,7 @@ # template_nofail default_step_units "grib2/localConcepts/[centre:s]/default_step_units.def"; # codetable[1] stepUnits 'stepUnits.table' = defaultStepUnits : transient,dump,no_copy; -meta stepUnits optimal_step_units(forecastTime,indicatorOfUnitOfTimeRange,lengthOfTimeRange,indicatorOfUnitForTimeRange) : transient,dump; +meta stepUnits optimal_step_units(forecastTime,indicatorOfUnitOfTimeRange,lengthOfTimeRange,indicatorOfUnitForTimeRange) : dump,no_copy; transient startStepUnit = 255 : hidden; # 255 means MISSING. See code table 4.4 transient endStepUnit = 255 : hidden; # The lowercase version is to unify it with the helper key in the MARS language From 44065534d49d402bb4a74d6ea608afd60c2dc99a Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 21 Feb 2024 13:15:29 +0000 Subject: [PATCH 057/244] ECC-1751: GRIB2: Consolidate parameters with fixed statistical processing ranges (S2S changes) --- definitions/grib2/localConcepts/s2s/cfVarName.def | 7 +++++++ definitions/grib2/localConcepts/s2s/name.def | 7 +++++++ definitions/grib2/localConcepts/s2s/paramId.def | 7 +++++++ definitions/grib2/localConcepts/s2s/shortName.def | 7 +++++++ definitions/grib2/localConcepts/s2s/units.def | 7 +++++++ 5 files changed, 35 insertions(+) diff --git a/definitions/grib2/localConcepts/s2s/cfVarName.def b/definitions/grib2/localConcepts/s2s/cfVarName.def index 13a346191..156261d3c 100644 --- a/definitions/grib2/localConcepts/s2s/cfVarName.def +++ b/definitions/grib2/localConcepts/s2s/cfVarName.def @@ -182,4 +182,11 @@ scaledValueOfSecondFixedSurface = missing() ; scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; + } +#Snow depth water equivalent +'sd' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 60 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/s2s/name.def b/definitions/grib2/localConcepts/s2s/name.def index 67dd7608e..cc091e047 100644 --- a/definitions/grib2/localConcepts/s2s/name.def +++ b/definitions/grib2/localConcepts/s2s/name.def @@ -182,4 +182,11 @@ scaledValueOfSecondFixedSurface = missing() ; scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; + } +#Snow depth water equivalent +'Snow depth water equivalent' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 60 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/s2s/paramId.def b/definitions/grib2/localConcepts/s2s/paramId.def index 1156927c0..8db27e06d 100644 --- a/definitions/grib2/localConcepts/s2s/paramId.def +++ b/definitions/grib2/localConcepts/s2s/paramId.def @@ -182,4 +182,11 @@ scaledValueOfSecondFixedSurface = missing() ; scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; + } +#Snow depth water equivalent +'228141' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 60 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/s2s/shortName.def b/definitions/grib2/localConcepts/s2s/shortName.def index 824ef22e7..025f7fe6f 100644 --- a/definitions/grib2/localConcepts/s2s/shortName.def +++ b/definitions/grib2/localConcepts/s2s/shortName.def @@ -182,4 +182,11 @@ scaledValueOfSecondFixedSurface = missing() ; scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; + } +#Snow depth water equivalent +'sd' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 60 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/s2s/units.def b/definitions/grib2/localConcepts/s2s/units.def index 4b7e30d55..17ff29efa 100644 --- a/definitions/grib2/localConcepts/s2s/units.def +++ b/definitions/grib2/localConcepts/s2s/units.def @@ -182,4 +182,11 @@ scaledValueOfSecondFixedSurface = missing() ; scaleFactorOfSecondFixedSurface = missing() ; typeOfStatisticalProcessing = 0 ; + } +#Snow depth water equivalent +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 60 ; + typeOfStatisticalProcessing = 0 ; } From a5bb4e186570554315deb43d60971bc246868a15 Mon Sep 17 00:00:00 2001 From: Eugen Betke Date: Wed, 21 Feb 2024 13:32:43 +0000 Subject: [PATCH 058/244] ECC-1768: Remove "loader" workaround --- src/grib_accessor_class_g2step_range.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/grib_accessor_class_g2step_range.cc b/src/grib_accessor_class_g2step_range.cc index 685c8a29b..c39601a40 100644 --- a/src/grib_accessor_class_g2step_range.cc +++ b/src/grib_accessor_class_g2step_range.cc @@ -211,11 +211,6 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) if ((ret = grib_get_long_internal(h, "forceStepUnits", &force_step_units)) != GRIB_SUCCESS) return ret; - // TODO(maee): A better solution should be found - if (h->loader) { // h->loader is set only when rebuilding or reparsing - force_step_units = 255; // See ECC-1768 - } - try { std::vector steps = parse_range(val, eccodes::Unit{force_step_units}); if (steps.size() == 0) { From 705cee4b920e7bc63f467f30323da84f83e72923 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 21 Feb 2024 15:11:19 +0000 Subject: [PATCH 059/244] Comments re no_copy flag --- definitions/grib2/stepUnits.def | 1 + src/{ => deprecated}/grib_expression_class_column.cc | 0 src/{ => deprecated}/grib_expression_class_constant.cc | 0 3 files changed, 1 insertion(+) rename src/{ => deprecated}/grib_expression_class_column.cc (100%) rename src/{ => deprecated}/grib_expression_class_constant.cc (100%) diff --git a/definitions/grib2/stepUnits.def b/definitions/grib2/stepUnits.def index 684aa1f72..d1beeb517 100644 --- a/definitions/grib2/stepUnits.def +++ b/definitions/grib2/stepUnits.def @@ -4,6 +4,7 @@ # template_nofail default_step_units "grib2/localConcepts/[centre:s]/default_step_units.def"; # codetable[1] stepUnits 'stepUnits.table' = defaultStepUnits : transient,dump,no_copy; +# See ECC-1768 re why no_copy is needed meta stepUnits optimal_step_units(forecastTime,indicatorOfUnitOfTimeRange,lengthOfTimeRange,indicatorOfUnitForTimeRange) : dump,no_copy; transient startStepUnit = 255 : hidden; # 255 means MISSING. See code table 4.4 transient endStepUnit = 255 : hidden; diff --git a/src/grib_expression_class_column.cc b/src/deprecated/grib_expression_class_column.cc similarity index 100% rename from src/grib_expression_class_column.cc rename to src/deprecated/grib_expression_class_column.cc diff --git a/src/grib_expression_class_constant.cc b/src/deprecated/grib_expression_class_constant.cc similarity index 100% rename from src/grib_expression_class_constant.cc rename to src/deprecated/grib_expression_class_constant.cc From 5b223d2effe74d8ad996ee5ff6a94d69e6cbfb4b Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 21 Feb 2024 15:11:38 +0000 Subject: [PATCH 060/244] Const correctness and cppcheck warnings --- src/grib_accessor_class_bufr_data_element.cc | 84 ++++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/grib_accessor_class_bufr_data_element.cc b/src/grib_accessor_class_bufr_data_element.cc index 1e98e17d9..3301eb10f 100644 --- a/src/grib_accessor_class_bufr_data_element.cc +++ b/src/grib_accessor_class_bufr_data_element.cc @@ -191,61 +191,61 @@ static grib_accessor* make_clone(grib_accessor* a, grib_section* s, int* err) void accessor_bufr_data_element_set_index(grib_accessor* a, long index) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->index = index; + self->index = index; } void accessor_bufr_data_element_set_type(grib_accessor* a, int type) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->type = type; + self->type = type; } void accessor_bufr_data_element_set_numberOfSubsets(grib_accessor* a, long numberOfSubsets) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->numberOfSubsets = numberOfSubsets; + self->numberOfSubsets = numberOfSubsets; } void accessor_bufr_data_element_set_subsetNumber(grib_accessor* a, long subsetNumber) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->subsetNumber = subsetNumber; + self->subsetNumber = subsetNumber; } void accessor_bufr_data_element_set_compressedData(grib_accessor* a, int compressedData) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->compressedData = compressedData; + self->compressedData = compressedData; } void accessor_bufr_data_element_set_descriptors(grib_accessor* a, bufr_descriptors_array* descriptors) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->descriptors = descriptors; + self->descriptors = descriptors; } void accessor_bufr_data_element_set_numericValues(grib_accessor* a, grib_vdarray* numericValues) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->numericValues = numericValues; + self->numericValues = numericValues; } void accessor_bufr_data_element_set_stringValues(grib_accessor* a, grib_vsarray* stringValues) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->stringValues = stringValues; + self->stringValues = stringValues; } void accessor_bufr_data_element_set_elementsDescriptorsIndex(grib_accessor* a, grib_viarray* elementsDescriptorsIndex) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - self->elementsDescriptorsIndex = elementsDescriptorsIndex; + self->elementsDescriptorsIndex = elementsDescriptorsIndex; } static void init(grib_accessor* a, const long len, grib_arguments* params) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - a->length = 0; + a->length = 0; a->flags |= GRIB_ACCESSOR_FLAG_BUFR_DATA; /* a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; */ self->cname = NULL; @@ -272,8 +272,8 @@ static int unpack_string_array(grib_accessor* a, char** val, size_t* len) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - int ret = 0, i, idx; - long count = 0; + int ret = 0, idx = 0; + size_t count = 0, i = 0; grib_context* c = a->context; if (self->compressedData) { @@ -289,7 +289,7 @@ static int unpack_string_array(grib_accessor* a, char** val, size_t* len) else { DEBUG_ASSERT(self->subsetNumber < self->numericValues->n); DEBUG_ASSERT(self->index < self->numericValues->v[self->subsetNumber]->n); - idx = (int)self->numericValues->v[self->subsetNumber]->v[self->index] / 1000 - 1; + idx = (int)self->numericValues->v[self->subsetNumber]->v[self->index] / 1000 - 1; val[0] = grib_context_strdup(c, self->stringValues->v[idx]->v[0]); *len = 1; } @@ -308,7 +308,7 @@ static int pack_string_array(grib_accessor* a, const char** v, size_t* len) if (self->compressedData) { idx = ((int)self->numericValues->v[self->index]->v[0] / 1000 - 1) / self->numberOfSubsets; - if (*len != 1 && *len != self->numberOfSubsets) { + if (*len != 1 && *len != (size_t)self->numberOfSubsets) { grib_context_log(c, GRIB_LOG_ERROR, "Number of values mismatch for '%s': %ld strings provided but expected %ld (=number of subsets)", self->descriptors->v[self->elementsDescriptorsIndex->v[0]->v[idx]]->shortName, *len, self->numberOfSubsets); return GRIB_ARRAY_TOO_SMALL; @@ -323,7 +323,7 @@ static int pack_string_array(grib_accessor* a, const char** v, size_t* len) } else { //ECC-1623 - if (*len != self->numberOfSubsets) { + if (*len != (size_t)self->numberOfSubsets) { grib_context_log(c, GRIB_LOG_ERROR, "Number of values mismatch for '%s': %zu strings provided but expected %ld (=number of subsets)", a->name, *len, self->numberOfSubsets); @@ -343,8 +343,8 @@ static int pack_string_array(grib_accessor* a, const char** v, size_t* len) static int unpack_string(grib_accessor* a, char* val, size_t* len) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - char* str = NULL; - char* p = 0; + char* str = NULL; + char* p = 0; size_t slen = 0; double dval = 0; size_t dlen = 1; @@ -413,8 +413,8 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - int ret = GRIB_SUCCESS, idx = 0; - char* s = NULL; + int ret = GRIB_SUCCESS, idx = 0; + char* s = NULL; grib_context* c = a->context; if (self->compressedData) { @@ -426,7 +426,7 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) grib_sarray_delete_content(c, self->stringValues->v[idx]); /* ECC-1172 */ grib_sarray_delete(c, self->stringValues->v[idx]); self->stringValues->v[idx] = grib_sarray_new(c, 1, 1); - s = grib_context_strdup(c, val); + s = grib_context_strdup(c, val); grib_sarray_push(c, self->stringValues->v[idx], s); return ret; @@ -435,7 +435,7 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - int ret = GRIB_SUCCESS; + int ret = GRIB_SUCCESS; long count = 0, i = 0; value_count(a, &count); @@ -494,12 +494,12 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; int ret = GRIB_SUCCESS; - long count = 1, i = 0; + size_t count = 1, i = 0; grib_context* c = a->context; if (self->compressedData) { count = *len; - if (count != 1 && count != self->numberOfSubsets) { + if (count != 1 && count != (size_t)self->numberOfSubsets) { grib_context_log(c, GRIB_LOG_ERROR, "Number of values mismatch for '%s': %ld doubles provided but expected %ld (=number of subsets)", self->descriptors->v[self->elementsDescriptorsIndex->v[0]->v[self->index]]->shortName, count, self->numberOfSubsets); return GRIB_ARRAY_TOO_SMALL; @@ -514,7 +514,7 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len) } else { self->numericValues->v[self->subsetNumber]->v[self->index] = val[0]; - *len = 1; + *len = 1; } return ret; @@ -523,14 +523,14 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len) static int pack_long(grib_accessor* a, const long* val, size_t* len) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - int ret = 0, i; - long count = 1; - grib_context* c = a->context; + int ret = 0; + size_t count = 1, i = 0; + grib_context* c = a->context; if (self->compressedData) { count = *len; - if (count != 1 && count != self->numberOfSubsets) { - grib_context_log(c, GRIB_LOG_ERROR, "Number of values mismatch for '%s': %ld integers provided but expected %ld (=number of subsets)", + if (count != 1 && count != (size_t)self->numberOfSubsets) { + grib_context_log(c, GRIB_LOG_ERROR, "Number of values mismatch for '%s': %zu integers provided but expected %ld (=number of subsets)", self->descriptors->v[self->elementsDescriptorsIndex->v[0]->v[self->index]]->shortName, count, self->numberOfSubsets); return GRIB_ARRAY_TOO_SMALL; } @@ -544,7 +544,7 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) } else { self->numericValues->v[self->subsetNumber]->v[self->index] = val[0] == GRIB_MISSING_LONG ? GRIB_MISSING_DOUBLE : val[0]; - *len = 1; + *len = 1; } return ret; @@ -552,7 +552,7 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) static int value_count(grib_accessor* a, long* count) { - int ret = 0, type = 0, idx = 0; + int ret = 0, type = 0, idx = 0; size_t size = 0; grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; @@ -581,8 +581,8 @@ static int unpack_double_element(grib_accessor* a, size_t idx, double* val) { /* ECC-415 */ grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - int ret = GRIB_SUCCESS; - long count = 0; + int ret = GRIB_SUCCESS; + long count = 0; value_count(a, &count); if (idx >= (size_t)count) { @@ -601,7 +601,7 @@ static int unpack_double_element(grib_accessor* a, size_t idx, double* val) static int get_native_type(grib_accessor* a) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - int ret = GRIB_TYPE_DOUBLE; + int ret = GRIB_TYPE_DOUBLE; DEBUG_ASSERT(self); switch (self->type) { case BUFR_DESCRIPTOR_TYPE_STRING: @@ -627,7 +627,7 @@ static int get_native_type(grib_accessor* a) static void destroy(grib_context* ct, grib_accessor* a) { grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a; - int i = 0; + int i = 0; if (self->cname) grib_context_free(ct, self->cname); /* ECC-765 */ while (i < MAX_ACCESSOR_ATTRIBUTES && a->attributes[i]) { @@ -650,14 +650,14 @@ static int is_missing(grib_accessor* a) grib_context* c = a->context; if (ktype == GRIB_TYPE_LONG) { - long* values = NULL; - long value = 0; + long* values = NULL; + long value = 0; value_count(a, &count); size = size2 = count; if (size > 1) { values = (long*)grib_context_malloc_clear(c, sizeof(long) * size); - err = grib_unpack_long(a, values, &size2); + err = grib_unpack_long(a, values, &size2); } else { err = grib_unpack_long(a, &value, &size2); @@ -677,14 +677,14 @@ static int is_missing(grib_accessor* a) } } else if (ktype == GRIB_TYPE_DOUBLE) { - double value = 0; - double* values = NULL; + double value = 0; + double* values = NULL; value_count(a, &count); size = size2 = count; if (size > 1) { values = (double*)grib_context_malloc_clear(c, sizeof(double) * size); - err = grib_unpack_double(a, values, &size2); + err = grib_unpack_double(a, values, &size2); } else { err = grib_unpack_double(a, &value, &size2); @@ -705,7 +705,7 @@ static int is_missing(grib_accessor* a) } } else if (ktype == GRIB_TYPE_STRING) { - char** values = NULL; + char** values = NULL; value_count(a, &count); size = count; if (size > 1) { From e434cdc19eadc91adacb9ba929b57ed14764cd81 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 21 Feb 2024 15:17:13 +0000 Subject: [PATCH 061/244] Dead code removal --- src/{ => deprecated}/grib_concept_index.cc | 0 .../grib_expression_class_constant.cc | 8 +-- .../grib_loader_from_array.cc | 0 src/grib_api_internal.h | 58 +++++++++---------- src/grib_expression_class.h | 2 - src/grib_expression_factory.h | 2 - 6 files changed, 28 insertions(+), 42 deletions(-) rename src/{ => deprecated}/grib_concept_index.cc (100%) rename src/{ => deprecated}/grib_loader_from_array.cc (100%) diff --git a/src/grib_concept_index.cc b/src/deprecated/grib_concept_index.cc similarity index 100% rename from src/grib_concept_index.cc rename to src/deprecated/grib_concept_index.cc diff --git a/src/deprecated/grib_expression_class_constant.cc b/src/deprecated/grib_expression_class_constant.cc index e669a6049..bedacd013 100644 --- a/src/deprecated/grib_expression_class_constant.cc +++ b/src/deprecated/grib_expression_class_constant.cc @@ -17,7 +17,7 @@ CLASS = expression IMPLEMENTS = destroy IMPLEMENTS = native_type - IMPLEMENTS = evaluate;print + IMPLEMENTS = print IMPLEMENTS = add_dependency MEMBERS = long value END_CLASS_DEF @@ -78,12 +78,6 @@ static void init_class(grib_expression_class* c) } /* END_CLASS_IMP */ -static long evaluate(grib_expression* g, grib_handle* h) -{ - const grib_expression_constant* e = (grib_expression_constant*)g; - return e->value; -} - static void print(grib_context* c, grib_expression* g, grib_handle* f) { const grib_expression_constant* e = (grib_expression_constant*)g; diff --git a/src/grib_loader_from_array.cc b/src/deprecated/grib_loader_from_array.cc similarity index 100% rename from src/grib_loader_from_array.cc rename to src/deprecated/grib_loader_from_array.cc diff --git a/src/grib_api_internal.h b/src/grib_api_internal.h index 0b516c99b..3e7370f36 100644 --- a/src/grib_api_internal.h +++ b/src/grib_api_internal.h @@ -1225,41 +1225,37 @@ struct grib_fieldset /* concept index structures */ -typedef struct grib_concept_index_key grib_concept_index_key; -typedef struct grib_concept_index grib_concept_index; -typedef struct grib_conditions_tree grib_conditions_tree; -typedef struct grib_concept_entry grib_concept_entry; -typedef struct grib_concept_key grib_concept_key; +//typedef struct grib_concept_index_key grib_concept_index_key; +//typedef struct grib_concept_index grib_concept_index; +//typedef struct grib_conditions_tree grib_conditions_tree; +//typedef struct grib_concept_entry grib_concept_entry; +//typedef struct grib_concept_key grib_concept_key; -struct grib_concept_index_entry -{ - char* name; - char* value; - int type; - grib_concept_entry* next; -}; +// struct grib_concept_index_entry { +// char* name; +// char* value; +// int type; +// grib_concept_entry* next; +// }; -struct grib_concept_index_key -{ - char* name; - int type; - grib_concept_key* next; -}; +// struct grib_concept_index_key { +// char* name; +// int type; +// grib_concept_key* next; +// }; -struct grib_concept_index -{ - grib_context* context; - grib_concept_key* keys; - grib_conditions_tree* conditions; -}; +// struct grib_concept_index { +// grib_context* context; +// grib_concept_key* keys; +// grib_conditions_tree* conditions; +// }; -struct grib_conditions_tree -{ - char* value; - void* object; - grib_conditions_tree* next; - grib_conditions_tree* next_key; -}; +// struct grib_conditions_tree { +// char* value; +// void* object; +// grib_conditions_tree* next; +// grib_conditions_tree* next_key; +// }; /* support for in-memory definition and tables */ diff --git a/src/grib_expression_class.h b/src/grib_expression_class.h index 6856b1b06..8660a7864 100644 --- a/src/grib_expression_class.h +++ b/src/grib_expression_class.h @@ -1,8 +1,6 @@ /* This file is automatically generated by ./make_class.pl, do not edit */ extern grib_expression_class* grib_expression_class_accessor; extern grib_expression_class* grib_expression_class_binop; -extern grib_expression_class* grib_expression_class_column; -extern grib_expression_class* grib_expression_class_constant; extern grib_expression_class* grib_expression_class_double; extern grib_expression_class* grib_expression_class_functor; extern grib_expression_class* grib_expression_class_is_in_dict; diff --git a/src/grib_expression_factory.h b/src/grib_expression_factory.h index 0f5cd83bb..7cacd3ac1 100644 --- a/src/grib_expression_factory.h +++ b/src/grib_expression_factory.h @@ -1,8 +1,6 @@ /* This file is automatically generated by ./make_class.pl, do not edit */ { "accessor", &grib_expression_class_accessor, }, { "binop", &grib_expression_class_binop, }, -{ "column", &grib_expression_class_column, }, -{ "constant", &grib_expression_class_constant, }, { "double", &grib_expression_class_double, }, { "functor", &grib_expression_class_functor, }, { "is_in_dict", &grib_expression_class_is_in_dict, }, From 304a2be6a0a61c08eff56d5fcfee61420bc233f8 Mon Sep 17 00:00:00 2001 From: Eugen Betke Date: Thu, 22 Feb 2024 08:21:58 +0000 Subject: [PATCH 062/244] ECC-1771: Fix static member initialisation --- src/step_unit.cc | 6 ++---- src/step_unit.h | 17 +++++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/step_unit.cc b/src/step_unit.cc index bd192a6e7..a842430f2 100644 --- a/src/step_unit.cc +++ b/src/step_unit.cc @@ -12,8 +12,6 @@ namespace eccodes { -Unit::Map Unit::map_{}; - std::vector Unit::grib_selected_units = { Unit::Value::SECOND, Unit::Value::MINUTE, @@ -39,7 +37,7 @@ std::vector Unit::complete_unit_order_ = { }; template <> long Unit::value() const { - return map_.unit_to_long(internal_value_); + return get_converter().unit_to_long(internal_value_); } template <> Unit::Value Unit::value() const { @@ -47,7 +45,7 @@ template <> Unit::Value Unit::value() const { } template <> std::string Unit::value() const { - return map_.unit_to_name(internal_value_); + return get_converter().unit_to_name(internal_value_); } } // namespace eccodes diff --git a/src/step_unit.h b/src/step_unit.h index bd078f403..0d6bc4e4e 100644 --- a/src/step_unit.h +++ b/src/step_unit.h @@ -68,7 +68,7 @@ public: explicit Unit(const std::string& unit_value) { try { - internal_value_ = map_.name_to_unit(unit_value); + internal_value_ = get_converter().name_to_unit(unit_value); } catch (std::exception& e) { throw std::runtime_error(std::string{"Unit not found "} + e.what()); } @@ -76,15 +76,15 @@ public: explicit Unit(long unit_value) { try { - internal_value_ = map_.long_to_unit(unit_value); + internal_value_ = get_converter().long_to_unit(unit_value); } catch (std::exception& e) { throw std::runtime_error(std::string{"Unit not found "} + e.what()); } } - bool operator>(const Unit& other) const {return map_.unit_to_duration(internal_value_) > map_.unit_to_duration(other.internal_value_);} - bool operator==(const Value value) const {return map_.unit_to_duration(internal_value_) == map_.unit_to_duration(value);} - bool operator==(const Unit& unit) const {return map_.unit_to_duration(internal_value_) == map_.unit_to_duration(unit.internal_value_);} + bool operator>(const Unit& other) const {return get_converter().unit_to_duration(internal_value_) > get_converter().unit_to_duration(other.internal_value_);} + bool operator==(const Value value) const {return get_converter().unit_to_duration(internal_value_) == get_converter().unit_to_duration(value);} + bool operator==(const Unit& unit) const {return get_converter().unit_to_duration(internal_value_) == get_converter().unit_to_duration(unit.internal_value_);} bool operator!=(const Unit& unit) const {return !(*this == unit);} bool operator!=(const Value value) const {return !(*this == value);} @@ -177,13 +177,14 @@ private: Value internal_value_; - static Map map_; public: - static Map& get_converter() {return map_;} + static Map& get_converter() { + static Map map_; + return map_; + } }; - template Seconds to_seconds(long value, const Unit& unit) { Seconds seconds; From c7a67156d38db6424f3b7dbe484ee63074c2d16b Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 22 Feb 2024 15:52:32 +0000 Subject: [PATCH 063/244] Dead code removal --- src/grib_api_internal.h | 122 +++++++++++++--------------------------- 1 file changed, 39 insertions(+), 83 deletions(-) diff --git a/src/grib_api_internal.h b/src/grib_api_internal.h index 3e7370f36..7f0398065 100644 --- a/src/grib_api_internal.h +++ b/src/grib_api_internal.h @@ -258,8 +258,7 @@ typedef struct string_feed string_feed; typedef struct codes_condition codes_condition; -/* typedef void (*dynamic_key_proc) (const char*, void*) -*/ +/* typedef void (*dynamic_key_proc) (const char*, void*) */ typedef void (*nearest_init_class_proc)(grib_nearest_class*); typedef int (*nearest_init_proc)(grib_nearest* i, grib_handle*, grib_arguments*); @@ -369,14 +368,12 @@ struct second_order_packed /** * an grib_compression * Structure supporting the packing and unpacking procedures -* -* @see grib_action_create_data */ struct grib_packer { const char* name; - grib_pack_proc pack; /** < packing procedure */ - grib_unpack_proc unpack; /** < unpacking procedure */ + grib_pack_proc pack; /** < packing procedure */ + grib_unpack_proc unpack; /** < unpacking procedure */ }; /* --------------- */ @@ -394,7 +391,7 @@ struct grib_loader }; /** -* an action +* An action * Structure supporting the creation of accessor, resulting of a statement during a definition file parsing * * @see grib_action_class @@ -437,7 +434,7 @@ typedef grib_action* (*action_reparse_proc)(grib_action* a, grib_accessor*, int* typedef int (*action_execute_proc)(grib_action* a, grib_handle*); /** -* an action_class +* An action_class * Structure supporting the specific behaviour of an action * * @see grib_action @@ -464,22 +461,22 @@ struct grib_action_class }; /** -* a buffer +* A buffer * Structure containing the data of a message */ struct grib_buffer { - int property; /** < property parameter of buffer */ - int validity; /** < validity parameter of buffer */ - int growable; /** < buffer can be grown */ - size_t length; /** < Buffer length */ - size_t ulength; /** < length used of the buffer */ - size_t ulength_bits; /** < length used of the buffer in bits */ - unsigned char* data; /** < the data byte array */ + int property; /** < property parameter of buffer */ + int validity; /** < validity parameter of buffer */ + int growable; /** < buffer can be grown */ + size_t length; /** < Buffer length */ + size_t ulength; /** < length used of the buffer */ + size_t ulength_bits; /** < length used of the buffer in bits */ + unsigned char* data; /** < the data byte array */ }; /** -* an Accessor +* An accessor * Structure supporting each single data unit and allowing its access * @see grib_accessor_class */ @@ -500,18 +497,18 @@ struct grib_virtual_value struct grib_accessor { - const char* name; /** < name of the accessor */ - const char* name_space; /** < namespace to which the accessor belongs */ + const char* name; /** < name of the accessor */ + const char* name_space; /** < namespace to which the accessor belongs */ grib_context* context; grib_handle* h; - grib_action* creator; /** < action that created the accessor */ - long length; /** < byte length of the accessor */ - long offset; /** < offset of the data in the buffer */ - grib_section* parent; /** < section to which the accessor is attached */ - grib_accessor* next; /** < next accessor in list */ - grib_accessor* previous; /** < next accessor in list */ - grib_accessor_class* cclass; /** < behaviour of the accessor */ - unsigned long flags; /** < Various flags */ + grib_action* creator; /** < action that created the accessor */ + long length; /** < byte length of the accessor */ + long offset; /** < offset of the data in the buffer */ + grib_section* parent; /** < section to which the accessor is attached */ + grib_accessor* next; /** < next accessor in list */ + grib_accessor* previous; /** < next accessor in list */ + grib_accessor_class* cclass; /** < behaviour of the accessor */ + unsigned long flags; /** < Various flags */ grib_section* sub_section; const char* all_names[MAX_ACCESSOR_NAMES]; /** < name of the accessor */ @@ -547,7 +544,7 @@ struct grib_accessor #define GRIB_ACCESSOR_FLAG_COPY_IF_CHANGING_EDITION (1 << 19) /** -* a section accessor +* A section accessor * Structure supporting hierarchical naming of the accessors * @see grib_accessor */ @@ -555,9 +552,9 @@ struct grib_section { grib_accessor* owner; grib_handle* h; /** < Handles of all accessors and buffer */ - grib_accessor* aclength; /** < block of the length of the block */ - grib_block_of_accessors* block; /** < block */ - grib_action* branch; /** < branch that created the block */ + grib_accessor* aclength; /** < block of the length of the block */ + grib_block_of_accessors* block; /** < block */ + grib_action* branch; /** < branch that created the block */ size_t length; size_t padding; }; @@ -640,18 +637,18 @@ struct grib_dumper_class struct grib_iterator { - grib_arguments* args; /** args of iterator */ + grib_arguments* args; /** args of iterator */ grib_handle* h; - long e; /** current element */ - size_t nv; /** number of values */ - double* data; /** data values */ + long e; /** current element */ + size_t nv; /** number of values */ + double* data; /** data values */ grib_iterator_class* cclass; unsigned long flags; }; struct grib_nearest { - grib_arguments* args; /** args of iterator */ + grib_arguments* args; /** args of iterator */ grib_handle* h; grib_context* context; double* values; @@ -823,8 +820,8 @@ void codes_assertion_failed(const char* message, const char* file, int line); struct grib_handle { - grib_context* context; /** < context attached to this handle */ - grib_buffer* buffer; /** < buffer attached to the handle */ + grib_context* context; /** < context attached to this handle */ + grib_buffer* buffer; /** < buffer attached to the handle */ grib_section* root; /** the root section*/ grib_section* rules; /** the rules section*/ grib_dependency* dependencies; /** List of dependencies */ @@ -853,13 +850,12 @@ struct grib_handle /* For GRIB2 multi-field messages */ struct grib_multi_handle { - grib_context* context; /** < context attached to this handle */ - grib_buffer* buffer; /** < buffer attached to the handle */ + grib_context* context; /** < context attached to this handle */ + grib_buffer* buffer; /** < buffer attached to the handle */ size_t offset; size_t length; }; - struct grib_accessor_class { grib_accessor_class** super; @@ -1094,7 +1090,6 @@ struct grib_expression_class expression_init_proc init; expression_destroy_proc destroy; - expression_print_proc print; expression_add_dependency_proc add_dependency; @@ -1106,7 +1101,6 @@ struct grib_expression_class expression_evaluate_string_proc evaluate_string; }; - struct grib_arguments { struct grib_arguments* next; @@ -1223,40 +1217,6 @@ struct grib_fieldset grib_field** fields; }; -/* concept index structures */ - -//typedef struct grib_concept_index_key grib_concept_index_key; -//typedef struct grib_concept_index grib_concept_index; -//typedef struct grib_conditions_tree grib_conditions_tree; -//typedef struct grib_concept_entry grib_concept_entry; -//typedef struct grib_concept_key grib_concept_key; - -// struct grib_concept_index_entry { -// char* name; -// char* value; -// int type; -// grib_concept_entry* next; -// }; - -// struct grib_concept_index_key { -// char* name; -// int type; -// grib_concept_key* next; -// }; - -// struct grib_concept_index { -// grib_context* context; -// grib_concept_key* keys; -// grib_conditions_tree* conditions; -// }; - -// struct grib_conditions_tree { -// char* value; -// void* object; -// grib_conditions_tree* next; -// grib_conditions_tree* next_key; -// }; - /* support for in-memory definition and tables */ extern int codes_memfs_exists(const char* path); @@ -1297,7 +1257,6 @@ struct grib_field_list grib_field_list* next; }; - struct grib_index { grib_context* context; @@ -1384,10 +1343,8 @@ struct bufr_keys_iterator grib_trie* seen; }; -/* ----------*/ -/* md5 */ +/* --------- md5 --------*/ typedef unsigned long cvs_uint32; - struct cvs_MD5Context { cvs_uint32 buf[4]; @@ -1421,7 +1378,6 @@ struct grib_case }; /* ----------*/ - typedef struct code_table_entry { char* abbreviation; @@ -1440,7 +1396,7 @@ struct grib_codetable typedef struct grib_smart_table_entry { - /*int code;*/ + /*int code;*/ char* abbreviation; char* column[MAX_SMART_TABLE_COLUMNS]; } grib_smart_table_entry; From 5eaa3aa84c5a5db6dd6abe5dfc33ac12d2efa67b Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 22 Feb 2024 15:52:42 +0000 Subject: [PATCH 064/244] grib_concept_index --- src/deprecated/grib_concept_index.cc | 73 ++++++++++++++++++---------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/deprecated/grib_concept_index.cc b/src/deprecated/grib_concept_index.cc index 9cb8f0d1d..8ca1794a4 100644 --- a/src/deprecated/grib_concept_index.cc +++ b/src/deprecated/grib_concept_index.cc @@ -1,30 +1,49 @@ -/* - * (C) Copyright 2005- ECMWF. - * - * This software is licensed under the terms of the Apache Licence Version 2.0 - * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. - * - * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by - * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. - */ - -/* - * Description: concept index - * - */ - #include "grib_api_internal.h" +typedef struct grib_concept_index_keys grib_concept_index_keys; +typedef struct grib_concept_index grib_concept_index; +typedef struct grib_conditions_tree grib_conditions_tree; +typedef struct grib_concept_index_entry grib_concept_index_entry; +typedef struct grib_concept_index_keys grib_concept_index_keys; + +struct grib_concept_index_entry { + char* name; + char* value; + int type; + grib_concept_index_entry* next; +}; + +struct grib_concept_index_keys { + char* name; + int type; + grib_concept_index_keys* next; +}; + +struct grib_concept_index { + grib_context* context; + grib_concept_index_keys* keys; + grib_conditions_tree* conditions; +}; + +struct grib_conditions_tree { + char* value; + void* object; + grib_conditions_tree* next; + grib_conditions_tree* next_key; +}; + + static grib_concept_index_entry* index_entry_new(grib_context* c, grib_concept_index_keys* keys) { grib_concept_index_entry* entry = NULL; + grib_concept_index_entry* e; Assert(keys); if (!c) c = grib_context_get_default(); - entry = grib_context_malloc_clear(c, sizeof(grib_concept_index_entry)); + entry = (grib_concept_index_entry*)grib_context_malloc_clear(c, sizeof(grib_concept_index_entry)); if (!entry) grib_context_log(c, GRIB_LOG_FATAL, "grib_concept_index_entry unable to allocate"); e = entry; @@ -32,7 +51,7 @@ static grib_concept_index_entry* index_entry_new(grib_context* c, grib_concept_i while (keys && keys->name) { e->name = grib_context_strdup(c, keys->name); e->type = keys->type; - e->next = grib_context_malloc_clear(c, sizeof(grib_concept_index_entry)); + e->next = (grib_concept_index_entry*)grib_context_malloc_clear(c, sizeof(grib_concept_index_entry)); if (!e->next) grib_context_log(c, GRIB_LOG_FATAL, "grib_concept_index_entry unable to allocate"); @@ -65,17 +84,17 @@ static int index_insert_entry(grib_concept_index* index, grib_concept_index_entr while (keys->name) { if (!cur) { - cur = grib_context_malloc_clear_persistent(index->context, sizeof(grib_conditions_tree)); + cur = (grib_conditions_tree*)grib_context_malloc_clear_persistent(index->context, sizeof(grib_conditions_tree)); if (!cur) grib_context_log(index->context, GRIB_LOG_FATAL, "index_insert_entry unable to allocate"); prev->next = cur; } - value = entry->value ? entry->value : "*"; + char* value = entry->value ? entry->value : (char*)"*"; while (cur && (!cur->value || (found = !strcmp(cur->value, value)) == 0)) cur = cur->next; if (!found) { - cur->next = grib_context_malloc_clear_persistent(index->context, sizeof(grib_conditions_tree)); + cur->next = (grib_conditions_tree*)grib_context_malloc_clear_persistent(index->context, sizeof(grib_conditions_tree)); Assert(cur->next); cur = cur->next; } @@ -103,6 +122,9 @@ static void index_add_conditions(grib_concept_index* index, grib_concept_conditi char s[512] = {0,}; grib_concept_index_entry* e; grib_concept_index_entry* entry = index_entry_new(index->context, index->keys); + long lres; + double dres; + int err = 0; while (c) { size_t size = 512; @@ -136,7 +158,7 @@ static void index_add_conditions(grib_concept_index* index, grib_concept_conditi e->value = grib_context_strdup(index->context, s); if (!e->name) { e->name = grib_context_strdup(index->context, c->name); - e->next = grib_context_malloc_clear_persistent(index->context, sizeof(grib_concept_index_entry)); + e->next = (grib_concept_index_entry*)grib_context_malloc_clear_persistent(index->context, sizeof(grib_concept_index_entry)); if (!e->next) grib_context_log(index->context, GRIB_LOG_FATAL, "index_add_conditions unable to allocate"); } @@ -156,14 +178,13 @@ grib_concept_index* grib_concept_index_new_from_concept(grib_context* c, grib_co if (!c) c = grib_context_get_default(); - index = grib_context_malloc_clear_persistent(c, sizeof(grib_concept_index)); - index->keys = grib_context_malloc_clear_persistent(c, sizeof(grib_concept_index_key)); - index->conditions = grib_context_malloc_clear_persistent(c, sizeof(grib_conditions_tree)); - index->conditions = grib_context_malloc_clear_persistent(c, sizeof(grib_conditions_tree)); + index = (grib_concept_index*)grib_context_malloc_clear_persistent(c, sizeof(grib_concept_index)); + index->keys = (grib_concept_index_keys*)grib_context_malloc_clear_persistent(c, sizeof(grib_concept_index_keys)); + index->conditions = (grib_conditions_tree*)grib_context_malloc_clear_persistent(c, sizeof(grib_conditions_tree)); index->context = c; while (concept) { - index_add_conditions(index, concept->conditions, err); + index_add_conditions(index, concept->conditions); concept = concept->next; } From 4872b51e110824474452b8aeb7e96afd13eb2ce2 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 22 Feb 2024 16:27:05 +0000 Subject: [PATCH 065/244] GitHub nightly: netcdf4 module --- .github/ci-nightly-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ci-nightly-test.sh b/.github/ci-nightly-test.sh index d0b206c7c..4eb4a54a9 100644 --- a/.github/ci-nightly-test.sh +++ b/.github/ci-nightly-test.sh @@ -8,7 +8,7 @@ module unload ecmwf-toolbox module load cdo/new module load numdiff module load nccmp -module load netcdf4/new +module load netcdf4 module load gnuparallel/new module load python3 From a0e3cc1a8f23b424ad1f2a746ba0f504c19855d5 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 22 Feb 2024 16:31:27 +0000 Subject: [PATCH 066/244] GitHub nightly: netcdf4 module fix --- .github/ci-hpc-config.yml | 2 +- .github/workflows/reusable-ci-hpc.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ci-hpc-config.yml b/.github/ci-hpc-config.yml index 801481f83..3ae75ea37 100644 --- a/.github/ci-hpc-config.yml +++ b/.github/ci-hpc-config.yml @@ -3,7 +3,7 @@ build: - ecbuild - ninja - aec - - netcdf4/new + - netcdf4 parallel: 64 cmake_options: - -DENABLE_EXTRA_TESTS=1 diff --git a/.github/workflows/reusable-ci-hpc.yml b/.github/workflows/reusable-ci-hpc.yml index 793f26ebe..1176afc9d 100644 --- a/.github/workflows/reusable-ci-hpc.yml +++ b/.github/workflows/reusable-ci-hpc.yml @@ -23,7 +23,7 @@ jobs: ecbuild ninja aec - netcdf4/new + netcdf4 --parallel: 64 --cmake-options: | -DENABLE_EXTRA_TESTS=1 From 7b36814d1136cbbe4e2157e4d2288da8f34f9cbd Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 22 Feb 2024 17:36:39 +0000 Subject: [PATCH 067/244] Testing: codes_get_string for different products --- src/grib_accessor_class_message.cc | 2 +- tests/codes_get_string.cc | 13 +++++++++---- tests/codes_get_string.sh | 14 +++++++++----- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/grib_accessor_class_message.cc b/src/grib_accessor_class_message.cc index 8dd580d3e..6c5587b22 100644 --- a/src/grib_accessor_class_message.cc +++ b/src/grib_accessor_class_message.cc @@ -142,7 +142,7 @@ static int value_count(grib_accessor* a, long* count) static int unpack_string(grib_accessor* a, char* val, size_t* len) { long i = 0; - size_t l = a->length + 1; + size_t l = string_length(a) + 1; grib_handle* h = grib_handle_of_accessor(a); if (*len < l) { diff --git a/tests/codes_get_string.cc b/tests/codes_get_string.cc index d0cf15192..db98de25e 100644 --- a/tests/codes_get_string.cc +++ b/tests/codes_get_string.cc @@ -18,15 +18,20 @@ int main(int argc, char* argv[]) size_t len = 0; int err = 0; - assert(argc == 3); + assert(argc == 4); - const char* infile = argv[1]; + const char* prod = argv[1]; + const char* infile = argv[2]; FILE* in = fopen(infile, "rb"); assert(in); - char* key = argv[2]; + char* key = argv[3]; char kvalue[2] = {0,}; // deliberately short + ProductKind productKind = PRODUCT_GRIB; + if (strcmp(prod, "BUFR")==0) productKind = PRODUCT_BUFR; + if (strcmp(prod, "GTS")==0) productKind = PRODUCT_GTS; + if (strcmp(prod, "ANY")==0) productKind = PRODUCT_ANY; - h = codes_handle_new_from_file(NULL, in, PRODUCT_ANY, &err); + h = codes_handle_new_from_file(NULL, in, productKind, &err); assert(h); assert(!err); diff --git a/tests/codes_get_string.sh b/tests/codes_get_string.sh index 011224253..a42ef9f97 100755 --- a/tests/codes_get_string.sh +++ b/tests/codes_get_string.sh @@ -15,29 +15,33 @@ tempGrib=temp.$label.grib tempText=temp.$label.txt input=$ECCODES_SAMPLES_PATH/GRIB1.tmpl -$EXEC ${test_dir}/codes_get_string $input dataDate +$EXEC ${test_dir}/codes_get_string GRIB $input dataDate ${tools_dir}/grib_set -s marsType=s3,marsStream=mpic $input $tempGrib -$EXEC ${test_dir}/codes_get_string $tempGrib dayOfTheYearDate # 2> $tempText +$EXEC ${test_dir}/codes_get_string GRIB $tempGrib dayOfTheYearDate # 2> $tempText input=$data_dir/reduced_latlon_surface.grib2 keys="identifier projString bitmap class year gridDefinitionDescription time validityTime packingType md5Headers parameterUnits" for k in $keys; do - $EXEC ${test_dir}/codes_get_string $input $k 2> $tempText + $EXEC ${test_dir}/codes_get_string GRIB $input $k 2> $tempText grep -q "Buffer too small" $tempText done input=$ECCODES_SAMPLES_PATH/reduced_gg_ml_grib2.tmpl -$EXEC ${test_dir}/codes_get_string "$input" gridName 2> $tempText +$EXEC ${test_dir}/codes_get_string GRIB "$input" gridName 2> $tempText grep -q "Buffer too small" $tempText # shortName = swh input=$data_dir/reduced_latlon_surface.grib1 -$EXEC ${test_dir}/codes_get_string "$input" shortName 2> $tempText +$EXEC ${test_dir}/codes_get_string GRIB "$input" shortName 2> $tempText grep -q "Buffer too small" $tempText +input=$data_dir/gts/EGRR20150317121020_00493212.DAT +$EXEC ${test_dir}/codes_get_string GTS "$input" theMessage 2> $tempText +grep -q "Buffer too small" $tempText +# Clean up rm -f $tempText From adc912850bf6de6d4e5db0d8b6cb2cf389cf721d Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 22 Feb 2024 19:33:02 +0000 Subject: [PATCH 068/244] Testing: Variables like constants and transients --- src/grib_accessor_class_variable.cc | 6 ++++++ tests/codes_compare_keys.sh | 4 ++++ tests/codes_get_string.sh | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/grib_accessor_class_variable.cc b/src/grib_accessor_class_variable.cc index 9d12e04cf..6a39d34df 100644 --- a/src/grib_accessor_class_variable.cc +++ b/src/grib_accessor_class_variable.cc @@ -126,6 +126,12 @@ grib_accessor_class* grib_accessor_class_variable = &_grib_accessor_class_variab /* END_CLASS_IMP */ +// +// This accessor is used for: +// constant +// transient +// + #define MAX_VARIABLE_STRING_LENGTH 255 static void init(grib_accessor* a, const long length, grib_arguments* args) diff --git a/tests/codes_compare_keys.sh b/tests/codes_compare_keys.sh index 9a2a39aef..1a678ede8 100755 --- a/tests/codes_compare_keys.sh +++ b/tests/codes_compare_keys.sh @@ -68,6 +68,9 @@ diff $tempRef $tempLog sample_spectral=$ECCODES_SAMPLES_PATH/sh_ml_grib2.tmpl ${test_dir}/codes_compare_keys $sample_spectral $sample_spectral enorm,avg +# Do some constant and transient keys +${test_dir}/codes_compare_keys $sample_spectral $sample_spectral marsDir,truncateLaplacian + # Local definitions # ---------------------- @@ -82,6 +85,7 @@ status=$? set -e [ $status -ne 0 ] grep -q "2 differences" $tempLog + rm -f $tempGribA $tempGribB diff --git a/tests/codes_get_string.sh b/tests/codes_get_string.sh index a42ef9f97..188c81a3e 100755 --- a/tests/codes_get_string.sh +++ b/tests/codes_get_string.sh @@ -22,7 +22,7 @@ $EXEC ${test_dir}/codes_get_string GRIB $tempGrib dayOfTheYearDate # 2> $tempTex input=$data_dir/reduced_latlon_surface.grib2 -keys="identifier projString bitmap class year gridDefinitionDescription +keys="hundred identifier projString bitmap class year gridDefinitionDescription time validityTime packingType md5Headers parameterUnits" for k in $keys; do $EXEC ${test_dir}/codes_get_string GRIB $input $k 2> $tempText From 0e0f204d82f80d2094d3d4d1e405776465b78b1a Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 22 Feb 2024 20:41:03 +0000 Subject: [PATCH 069/244] Const correctness and cppcheck warnings --- src/grib_accessor_class_variable.cc | 33 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/grib_accessor_class_variable.cc b/src/grib_accessor_class_variable.cc index 6a39d34df..13b31706b 100644 --- a/src/grib_accessor_class_variable.cc +++ b/src/grib_accessor_class_variable.cc @@ -186,7 +186,7 @@ void accessor_variable_set_type(grib_accessor* a, int type) static void dump(grib_accessor* a, grib_dumper* dumper) { - grib_accessor_variable* self = (grib_accessor_variable*)a; + const grib_accessor_variable* self = (grib_accessor_variable*)a; switch (self->type) { case GRIB_TYPE_DOUBLE: grib_dump_double(dumper, a, NULL); @@ -261,7 +261,7 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) static int unpack_double(grib_accessor* a, double* val, size_t* len) { - grib_accessor_variable* self = (grib_accessor_variable*)a; + const grib_accessor_variable* self = (grib_accessor_variable*)a; if (*len < 1) { grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains %d values", a->name, 1); @@ -275,7 +275,7 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) static int unpack_float(grib_accessor* a, float* val, size_t* len) { - grib_accessor_variable* self = (grib_accessor_variable*)a; + const grib_accessor_variable* self = (grib_accessor_variable*)a; if (*len < 1) { grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains %d values", a->name, 1); @@ -289,7 +289,7 @@ static int unpack_float(grib_accessor* a, float* val, size_t* len) static int unpack_long(grib_accessor* a, long* val, size_t* len) { - grib_accessor_variable* self = (grib_accessor_variable*)a; + const grib_accessor_variable* self = (grib_accessor_variable*)a; if (*len < 1) { grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s it contains %d values ", a->name, 1); @@ -303,7 +303,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) static int get_native_type(grib_accessor* a) { - grib_accessor_variable* self = (grib_accessor_variable*)a; + const grib_accessor_variable* self = (grib_accessor_variable*)a; return self->type; } @@ -356,7 +356,7 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) static int pack_string(grib_accessor* a, const char* val, size_t* len) { grib_accessor_variable* self = (grib_accessor_variable*)a; - grib_context* c = a->context; + const grib_context* c = a->context; grib_context_free(c, self->cval); self->cval = grib_context_strdup(c, val); @@ -375,7 +375,7 @@ static int value_count(grib_accessor* a, long* count) static size_t string_length(grib_accessor* a) { - grib_accessor_variable* self = (grib_accessor_variable*)a; + const grib_accessor_variable* self = (grib_accessor_variable*)a; if (self->type == GRIB_TYPE_STRING) return strlen(self->cval); else @@ -389,7 +389,7 @@ static long byte_count(grib_accessor* a) static int compare(grib_accessor* a, grib_accessor* b) { - int retval = 0; + int retval = GRIB_SUCCESS; double* aval = 0; double* bval = 0; @@ -418,10 +418,9 @@ static int compare(grib_accessor* a, grib_accessor* b) grib_unpack_double(b, bval, &blen); retval = GRIB_SUCCESS; - while (alen != 0) { - if (*bval != *aval) - retval = GRIB_DOUBLE_VALUE_MISMATCH; - alen--; + retval = GRIB_SUCCESS; + for (size_t i=0; icontext, aval); @@ -432,13 +431,13 @@ static int compare(grib_accessor* a, grib_accessor* b) static grib_accessor* make_clone(grib_accessor* a, grib_section* s, int* err) { - grib_accessor* the_clone = NULL; - grib_accessor_variable* self = (grib_accessor_variable*)a; + grib_accessor* the_clone = NULL; + const grib_accessor_variable* self = (grib_accessor_variable*)a; grib_accessor_variable* variableAccessor = NULL; - grib_action creator = {0,}; - creator.op = (char*)"variable"; + grib_action creator = {0,}; + creator.op = (char*)"variable"; creator.name_space = (char*)""; - creator.set = 0; + creator.set = 0; creator.name = grib_context_strdup(a->context, a->name); the_clone = grib_accessor_factory(s, &creator, 0, NULL); From b8a92c83d91d5659bc9f1add21a7972315d32103 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 23 Feb 2024 11:21:58 +0000 Subject: [PATCH 070/244] ECC-1685: GRIB2: Correct local ECMWF table entries (code 194) --- definitions/grib2/tables/local/ecmf/1/4.2.0.1.table | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/definitions/grib2/tables/local/ecmf/1/4.2.0.1.table b/definitions/grib2/tables/local/ecmf/1/4.2.0.1.table index 5e02901a1..1ee04a741 100644 --- a/definitions/grib2/tables/local/ecmf/1/4.2.0.1.table +++ b/definitions/grib2/tables/local/ecmf/1/4.2.0.1.table @@ -1,7 +1,7 @@ # Code table 4.2 - discipline=0 category=1 for ECMWF 192 192 Snow evaporation rate (kg m-2 s-1) 193 193 Total precipitation rate (m s-1) -194 194 Accumulated freezing rain (m) +194 194 Freezing rain precipitation rate (m s-1) 195 195 Convective precipitation rate (m s-1) 196 196 Large-scale precipitation rate (m s-1) 197 197 Snow evaporation rate (m of water equivalent s-1) From 74c78e1d3dcbcd0f84965afa66539d8c80cf2c63 Mon Sep 17 00:00:00 2001 From: Sebastien Villaume Date: Fri, 23 Feb 2024 11:55:51 +0000 Subject: [PATCH 071/244] ECC-1774 adding MARS system keyword for mmsf/fc and msmm/fcmean --- definitions/mars/grib.mmsf.fc.def | 1 + definitions/mars/grib.msmm.fcmean.def | 1 + 2 files changed, 2 insertions(+) diff --git a/definitions/mars/grib.mmsf.fc.def b/definitions/mars/grib.mmsf.fc.def index f1820336a..c002f9d76 100644 --- a/definitions/mars/grib.mmsf.fc.def +++ b/definitions/mars/grib.mmsf.fc.def @@ -8,6 +8,7 @@ if (class is "od") { alias mars.system = systemNumber; } if (class is "me") { alias mars.system = systemNumber; } if (class is "en") { alias mars.system = systemNumber; } if (class is "c3") { alias mars.system = systemNumber; } +if (class is "ci") { alias mars.system = systemNumber; } alias mars.number = perturbationNumber; alias mars.method = methodNumber; diff --git a/definitions/mars/grib.msmm.fcmean.def b/definitions/mars/grib.msmm.fcmean.def index 800a49134..a13ca9918 100644 --- a/definitions/mars/grib.msmm.fcmean.def +++ b/definitions/mars/grib.msmm.fcmean.def @@ -10,6 +10,7 @@ if (class is "od") { alias mars.system = systemNumber; } if (class is "me") { alias mars.system = systemNumber; } if (class is "en") { alias mars.system = systemNumber; } if (class is "c3") { alias mars.system = systemNumber; } +if (class is "ci") { alias mars.system = systemNumber; } # See ECC-624 if (centre == 80 && subCentre == 98 && class is "c3") { From e1eba0471a3548a67187e45f4136aeb3e2007ad3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 23 Feb 2024 14:28:08 +0000 Subject: [PATCH 072/244] Dead code removal --- src/action_class_hash_array.cc | 47 ++++++++++++++++------------------ 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/action_class_hash_array.cc b/src/action_class_hash_array.cc index b01077870..609e763f2 100644 --- a/src/action_class_hash_array.cc +++ b/src/action_class_hash_array.cc @@ -168,13 +168,14 @@ grib_action* grib_action_create_hash_array(grib_context* context, a->hash_array = hash_array; if (hash_array) { - grib_hash_array_value* ha = hash_array; - grib_trie* index = grib_trie_new(context); - while (ha) { - ha->index = index; - grib_trie_insert_no_replace(index, ha->name, ha); - ha = ha->next; - } + grib_context_log(context, GRIB_LOG_FATAL, "%s: 'hash_array_list' not implemented", __func__); + // grib_hash_array_value* ha = hash_array; + // grib_trie* index = grib_trie_new(context); + // while (ha) { + // ha->index = index; + // grib_trie_insert_no_replace(index, ha->name, ha); + // ha = ha->next; + // } } act->name = grib_context_strdup_persistent(context, name); @@ -185,17 +186,12 @@ grib_action* grib_action_create_hash_array(grib_context* context, static void dump(grib_action* act, FILE* f, int lvl) { - int i = 0; - - for (i = 0; i < lvl; i++) - grib_context_print(act->context, f, " "); - - printf("hash_array(%s) { ", act->name); - printf("\n"); - - for (i = 0; i < lvl; i++) - grib_context_print(act->context, f, " "); - printf("}\n"); + // for (int i = 0; i < lvl; i++) + // grib_context_print(act->context, f, " "); + // printf("hash_array(%s) { \n", act->name); + // for (int i = 0; i < lvl; i++) + // grib_context_print(act->context, f, " "); + // printf("}\n"); } @@ -204,13 +200,14 @@ static void destroy(grib_context* context, grib_action* act) grib_action_hash_array* self = (grib_action_hash_array*)act; grib_hash_array_value* v = self->hash_array; - if (v) - grib_trie_delete(v->index); - while (v) { - grib_hash_array_value* n = v->next; - grib_hash_array_value_delete(context, v); - v = n; - } + Assert(!v); // not implemented + // if (v) + // grib_trie_delete(v->index); + // while (v) { + // grib_hash_array_value* n = v->next; + // grib_hash_array_value_delete(context, v); + // v = n; + // } grib_context_free_persistent(context, self->masterDir); grib_context_free_persistent(context, self->localDir); From 94a306485496187717bb75acb2500608fe642bf3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 23 Feb 2024 14:28:21 +0000 Subject: [PATCH 073/244] Debug messages --- src/grib_context.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/grib_context.cc b/src/grib_context.cc index 0c1921138..859f1087c 100644 --- a/src/grib_context.cc +++ b/src/grib_context.cc @@ -535,11 +535,10 @@ grib_context* grib_context_get_default() } #endif - grib_context_log(&default_grib_context, GRIB_LOG_DEBUG, "Definitions path: %s", - default_grib_context.grib_definition_files_path); - grib_context_log(&default_grib_context, GRIB_LOG_DEBUG, "Samples path: %s", - default_grib_context.grib_samples_path); - + if (default_grib_context.debug) { + fprintf(stderr, "ECCODES DEBUG Definitions path: %s\n", default_grib_context.grib_definition_files_path); + fprintf(stderr, "ECCODES DEBUG Samples path: %s\n", default_grib_context.grib_samples_path); + } default_grib_context.keys_count = 0; default_grib_context.keys = grib_hash_keys_new(&(default_grib_context), &(default_grib_context.keys_count)); From 27b7b44eb7235a835fde1de54721a867abfe7c7e Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 23 Feb 2024 15:25:39 +0000 Subject: [PATCH 074/244] Dead code removal --- src/eccodes_prototypes.h | 1 - src/grib_hash_array.cc | 32 ++++++++++++++++---------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 3537fc05f..1513b01df 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -172,7 +172,6 @@ void grib_concept_condition_delete(grib_context* c, grib_concept_condition* v); /* grib_hash_array.cc*/ grib_hash_array_value* grib_integer_hash_array_value_new(grib_context* c, const char* name, grib_iarray* array); -void grib_hash_array_value_delete(grib_context* c, grib_hash_array_value* v); /* grib_bufr_descriptor.cc*/ bufr_descriptor* grib_bufr_descriptor_new(grib_accessor* tables_accessor, int code, int silent, int* err); diff --git a/src/grib_hash_array.cc b/src/grib_hash_array.cc index 54ba4294f..ec556c904 100644 --- a/src/grib_hash_array.cc +++ b/src/grib_hash_array.cc @@ -30,19 +30,19 @@ grib_hash_array_value* grib_integer_hash_array_value_new(grib_context* c, const // return v; // } -void grib_hash_array_value_delete(grib_context* c, grib_hash_array_value* v) -{ - switch (v->type) { - case GRIB_HASH_ARRAY_TYPE_INTEGER: - grib_iarray_delete(v->iarray); - break; - case GRIB_HASH_ARRAY_TYPE_DOUBLE: - grib_darray_delete(c, v->darray); - break; - default: - grib_context_log(c, GRIB_LOG_ERROR, - "wrong type in grib_hash_array_value_delete"); - } - grib_context_free_persistent(c, v->name); - grib_context_free_persistent(c, v); -} +// void grib_hash_array_value_delete(grib_context* c, grib_hash_array_value* v) +// { +// switch (v->type) { +// case GRIB_HASH_ARRAY_TYPE_INTEGER: +// grib_iarray_delete(v->iarray); +// break; +// case GRIB_HASH_ARRAY_TYPE_DOUBLE: +// grib_darray_delete(c, v->darray); +// break; +// default: +// grib_context_log(c, GRIB_LOG_ERROR, +// "wrong type in grib_hash_array_value_delete"); +// } +// grib_context_free_persistent(c, v->name); +// grib_context_free_persistent(c, v); +// } From be75fa1a7806313c95e10e7a6989c584cf2db823 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 23 Feb 2024 15:58:16 +0000 Subject: [PATCH 075/244] Expressions: Dead code removal --- src/expression.class | 30 +++++++-------------- src/grib_api_internal.h | 1 - src/grib_expression_class_accessor.cc | 27 ++++++------------- src/grib_expression_class_binop.cc | 23 +++++----------- src/grib_expression_class_double.cc | 23 +++++----------- src/grib_expression_class_functor.cc | 21 ++++----------- src/grib_expression_class_is_in_dict.cc | 25 +++++------------ src/grib_expression_class_is_in_list.cc | 27 ++++++------------- src/grib_expression_class_is_integer.cc | 27 ++++++------------- src/grib_expression_class_length.cc | 27 ++++++------------- src/grib_expression_class_logical_and.cc | 24 +++++------------ src/grib_expression_class_logical_or.cc | 24 +++++------------ src/grib_expression_class_long.cc | 23 +++++----------- src/grib_expression_class_string.cc | 21 ++++----------- src/grib_expression_class_string_compare.cc | 23 +++++----------- src/grib_expression_class_sub_string.cc | 21 ++++----------- src/grib_expression_class_true.cc | 23 +++++----------- src/grib_expression_class_unop.cc | 23 +++++----------- 18 files changed, 111 insertions(+), 302 deletions(-) diff --git a/src/expression.class b/src/expression.class index 9c11d39db..64c9a2e70 100644 --- a/src/expression.class +++ b/src/expression.class @@ -1,20 +1,14 @@ typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void init(grib_expression* e); -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); -static string get_name(grib_expression* e); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void init(grib_expression* e); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static string get_name(grib_expression* e); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_NAME{ grib_expression base; @@ -28,7 +22,6 @@ static grib_expression_class _grib_expression_class_NAME = { "NAME", /* name */ sizeof(grib_expression_NAME),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ &init, /* constructor */ &destroy, /* destructor */ &print, @@ -44,8 +37,3 @@ grib_expression_class* grib_expression_class_NAME = &_grib_expression_class_NAME ADD_TO_FILE grib_expression_class.h extern grib_expression_class* grib_expression_class_NAME; ADD_TO_FILE grib_expression_factory.h { "NAME", &grib_expression_class_NAME, }, - -static void init_class(grib_expression_class* c) -{ -INIT -} diff --git a/src/grib_api_internal.h b/src/grib_api_internal.h index 7f0398065..e54b76615 100644 --- a/src/grib_api_internal.h +++ b/src/grib_api_internal.h @@ -1086,7 +1086,6 @@ struct grib_expression_class size_t size; int inited; - expression_class_init_proc init_class; expression_init_proc init; expression_destroy_proc destroy; diff --git a/src/grib_expression_class_accessor.cc b/src/grib_expression_class_accessor.cc index 67ffbea9a..39fe4f109 100644 --- a/src/grib_expression_class_accessor.cc +++ b/src/grib_expression_class_accessor.cc @@ -41,20 +41,14 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); -static string get_name(grib_expression* e); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static string get_name(grib_expression* e); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_accessor{ grib_expression base; @@ -70,7 +64,6 @@ static grib_expression_class _grib_expression_class_accessor = { "accessor", /* name */ sizeof(grib_expression_accessor),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -84,10 +77,6 @@ static grib_expression_class _grib_expression_class_accessor = { grib_expression_class* grib_expression_class_accessor = &_grib_expression_class_accessor; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static const char* get_name(grib_expression* g) diff --git a/src/grib_expression_class_binop.cc b/src/grib_expression_class_binop.cc index e95bebbd3..328bb2ac4 100644 --- a/src/grib_expression_class_binop.cc +++ b/src/grib_expression_class_binop.cc @@ -41,18 +41,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_binop{ grib_expression base; @@ -70,7 +64,6 @@ static grib_expression_class _grib_expression_class_binop = { "binop", /* name */ sizeof(grib_expression_binop),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -84,10 +77,6 @@ static grib_expression_class _grib_expression_class_binop = { grib_expression_class* grib_expression_class_binop = &_grib_expression_class_binop; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) diff --git a/src/grib_expression_class_double.cc b/src/grib_expression_class_double.cc index 0c0f87a16..89747194b 100644 --- a/src/grib_expression_class_double.cc +++ b/src/grib_expression_class_double.cc @@ -37,18 +37,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_double{ grib_expression base; @@ -62,7 +56,6 @@ static grib_expression_class _grib_expression_class_double = { "double", /* name */ sizeof(grib_expression_double),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -76,10 +69,6 @@ static grib_expression_class _grib_expression_class_double = { grib_expression_class* grib_expression_class_double = &_grib_expression_class_double; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) diff --git a/src/grib_expression_class_functor.cc b/src/grib_expression_class_functor.cc index 16153620d..4664def10 100644 --- a/src/grib_expression_class_functor.cc +++ b/src/grib_expression_class_functor.cc @@ -37,17 +37,11 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); typedef struct grib_expression_functor{ grib_expression base; @@ -62,7 +56,6 @@ static grib_expression_class _grib_expression_class_functor = { "functor", /* name */ sizeof(grib_expression_functor),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -76,10 +69,6 @@ static grib_expression_class _grib_expression_class_functor = { grib_expression_class* grib_expression_class_functor = &_grib_expression_class_functor; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) diff --git a/src/grib_expression_class_is_in_dict.cc b/src/grib_expression_class_is_in_dict.cc index 27856cc2d..142287cdc 100644 --- a/src/grib_expression_class_is_in_dict.cc +++ b/src/grib_expression_class_is_in_dict.cc @@ -39,19 +39,13 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); -static string get_name(grib_expression* e); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static string get_name(grib_expression* e); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_is_in_dict{ grib_expression base; @@ -66,7 +60,6 @@ static grib_expression_class _grib_expression_class_is_in_dict = { "is_in_dict", /* name */ sizeof(grib_expression_is_in_dict),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ 0, /* destructor */ &print, @@ -80,10 +73,6 @@ static grib_expression_class _grib_expression_class_is_in_dict = { grib_expression_class* grib_expression_class_is_in_dict = &_grib_expression_class_is_in_dict; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ diff --git a/src/grib_expression_class_is_in_list.cc b/src/grib_expression_class_is_in_list.cc index 46310bcd3..f5339c309 100644 --- a/src/grib_expression_class_is_in_list.cc +++ b/src/grib_expression_class_is_in_list.cc @@ -40,20 +40,14 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); -static string get_name(grib_expression* e); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static string get_name(grib_expression* e); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_is_in_list{ grib_expression base; @@ -68,7 +62,6 @@ static grib_expression_class _grib_expression_class_is_in_list = { "is_in_list", /* name */ sizeof(grib_expression_is_in_list),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -82,10 +75,6 @@ static grib_expression_class _grib_expression_class_is_in_list = { grib_expression_class* grib_expression_class_is_in_list = &_grib_expression_class_is_in_list; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ diff --git a/src/grib_expression_class_is_integer.cc b/src/grib_expression_class_is_integer.cc index 460170e6e..e79f6c32c 100644 --- a/src/grib_expression_class_is_integer.cc +++ b/src/grib_expression_class_is_integer.cc @@ -41,20 +41,14 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); -static string get_name(grib_expression* e); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static string get_name(grib_expression* e); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_is_integer{ grib_expression base; @@ -70,7 +64,6 @@ static grib_expression_class _grib_expression_class_is_integer = { "is_integer", /* name */ sizeof(grib_expression_is_integer),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -84,10 +77,6 @@ static grib_expression_class _grib_expression_class_is_integer = { grib_expression_class* grib_expression_class_is_integer = &_grib_expression_class_is_integer; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static const char* get_name(grib_expression* g) diff --git a/src/grib_expression_class_length.cc b/src/grib_expression_class_length.cc index 23ac0f591..c9e967c77 100644 --- a/src/grib_expression_class_length.cc +++ b/src/grib_expression_class_length.cc @@ -41,20 +41,14 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); -static string get_name(grib_expression* e); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static string get_name(grib_expression* e); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_length{ grib_expression base; @@ -70,7 +64,6 @@ static grib_expression_class _grib_expression_class_length = { "length", /* name */ sizeof(grib_expression_length),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -84,10 +77,6 @@ static grib_expression_class _grib_expression_class_length = { grib_expression_class* grib_expression_class_length = &_grib_expression_class_length; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static const char* get_name(grib_expression* g) diff --git a/src/grib_expression_class_logical_and.cc b/src/grib_expression_class_logical_and.cc index 5cf98db69..9a25e54c1 100644 --- a/src/grib_expression_class_logical_and.cc +++ b/src/grib_expression_class_logical_and.cc @@ -15,7 +15,6 @@ START_CLASS_DEF CLASS = expression - IMPLEMENTS = init_class IMPLEMENTS = destroy IMPLEMENTS = native_type IMPLEMENTS = evaluate_long @@ -39,18 +38,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_logical_and{ grib_expression base; @@ -65,7 +58,6 @@ static grib_expression_class _grib_expression_class_logical_and = { "logical_and", /* name */ sizeof(grib_expression_logical_and),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -79,10 +71,6 @@ static grib_expression_class _grib_expression_class_logical_and = { grib_expression_class* grib_expression_class_logical_and = &_grib_expression_class_logical_and; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) diff --git a/src/grib_expression_class_logical_or.cc b/src/grib_expression_class_logical_or.cc index 75c2a6520..212ff3084 100644 --- a/src/grib_expression_class_logical_or.cc +++ b/src/grib_expression_class_logical_or.cc @@ -15,7 +15,6 @@ START_CLASS_DEF CLASS = expression - IMPLEMENTS = init_class IMPLEMENTS = destroy IMPLEMENTS = native_type IMPLEMENTS = evaluate_long @@ -39,18 +38,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_logical_or{ grib_expression base; @@ -65,7 +58,6 @@ static grib_expression_class _grib_expression_class_logical_or = { "logical_or", /* name */ sizeof(grib_expression_logical_or),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -79,10 +71,6 @@ static grib_expression_class _grib_expression_class_logical_or = { grib_expression_class* grib_expression_class_logical_or = &_grib_expression_class_logical_or; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) diff --git a/src/grib_expression_class_long.cc b/src/grib_expression_class_long.cc index e2c43b9ce..3b61a83d1 100644 --- a/src/grib_expression_class_long.cc +++ b/src/grib_expression_class_long.cc @@ -37,18 +37,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_long{ grib_expression base; @@ -62,7 +56,6 @@ static grib_expression_class _grib_expression_class_long = { "long", /* name */ sizeof(grib_expression_long),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -76,10 +69,6 @@ static grib_expression_class _grib_expression_class_long = { grib_expression_class* grib_expression_class_long = &_grib_expression_class_long; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) diff --git a/src/grib_expression_class_string.cc b/src/grib_expression_class_string.cc index 962afeaf8..79d42e247 100644 --- a/src/grib_expression_class_string.cc +++ b/src/grib_expression_class_string.cc @@ -36,17 +36,11 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_string{ grib_expression base; @@ -60,7 +54,6 @@ static grib_expression_class _grib_expression_class_string = { "string", /* name */ sizeof(grib_expression_string),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -74,10 +67,6 @@ static grib_expression_class _grib_expression_class_string = { grib_expression_class* grib_expression_class_string = &_grib_expression_class_string; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static const char* evaluate_string(grib_expression* g, grib_handle* h, char* buf, size_t* size, int* err) diff --git a/src/grib_expression_class_string_compare.cc b/src/grib_expression_class_string_compare.cc index 1c6202b23..421669aca 100644 --- a/src/grib_expression_class_string_compare.cc +++ b/src/grib_expression_class_string_compare.cc @@ -38,18 +38,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_string_compare{ grib_expression base; @@ -64,7 +58,6 @@ static grib_expression_class _grib_expression_class_string_compare = { "string_compare", /* name */ sizeof(grib_expression_string_compare),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -78,10 +71,6 @@ static grib_expression_class _grib_expression_class_string_compare = { grib_expression_class* grib_expression_class_string_compare = &_grib_expression_class_string_compare; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ /* Note: A fast cut-down version of strcmp which does NOT return -1 */ diff --git a/src/grib_expression_class_sub_string.cc b/src/grib_expression_class_sub_string.cc index 988a5d0ba..a5a0da732 100644 --- a/src/grib_expression_class_sub_string.cc +++ b/src/grib_expression_class_sub_string.cc @@ -36,17 +36,11 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static string evaluate_string(grib_expression*,grib_handle*,char*,size_t*,int*); typedef struct grib_expression_sub_string{ grib_expression base; @@ -60,7 +54,6 @@ static grib_expression_class _grib_expression_class_sub_string = { "sub_string", /* name */ sizeof(grib_expression_sub_string),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -74,10 +67,6 @@ static grib_expression_class _grib_expression_class_sub_string = { grib_expression_class* grib_expression_class_sub_string = &_grib_expression_class_sub_string; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static const char* evaluate_string(grib_expression* g, grib_handle* h, char* buf, size_t* size, int* err) diff --git a/src/grib_expression_class_true.cc b/src/grib_expression_class_true.cc index a57ce9c60..6b418cb2c 100644 --- a/src/grib_expression_class_true.cc +++ b/src/grib_expression_class_true.cc @@ -36,18 +36,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_true{ grib_expression base; @@ -60,7 +54,6 @@ static grib_expression_class _grib_expression_class_true = { "true", /* name */ sizeof(grib_expression_true),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -74,10 +67,6 @@ static grib_expression_class _grib_expression_class_true = { grib_expression_class* grib_expression_class_true = &_grib_expression_class_true; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) diff --git a/src/grib_expression_class_unop.cc b/src/grib_expression_class_unop.cc index 2abd4dbc9..1f4d6f9d0 100644 --- a/src/grib_expression_class_unop.cc +++ b/src/grib_expression_class_unop.cc @@ -39,18 +39,12 @@ or edit "expression.class" and rerun ./make_class.pl typedef const char* string; /* to keep make_class.pl happy */ - -static void init_class (grib_expression_class*); - -static void destroy(grib_context*,grib_expression* e); - -static void print(grib_context*,grib_expression*,grib_handle*); -static void add_dependency(grib_expression* e, grib_accessor* observer); - -static int native_type(grib_expression*,grib_handle*); - -static int evaluate_long(grib_expression*,grib_handle*,long*); -static int evaluate_double(grib_expression*,grib_handle*,double*); +static void destroy(grib_context*,grib_expression* e); +static void print(grib_context*,grib_expression*,grib_handle*); +static void add_dependency(grib_expression* e, grib_accessor* observer); +static int native_type(grib_expression*,grib_handle*); +static int evaluate_long(grib_expression*,grib_handle*,long*); +static int evaluate_double(grib_expression*,grib_handle*,double*); typedef struct grib_expression_unop{ grib_expression base; @@ -66,7 +60,6 @@ static grib_expression_class _grib_expression_class_unop = { "unop", /* name */ sizeof(grib_expression_unop),/* size of instance */ 0, /* inited */ - &init_class, /* init_class */ 0, /* constructor */ &destroy, /* destructor */ &print, @@ -80,10 +73,6 @@ static grib_expression_class _grib_expression_class_unop = { grib_expression_class* grib_expression_class_unop = &_grib_expression_class_unop; - -static void init_class(grib_expression_class* c) -{ -} /* END_CLASS_IMP */ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) From fad6fa43065c241e4b069df16628f058e54bb8d2 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 24 Feb 2024 18:24:16 +0000 Subject: [PATCH 076/244] Testing: Coverage --- examples/C/grib_multi.c | 6 +++--- tests/grib_util_set_spec2.cc | 2 +- tests/unit_tests.cc | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/examples/C/grib_multi.c b/examples/C/grib_multi.c index 24479075d..617c30a71 100644 --- a/examples/C/grib_multi.c +++ b/examples/C/grib_multi.c @@ -30,12 +30,12 @@ int main(int argc, char** argv) codes_handle* h = NULL; int mcount = 0; + /* turn off support for GRIB2 multi-field messages */ + codes_grib_multi_support_off(NULL); + /* turn on support for GRIB2 multi-field messages */ codes_grib_multi_support_on(NULL); - /* turn off support for GRIB2 multi-field messages */ - /* codes_multi_support_off(NULL); */ - in = fopen(filename, "rb"); if (!in) { fprintf(stderr, "Error: unable to open file %s\n", filename); diff --git a/tests/grib_util_set_spec2.cc b/tests/grib_util_set_spec2.cc index 11e86a915..5a0b69264 100644 --- a/tests/grib_util_set_spec2.cc +++ b/tests/grib_util_set_spec2.cc @@ -37,7 +37,7 @@ static grib_handle* test0() // packing_spec.accuracy = GRIB_UTIL_ACCURACY_USE_PROVIDED_BITS_PER_VALUES; // packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; - grib_handle* finalh = grib_util_set_spec( + grib_handle* finalh = codes_grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); Assert(err == 0); diff --git a/tests/unit_tests.cc b/tests/unit_tests.cc index 539b03873..12e18bd97 100644 --- a/tests/unit_tests.cc +++ b/tests/unit_tests.cc @@ -41,12 +41,23 @@ static void check_float_representation(const double val, const double expected, compare_doubles(out, expected, tolerance); } +static void test_get_package_name() +{ + printf("Running %s ...\n", __func__); + + const char* pn = codes_get_package_name(); + Assert(pn != NULL); + Assert(strlen(pn) > 1); + printf("Package name = %s\n", pn); +} + static void test_get_git_sha1() { printf("Running %s ...\n", __func__); - const char* sha1 = grib_get_git_sha1(); + const char* sha1 = codes_get_git_sha1(); Assert(sha1 != NULL); + printf("Git SHA1 = %s\n", sha1); } static void test_get_build_date() @@ -650,7 +661,7 @@ void test_codes_get_product_name() void test_codes_get_type_name() { printf("Running %s ...\n", __func__); - Assert( STR_EQUAL("long", grib_get_type_name(GRIB_TYPE_LONG)) ); + Assert( STR_EQUAL("long", codes_get_type_name(GRIB_TYPE_LONG)) ); Assert( STR_EQUAL("string", grib_get_type_name(GRIB_TYPE_STRING)) ); Assert( STR_EQUAL("double", grib_get_type_name(GRIB_TYPE_DOUBLE)) ); Assert( STR_EQUAL("bytes", grib_get_type_name(GRIB_TYPE_BYTES)) ); @@ -728,6 +739,7 @@ int main(int argc, char** argv) test_parse_keyval_string(); test_get_git_sha1(); + test_get_package_name(); test_get_build_date(); test_gribex_mode(); test_gts_header_mode(); From 82bc4615ba7ff91d3571c411c81558f785e1b83c Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 24 Feb 2024 19:17:45 +0000 Subject: [PATCH 077/244] Testing: Expressions/functions --- src/eccodes_prototypes.h | 2 -- src/functions.cc | 24 +++++-------- src/grib_accessor_class_group.cc | 60 +++++++++++++------------------- tests/grib_filter.sh | 9 +++++ 4 files changed, 43 insertions(+), 52 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 1513b01df..993074e1d 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1379,8 +1379,6 @@ long grib_op_eq(long a, long b); long grib_op_ne(long a, long b); long grib_op_lt(long a, long b); long grib_op_gt(long a, long b); -long grib_op_and(long a, long b); -long grib_op_or(long a, long b); long grib_op_ge(long a, long b); long grib_op_le(long a, long b); long grib_op_bit(long a, long b); diff --git a/src/functions.cc b/src/functions.cc index 9680d07bd..6c6bba770 100644 --- a/src/functions.cc +++ b/src/functions.cc @@ -27,14 +27,14 @@ long grib_op_gt(long a, long b) { return a > b; } -long grib_op_and(long a, long b) -{ - return a && b; -} -long grib_op_or(long a, long b) -{ - return a || b; -} +// long grib_op_and(long a, long b) +// { +// return a && b; +// } +// long grib_op_or(long a, long b) +// { +// return a || b; +// } long grib_op_ge(long a, long b) { return a >= b; @@ -43,7 +43,6 @@ long grib_op_le(long a, long b) { return a <= b; } - long grib_op_bit(long a, long b) { return a & (1 << b); @@ -52,7 +51,6 @@ long grib_op_bitoff(long a, long b) { return !grib_op_bit(a, b); } - long grib_op_not(long a) { return !a; @@ -61,15 +59,14 @@ long grib_op_neg(long a) { return -a; } - double grib_op_neg_d(double a) { return -a; } +// Note: This is actually 'a' to the power 'b' long grib_op_pow(long a, long b) { - /* Note: This is actually 'a' to the power 'b' */ return codes_power(b, a); } @@ -93,7 +90,6 @@ long grib_op_modulo(long a, long b) { return a % b; } - double grib_op_mul_d(double a, double b) { return a * b; @@ -102,7 +98,6 @@ double grib_op_div_d(double a, double b) { return a / b; } - double grib_op_add_d(double a, double b) { return a + b; @@ -111,7 +106,6 @@ double grib_op_sub_d(double a, double b) { return a - b; } - double grib_op_eq_d(double a, double b) { return a == b; diff --git a/src/grib_accessor_class_group.cc b/src/grib_accessor_class_group.cc index a64362968..df2118bff 100644 --- a/src/grib_accessor_class_group.cc +++ b/src/grib_accessor_class_group.cc @@ -238,42 +238,32 @@ static int unpack_double(grib_accessor* a, double* v, size_t* len) static int compare(grib_accessor* a, grib_accessor* b) { - int retval = 0; - char* aval = 0; - char* bval = 0; - int err = 0; + grib_context_log(a->context, GRIB_LOG_ERROR, "%s:%s not implemented", __func__, a->name); + return GRIB_NOT_IMPLEMENTED; - size_t alen = 0; - size_t blen = 0; - long count = 0; - - err = grib_value_count(a, &count); - if (err) - return err; - alen = count; - - err = grib_value_count(b, &count); - if (err) - return err; - blen = count; - - if (alen != blen) - return GRIB_COUNT_MISMATCH; - - aval = (char*)grib_context_malloc(a->context, alen * sizeof(char)); - bval = (char*)grib_context_malloc(b->context, blen * sizeof(char)); - - grib_unpack_string(a, aval, &alen); - grib_unpack_string(b, bval, &blen); - - retval = GRIB_SUCCESS; - if (strcmp(aval, bval)) - retval = GRIB_STRING_VALUE_MISMATCH; - - grib_context_free(a->context, aval); - grib_context_free(b->context, bval); - - return retval; + // int retval = 0; + // char* aval = 0; + // char* bval = 0; + // int err = 0; + // size_t alen = 0; + // size_t blen = 0; + // long count = 0; + // err = grib_value_count(a, &count); + // if (err) return err; + // alen = count; + // err = grib_value_count(b, &count); + // if (err) return err; + // blen = count; + // if (alen != blen) return GRIB_COUNT_MISMATCH; + // aval = (char*)grib_context_malloc(a->context, alen * sizeof(char)); + // bval = (char*)grib_context_malloc(b->context, blen * sizeof(char)); + // grib_unpack_string(a, aval, &alen); + // grib_unpack_string(b, bval, &blen); + // retval = GRIB_SUCCESS; + // if (strcmp(aval, bval)) retval = GRIB_STRING_VALUE_MISMATCH; + // grib_context_free(a->context, aval); + // grib_context_free(b->context, bval); + // return retval; } static long next_offset(grib_accessor* a) diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh index c932cf026..c8c632f1c 100755 --- a/tests/grib_filter.sh +++ b/tests/grib_filter.sh @@ -491,6 +491,15 @@ echo 'set endStep = 12; write;' | ${tools_dir}/grib_filter -o $tempGrib - $input grib_check_key_equals $tempGrib step 12 grib_check_key_equals $tempGrib forecastTime 12 +# Functions: grib_op_ne_d +# ------------------------ +input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl +cat >$tempFilt < Date: Sat, 24 Feb 2024 20:15:57 +0000 Subject: [PATCH 078/244] Dead code removal --- src/action_class_remove.cc | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/action_class_remove.cc b/src/action_class_remove.cc index 26ab6760b..40f5079a7 100644 --- a/src/action_class_remove.cc +++ b/src/action_class_remove.cc @@ -111,17 +111,13 @@ static void remove_accessor(grib_accessor* a) a->next->previous = a->previous; grib_accessor_delete(s->h->context, a); - - return; } static int create_accessor(grib_section* p, grib_action* act, grib_loader* h) { grib_action_remove* a = (grib_action_remove*)act; - grib_accessor* ga = NULL; - - ga = grib_find_accessor(p->h, grib_arguments_get_name(p->h, a->args, 0)); + grib_accessor* ga = grib_find_accessor(p->h, grib_arguments_get_name(p->h, a->args, 0)); if (ga) { remove_accessor(ga); @@ -134,15 +130,15 @@ static int create_accessor(grib_section* p, grib_action* act, grib_loader* h) static void dump(grib_action* act, FILE* f, int lvl) { - grib_action_remove* a = (grib_action_remove*)act; - - int i = 0; - - for (i = 0; i < lvl; i++) - grib_context_print(act->context, f, " "); - - grib_context_print(act->context, f, "remove %s as %s in %s\n", grib_arguments_get_name(0, a->args, 0), act->name, grib_arguments_get_name(0, a->args, 1)); + grib_context_log(act->context, GRIB_LOG_ERROR, "%s: dump not implemented", act->name); + // grib_action_remove* a = (grib_action_remove*)act; + // int i = 0; + // for (i = 0; i < lvl; i++) + // grib_context_print(act->context, f, " "); + // grib_context_print(act->context, f, "remove %s as %s in %s\n", + // grib_arguments_get_name(0, a->args, 0), act->name, grib_arguments_get_name(0, a->args, 1)); } + static void destroy(grib_context* context, grib_action* act) { grib_action_remove* a = (grib_action_remove*)act; @@ -151,4 +147,3 @@ static void destroy(grib_context* context, grib_action* act) grib_context_free_persistent(context, act->name); grib_context_free_persistent(context, act->op); } - From f5c4761861d8719c8e7b82b947c1a79cec304572 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 24 Feb 2024 20:16:18 +0000 Subject: [PATCH 079/244] Testing: expandedOriginalCodes (smart_table) --- tests/bufr_ecc-517.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/bufr_ecc-517.cc b/tests/bufr_ecc-517.cc index e4dc5d563..37c538fde 100644 --- a/tests/bufr_ecc-517.cc +++ b/tests/bufr_ecc-517.cc @@ -120,8 +120,17 @@ int main(int argc, char** argv) } fclose(fout); + + // expandedOriginalCodes + long orig[100]; + size = 100; + CODES_CHECK(codes_get_long_array(h, "expandedOriginalCodes", orig, &size), 0); + printf("Size of expandedOriginalCodes = %zu\n", size); + codes_handle_delete(h); free(ivalues); + codes_context_delete(0); + return 0; } From 18edad5b52b919d0a3c9ae5351ce838c24241096 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 24 Feb 2024 21:57:46 +0000 Subject: [PATCH 080/244] Testing: smart_table unpack_string --- src/grib_accessor_class_smart_table.cc | 2 +- tests/bufr_filter_misc.sh | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/grib_accessor_class_smart_table.cc b/src/grib_accessor_class_smart_table.cc index dd6cfcd41..5417dec67 100644 --- a/src/grib_accessor_class_smart_table.cc +++ b/src/grib_accessor_class_smart_table.cc @@ -545,7 +545,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) if (*len < self->tableCodesSize) { grib_context_log(a->context, GRIB_LOG_ERROR, - "Wrong size (%lu) for %s it contains %lu values", *len, a->name, self->tableCodesSize); + "Wrong size (%zu) for %s, it contains %zu values", *len, a->name, self->tableCodesSize); *len = 0; return GRIB_ARRAY_TOO_SMALL; } diff --git a/tests/bufr_filter_misc.sh b/tests/bufr_filter_misc.sh index f1edf0368..f2021a3f5 100755 --- a/tests/bufr_filter_misc.sh +++ b/tests/bufr_filter_misc.sh @@ -1290,6 +1290,15 @@ cat > $fRules < $fLog +# smart table unpack_string +tempBufr=temp.$label.bufr +f="$ECCODES_SAMPLES_PATH/BUFR4.tmpl" +cat > $fRules < Date: Sat, 24 Feb 2024 22:07:55 +0000 Subject: [PATCH 081/244] Error messages --- src/grib_accessor_class_smart_table.cc | 56 +++++++++---------- src/grib_accessor_class_smart_table_column.cc | 22 ++++---- src/grib_oarray.cc | 8 +-- src/grib_sarray.cc | 6 +- 4 files changed, 44 insertions(+), 48 deletions(-) diff --git a/src/grib_accessor_class_smart_table.cc b/src/grib_accessor_class_smart_table.cc index 5417dec67..70f964c7d 100644 --- a/src/grib_accessor_class_smart_table.cc +++ b/src/grib_accessor_class_smart_table.cc @@ -165,9 +165,9 @@ static int grib_load_smart_table(grib_context* c, const char* filename, const ch static void init(grib_accessor* a, const long len, grib_arguments* params) { - int n = 0; + int n = 0; grib_accessor_smart_table* self = (grib_accessor_smart_table*)a; - grib_handle* hand = grib_handle_of_accessor(a); + grib_handle* hand = grib_handle_of_accessor(a); self->values = grib_arguments_get_name(hand, params, n++); self->tablename = grib_arguments_get_string(hand, params, n++); @@ -179,25 +179,25 @@ static void init(grib_accessor* a, const long len, grib_arguments* params) a->length = 0; a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; - self->dirty = 1; + self->dirty = 1; self->tableCodesSize = 0; - self->tableCodes = 0; + self->tableCodes = 0; } static grib_smart_table* load_table(grib_accessor* a) { grib_accessor_smart_table* self = (grib_accessor_smart_table*)a; - size_t size = 0; - grib_handle* h = ((grib_accessor*)self)->parent->h; - grib_context* c = h->context; - grib_smart_table* t = NULL; + size_t size = 0; + grib_handle* h = ((grib_accessor*)self)->parent->h; + grib_context* c = h->context; + grib_smart_table* t = NULL; grib_smart_table* next = NULL; - char* filename = 0; + char* filename = 0; char recomposed[1024] = {0,}; char localRecomposed[1024] = {0,}; - char* localFilename = 0; + char* localFilename = 0; char extraRecomposed[1024] = {0,}; - char* extraFilename = 0; + char* extraFilename = 0; char masterDir[1024] = {0,}; char localDir[1024] = {0,}; char extraDir[1024] = {0,}; @@ -258,8 +258,8 @@ static grib_smart_table* load_table(grib_accessor* a) */ size = (1ULL << self->widthOfCode); /* = 2^self->widthOfCode (as a 64 bit number) */ - t = (grib_smart_table*)grib_context_malloc_clear_persistent(c, sizeof(grib_smart_table)); - t->entries = (grib_smart_table_entry*)grib_context_malloc_clear_persistent(c, size * sizeof(grib_smart_table_entry)); + t = (grib_smart_table*)grib_context_malloc_clear_persistent(c, sizeof(grib_smart_table)); + t->entries = (grib_smart_table_entry*)grib_context_malloc_clear_persistent(c, size * sizeof(grib_smart_table_entry)); t->numberOfEntries = size; if (filename != 0) @@ -296,21 +296,21 @@ static int grib_load_smart_table(grib_context* c, const char* filename, Assert(t != NULL); if (t->filename[0] == NULL) { - t->filename[0] = grib_context_strdup_persistent(c, filename); + t->filename[0] = grib_context_strdup_persistent(c, filename); t->recomposed_name[0] = grib_context_strdup_persistent(c, recomposed_name); - t->next = c->smart_table; - t->numberOfEntries = size; + t->next = c->smart_table; + t->numberOfEntries = size; GRIB_MUTEX_INIT_ONCE(&once, &thread_init); GRIB_MUTEX_LOCK(&mutex); c->smart_table = t; GRIB_MUTEX_UNLOCK(&mutex); } else if (t->filename[1] == NULL) { - t->filename[1] = grib_context_strdup_persistent(c, filename); + t->filename[1] = grib_context_strdup_persistent(c, filename); t->recomposed_name[1] = grib_context_strdup_persistent(c, recomposed_name); } else { - t->filename[2] = grib_context_strdup_persistent(c, filename); + t->filename[2] = grib_context_strdup_persistent(c, filename); t->recomposed_name[2] = grib_context_strdup_persistent(c, recomposed_name); } @@ -405,7 +405,7 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int unpack_string(grib_accessor* a, char* buffer, size_t* len) { grib_accessor_smart_table* self = (grib_accessor_smart_table*)a; - grib_smart_table* table = NULL; + grib_smart_table* table = NULL; size_t size = 1; long value; @@ -435,7 +435,7 @@ static int unpack_string(grib_accessor* a, char* buffer, size_t* len) } strcpy(buffer, tmp); - *len = l; + *len = l; self->dirty = 0; return GRIB_SUCCESS; @@ -444,9 +444,9 @@ static int unpack_string(grib_accessor* a, char* buffer, size_t* len) static int get_table_codes(grib_accessor* a) { grib_accessor_smart_table* self = (grib_accessor_smart_table*)a; - size_t size = 0; - long* v = 0; - int err = 0; + size_t size = 0; + long* v = 0; + int err = 0; int count, j; size_t i; @@ -479,7 +479,7 @@ static int get_table_codes(grib_accessor* a) if (self->tableCodes) grib_context_free(a->context, self->tableCodes); self->tableCodes = (long*)grib_context_malloc_clear(a->context, count * sizeof(long)); - j = 0; + j = 0; for (i = 0; i < size; i++) { if (v[i] < table_size) self->tableCodes[j++] = v[i]; @@ -488,16 +488,16 @@ static int get_table_codes(grib_accessor* a) grib_context_free(a->context, v); self->tableCodesSize = count; - self->dirty = 0; + self->dirty = 0; return 0; } static int value_count(grib_accessor* a, long* count) { - int err = 0; + int err = 0; grib_accessor_smart_table* self = (grib_accessor_smart_table*)a; - *count = 0; + *count = 0; if (!self->values) return 0; @@ -532,7 +532,7 @@ static int get_native_type(grib_accessor* a) static int unpack_long(grib_accessor* a, long* val, size_t* len) { - int err = 0; + int err = 0; grib_accessor_smart_table* self = (grib_accessor_smart_table*)a; size_t i; diff --git a/src/grib_accessor_class_smart_table_column.cc b/src/grib_accessor_class_smart_table_column.cc index 28e5a4798..295f29281 100644 --- a/src/grib_accessor_class_smart_table_column.cc +++ b/src/grib_accessor_class_smart_table_column.cc @@ -130,11 +130,11 @@ typedef struct grib_accessor_smart_table static void init(grib_accessor* a, const long len, grib_arguments* params) { - int n = 0; + int n = 0; grib_accessor_smart_table_column* self = (grib_accessor_smart_table_column*)a; self->smartTable = grib_arguments_get_name(grib_handle_of_accessor(a), params, n++); - self->index = grib_arguments_get_long(grib_handle_of_accessor(a), params, n++); + self->index = grib_arguments_get_long(grib_handle_of_accessor(a), params, n++); a->length = 0; a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; @@ -158,18 +158,18 @@ static int unpack_string_array(grib_accessor* a, char** buffer, size_t* len) { grib_accessor_smart_table_column* self = (grib_accessor_smart_table_column*)a; grib_accessor_smart_table* tableAccessor = NULL; - grib_smart_table* table = NULL; + grib_smart_table* table = NULL; size_t size = 1; long* code; - int err = GRIB_SUCCESS; + int err = GRIB_SUCCESS; char tmp[1024] = {0,}; int i = 0; tableAccessor = (grib_accessor_smart_table*)grib_find_accessor(grib_handle_of_accessor(a), self->smartTable); if (!tableAccessor) { grib_context_log(a->context, GRIB_LOG_ERROR, - "unable to find accessor %s", self->smartTable); + "Unable to find accessor %s", self->smartTable); return GRIB_NOT_FOUND; } @@ -213,7 +213,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_smart_table_column* self = (grib_accessor_smart_table_column*)a; grib_accessor_smart_table* tableAccessor = NULL; - grib_smart_table* table = NULL; + grib_smart_table* table = NULL; size_t size = 1; long* code; @@ -226,7 +226,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) tableAccessor = (grib_accessor_smart_table*)grib_find_accessor(grib_handle_of_accessor(a), self->smartTable); if (!tableAccessor) { grib_context_log(a->context, GRIB_LOG_ERROR, - "unable to find accessor %s", self->smartTable); + "Unable to find accessor %s", self->smartTable); return GRIB_NOT_FOUND; } @@ -263,14 +263,14 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) static int value_count(grib_accessor* a, long* count) { grib_accessor_smart_table_column* self = (grib_accessor_smart_table_column*)a; - size_t size = 0; - int err = 0; - *count = 0; + size_t size = 0; + int err = 0; + *count = 0; if (!self->smartTable) return 0; - err = grib_get_size(grib_handle_of_accessor(a), self->smartTable, &size); + err = grib_get_size(grib_handle_of_accessor(a), self->smartTable, &size); *count = size; return err; } diff --git a/src/grib_oarray.cc b/src/grib_oarray.cc index 91e7d9f33..6c5e06d45 100644 --- a/src/grib_oarray.cc +++ b/src/grib_oarray.cc @@ -17,8 +17,6 @@ grib_oarray* grib_oarray_new(grib_context* c, size_t size, size_t incsize) c = grib_context_get_default(); v = (grib_oarray*)grib_context_malloc_clear(c, sizeof(grib_oarray)); if (!v) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_oarray_new unable to allocate %zu bytes", sizeof(grib_oarray)); return NULL; } v->size = size; @@ -27,8 +25,7 @@ grib_oarray* grib_oarray_new(grib_context* c, size_t size, size_t incsize) v->v = (void**)grib_context_malloc_clear(c, sizeof(char*) * size); v->context = c; if (!v->v) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_oarray_new unable to allocate %zu bytes", sizeof(char*) * size); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(char*) * size); return NULL; } return v; @@ -44,8 +41,7 @@ static grib_oarray* grib_oarray_resize(grib_oarray* v) v->v = (void**)grib_context_realloc(c, v->v, newsize * sizeof(char*)); v->size = newsize; if (!v->v) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_oarray_resize unable to allocate %zu bytes", sizeof(char*) * newsize); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(char*) * newsize); return NULL; } return v; diff --git a/src/grib_sarray.cc b/src/grib_sarray.cc index 93e372e94..2159af7b3 100644 --- a/src/grib_sarray.cc +++ b/src/grib_sarray.cc @@ -30,7 +30,7 @@ grib_sarray* grib_sarray_new(grib_context* c, size_t size, size_t incsize) v = (grib_sarray*)grib_context_malloc_clear(c, sizeof(grib_sarray)); if (!v) { grib_context_log(c, GRIB_LOG_ERROR, - "grib_sarray_new unable to allocate %lu bytes\n", sizeof(grib_sarray)); + "%s: Unable to allocate %zu bytes", __func__, sizeof(grib_sarray)); return NULL; } v->size = size; @@ -40,7 +40,7 @@ grib_sarray* grib_sarray_new(grib_context* c, size_t size, size_t incsize) v->v = (char**)grib_context_malloc_clear(c, sizeof(char*) * size); if (!v->v) { grib_context_log(c, GRIB_LOG_ERROR, - "grib_sarray_new unable to allocate %lu bytes\n", sizeof(char*) * size); + "%s: Unable to allocate %zu bytes", __func__, sizeof(char*) * size); return NULL; } return v; @@ -57,7 +57,7 @@ static grib_sarray* grib_sarray_resize(grib_sarray* v) v->size = newsize; if (!v->v) { grib_context_log(c, GRIB_LOG_ERROR, - "grib_sarray_resize unable to allocate %lu bytes\n", sizeof(char*) * newsize); + "%s: Unable to allocate %zu bytes", __func__, sizeof(char*) * newsize); return NULL; } return v; From f7869adb9c2f67334b715d00346bcfae2c7ffb34 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 24 Feb 2024 22:21:36 +0000 Subject: [PATCH 082/244] Error messages: Print context --- src/grib_accessor_class_bufr_elements_table.cc | 3 +-- src/grib_accessor_class_data_g22order_packing.cc | 2 +- src/grib_bufr_descriptors_array.cc | 8 +++----- src/grib_darray.cc | 8 +++----- src/grib_dumper_class_json.cc | 2 +- src/grib_iarray.cc | 9 +++------ src/grib_index.cc | 10 +++------- 7 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/grib_accessor_class_bufr_elements_table.cc b/src/grib_accessor_class_bufr_elements_table.cc index cee7049aa..4858ff63d 100644 --- a/src/grib_accessor_class_bufr_elements_table.cc +++ b/src/grib_accessor_class_bufr_elements_table.cc @@ -379,8 +379,7 @@ bufr_descriptor* accessor_bufr_elements_table_get_descriptor(grib_accessor* a, i DEBUG_ASSERT(c); v = (bufr_descriptor*)grib_context_malloc_clear(c, sizeof(bufr_descriptor)); if (!v) { - grib_context_log(c, GRIB_LOG_ERROR, - "accessor_bufr_elements_table_get_descriptor: unable to allocate %ld bytes\n", sizeof(bufr_descriptor)); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(bufr_descriptor)); *err = GRIB_OUT_OF_MEMORY; return NULL; } diff --git a/src/grib_accessor_class_data_g22order_packing.cc b/src/grib_accessor_class_data_g22order_packing.cc index f45d9f722..4ed535d29 100644 --- a/src/grib_accessor_class_data_g22order_packing.cc +++ b/src/grib_accessor_class_data_g22order_packing.cc @@ -1772,7 +1772,7 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len) unsigned char* sec7 = reinterpret_cast(grib_context_malloc(a->context, size_sec7)); if (sec7 == NULL) { - grib_context_log(a->context, GRIB_LOG_ERROR, "%s packing: unable to allocate %d bytes", cclass_name, size_sec7); + grib_context_log(a->context, GRIB_LOG_ERROR, "%s: Unable to allocate %d bytes", cclass_name, size_sec7); return GRIB_OUT_OF_MEMORY; } diff --git a/src/grib_bufr_descriptors_array.cc b/src/grib_bufr_descriptors_array.cc index 0134048a2..637cf14eb 100644 --- a/src/grib_bufr_descriptors_array.cc +++ b/src/grib_bufr_descriptors_array.cc @@ -22,8 +22,7 @@ bufr_descriptors_array* grib_bufr_descriptors_array_new(grib_context* c, size_t v = (bufr_descriptors_array*)grib_context_malloc(c, sizeof(bufr_descriptors_array)); if (!v) { - grib_context_log(c, GRIB_LOG_ERROR, - "bufr_descriptors_array_new unable to allocate %ld bytes\n", sizeof(bufr_descriptors_array)); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(bufr_descriptors_array)); return NULL; } v->context = c; @@ -34,7 +33,7 @@ bufr_descriptors_array* grib_bufr_descriptors_array_new(grib_context* c, size_t v->number_of_pop_front = 0; if (!v->v) { grib_context_log(c, GRIB_LOG_ERROR, - "grib_bufr_descriptors_array_new unable to allocate %ld bytes\n", sizeof(bufr_descriptor) * size); + "%s: Unable to allocate %zu bytes", __func__, sizeof(bufr_descriptor) * size); return NULL; } return v; @@ -73,8 +72,7 @@ static bufr_descriptors_array* grib_bufr_descriptors_array_resize_to(bufr_descri newv = (bufr_descriptor**)grib_context_malloc_clear(c, newsize * sizeof(bufr_descriptor*)); if (!newv) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_bufr_descriptors_array_resize unable to allocate %ld bytes\n", sizeof(bufr_descriptor*) * newsize); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(bufr_descriptor*) * newsize); return NULL; } diff --git a/src/grib_darray.cc b/src/grib_darray.cc index f2250862d..5aac8265a 100644 --- a/src/grib_darray.cc +++ b/src/grib_darray.cc @@ -45,8 +45,7 @@ grib_darray* grib_darray_new(grib_context* c, size_t size, size_t incsize) c = grib_context_get_default(); v = (grib_darray*)grib_context_malloc_clear(c, sizeof(grib_darray)); if (!v) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_darray_new unable to allocate %zu bytes", sizeof(grib_darray)); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(grib_darray)); return NULL; } v->size = size; @@ -55,8 +54,7 @@ grib_darray* grib_darray_new(grib_context* c, size_t size, size_t incsize) v->context = c; v->v = (double*)grib_context_malloc_clear(c, sizeof(double) * size); if (!v->v) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_darray_new unable to allocate %zu bytes", sizeof(double) * size); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(double) * size); return NULL; } return v; @@ -73,7 +71,7 @@ static grib_darray* grib_darray_resize(grib_darray* v) v->size = newsize; if (!v->v) { grib_context_log(c, GRIB_LOG_ERROR, - "grib_darray_resize unable to allocate %zu bytes", sizeof(double) * newsize); + "%s: Unable to allocate %zu bytes", __func__, sizeof(double) * newsize); return NULL; } return v; diff --git a/src/grib_dumper_class_json.cc b/src/grib_dumper_class_json.cc index be1b5bcc4..a3b052844 100644 --- a/src/grib_dumper_class_json.cc +++ b/src/grib_dumper_class_json.cc @@ -458,7 +458,7 @@ static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) * if (size==0) return; * value=(char*)grib_context_malloc_clear(a->context,size); * if (!value) { - * grib_context_log(a->context,GRIB_LOG_ERROR,"unable to allocate %d bytes",(int)size); + * grib_context_log(a->context,GRIB_LOG_ERROR,"Unable to allocate %zu bytes",size); * return; * } */ diff --git a/src/grib_iarray.cc b/src/grib_iarray.cc index 50d16bcaa..f69adfffd 100644 --- a/src/grib_iarray.cc +++ b/src/grib_iarray.cc @@ -46,8 +46,7 @@ grib_iarray* grib_iarray_new(grib_context* c, size_t size, size_t incsize) v = (grib_iarray*)grib_context_malloc(c, sizeof(grib_iarray)); if (!v) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_iarray_new unable to allocate %zu bytes", sizeof(grib_iarray)); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(grib_iarray)); return NULL; } v->context = c; @@ -57,8 +56,7 @@ grib_iarray* grib_iarray_new(grib_context* c, size_t size, size_t incsize) v->v = (long*)grib_context_malloc(c, sizeof(long) * size); v->number_of_pop_front = 0; if (!v->v) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_iarray_new unable to allocate %zu bytes", sizeof(long) * size); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(long) * size); return NULL; } return v; @@ -98,8 +96,7 @@ static grib_iarray* grib_iarray_resize_to(grib_iarray* v, size_t newsize) newv = (long*)grib_context_malloc_clear(c, newsize * sizeof(long)); if (!newv) { - grib_context_log(c, GRIB_LOG_ERROR, - "grib_iarray_resize unable to allocate %zu bytes", sizeof(long) * newsize); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to allocate %zu bytes", __func__, sizeof(long) * newsize); return NULL; } diff --git a/src/grib_index.cc b/src/grib_index.cc index 225e502eb..15e9de083 100644 --- a/src/grib_index.cc +++ b/src/grib_index.cc @@ -242,17 +242,13 @@ static grib_index_key* grib_index_new_key(grib_context* c, grib_index_key* keys, next = (grib_index_key*)grib_context_malloc_clear(c, sizeof(grib_index_key)); if (!next) { - grib_context_log(c, GRIB_LOG_ERROR, - "unable to allocate %ld bytes", - sizeof(grib_index_key)); + grib_context_log(c, GRIB_LOG_ERROR, "Unable to allocate %zu bytes", sizeof(grib_index_key)); *err = GRIB_OUT_OF_MEMORY; return NULL; } values = (grib_string_list*)grib_context_malloc_clear(c, sizeof(grib_string_list)); if (!values) { - grib_context_log(c, GRIB_LOG_ERROR, - "unable to allocate %ld bytes", - sizeof(grib_string_list)); + grib_context_log(c, GRIB_LOG_ERROR, "Unable to allocate %zu bytes", sizeof(grib_string_list)); *err = GRIB_OUT_OF_MEMORY; return NULL; } @@ -1908,7 +1904,7 @@ grib_handle* codes_new_from_index(grib_index* index, int message_type, int* err) sizeof(grib_field_list)); if (!index->fieldset) { grib_context_log(index->context, GRIB_LOG_ERROR, - "unable to allocate %lu bytes", sizeof(grib_field_list)); + "Unable to allocate %zu bytes", sizeof(grib_field_list)); return NULL; } index->current = index->fieldset; From 2a625a483c9b0ff5f7dc4ab3c997f93bf8a9d310 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 25 Feb 2024 15:47:30 +0000 Subject: [PATCH 083/244] Testing: Product names --- tests/unit_tests.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit_tests.cc b/tests/unit_tests.cc index 12e18bd97..110e8c4ee 100644 --- a/tests/unit_tests.cc +++ b/tests/unit_tests.cc @@ -656,6 +656,7 @@ void test_codes_get_product_name() Assert( STR_EQUAL("BUFR", codes_get_product_name(PRODUCT_BUFR)) ); Assert( STR_EQUAL("GTS", codes_get_product_name(PRODUCT_GTS)) ); Assert( STR_EQUAL("METAR", codes_get_product_name(PRODUCT_METAR)) ); + Assert( STR_EQUAL("TAF", codes_get_product_name(PRODUCT_TAF)) ); } void test_codes_get_type_name() From 0be6b6c5808feada102a458963086a8eb171ff8f Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 25 Feb 2024 15:47:41 +0000 Subject: [PATCH 084/244] Fix compare method --- src/grib_accessor_class_values.cc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/grib_accessor_class_values.cc b/src/grib_accessor_class_values.cc index 3e69cf56e..384282317 100644 --- a/src/grib_accessor_class_values.cc +++ b/src/grib_accessor_class_values.cc @@ -231,10 +231,8 @@ static int compare(grib_accessor* a, grib_accessor* b) grib_unpack_double(b, bval, &blen); retval = GRIB_SUCCESS; - while (alen != 0) { - if (*bval != *aval) - retval = GRIB_DOUBLE_VALUE_MISMATCH; - alen--; + for (size_t i=0; icontext, aval); @@ -245,15 +243,13 @@ static int compare(grib_accessor* a, grib_accessor* b) static int pack_long(grib_accessor* a, const long* val, size_t* len) { - int ret = 0; grib_accessor_values* self = (grib_accessor_values*)a; - int i; double* dval = (double*)grib_context_malloc(a->context, *len * sizeof(double)); - for (i = 0; i < *len; i++) + for (size_t i = 0; i < *len; i++) dval[i] = (double)val[i]; - ret = grib_pack_double(a, dval, len); + int ret = grib_pack_double(a, dval, len); grib_context_free(a->context, dval); From 8f31b291340eb154058d8d0528064a61577bbe55 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 25 Feb 2024 15:54:02 +0000 Subject: [PATCH 085/244] Accessors: Type safety --- src/grib_accessor_class_gen.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/grib_accessor_class_gen.cc b/src/grib_accessor_class_gen.cc index 8b59b3b7a..c74479aeb 100644 --- a/src/grib_accessor_class_gen.cc +++ b/src/grib_accessor_class_gen.cc @@ -455,16 +455,14 @@ static int pack_long(grib_accessor* a, const long* v, size_t* len) { grib_context* c = a->context; if (a->cclass->pack_double && a->cclass->pack_double != &pack_double) { - int i = 0, ret = 0; double* val = (double*)grib_context_malloc(c, *len * (sizeof(double))); if (!val) { - grib_context_log(c, GRIB_LOG_ERROR, - "Unable to allocate %zu bytes", *len * (sizeof(double))); + grib_context_log(c, GRIB_LOG_ERROR, "Unable to allocate %zu bytes", *len * (sizeof(double))); return GRIB_OUT_OF_MEMORY; } - for (i = 0; i < *len; i++) - val[i] = (long)v[i]; - ret = grib_pack_double(a, val, len); + for (size_t i = 0; i < *len; i++) + val[i] = v[i]; + int ret = grib_pack_double(a, val, len); grib_context_free(c, val); return ret; } From 1a1b44662684d1f8596efdebe4fd13483e56e6db Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 25 Feb 2024 15:56:00 +0000 Subject: [PATCH 086/244] Accessors: Type safety --- src/grib_accessor_class_gen.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/grib_accessor_class_gen.cc b/src/grib_accessor_class_gen.cc index c74479aeb..b611f5043 100644 --- a/src/grib_accessor_class_gen.cc +++ b/src/grib_accessor_class_gen.cc @@ -477,14 +477,13 @@ static int pack_double_array_as_long(grib_accessor* a, const double* v, size_t* { grib_context* c = a->context; int ret = GRIB_SUCCESS; - size_t i = 0; size_t numBytes = *len * (sizeof(long)); long* lValues = (long*)grib_context_malloc(c, numBytes); if (!lValues) { grib_context_log(c, GRIB_LOG_ERROR, "Unable to allocate %ld bytes", numBytes); return GRIB_OUT_OF_MEMORY; } - for (i = 0; i < *len; i++) + for (size_t i = 0; i < *len; i++) lValues[i] = (long)v[i]; /* convert from double to long */ ret = grib_pack_long(a, lValues, len); grib_context_free(c, lValues); From f8e580061753e1ad9f6f0a8b4bdb26736994b45a Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 25 Feb 2024 16:18:44 +0000 Subject: [PATCH 087/244] Testing: switch for doubles --- tests/grib_filter.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh index c8c632f1c..c4e6a4021 100755 --- a/tests/grib_filter.sh +++ b/tests/grib_filter.sh @@ -206,11 +206,15 @@ ${tools_dir}/grib_filter $tempFilt $ECCODES_SAMPLES_PATH/GRIB1.tmpl $ECCODES_SAM cat >$tempFilt < Date: Mon, 26 Feb 2024 13:21:23 +0000 Subject: [PATCH 088/244] Tools: Capitalisation --- tools/codes_info.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/codes_info.cc b/tools/codes_info.cc index a351ec34e..a73dcde14 100644 --- a/tools/codes_info.cc +++ b/tools/codes_info.cc @@ -136,8 +136,8 @@ int main(int argc, char* argv[]) "It is recommended you use ECCODES_SAMPLES_PATH instead!)\n"); } else { - printf("Default SAMPLES path is used: %s\n", context->grib_samples_path); - printf("SAMPLES path can be changed by setting the ECCODES_SAMPLES_PATH environment variable.\n"); + printf("Default samples path is used: %s\n", context->grib_samples_path); + printf("Samples path can be changed by setting the ECCODES_SAMPLES_PATH environment variable.\n"); } if ((path = getenv("ECCODES_EXTRA_SAMPLES_PATH")) != NULL) { printf("Environment variable ECCODES_EXTRA_SAMPLES_PATH=%s\n", path); From 41e82fbdcd61a8f9fccb85d4e28bdf21c5a103bc Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 26 Feb 2024 13:21:33 +0000 Subject: [PATCH 089/244] Compiler warnings --- src/grib_context.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/grib_context.cc b/src/grib_context.cc index 859f1087c..446481c4a 100644 --- a/src/grib_context.cc +++ b/src/grib_context.cc @@ -839,7 +839,6 @@ void grib_context_reset(grib_context* c) void grib_context_delete(grib_context* c) { - size_t i = 0; if (!c) c = grib_context_get_default(); @@ -851,7 +850,7 @@ void grib_context_delete(grib_context* c) if (c != &default_grib_context) grib_context_free_persistent(&default_grib_context, c); - for(i=0; ihash_array[i] = NULL; c->hash_array_count = 0; grib_itrie_delete(c->hash_array_index); From 91e4b96db502bd2e0b46ef3e5303cf05acb72fe6 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 26 Feb 2024 13:37:31 +0000 Subject: [PATCH 090/244] Testing: bufr_extract_headers --- tests/bufr_extract_headers.sh | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/tests/bufr_extract_headers.sh b/tests/bufr_extract_headers.sh index 6b6f0a907..a20602391 100755 --- a/tests/bufr_extract_headers.sh +++ b/tests/bufr_extract_headers.sh @@ -115,26 +115,16 @@ amsu_55.bufr amv2_87.bufr asbh_139.bufr asbl_139.bufr -asca_139.bufr -asch_139.bufr -ascs_139.bufr -aseh_139.bufr asel_139.bufr ashs_139.bufr atap_55.bufr ateu_155.bufr atms_201.bufr atov_55.bufr -avhm_87.bufr -avhn_87.bufr -avhr_58.bufr b003_56.bufr b005_89.bufr -cmwi_87.bufr cmwn_87.bufr cori_156.bufr -crit_202.bufr -csrh_189.bufr emsg_189.bufr euwv_87.bufr fy3a_154.bufr @@ -150,20 +140,14 @@ hirb_55.bufr hirs_55.bufr ias1_240.bufr iasi_241.bufr -ifco_208.bufr ikco_217.bufr imssnow.bufr itrg_208.bufr itwt_233.bufr -j2eo_216.bufr j2nb_216.bufr jaso_214.bufr kond_209.bufr maer_207.bufr -mloz_206.bufr -modi_87.bufr -modw_87.bufr -monw_87.bufr nomi_206.bufr nos1_208.bufr pgps_110.bufr @@ -172,8 +156,6 @@ s4kn_165.bufr sb19_206.bufr sbu8_206.bufr smin_49.bufr -smiu_49.bufr -smos_203.bufr sn4k_165.bufr ssbt_127.bufr tmr7_129.bufr From 13bbefaa496e1120e0989be4b655f29312c205ae Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 26 Feb 2024 16:32:30 +0000 Subject: [PATCH 091/244] Replace Asserts with helpful error messages --- src/grib_iterator.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/grib_iterator.cc b/src/grib_iterator.cc index 9f4fadd95..0d253bc68 100644 --- a/src/grib_iterator.cc +++ b/src/grib_iterator.cc @@ -9,7 +9,6 @@ */ /*************************************************************************** - * Enrico Fucile * * Jean Baptiste Filippi - 01.11.2005 * ***************************************************************************/ #include "grib_api_internal.h" @@ -71,7 +70,8 @@ int grib_iterator_next(grib_iterator* i, double* lat, double* lon, double* value return c->next(i, lat, lon, value); c = s; } - Assert(0); + + grib_context_log(i->h->context, GRIB_LOG_FATAL, "%s: No next() function in iterator '%s'", __func__, i->cclass->name); return 0; } @@ -84,7 +84,7 @@ int grib_iterator_has_next(grib_iterator* i) return c->has_next(i); c = s; } - Assert(0); + grib_context_log(i->h->context, GRIB_LOG_FATAL, "%s: No has_next() function in iterator '%s'", __func__, i->cclass->name); return 0; } @@ -97,7 +97,7 @@ int grib_iterator_previous(grib_iterator* i, double* lat, double* lon, double* v return c->previous(i, lat, lon, value); c = s; } - Assert(0); + grib_context_log(i->h->context, GRIB_LOG_FATAL, "%s: No previous() function in iterator '%s'", __func__, i->cclass->name); return 0; } @@ -110,7 +110,7 @@ int grib_iterator_reset(grib_iterator* i) return c->reset(i); c = s; } - Assert(0); + grib_context_log(i->h->context, GRIB_LOG_FATAL, "%s: No reset() function in iterator '%s'", __func__, i->cclass->name); return 0; } From 65e32808502f1baf75a4db94666906ebf9d65c92 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 27 Feb 2024 10:51:27 +0000 Subject: [PATCH 092/244] Update author list --- AUTHORS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index f21f35fcf..c0f36b955 100755 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,7 @@ -Enrico Fucile Shahram Najm Eugen Betke +Enrico Fucile +Pedro Maciel Sandor Kertesz Sebastien Villaume Florian Rathgeber From 151654a3392c16d8c7d3966143b0a656d88438c0 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 27 Feb 2024 10:52:09 +0000 Subject: [PATCH 093/244] ECC-1764: Fix crash --- src/eccodes_prototypes.h | 1 - src/grib_index.cc | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 993074e1d..e26aace4e 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -655,7 +655,6 @@ void grib_index_dump(FILE* fout, grib_index* index, unsigned long flags); char* grib_get_field_file(grib_index* index, off_t* offset); grib_handle* grib_handle_new_from_index(grib_index* index, int* err); grib_handle* codes_new_from_index(grib_index* index, int message_type, int* err); -void grib_index_rewind(grib_index* index); int codes_index_set_product_kind(grib_index* index, ProductKind product_kind); int codes_index_set_unpack_bufr(grib_index* index, int unpack); int is_index_file(const char* filename); diff --git a/src/grib_index.cc b/src/grib_index.cc index 15e9de083..5571f6e90 100644 --- a/src/grib_index.cc +++ b/src/grib_index.cc @@ -63,6 +63,7 @@ static int index_count; static long values_count = 0; static int codes_index_add_file_internal(grib_index* index, const char* filename, int message_type); +static void grib_index_rewind(grib_index* index); static char* get_key(char** keys, int* type) { @@ -1881,7 +1882,8 @@ grib_handle* codes_new_from_index(grib_index* index, int message_type, int* err) return NULL; c = index->context; if (!index->rewind) { - if (!index->current) { + // ECC-1764 + if (!index->current || !index->current->field) { *err = GRIB_END_OF_INDEX; return NULL; } @@ -1937,7 +1939,7 @@ grib_handle* codes_new_from_index(grib_index* index, int message_type, int* err) return h; } -void grib_index_rewind(grib_index* index) +static void grib_index_rewind(grib_index* index) { index->rewind = 1; } From 07382ee77fd9415db0b987da7625bf18941b9367 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 27 Feb 2024 11:54:09 +0000 Subject: [PATCH 094/244] HEALPix: Better error message re nested ordering --- src/grib_iterator_class_healpix.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index f2e9c0766..6d7aad5c4 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -195,7 +195,7 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) if (!STR_EQUAL(ordering, "ring")) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only ring ordering is supported", ITER); - return GRIB_WRONG_GRID; + return GRIB_GEOCALCULUS_PROBLEM; } if (grib_is_earth_oblate(h)) { From 4f446ffc61c904fa619b04baa37c0c870ca673f3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 27 Feb 2024 12:19:01 +0000 Subject: [PATCH 095/244] ECC-1764: Add test --- tests/CMakeLists.txt | 2 ++ tests/grib_ecc-1764.cc | 44 ++++++++++++++++++++++++++++++++++++++++++ tests/grib_ecc-1764.sh | 20 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 tests/grib_ecc-1764.cc create mode 100755 tests/grib_ecc-1764.sh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 21640b8bb..092d9ea83 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -45,6 +45,7 @@ list(APPEND test_c_bins grib_ecc-1467 grib_ecc-1431 grib_ecc-1433 + grib_ecc-1764 bufr_ecc-517 bufr_ecc-1288 bufr_get_element @@ -259,6 +260,7 @@ if( HAVE_BUILD_TOOLS ) grib_ecc-1397 grib_ecc-1425 grib_ecc-1467 + grib_ecc-1764 grib_sub_hourly grib_set_bytes grib_set_force diff --git a/tests/grib_ecc-1764.cc b/tests/grib_ecc-1764.cc new file mode 100644 index 000000000..a2d884a18 --- /dev/null +++ b/tests/grib_ecc-1764.cc @@ -0,0 +1,44 @@ +/* + * (C) Copyright 2005- ECMWF. + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + * + * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by + * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. + */ +#include "grib_api.h" +#undef NDEBUG +#include "assert.h" + +int main(int argc, char* argv[]) +{ + int ret = GRIB_SUCCESS; + + if (argc != 2) return 1; + + const char* infile = argv[1]; + grib_index* index = grib_index_new(0, "shortName,level", &ret); + assert(ret == GRIB_SUCCESS); + + ret = grib_index_add_file(index, infile); + assert(ret == GRIB_SUCCESS); + + printf("Select nonexistent entries...\n"); + grib_index_select_string(index, "shortName", "frost"); + grib_index_select_long(index, "level", 666); + + grib_handle* h = grib_handle_new_from_index(index, &ret); + assert(!h); + assert(ret == GRIB_END_OF_INDEX); + + // Call it again. Should not crash + h = grib_handle_new_from_index(index, &ret); + assert(!h); + assert(ret == GRIB_END_OF_INDEX); + + grib_index_delete(index); + grib_context_delete(grib_context_get_default()); + + return 0; +} diff --git a/tests/grib_ecc-1764.sh b/tests/grib_ecc-1764.sh new file mode 100755 index 000000000..81891ec74 --- /dev/null +++ b/tests/grib_ecc-1764.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +label="grib_ecc-1764_test" +temp=temp.$label.txt + +infile=${data_dir}/tigge_cf_ecmwf.grib2 +$EXEC ${test_dir}/grib_ecc-1764 $infile # > $temp + +# Clean up +rm -f $temp From db30325fbfa3125195db8c66b43e35c52f0eb0a7 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 27 Feb 2024 12:39:33 +0000 Subject: [PATCH 096/244] Cleanup --- src/action_class_list.cc | 5 ++--- src/grib_accessor_class_section_pointer.cc | 14 +++++++------- src/grib_index.cc | 16 ++++++++-------- src/grib_nearest_class_latlon_reduced.cc | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/action_class_list.cc b/src/action_class_list.cc index 0a4b8a630..c9693a554 100644 --- a/src/action_class_list.cc +++ b/src/action_class_list.cc @@ -10,7 +10,6 @@ /*************************************************************************** * Jean Baptiste Filippi - 01.11.2005 * - * Enrico Fucile * ***************************************************************************/ #include "grib_api_internal.h" /* @@ -107,7 +106,7 @@ static int create_accessor(grib_section* p, grib_action* act, grib_loader* h) long val = 0; if ((ret = grib_expression_evaluate_long(p->h, a->expression, &val)) != GRIB_SUCCESS) { - grib_context_log(p->h->context, GRIB_LOG_DEBUG, "List %s creating %d values unable to evaluate long", act->name, val); + grib_context_log(p->h->context, GRIB_LOG_DEBUG, "List %s creating %ld values: Unable to evaluate long", act->name, val); return ret; } @@ -166,7 +165,7 @@ static grib_action* reparse(grib_action* a, grib_accessor* acc, int* doit) if ((ret = grib_expression_evaluate_long(grib_handle_of_accessor(acc), self->expression, &val)) != GRIB_SUCCESS) { grib_context_log(acc->context, GRIB_LOG_ERROR, - "List %s creating %ld values, unable to evaluate long", acc->name, val); + "List %s creating %ld values: Unable to evaluate long", acc->name, val); } *doit = (val != acc->loop); diff --git a/src/grib_accessor_class_section_pointer.cc b/src/grib_accessor_class_section_pointer.cc index e9b81614a..861ab12e7 100644 --- a/src/grib_accessor_class_section_pointer.cc +++ b/src/grib_accessor_class_section_pointer.cc @@ -107,7 +107,7 @@ grib_accessor_class* grib_accessor_class_section_pointer = &_grib_accessor_class static void init(grib_accessor* a, const long len, grib_arguments* arg) { - int n = 0; + int n = 0; grib_accessor_section_pointer* self = (grib_accessor_section_pointer*)a; self->sectionOffset = grib_arguments_get_name(grib_handle_of_accessor(a), arg, n++); @@ -162,13 +162,13 @@ static int unpack_string(grib_accessor* a, char* v, size_t* len) static long byte_count(grib_accessor* a) { grib_accessor_section_pointer* self = (grib_accessor_section_pointer*)a; - long sectionLength = 0; - int ret = 0; + long sectionLength = 0; + int ret = 0; ret = grib_get_long(grib_handle_of_accessor(a), self->sectionLength, §ionLength); if (ret) { grib_context_log(a->context, GRIB_LOG_ERROR, - "unable to get %s %s", + "Unable to get %s %s", self->sectionLength, grib_get_error_message(ret)); return -1; } @@ -179,13 +179,13 @@ static long byte_count(grib_accessor* a) static long byte_offset(grib_accessor* a) { grib_accessor_section_pointer* self = (grib_accessor_section_pointer*)a; - long sectionOffset = 0; - int ret = 0; + long sectionOffset = 0; + int ret = 0; ret = grib_get_long(grib_handle_of_accessor(a), self->sectionOffset, §ionOffset); if (ret) { grib_context_log(a->context, GRIB_LOG_ERROR, - "unable to get %s %s", + "Unable to get %s %s", self->sectionOffset, grib_get_error_message(ret)); return -1; } diff --git a/src/grib_index.cc b/src/grib_index.cc index 5571f6e90..66718a58b 100644 --- a/src/grib_index.cc +++ b/src/grib_index.cc @@ -543,7 +543,7 @@ grib_index* grib_index_new(grib_context* c, const char* key, int* err) index = (grib_index*)grib_context_malloc_clear(c, sizeof(grib_index)); if (!index) { - grib_context_log(c, GRIB_LOG_ERROR, "unable to create index"); + grib_context_log(c, GRIB_LOG_ERROR, "Unable to create index"); *err = GRIB_OUT_OF_MEMORY; return NULL; } @@ -1033,7 +1033,7 @@ int grib_index_search_same(grib_index* index, grib_handle* h) } if (err && err != GRIB_NOT_FOUND) { grib_context_log(c, GRIB_LOG_ERROR, - "unable to create index. \"%s\": %s", + "Unable to create index. \"%s\": %s", keys->name, grib_get_error_message(err)); return err; } @@ -1138,7 +1138,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename if (!error && set_values_count != 0) { err = grib_set_values(h, set_values, set_values_count); if (err) { - grib_context_log(c, GRIB_LOG_ERROR,"codes_index_add_file: unable to set %s\n", envsetkeys); + grib_context_log(c, GRIB_LOG_ERROR,"codes_index_add_file: Unable to set %s\n", envsetkeys); return err; } } @@ -1148,7 +1148,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename if (index->product_kind == PRODUCT_BUFR && index->unpack_bufr) { err = grib_set_long(h, "unpack", 1); if (err) { - grib_context_log(c, GRIB_LOG_ERROR, "unable to unpack BUFR to create index. \"%s\": %s", + grib_context_log(c, GRIB_LOG_ERROR, "Unable to unpack BUFR to create index. \"%s\": %s", index_key->name, grib_get_error_message(err)); return err; } @@ -1186,7 +1186,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename return err; } if (err && err != GRIB_NOT_FOUND) { - grib_context_log(c, GRIB_LOG_ERROR, "unable to create index. key=\"%s\" (message #%lu): %s", + grib_context_log(c, GRIB_LOG_ERROR, "Unable to create index. key=\"%s\" (message #%lu): %s", index_key->name, message_count, grib_get_error_message(err)); return err; } @@ -1359,7 +1359,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename // return err; // } // if (err && err != GRIB_NOT_FOUND) { -// grib_context_log(c,GRIB_LOG_ERROR,"unable to create index. \"%s\": %s",index_key->name,grib_get_error_message(err)); +// grib_context_log(c,GRIB_LOG_ERROR,"Unable to create index. \"%s\": %s",index_key->name,grib_get_error_message(err)); // return err; // } @@ -1495,7 +1495,7 @@ int grib_index_get_long(const grib_index* index, const char* key, long* values, if (!k) return GRIB_NOT_FOUND; if (k->type != GRIB_TYPE_LONG) { - grib_context_log(index->context, GRIB_LOG_ERROR, "unable to get index %s as long", key); + grib_context_log(index->context, GRIB_LOG_ERROR, "Unable to get index %s as long", key); return GRIB_WRONG_TYPE; } if (k->values_count > *size) @@ -1524,7 +1524,7 @@ int grib_index_get_double(const grib_index* index, const char* key, double* valu if (!k) return GRIB_NOT_FOUND; if (k->type != GRIB_TYPE_DOUBLE) { - grib_context_log(index->context, GRIB_LOG_ERROR, "unable to get index %s as double", key); + grib_context_log(index->context, GRIB_LOG_ERROR, "Unable to get index %s as double", key); return GRIB_WRONG_TYPE; } if (k->values_count > *size) diff --git a/src/grib_nearest_class_latlon_reduced.cc b/src/grib_nearest_class_latlon_reduced.cc index e38978188..a5d2af222 100644 --- a/src/grib_nearest_class_latlon_reduced.cc +++ b/src/grib_nearest_class_latlon_reduced.cc @@ -210,7 +210,7 @@ static int find_global(grib_nearest* nearest, grib_handle* h, iter = grib_iterator_new(h, GRIB_GEOITERATOR_NO_VALUES, &ret); if (ret) { - grib_context_log(h->context, GRIB_LOG_ERROR, "unable to create iterator"); + grib_context_log(h->context, GRIB_LOG_ERROR, "Unable to create iterator"); return ret; } while (grib_iterator_next(iter, &lat, &lon, NULL)) { From d1e008361604dd995ddfb5a9c7cfd1b3ef9c9340 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 27 Feb 2024 14:20:42 +0000 Subject: [PATCH 097/244] ECC-1776: GRIB2: Additional activity and experiment table entries for DestinE ClimateDT --- definitions/grib2/destine_activity.table | 1 + definitions/grib2/destine_experiment.table | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/definitions/grib2/destine_activity.table b/definitions/grib2/destine_activity.table index 8217458fd..b7c3e8d86 100644 --- a/definitions/grib2/destine_activity.table +++ b/definitions/grib2/destine_activity.table @@ -2,4 +2,5 @@ 1 CMIP6 Coupled Model Intercomparison Project Phase 6 2 ScenarioMIP Scenario Model Intercomparison Project 3 HighResMIP High Resolution Model Intercomparison Project +4 story-nudging Climate storylines by nudging to reanalysis 65535 65535 Missing diff --git a/definitions/grib2/destine_experiment.table b/definitions/grib2/destine_experiment.table index d98a8dd70..864ef9260 100644 --- a/definitions/grib2/destine_experiment.table +++ b/definitions/grib2/destine_experiment.table @@ -7,4 +7,8 @@ 6 SSP2-4.5 Shared Socio-economic Pathways 2-4.5 7 SSP3-7.0 Shared Socio-economic Pathways 3-7.0 8 SSP5-8.5 Shared Socio-economic Pathways 5-8.5 +9 Tplus1.5K Warmer world at 1.5 degrees K above pre-industrial temperatures +10 Tplus2.0K Warmer world at 2.0 degrees K above pre-industrial temperatures +11 Tplus3.0K Warmer world at 3.0 degrees K above pre-industrial temperatures +12 Tplus4.0K Warmer world at 4.0 degrees K above pre-industrial temperatures 65535 65535 Missing From 8b3134cd20f1fc24213b71c29db6bd2000df3d2b Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 27 Feb 2024 17:09:20 +0000 Subject: [PATCH 098/244] ECC-1775: GRIB2: WMO conforming snowfall water equivalent parameters for DestinationEarth --- definitions/grib2/cfVarName.def | 16 ++++++++++++++++ definitions/grib2/name.def | 16 ++++++++++++++++ definitions/grib2/paramId.def | 16 ++++++++++++++++ definitions/grib2/shortName.def | 16 ++++++++++++++++ definitions/grib2/units.def | 16 ++++++++++++++++ 5 files changed, 80 insertions(+) diff --git a/definitions/grib2/cfVarName.def b/definitions/grib2/cfVarName.def index 889c839e3..ce2d3e54f 100644 --- a/definitions/grib2/cfVarName.def +++ b/definitions/grib2/cfVarName.def @@ -3786,6 +3786,22 @@ typeOfFirstFixedSurface = 187 ; typeOfSecondFixedSurface = 185 ; } +#Convective snowfall water equivalent +'csfwe' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 55 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Large-scale snowfall water equivalent +'lsfwe' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 56 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Burned area 'fba' = { discipline = 2 ; diff --git a/definitions/grib2/name.def b/definitions/grib2/name.def index b3b91952a..3ca2e8bd3 100644 --- a/definitions/grib2/name.def +++ b/definitions/grib2/name.def @@ -3786,6 +3786,22 @@ typeOfFirstFixedSurface = 187 ; typeOfSecondFixedSurface = 185 ; } +#Convective snowfall water equivalent +'Convective snowfall water equivalent' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 55 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Large-scale snowfall water equivalent +'Large-scale snowfall water equivalent' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 56 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Burned area 'Burned area' = { discipline = 2 ; diff --git a/definitions/grib2/paramId.def b/definitions/grib2/paramId.def index 4c79c56a5..f958d70d5 100644 --- a/definitions/grib2/paramId.def +++ b/definitions/grib2/paramId.def @@ -3786,6 +3786,22 @@ typeOfFirstFixedSurface = 187 ; typeOfSecondFixedSurface = 185 ; } +#Convective snowfall water equivalent +'231057' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 55 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Large-scale snowfall water equivalent +'231058' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 56 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Burned area '232000' = { discipline = 2 ; diff --git a/definitions/grib2/shortName.def b/definitions/grib2/shortName.def index 614a8454d..657b668ea 100644 --- a/definitions/grib2/shortName.def +++ b/definitions/grib2/shortName.def @@ -3786,6 +3786,22 @@ typeOfFirstFixedSurface = 187 ; typeOfSecondFixedSurface = 185 ; } +#Convective snowfall water equivalent +'csfwe' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 55 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Large-scale snowfall water equivalent +'lsfwe' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 56 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Burned area 'fba' = { discipline = 2 ; diff --git a/definitions/grib2/units.def b/definitions/grib2/units.def index d96d6bd9e..c63afd045 100644 --- a/definitions/grib2/units.def +++ b/definitions/grib2/units.def @@ -3786,6 +3786,22 @@ typeOfFirstFixedSurface = 187 ; typeOfSecondFixedSurface = 185 ; } +#Convective snowfall water equivalent +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 55 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Large-scale snowfall water equivalent +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 56 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Burned area '%' = { discipline = 2 ; From f27616d3820487f225fa1b6d68232135e842bdb3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 10:35:59 +0000 Subject: [PATCH 099/244] Time validation --- src/grib_accessor_class_time.cc | 36 ++++++++++++++++++++++++++++++++- tests/grib_util_set_spec2.sh | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/grib_accessor_class_time.cc b/src/grib_accessor_class_time.cc index a90f4415a..d38a53b7c 100644 --- a/src/grib_accessor_class_time.cc +++ b/src/grib_accessor_class_time.cc @@ -160,7 +160,37 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) return GRIB_SUCCESS; } -/* TODO: Check for a valid date */ +// In the 24-hour time notation, the day begins at midnight, 00:00 or 0:00, +// and the last minute of the day begins at 23:59. +// Where convenient, the notation 24:00 may also be used to refer to midnight +// at the end of a given date — that is, 24:00 of one day is the same time +// as 00:00 of the following day +#if 0 +static bool isValidTime(long number) +{ + // Check if the number is a four-digit integer + if (number < 0 || number > 9999) { + return false; + } + + // Extract hours and minutes + long hours = number / 100; // Get the first two digits as hours + long minutes = number % 100; // Get the last two digits as minutes + + // Check if hours are within the valid range (00-23) + if (hours < 0 || hours > 24) { + return false; + } + + // Check if minutes are within the valid range (00-59) + if (minutes < 0 || minutes > 59) { + return false; + } + + // All checks pass + return true; +} +#endif static int pack_long(grib_accessor* a, const long* val, size_t* len) { @@ -175,6 +205,10 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) if (*len != 1) return GRIB_WRONG_ARRAY_SIZE; + // if (!isValidTime(v)) { + // return GRIB_ENCODING_ERROR; + // } + hour = v / 100; minute = v % 100; second = 0; /* We ignore the 'seconds' in our time calculation! */ diff --git a/tests/grib_util_set_spec2.sh b/tests/grib_util_set_spec2.sh index 95fc00c01..fa289d291 100755 --- a/tests/grib_util_set_spec2.sh +++ b/tests/grib_util_set_spec2.sh @@ -10,4 +10,5 @@ . ./include.ctest.sh +export ECCODES_DEBUG=-1 $EXEC ${test_dir}/grib_util_set_spec2 From 50641af986f913d7b484e5a76c67ce8746a163e4 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 10:46:03 +0000 Subject: [PATCH 100/244] Testing: grib_util_set_spec --- tests/grib_util_set_spec2.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/grib_util_set_spec2.cc b/tests/grib_util_set_spec2.cc index 5a0b69264..b032fcc1c 100644 --- a/tests/grib_util_set_spec2.cc +++ b/tests/grib_util_set_spec2.cc @@ -84,6 +84,9 @@ static grib_handle* test2() packing_spec.extra_settings[0].name = "tablesVersion"; packing_spec.extra_settings[0].long_value = 32; + packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SECOND_ORDER; + packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); From 95da948d3c867e326a57f468f6f3f37b709ad263 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 11:29:00 +0000 Subject: [PATCH 101/244] ECC-1706: Definitions: Align WMO Common Code Table 11 with ecCodes c-11 table (Part 1) --- definitions/common/c-11.table | 54 ++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/definitions/common/c-11.table b/definitions/common/c-11.table index 6c52dbf48..778001045 100644 --- a/definitions/common/c-11.table +++ b/definitions/common/c-11.table @@ -2,19 +2,26 @@ 0 0 WMO Secretariat 1 ammc Melbourne (WMC) 2 2 Melbourne (WMC) +3 3 Melbourne (WMC) 4 rums Moscow (WMC) 5 5 Moscow (WMC) +6 6 Moscow (WMC) 7 kwbc US National Weather Service - NCEP (WMC) 8 8 US National Weather Service - NWSTG (WMC) 9 9 US National Weather Service - Other (WMC) 10 10 Cairo (RSMC/RAFC) +11 11 Cairo (RSMC/RAFC) 12 12 Dakar (RSMC/RAFC) +13 13 Dakar (RSMC/RAFC) 14 14 Nairobi (RSMC/RAFC) -16 16 Atananarivo (RSMC) +15 15 Nairobi (RSMC/RAFC) +16 16 Casablanca (RSMC) +17 17 Tunis (RSMC) 18 18 Tunis-Casablanca (RSMC) 20 20 Las Palmas (RAFC) 21 21 Algiers (RSMC) -22 22 Lagos (RSMC) +22 22 ACMAD +23 23 Mozambique (NMC) 24 fapr Pretoria (RSMC) 26 26 Khabarovsk (RSMC) 28 vabb New Delhi (IMD) @@ -23,27 +30,38 @@ 32 32 Tashkent (RSMC) 33 33 Jeddah (RSMC) 34 rjtd Japanese Meteorological Agency - Tokyo (RSMC) -36 36 Bankok -37 37 Ulan Bator +36 36 Bangkok +37 37 Ulaanbaatar 38 babj Beijing (RSMC) 40 rksl Seoul 41 sabm Buenos Aires (RSMC/RAFC) 43 43 Brasilia (RSMC/RAFC) 45 45 Santiago 46 sbsj Brasilian Space Agency - INPE +47 47 Colombia (NMC) +48 48 Ecuador (NMC) +49 49 Peru (NMC) +50 50 Venezuela (Bolivarian Republic of) (NMC) 51 51 Miami (RSMC/RAFC) 52 52 National Hurricane Center, Miami 53 53 Canadian Meteorological Service - Montreal (RSMC) 54 cwao Canadian Meteorological Service - Montreal (RSMC) 55 55 San Francisco +56 56 ARINC Centre 57 57 U.S. Air Force - Global Weather Center 58 fnmo US Navy - Fleet Numerical Oceanography Center 59 59 NOAA Forecast Systems Lab, Boulder CO 60 60 National Center for Atmospheric Research (NCAR), Boulder, CO +61 61 Service ARGOS - Landover +62 62 US Naval Oceanographic Office +63 63 International Research Institute for Climate and Society (IRI) 64 64 Honolulu 65 65 Darwin (RSMC) 67 67 Melbourne (RSMC) 69 nzkl Wellington (RSMC/RAFC) +71 71 Nadi (RSMC) +72 72 Singapore +73 73 Malaysia (NMC) 74 egrr U.K. Met Office - Exeter 76 76 Moscow (RSMC/RAFC) 78 edzw Offenbach (RSMC) @@ -65,9 +83,34 @@ 97 97 European Space Agency (ESA) 98 ecmf European Centre for Medium-Range Weather Forecasts 99 99 DeBilt, Netherlands +100 100 Brazzaville +101 101 Abidjan +102 102 Libya (NMC) +103 103 Madagascar (NMC) +104 104 Mauritius (NMC) +105 105 Niger (NMC) +106 106 Seychelles (NMC) +107 107 Uganda (NMC) +108 108 United Republic of Tanzania (NMC) +109 109 Zimbabwe (NMC) 110 110 Hong-Kong +145 145 French Guiana +146 146 Brazilian Navy Hydrographic Centre +147 147 National Commission on Space Activities (CONAE) - Argentina +148 148 Brazilian Department of Airspace Control - DECEA 160 160 US NOAA/NESDIS +161 161 US NOAA Office of Oceanic and Atmospheric Research 173 nasa US National Aeronautics and Space Administration (NASA) + +174 174 Integrated Science Data Management/Marine Environmental Data Service (ISDM/MEDS - Canada) +175 175 University Corporation for Atmospheric Research (UCAR) - United States +176 176 Cooperative Institute for Meteorological Satellite Studies (CIMSS) - United States +177 177 NOAA National Ocean Service - United States +178 178 Spire Global, Inc. +179 179 GeoOptics, Inc. +180 180 PlanetiQ +181 181 Atmospheric and Environmental Research (AER) + 195 wiix Indonesia (NMC) 204 niwa National Institute of Water and Atmospheric Research (NIWA - New Zealand) 210 210 Frascati (ESA/ESRIN) @@ -85,6 +128,8 @@ 222 222 Albania (NMC) 223 223 Armenia (NMC) 224 lowm Austria +225 225 Azerbaijan (NMC) +226 226 Belarus (NMC) 227 ebum Belgium (NMC) 228 228 Bosnia and Herzegovina (NMC) 229 229 Bulgaria (NMC) @@ -94,6 +139,7 @@ 233 eidb Dublin 234 234 Israel (NMC) 235 ingv INGV +238 238 Lithuania (NMC) 239 crfc CERFAX 240 240 Malta (NMC) 241 241 Monaco From d31f36f66b9b7301e46dac018fc995a73bbd9481 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 12:36:48 +0000 Subject: [PATCH 102/244] Testing: grib_util_set_spec edition conversion --- tests/grib_util_set_spec2.cc | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tests/grib_util_set_spec2.cc b/tests/grib_util_set_spec2.cc index b032fcc1c..ddd3f1dc5 100644 --- a/tests/grib_util_set_spec2.cc +++ b/tests/grib_util_set_spec2.cc @@ -14,12 +14,13 @@ static void dump_it(grib_handle* h) { int dump_flags = GRIB_DUMP_FLAG_CODED | GRIB_DUMP_FLAG_OCTET | GRIB_DUMP_FLAG_VALUES | GRIB_DUMP_FLAG_READ_ONLY; - grib_dump_content(h, stdout, "wmo", dump_flags, NULL); + grib_dump_content(h, stderr, "wmo", dump_flags, NULL); } // Lambert conformal static grib_handle* test0() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; @@ -47,6 +48,7 @@ static grib_handle* test0() // Lambert azimuthal static grib_handle* test1() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; @@ -68,6 +70,7 @@ static grib_handle* test1() // HEALPix static grib_handle* test2() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; @@ -75,17 +78,13 @@ static grib_handle* test2() int set_spec_flags = 0; size_t outlen = 4; - grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); + grib_handle* handle = grib_handle_new_from_samples(0, "GRIB1"); spec.grid_type = GRIB_UTIL_GRID_SPEC_HEALPIX; spec.N = 2; - packing_spec.extra_settings_count = 1; - packing_spec.extra_settings[0].type = GRIB_TYPE_LONG; - packing_spec.extra_settings[0].name = "tablesVersion"; - packing_spec.extra_settings[0].long_value = 32; - packing_spec.packing_type = GRIB_UTIL_PACKING_TYPE_GRID_SECOND_ORDER; packing_spec.packing = GRIB_UTIL_PACKING_USE_PROVIDED; + packing_spec.editionNumber = 2; grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, @@ -97,6 +96,7 @@ static grib_handle* test2() // Spherical harmonics static grib_handle* test3() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; @@ -124,6 +124,7 @@ static grib_handle* test3() // Polar stereo static grib_handle* test4() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; @@ -132,10 +133,15 @@ static grib_handle* test4() size_t outlen = 0; grib_handle* handle = grib_handle_new_from_samples(0, "GRIB2"); - grib_set_long(handle, "tablesVersion", 32); + //grib_set_long(handle, "tablesVersion", 32); spec.grid_type = GRIB_UTIL_GRID_SPEC_POLAR_STEREOGRAPHIC; outlen = 4; + packing_spec.extra_settings_count = 1; + packing_spec.extra_settings[0].type = GRIB_TYPE_LONG; + packing_spec.extra_settings[0].name = "tablesVersion"; + packing_spec.extra_settings[0].long_value = 32; + grib_handle* finalh = grib_util_set_spec( handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); @@ -146,6 +152,7 @@ static grib_handle* test4() // Regular Gaussian static grib_handle* test5() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; @@ -168,6 +175,7 @@ static grib_handle* test5() // Reduced LL static grib_handle* test6() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; @@ -190,6 +198,7 @@ static grib_handle* test6() // Unstructured static grib_handle* test7() { + fprintf(stderr, "Doing test %s\n-----------------\n", __func__); int err = 0; grib_util_grid_spec spec = {0,}; grib_util_packing_spec packing_spec = {0,}; From 29fb82739144fbc8b6e7b8f3c44a24167dc26cfd Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 13:30:59 +0000 Subject: [PATCH 103/244] Compiler warnings: format specifiers --- src/grib_accessor_class_md5.cc | 2 +- src/grib_accessor_class_optimal_step_units.cc | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/grib_accessor_class_md5.cc b/src/grib_accessor_class_md5.cc index dfb08a7fb..6a57c1329 100644 --- a/src/grib_accessor_class_md5.cc +++ b/src/grib_accessor_class_md5.cc @@ -183,7 +183,7 @@ static int unpack_string(grib_accessor* a, char* v, size_t* len) if (*len < 32) { const char* cclass_name = a->cclass->name; grib_context_log(a->context, GRIB_LOG_ERROR, - "%s: Buffer too small for %s. It is %zu bytes long (len=%zu)", + "%s: Buffer too small for %s. It is %d bytes long (len=%zu)", cclass_name, a->name, 32, *len); *len = 32; return GRIB_BUFFER_TOO_SMALL; diff --git a/src/grib_accessor_class_optimal_step_units.cc b/src/grib_accessor_class_optimal_step_units.cc index 9bcf338be..261ff4c80 100644 --- a/src/grib_accessor_class_optimal_step_units.cc +++ b/src/grib_accessor_class_optimal_step_units.cc @@ -192,7 +192,7 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) std::string msg = std::string{"Invalid unit: "} + std::to_string(*val) + " (" + e.what() + ")" + ". Available units are: " + supported_units_str; - grib_context_log(a->context, GRIB_LOG_ERROR, msg.c_str()); + grib_context_log(a->context, GRIB_LOG_ERROR, "%s", msg.c_str()); return GRIB_INVALID_ARGUMENT; } @@ -235,7 +235,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) } } catch (std::exception& e) { - grib_context_log(a->context, GRIB_LOG_ERROR, e.what()); + grib_context_log(a->context, GRIB_LOG_ERROR, "%s", e.what()); return GRIB_INTERNAL_ERROR; } @@ -256,7 +256,7 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) supported_units_str.pop_back(); std::string msg = "Invalid unit: " + std::string(val) + " (" + e.what() + ")" + ". Available units are: " + supported_units_str; - grib_context_log(a->context, GRIB_LOG_ERROR, msg.c_str()); + grib_context_log(a->context, GRIB_LOG_ERROR, "%s", msg.c_str()); return GRIB_INVALID_ARGUMENT; } From 1eb99c0bf8edfbf9112fdb657be19eb5cf676496 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 13:54:02 +0000 Subject: [PATCH 104/244] Testing: Julian dates --- tests/julian.cc | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/tests/julian.cc b/tests/julian.cc index 318429e79..b51157e63 100644 --- a/tests/julian.cc +++ b/tests/julian.cc @@ -14,18 +14,14 @@ #define EPSILON 1e-12 #define DBL_EQUAL(a, b) (fabs((a) - (b)) <= (EPSILON)*fabs((a))) -#define BOOL int -#define TRUE 1 -#define FALSE 0 - -static BOOL Check( +static bool Check( const long year1, const long month1, const long day1, const long hour1, const long min1, const long sec1, const long year2, const long month2, const long day2, const long hour2, const long min2, const long sec2) { if (year1 != year2 || month1 != month2 || day1 != day2 || hour1 != hour2 || min1 != min2 || sec1 != sec2) { - return FALSE; + return false; } - return TRUE; + return true; } static void TestDateTime(const long year, const long month, const long day, const long hour, const long min, const long sec) @@ -184,6 +180,7 @@ static void Test3() static void Test4() { const long iyear = 1582; + printf("Test4...\n"); TestDateTime(iyear, 9, 1, 1, 0, 0); TestDateTime(iyear, 9, 2, 1, 0, 0); @@ -215,6 +212,21 @@ static void Test4() */ } +static void Test5() +{ + printf("Test5...\n"); + double jd = 0.0; + long year=2017, month=2, day=29, hour=0, min=0, sec=0; // Feb 2017 had 28 days + long year1, month1, day1, hour1, min1, sec1; + + codes_datetime_to_julian(year, month, day, hour, min, sec, &jd); + codes_julian_to_datetime(jd, &year1, &month1, &day1, &hour1, &min1, &sec1); + + if (Check(year, month, day, hour, min, sec, year1, month1, day1, hour1, min1, sec1)) { + Assert(!"Bad input should have failed checks"); + } +} + int main(int argc, char* argv[]) { Test0(); @@ -222,6 +234,7 @@ int main(int argc, char* argv[]) Test2(); Test3(); Test4(); + Test5(); printf("All OK\n"); return 0; } From e68e56d2aad76775354dd9ef602e3ec27f809d2f Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 13:55:45 +0000 Subject: [PATCH 105/244] Testing: Julian dates --- tests/julian.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/julian.cc b/tests/julian.cc index b51157e63..559d9883a 100644 --- a/tests/julian.cc +++ b/tests/julian.cc @@ -215,6 +215,9 @@ static void Test4() static void Test5() { printf("Test5...\n"); + + // Also see function is_date_valid() + double jd = 0.0; long year=2017, month=2, day=29, hour=0, min=0, sec=0; // Feb 2017 had 28 days long year1, month1, day1, hour1, min1, sec1; From 8b4d1eb323ffa30cb305359931d861202951da98 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 14:47:50 +0000 Subject: [PATCH 106/244] Testing: Fix julian test --- data/julian.out.good | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/julian.out.good b/data/julian.out.good index c1321285c..c897c9476 100644 --- a/data/julian.out.good +++ b/data/julian.out.good @@ -62,4 +62,6 @@ Test2... - -47120001 -> 6 Test3... +Test4... +Test5... All OK From e2368676b3937a68f1a25be6d4a378089efcf4a2 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 15:36:21 +0000 Subject: [PATCH 107/244] ECC-1777: Validate dataDate and dataTime on input --- src/codes_util.cc | 32 +++++++++++++++ src/eccodes_prototypes.h | 1 + src/grib_accessor_class_g2date.cc | 17 +++++--- src/grib_accessor_class_time.cc | 65 ++++++++----------------------- tests/grib_set_fail.sh | 12 ++++++ 5 files changed, 73 insertions(+), 54 deletions(-) diff --git a/src/codes_util.cc b/src/codes_util.cc index 1b73432f8..3ff4ac353 100644 --- a/src/codes_util.cc +++ b/src/codes_util.cc @@ -213,6 +213,38 @@ int is_date_valid(long year, long month, long day, long hour, long minute, doubl return 1; } +// Return 1 if input date is valid. Otherwise 0 +// Note: In the 24-hour time notation, the day begins at midnight, 00:00 or 0:00, +// and the last minute of the day begins at 23:59. +// Where convenient, the notation 24:00 may also be used to refer to midnight +// at the end of a given date — that is, 24:00 of one day is the same time +// as 00:00 of the following day +int is_time_valid(long number) +{ + // number should be 4 digits i.e., HHMM + // Check if the number is a four-digit integer + if (number < 0 || number > 9999) { + return 0; + } + + // Extract hours and minutes + long hours = number / 100; // Get the first two digits as hours + long minutes = number % 100; // Get the last two digits as minutes + + // Check if hours are within the valid range (00-23) + if (hours < 0 || hours > 24) { + return 0; + } + + // Check if minutes are within the valid range (00-59) + if (minutes < 0 || minutes > 59) { + return 0; + } + + // All checks pass + return 1; +} + static float float_epsilon(void) { float floatEps = 1.0; diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index e26aace4e..db119f1ce 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1328,6 +1328,7 @@ char* codes_getenv(const char* name); int codes_check_grib_ieee_packing_value(int value); int codes_flush_sync_close_file(FILE* f); int is_date_valid(long year, long month, long day, long hour, long minute, double second); +int is_time_valid(long number); // number is HHMM int compute_scaled_value_and_scale_factor(double input, int64_t scaled_value_max, int64_t scale_factor_max, int64_t* ret_value, int64_t* ret_factor); /* grib_util.cc*/ diff --git a/src/grib_accessor_class_g2date.cc b/src/grib_accessor_class_g2date.cc index 4ed01d99e..c85e86b9e 100644 --- a/src/grib_accessor_class_g2date.cc +++ b/src/grib_accessor_class_g2date.cc @@ -123,9 +123,9 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int unpack_long(grib_accessor* a, long* val, size_t* len) { - int ret = 0; - grib_accessor_g2date* self = (grib_accessor_g2date*)a; + const grib_accessor_g2date* self = (grib_accessor_g2date*)a; + int ret = 0; long year = 0; long month = 0; long day = 0; @@ -145,13 +145,12 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) return GRIB_SUCCESS; } -/* TODO: Check for a valid date */ static int pack_long(grib_accessor* a, const long* val, size_t* len) { - int ret; - long v = val[0]; - grib_accessor_g2date* self = (grib_accessor_g2date*)a; + const grib_accessor_g2date* self = (grib_accessor_g2date*)a; + int ret = GRIB_SUCCESS; + long v = val[0]; long year = 0; long month = 0; long day = 0; @@ -165,6 +164,12 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) v %= 100; day = v; + if (!is_date_valid(year, month, day, 0, 0, 0)) { + // ECC-1777: For now just a warning. Will later change to an error + fprintf(stderr, "ECCODES WARNING : %s:%s: Date is not valid! year=%ld month=%ld day=%ld\n", + a->cclass->name, __func__, year, month, day); + } + if ((ret = grib_set_long_internal(grib_handle_of_accessor(a), self->day, day)) != GRIB_SUCCESS) return ret; if ((ret = grib_set_long_internal(grib_handle_of_accessor(a), self->month, month)) != GRIB_SUCCESS) diff --git a/src/grib_accessor_class_time.cc b/src/grib_accessor_class_time.cc index d38a53b7c..36aa290c9 100644 --- a/src/grib_accessor_class_time.cc +++ b/src/grib_accessor_class_time.cc @@ -126,12 +126,11 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int unpack_long(grib_accessor* a, long* val, size_t* len) { - int ret = 0; - grib_accessor_time* self = (grib_accessor_time*)a; - long hour = 0; - long minute = 0; - long second = 0; - grib_handle* hand = grib_handle_of_accessor(a); + const grib_accessor_time* self = (grib_accessor_time*)a; + + int ret = 0; + long hour = 0, minute = 0, second = 0; + grib_handle* hand = grib_handle_of_accessor(a); if ((ret = grib_get_long_internal(hand, self->hour, &hour)) != GRIB_SUCCESS) return ret; @@ -160,54 +159,24 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) return GRIB_SUCCESS; } -// In the 24-hour time notation, the day begins at midnight, 00:00 or 0:00, -// and the last minute of the day begins at 23:59. -// Where convenient, the notation 24:00 may also be used to refer to midnight -// at the end of a given date — that is, 24:00 of one day is the same time -// as 00:00 of the following day -#if 0 -static bool isValidTime(long number) -{ - // Check if the number is a four-digit integer - if (number < 0 || number > 9999) { - return false; - } - - // Extract hours and minutes - long hours = number / 100; // Get the first two digits as hours - long minutes = number % 100; // Get the last two digits as minutes - - // Check if hours are within the valid range (00-23) - if (hours < 0 || hours > 24) { - return false; - } - - // Check if minutes are within the valid range (00-59) - if (minutes < 0 || minutes > 59) { - return false; - } - - // All checks pass - return true; -} -#endif - static int pack_long(grib_accessor* a, const long* val, size_t* len) { - int ret = 0; - long v = val[0]; - grib_accessor_time* self = (grib_accessor_time*)a; - grib_handle* hand = grib_handle_of_accessor(a); - long hour = 0; - long minute = 0; - long second = 0; + const grib_accessor_time* self = (grib_accessor_time*)a; + + int ret = 0; + long v = val[0]; + grib_handle* hand = grib_handle_of_accessor(a); + long hour = 0, minute = 0, second = 0; if (*len != 1) return GRIB_WRONG_ARRAY_SIZE; - // if (!isValidTime(v)) { - // return GRIB_ENCODING_ERROR; - // } + if (!is_time_valid(v)) { + // ECC-1777: For now just a warning. Will later change to an error + fprintf(stderr, "ECCODES WARNING : %s:%s: Time is not valid! hour=%ld min=%ld sec=%ld\n", + a->cclass->name, __func__, hour, minute, second); + // return GRIB_ENCODING_ERROR; + } hour = v / 100; minute = v % 100; diff --git a/tests/grib_set_fail.sh b/tests/grib_set_fail.sh index 1d850141e..d4c2a0b4e 100755 --- a/tests/grib_set_fail.sh +++ b/tests/grib_set_fail.sh @@ -95,6 +95,18 @@ status=$? set -e [ $status -ne 0 ] +# Bad date +# --------- +input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl +${tools_dir}/grib_set -s dataDate=20180229 $input $outfile > $temp 2>&1 +cat $temp +grep -q "Date is not valid" $temp + +${tools_dir}/grib_set -s dataTime=4261 $input $outfile > $temp 2>&1 +cat $temp +grep -q "Time is not valid" $temp + + # ECC-1359: string that can be converted to an integer # --------------------------------------------------- ${tools_dir}/grib_set -s month:s=6 $ECCODES_SAMPLES_PATH/GRIB2.tmpl $outfile From b9dcf3fb63485b3dac50d8f24078b2c0677a6bec Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 16:03:46 +0000 Subject: [PATCH 108/244] ECC-1777: Validate dataDate and dataTime on input --- tests/grib_set_fail.sh | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tests/grib_set_fail.sh b/tests/grib_set_fail.sh index d4c2a0b4e..1a44b5a3b 100755 --- a/tests/grib_set_fail.sh +++ b/tests/grib_set_fail.sh @@ -95,17 +95,30 @@ status=$? set -e [ $status -ne 0 ] -# Bad date -# --------- +# ECC-1777: Bad date/time +# ------------------------- input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl ${tools_dir}/grib_set -s dataDate=20180229 $input $outfile > $temp 2>&1 -cat $temp grep -q "Date is not valid" $temp ${tools_dir}/grib_set -s dataTime=4261 $input $outfile > $temp 2>&1 -cat $temp grep -q "Time is not valid" $temp +${tools_dir}/grib_set -s dataTime=2501 $input $outfile > $temp 2>&1 +grep -q "Time is not valid" $temp + +# Note for GRIB1 we DO fail on a bad date! This need to be consistent across editions +input=$ECCODES_SAMPLES_PATH/GRIB1.tmpl +set +e +${tools_dir}/grib_set -s dataDate=20180229 $input $outfile > $temp 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "invalid date 20180229" $temp + +# 2016 did have 29th Feb +${tools_dir}/grib_set -s dataDate=20160229 $input $outfile + # ECC-1359: string that can be converted to an integer # --------------------------------------------------- From b2c381d6b8b37351fcc23f938f6ac55e0bc5bd2a Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 16:39:30 +0000 Subject: [PATCH 109/244] Cleanup --- src/codes_util.cc | 3 +-- src/grib_accessor_class_g1date.cc | 43 ++++++++++++------------------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/codes_util.cc b/src/codes_util.cc index 3ff4ac353..2d91fa598 100644 --- a/src/codes_util.cc +++ b/src/codes_util.cc @@ -221,8 +221,7 @@ int is_date_valid(long year, long month, long day, long hour, long minute, doubl // as 00:00 of the following day int is_time_valid(long number) { - // number should be 4 digits i.e., HHMM - // Check if the number is a four-digit integer + // Number should be 4 digits i.e., HHMM if (number < 0 || number > 9999) { return 0; } diff --git a/src/grib_accessor_class_g1date.cc b/src/grib_accessor_class_g1date.cc index 37cd80ad5..10294a935 100644 --- a/src/grib_accessor_class_g1date.cc +++ b/src/grib_accessor_class_g1date.cc @@ -129,14 +129,11 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int unpack_long(grib_accessor* a, long* val, size_t* len) { - int ret = 0; grib_accessor_g1date* self = (grib_accessor_g1date*)a; - grib_handle* hand = grib_handle_of_accessor(a); + grib_handle* hand = grib_handle_of_accessor(a); - long year = 0; - long century = 0; - long month = 0; - long day = 0; + int ret = 0; + long year = 0, century = 0, month = 0, day = 0; if ((ret = grib_get_long_internal(hand, self->century, ¢ury)) != GRIB_SUCCESS) return ret; @@ -165,25 +162,20 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) static int pack_long(grib_accessor* a, const long* val, size_t* len) { - int ret = 0; - long v = val[0]; grib_accessor_g1date* self = (grib_accessor_g1date*)a; - grib_handle* hand = grib_handle_of_accessor(a); + grib_handle* hand = grib_handle_of_accessor(a); - long year = 0; - long century = 0; - long month = 0; - long day = 0; + int ret = 0; + long v = val[0]; + long year = 0, century = 0, month = 0, day = 0; if (*len != 1) return GRIB_WRONG_ARRAY_SIZE; - { - long d = grib_julian_to_date((long)grib_date_to_julian(v)); - if (v != d) { - grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_g1date: pack_long invalid date %ld, changed to %ld", v, d); - return GRIB_ENCODING_ERROR; - } + long d = grib_julian_to_date(grib_date_to_julian(v)); + if (v != d) { + grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_g1date: pack_long invalid date %ld, changed to %ld", v, d); + return GRIB_ENCODING_ERROR; } century = v / 1000000; @@ -228,15 +220,12 @@ static const char* months[] = { static int unpack_string(grib_accessor* a, char* val, size_t* len) { - int ret = 0; - char tmp[1024]; grib_accessor_g1date* self = (grib_accessor_g1date*)a; grib_handle* hand = grib_handle_of_accessor(a); - long year = 0; - long century = 0; - long month = 0; - long day = 0; - size_t l; + + int ret = 0; + char tmp[1024]; + long year = 0, century = 0, month = 0, day = 0; if ((ret = grib_get_long_internal(hand, self->century, ¢ury)) != GRIB_SUCCESS) return ret; @@ -261,7 +250,7 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) snprintf(tmp, sizeof(tmp), "%ld", x); } - l = strlen(tmp) + 1; + size_t l = strlen(tmp) + 1; if (*len < l) { *len = l; return GRIB_BUFFER_TOO_SMALL; From 1fc934731609204cc7e4cfef0f50ced56defe005 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 17:48:00 +0000 Subject: [PATCH 110/244] Reformatting --- ...cessor_class_data_apply_boustrophedonic.cc | 32 ++++---- src/grib_dumper_class_bufr_encode_C.cc | 79 ++++++++++--------- src/grib_dumper_class_bufr_encode_fortran.cc | 78 ++++++++++-------- 3 files changed, 103 insertions(+), 86 deletions(-) diff --git a/src/grib_accessor_class_data_apply_boustrophedonic.cc b/src/grib_accessor_class_data_apply_boustrophedonic.cc index 1f10885e0..e01917384 100644 --- a/src/grib_accessor_class_data_apply_boustrophedonic.cc +++ b/src/grib_accessor_class_data_apply_boustrophedonic.cc @@ -119,7 +119,7 @@ grib_accessor_class* grib_accessor_class_data_apply_boustrophedonic = &_grib_acc static void init(grib_accessor* a, const long v, grib_arguments* args) { - int n = 0; + int n = 0; grib_accessor_data_apply_boustrophedonic* self = (grib_accessor_data_apply_boustrophedonic*)a; self->values = grib_arguments_get_name(grib_handle_of_accessor(a), args, n++); @@ -138,10 +138,10 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int value_count(grib_accessor* a, long* numberOfPoints) { grib_accessor_data_apply_boustrophedonic* self = (grib_accessor_data_apply_boustrophedonic*)a; - int ret = 0; + int ret = 0; *numberOfPoints = 0; - ret = grib_get_long_internal(grib_handle_of_accessor(a), self->numberOfPoints, numberOfPoints); + ret = grib_get_long_internal(grib_handle_of_accessor(a), self->numberOfPoints, numberOfPoints); return ret; } @@ -150,12 +150,13 @@ template static int unpack(grib_accessor* a, T* val, size_t* len) { grib_accessor_data_apply_boustrophedonic* self = (grib_accessor_data_apply_boustrophedonic*)a; - size_t plSize = 0; - long* pl = 0; - double* values = 0; - double* pvalues = 0; - T* pval = 0; - size_t valuesSize = 0; + + size_t plSize = 0; + long* pl = 0; + double* values = 0; + double* pvalues = 0; + T* pval = 0; + size_t valuesSize = 0; long i, j; int ret; long numberOfPoints, numberOfRows, numberOfColumns; @@ -306,12 +307,13 @@ static int unpack_double_element_set(grib_accessor* a, const size_t* index_array static int pack_double(grib_accessor* a, const double* val, size_t* len) { grib_accessor_data_apply_boustrophedonic* self = (grib_accessor_data_apply_boustrophedonic*)a; - size_t plSize = 0; - long* pl = 0; - double* values = 0; - double* pvalues = 0; - double* pval = 0; - size_t valuesSize = 0; + + size_t plSize = 0; + long* pl = 0; + double* values = 0; + double* pvalues = 0; + double* pval = 0; + size_t valuesSize = 0; long i, j; int ret; long numberOfPoints, numberOfRows, numberOfColumns; diff --git a/src/grib_dumper_class_bufr_encode_C.cc b/src/grib_dumper_class_bufr_encode_C.cc index d07825434..568a035bb 100644 --- a/src/grib_dumper_class_bufr_encode_C.cc +++ b/src/grib_dumper_class_bufr_encode_C.cc @@ -102,13 +102,14 @@ static void init_class(grib_dumper_class* c) {} static int init(grib_dumper* d) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - grib_context* c = d->context; - self->section_offset = 0; - self->empty = 1; - d->count = 1; - self->isLeaf = 0; - self->isAttribute = 0; - self->keys = (grib_string_list*)grib_context_malloc_clear(c, sizeof(grib_string_list)); + + grib_context* c = d->context; + self->section_offset = 0; + self->empty = 1; + d->count = 1; + self->isLeaf = 0; + self->isAttribute = 0; + self->keys = (grib_string_list*)grib_context_malloc_clear(c, sizeof(grib_string_list)); return GRIB_SUCCESS; } @@ -116,9 +117,9 @@ static int init(grib_dumper* d) static int destroy(grib_dumper* d) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - grib_string_list* next = self->keys; - grib_string_list* cur = NULL; - grib_context* c = d->context; + grib_string_list* next = self->keys; + grib_string_list* cur = NULL; + grib_context* c = d->context; while (next) { cur = next; next = next->next; @@ -152,10 +153,11 @@ static char* dval_to_string(grib_context* c, double v) static void dump_values(grib_dumper* d, grib_accessor* a) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - double value = 0; + + double value = 0; size_t size = 0, size2 = 0; - double* values = NULL; - int err = 0; + double* values = NULL; + int err = 0; int i, r, icount; int cols = 2; long count = 0; @@ -248,10 +250,11 @@ static void dump_values(grib_dumper* d, grib_accessor* a) static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char* prefix) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - double value = 0; + + double value = 0; size_t size = 0, size2 = 0; - double* values = NULL; - int err = 0; + double* values = NULL; + int err = 0; int i, icount; int cols = 2; long count = 0; @@ -333,16 +336,17 @@ static int is_hidden(grib_accessor* a) static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - long value = 0; + + long value = 0; size_t size = 0, size2 = 0; - long* values = NULL; - int err = 0; + long* values = NULL; + int err = 0; int i, r, icount; - int cols = 4; - long count = 0; - char* sval = NULL; - grib_context* c = a->context; - grib_handle* h = grib_handle_of_accessor(a); + int cols = 4; + long count = 0; + char* sval = NULL; + grib_context* c = a->context; + grib_handle* h = grib_handle_of_accessor(a); int doing_unexpandedDescriptors = 0; if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0) { /* key does not have the dump attribute */ @@ -471,10 +475,11 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment) static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* prefix) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - long value = 0; + + long value = 0; size_t size = 0, size2 = 0; - long* values = NULL; - int err = 0; + long* values = NULL; + int err = 0; int i, icount; int cols = 4; long count = 0; @@ -552,8 +557,9 @@ static void dump_bits(grib_dumper* d, grib_accessor* a, const char* comment) static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - double value = 0; - size_t size = 1; + + double value = 0; + size_t size = 1; int r; char* sval; grib_handle* h = grib_handle_of_accessor(a); @@ -667,12 +673,13 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - char* value = NULL; - char* p = NULL; - size_t size = 0; - grib_context* c = a->context; + + char* value = NULL; + char* p = NULL; + size_t size = 0; + grib_context* c = a->context; int r = 0, err = 0; - grib_handle* h = grib_handle_of_accessor(a); + grib_handle* h = grib_handle_of_accessor(a); const char* acc_name = a->name; grib_get_string_length_acc(a, &size); @@ -814,7 +821,7 @@ static void dump_section(grib_dumper* d, grib_accessor* a, grib_block_of_accesso static void dump_attributes(grib_dumper* d, grib_accessor* a, const char* prefix) { - int i = 0; + int i = 0; grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; unsigned long flags; while (i < MAX_ACCESSOR_ATTRIBUTES && a->attributes[i]) { @@ -846,7 +853,7 @@ static void dump_attributes(grib_dumper* d, grib_accessor* a, const char* prefix static void header(grib_dumper* d, grib_handle* h) { grib_dumper_bufr_encode_C* self = (grib_dumper_bufr_encode_C*)d; - char sampleName[200] = { 0 }; + char sampleName[200] = { 0 }; long localSectionPresent, edition, bufrHeaderCentre, isSatellite; Assert(h->product_kind == PRODUCT_BUFR); diff --git a/src/grib_dumper_class_bufr_encode_fortran.cc b/src/grib_dumper_class_bufr_encode_fortran.cc index c689867b8..e76bd0872 100644 --- a/src/grib_dumper_class_bufr_encode_fortran.cc +++ b/src/grib_dumper_class_bufr_encode_fortran.cc @@ -103,13 +103,14 @@ static void init_class(grib_dumper_class* c) {} static int init(grib_dumper* d) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - grib_context* c = d->context; - self->section_offset = 0; - self->empty = 1; - d->count = 1; - self->isLeaf = 0; - self->isAttribute = 0; - self->keys = (grib_string_list*)grib_context_malloc_clear(c, sizeof(grib_string_list)); + + grib_context* c = d->context; + self->section_offset = 0; + self->empty = 1; + d->count = 1; + self->isLeaf = 0; + self->isAttribute = 0; + self->keys = (grib_string_list*)grib_context_malloc_clear(c, sizeof(grib_string_list)); return GRIB_SUCCESS; } @@ -117,9 +118,10 @@ static int init(grib_dumper* d) static int destroy(grib_dumper* d) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - grib_string_list* next = self->keys; - grib_string_list* cur = NULL; - grib_context* c = d->context; + + grib_string_list* next = self->keys; + grib_string_list* cur = NULL; + grib_context* c = d->context; while (next) { cur = next; next = next->next; @@ -200,10 +202,11 @@ static char* break_line(grib_context* c, const char* input) static void dump_values(grib_dumper* d, grib_accessor* a) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - double value = 0; + + double value = 0; size_t size = 0, size2 = 0; - double* values = NULL; - int err = 0; + double* values = NULL; + int err = 0; int i, r, icount; int cols = 2; long count = 0; @@ -295,10 +298,11 @@ static void dump_values(grib_dumper* d, grib_accessor* a) static void dump_values_attribute(grib_dumper* d, grib_accessor* a, const char* prefix) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - double value = 0; + + double value = 0; size_t size = 0, size2 = 0; - double* values = NULL; - int err = 0; + double* values = NULL; + int err = 0; int i, icount; int cols = 2; long count = 0; @@ -381,16 +385,17 @@ static int is_hidden(grib_accessor* a) static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - long value = 0; + + long value = 0; size_t size = 0, size2 = 0; - long* values = NULL; - int err = 0; + long* values = NULL; + int err = 0; int i, r, icount; - int cols = 4; - long count = 0; - char* sval = NULL; - grib_context* c = a->context; - grib_handle* h = grib_handle_of_accessor(a); + int cols = 4; + long count = 0; + char* sval = NULL; + grib_context* c = a->context; + grib_handle* h = grib_handle_of_accessor(a); int doing_unexpandedDescriptors = 0; if ((a->flags & GRIB_ACCESSOR_FLAG_DUMP) == 0) { /* key does not have the dump attribute */ @@ -516,10 +521,11 @@ static void dump_long(grib_dumper* d, grib_accessor* a, const char* comment) static void dump_long_attribute(grib_dumper* d, grib_accessor* a, const char* prefix) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - long value = 0; + + long value = 0; size_t size = 0, size2 = 0; - long* values = NULL; - int err = 0; + long* values = NULL; + int err = 0; int i, icount; int cols = 4; long count = 0; @@ -603,8 +609,9 @@ static void dump_bits(grib_dumper* d, grib_accessor* a, const char* comment) static void dump_double(grib_dumper* d, grib_accessor* a, const char* comment) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - double value = 0; - size_t size = 1; + + double value = 0; + size_t size = 1; int r; char* sval; grib_handle* h = grib_handle_of_accessor(a); @@ -715,10 +722,11 @@ static void dump_string_array(grib_dumper* d, grib_accessor* a, const char* comm static void dump_string(grib_dumper* d, grib_accessor* a, const char* comment) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - char* value = NULL; - char* p = NULL; - size_t size = 0; - grib_context* c = a->context; + + char* value = NULL; + char* p = NULL; + size_t size = 0; + grib_context* c = a->context; int r; int err = 0; grib_handle* h = grib_handle_of_accessor(a); @@ -860,7 +868,7 @@ static void dump_section(grib_dumper* d, grib_accessor* a, grib_block_of_accesso static void dump_attributes(grib_dumper* d, grib_accessor* a, const char* prefix) { - int i = 0; + int i = 0; grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; unsigned long flags; while (i < MAX_ACCESSOR_ATTRIBUTES && a->attributes[i]) { @@ -892,7 +900,7 @@ static void dump_attributes(grib_dumper* d, grib_accessor* a, const char* prefix static void header(grib_dumper* d, grib_handle* h) { grib_dumper_bufr_encode_fortran* self = (grib_dumper_bufr_encode_fortran*)d; - char sampleName[200] = { 0 }; + char sampleName[200] = { 0 }; long localSectionPresent, edition, bufrHeaderCentre, isSatellite; grib_get_long(h, "localSectionPresent", &localSectionPresent); From 3614dfdc5a857df77e66b109c41d0bbc5631a327 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 17:49:15 +0000 Subject: [PATCH 111/244] Openjpeg 2.5.1: Fix compilation --- src/grib_openjpeg_encoding.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/grib_openjpeg_encoding.cc b/src/grib_openjpeg_encoding.cc index 6b726a97a..381e36c22 100644 --- a/src/grib_openjpeg_encoding.cc +++ b/src/grib_openjpeg_encoding.cc @@ -13,6 +13,7 @@ #if HAVE_LIBOPENJPEG #include "openjpeg.h" +#include "opj_config.h" static void openjpeg_warning(const char* msg, void* client_data) { From 24e13c4f8a8f7c56ca7e9d4af76d701cbb8ae328 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 18:06:33 +0000 Subject: [PATCH 112/244] Bamboo CIE: Have to disable OpenJPEG for now as it is too old --- bamboo/flags.cmake | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bamboo/flags.cmake b/bamboo/flags.cmake index 2c5a809e2..4c4a1ede8 100644 --- a/bamboo/flags.cmake +++ b/bamboo/flags.cmake @@ -1,3 +1,4 @@ -SET(ENABLE_EXTRA_TESTS ON CACHE BOOL "Enable extra tests") -SET(ENABLE_ECCODES_THREADS ON CACHE BOOL "Enable POSIX threads") -SET(ENABLE_MEMFS ON CACHE BOOL "Enable MEMFS") +SET(ENABLE_EXTRA_TESTS ON CACHE BOOL "Enable extra tests") +SET(ENABLE_ECCODES_THREADS ON CACHE BOOL "Enable POSIX threads") +SET(ENABLE_MEMFS ON CACHE BOOL "Enable MEMFS") +SET(ENABLE_JPG_LIBOPENJPEG OFF CACHE BOOL "Disable OpenJPEG") From 66e39ad3e87eb6bed44faecb22900865bf3db000 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 28 Feb 2024 19:35:25 +0000 Subject: [PATCH 113/244] Openjpeg 2.5.1: Try again --- bamboo/flags.cmake | 2 +- src/grib_openjpeg_encoding.cc | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/bamboo/flags.cmake b/bamboo/flags.cmake index 4c4a1ede8..832133409 100644 --- a/bamboo/flags.cmake +++ b/bamboo/flags.cmake @@ -1,4 +1,4 @@ SET(ENABLE_EXTRA_TESTS ON CACHE BOOL "Enable extra tests") SET(ENABLE_ECCODES_THREADS ON CACHE BOOL "Enable POSIX threads") SET(ENABLE_MEMFS ON CACHE BOOL "Enable MEMFS") -SET(ENABLE_JPG_LIBOPENJPEG OFF CACHE BOOL "Disable OpenJPEG") +# SET(ENABLE_JPG_LIBOPENJPEG OFF CACHE BOOL "Disable OpenJPEG") diff --git a/src/grib_openjpeg_encoding.cc b/src/grib_openjpeg_encoding.cc index 381e36c22..9b3b67566 100644 --- a/src/grib_openjpeg_encoding.cc +++ b/src/grib_openjpeg_encoding.cc @@ -13,7 +13,11 @@ #if HAVE_LIBOPENJPEG #include "openjpeg.h" -#include "opj_config.h" +// The older versions did not have the opj_config.h file +// So we use a more recent macro to detect whether it is there +#if defined(OPJ_IMG_INFO) + #include "opj_config.h" +#endif static void openjpeg_warning(const char* msg, void* client_data) { From c9259f69eb088b323acf1753dfec52d394b4d272 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 13:36:35 +0000 Subject: [PATCH 114/244] Const correctness and cppcheck warnings --- src/eccodes_prototypes.h | 4 +- src/grib_util.cc | 182 +++++++++++++++++++-------------------- 2 files changed, 93 insertions(+), 93 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index db119f1ce..34a63088f 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1345,9 +1345,9 @@ int grib2_is_PDTN_Aerosol(long productDefinitionTemplateNumber); int grib2_is_PDTN_AerosolOptical(long productDefinitionTemplateNumber); int grib2_select_PDTN(int is_eps, int is_instant, int is_chemical, int is_chemical_srcsink, int is_chemical_distfn, int is_aerosol, int is_aerosol_optical); size_t sum_of_pl_array(const long* pl, size_t plsize); -int grib_is_earth_oblate(grib_handle* h); +int grib_is_earth_oblate(const grib_handle* h); int grib_check_data_values_minmax(grib_handle* h, const double min_val, const double max_val); -int grib_producing_large_constant_fields(grib_handle* h, int edition); +int grib_producing_large_constant_fields(const grib_handle* h, int edition); int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max_val); /* bufr_util.cc*/ diff --git a/src/grib_util.cc b/src/grib_util.cc index c559eeacb..7ecc75f72 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -90,18 +90,18 @@ static grib_handle* grib_sections_copy_internal(grib_handle* hfrom, grib_handle* p = buffer; off = 0; for (i = 0; i <= hfrom->sections_count; i++) { - grib_handle* hand = NULL; + const grib_handle* hand = NULL; if (sections[i]) hand = hfrom; else hand = hto; - p = (unsigned char*)memcpy(p, hand->buffer->data + section_offset[i], section_length[i]); + p = (unsigned char*)memcpy(p, hand->buffer->data + section_offset[i], section_length[i]); section_offset[i] = off; off += section_length[i]; p += section_length[i]; } - /* copy section 3 present flag*/ + // copy section 3 present flag if (edition == 1) { const void* buffer_to = NULL; size_t size_to = 0; @@ -113,7 +113,7 @@ static grib_handle* grib_sections_copy_internal(grib_handle* hfrom, grib_handle* h = grib_handle_new_from_message(hfrom->context, buffer, totalLength); - /*to allow free of buffer*/ + // to allow freeing of buffer h->buffer->property = CODES_MY_BUFFER; switch (edition) { @@ -279,7 +279,7 @@ grib_handle* grib_util_sections_copy(grib_handle* hfrom, grib_handle* hto, int w static grib_trie* init_list(const char* name); static grib_trie* param_id_list = NULL; static grib_trie* mars_param_list = NULL; -/* TODO thread safe */ +// TODO thread safe grib_string_list* grib_util_get_param_id(const char* mars_param) { if (!mars_param_list && (mars_param_list = init_list("mars_param.table")) == NULL) @@ -382,13 +382,13 @@ static const char* get_packing_spec_packing_type_name(long packing_spec_packing_ return NULL; } -/* For debugging purposes */ -static void print_values(grib_context* c, +// For debugging purposes +static void print_values(const grib_context* c, const grib_util_grid_spec* spec, const grib_util_packing_spec* packing_spec, const char* input_packing_type, - const double* data_values, const size_t data_values_count, /* the data pay load */ - const grib_values* keyval_pairs, const size_t count) /* keys and their values */ + const double* data_values, const size_t data_values_count, // the data pay load + const grib_values* keyval_pairs, const size_t count) // keys and their values { size_t i = 0; int isConstant = 1; @@ -464,14 +464,12 @@ static void print_values(grib_context* c, } -/* -static int DBL_EQUAL(double d1, double d2, double tolerance) -{ - return fabs(d1-d2) < tolerance; -} -*/ +// static int DBL_EQUAL(double d1, double d2, double tolerance) +// { +// return fabs(d1-d2) < tolerance; +// } -// /* Returns a boolean: 1 if angle can be encoded, 0 otherwise */ +// Returns a boolean: 1 if angle can be encoded, 0 otherwise // static int grib1_angle_can_be_encoded(const double angle) // { // const double angle_milliDegrees = angle * 1000; @@ -480,10 +478,10 @@ static int DBL_EQUAL(double d1, double d2, double tolerance) // rounded = (int)(angle_milliDegrees-0.5)/1000.0; // } // if (angle == rounded) return 1; -// return 0; /* sub millidegree. Cannot be encoded in grib1 */ +// return 0; // sub millidegree. Cannot be encoded in grib1 // } -// /* Returns a boolean: 1 if angle can be encoded, 0 otherwise */ +// Returns a boolean: 1 if angle can be encoded, 0 otherwise // static int angle_can_be_encoded(const double angle, const double angular_precision) // { // const double angle_expanded = angle * angular_precision; @@ -493,18 +491,18 @@ static int DBL_EQUAL(double d1, double d2, double tolerance) // rounded = (long)(angle_expanded-0.5)/angular_precision; // } // if (angle == rounded) return 1; -// /*printf(" ......... angle cannot be encoded: %.10e\n", angle);*/ -// return 0; /* Cannot be encoded */ +// //printf(" ......... angle cannot be encoded: %.10e\n", angle); +// return 0; // Cannot be encoded // } -/* Returns a boolean: 1 if angle can be encoded, 0 otherwise */ -static int angle_can_be_encoded(grib_handle* h, const double angle) +// Returns a boolean: 1 if angle can be encoded, 0 otherwise +static int angle_can_be_encoded(const grib_handle* h, const double angle) { int ret = 0; int retval = 1; grib_handle* h2 = NULL; char sample_name[16] = {0,}; - long angle_subdivisions = 0; /* e.g. 1e3 for grib1 and 1e6 for grib2 */ + long angle_subdivisions = 0; // e.g. 1e3 for grib1 and 1e6 for grib2 long edition = 0, coded = 0; double expanded, diff; @@ -545,20 +543,19 @@ static double adjust_angle(const double angle, const RoundingPolicy policy, cons return result; } -/* Search key=value array for: - * latitudeOfFirstGridPointInDegrees - * longitudeOfFirstGridPointInDegrees - * latitudeOfLastGridPointInDegrees - * longitudeOfLastGridPointInDegrees - * and change their values to expand the bounding box - */ -static int expand_bounding_box(grib_handle* h, grib_values* values, const size_t count) +// Search key=value array for: +// * latitudeOfFirstGridPointInDegrees +// * longitudeOfFirstGridPointInDegrees +// * latitudeOfLastGridPointInDegrees +// * longitudeOfLastGridPointInDegrees +// and change their values to expand the bounding box +static int expand_bounding_box(const grib_handle* h, grib_values* values, const size_t count) { int ret = GRIB_SUCCESS; size_t i = 0; double new_angle = 0; RoundingPolicy roundingPolicy = eROUND_ANGLE_UP; - long angle_subdivisions = 0; /* e.g. 1e3 for grib1 and 1e6 for grib2 */ + long angle_subdivisions = 0; // e.g. 1e3 for grib1 and 1e6 for grib2 if ((ret = grib_get_long(h, "angleSubdivisions", &angle_subdivisions)) != 0) return ret; @@ -625,7 +622,7 @@ static int check_values(const double* data_values, size_t data_values_count) }*/ static int check_geometry(grib_handle* handle, const grib_util_grid_spec* spec, - size_t data_values_count, int specified_as_global) + size_t data_values_count, bool specified_as_global) { int err = 0; @@ -650,7 +647,7 @@ static int check_geometry(grib_handle* handle, const grib_util_grid_spec* spec, #if defined(CHECK_HANDLE_AGAINST_SPEC) /* Check what is coded in the handle is what is requested by the spec. */ /* Return GRIB_SUCCESS if the geometry matches, otherwise the error code */ -static int check_handle_against_spec(grib_handle* handle, const long edition, +static int check_handle_against_spec(const grib_handle* handle, const long edition, const grib_util_grid_spec* spec, int global_grid) { int err = 0; @@ -884,10 +881,10 @@ static int get_grib_sample_name(grib_handle* h, long editionNumber, 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 */ + // 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 */ + // 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; @@ -905,7 +902,7 @@ static int get_grib_sample_name(grib_handle* h, long editionNumber, } if (spec->pl && spec->grid_name) { - /* Cannot have BOTH pl and grid name specified */ + // Cannot have BOTH pl and grid name specified fprintf(stderr, "%s: Cannot set BOTH spec.pl and spec.grid_name!\n", __func__); return GRIB_INTERNAL_ERROR; } @@ -967,25 +964,25 @@ grib_handle* grib_util_set_spec(grib_handle* h, } while (0) grib_values values[1024] = {{0,},}; - grib_context* c = grib_context_get_default(); + const grib_context* c = grib_context_get_default(); grib_handle* h_out = NULL; grib_handle* h_sample = NULL; const char* grid_type = NULL; - char sample_name[1024]; /* name of the GRIB sample file */ + char sample_name[1024]; // name of the GRIB sample file char input_grid_type[100]; char input_packing_type[100]; long editionNumber = 0; size_t count = 0, len = 100, slen = 20, input_grid_type_len = 100; double laplacianOperator; 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 grib1_high_resolution_fix = 0; /* boolean: See GRIB-863 */ - int global_grid = 0; /* boolean */ + bool convertEditionEarlier = false; // For cases when we cannot set some keys without converting + bool grib1_high_resolution_fix = false; // See GRIB-863 + bool global_grid = false; int expandBoundingBox = 0; Assert(h); - /* Get edition number from input handle */ + // Get edition number from input handle if ((*err = grib_get_long(h, "edition", &editionNumber)) != 0) { if (c->write_on_fail) grib_write_message(h, "error.grib", "w"); return NULL; @@ -997,7 +994,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, grib_get_string(h, "packingType", input_packing_type, &len); - /* ECC-1201, ECC-1529, ECC-1530: Make sure input packing type is preserved */ + // ECC-1201, ECC-1529, ECC-1530: Make sure input packing type is preserved if (packing_spec->packing == GRIB_UTIL_PACKING_SAME_AS_INPUT && packing_spec->packing_type == GRIB_UTIL_PACKING_TYPE_SAME_AS_INPUT) { @@ -1031,7 +1028,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, } 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) { goto cleanup; } @@ -1040,7 +1037,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, fprintf(stderr, "ECCODES WARNING %s: '%s' specified " "but input is GRIB edition %ld. Output must be a higher edition!\n", __func__, grid_type, editionNumber); - convertEditionEarlier = 1; + convertEditionEarlier = true; } h_sample = grib_handle_new_from_samples(NULL, sample_name); @@ -1049,7 +1046,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, return NULL; } - /* Set grid */ + // Set grid switch (spec->grid_type) { case GRIB_UTIL_GRID_SPEC_REGULAR_LL: case GRIB_UTIL_GRID_SPEC_ROTATED_LL: @@ -1060,16 +1057,16 @@ grib_handle* grib_util_set_spec(grib_handle* h, SET_LONG_VALUE("ijDirectionIncrementGiven", 1); if (editionNumber == 1) { - /* GRIB-863: GRIB1 cannot represent increments less than a millidegree */ + // GRIB-863: GRIB1 cannot represent increments less than a millidegree if (!angle_can_be_encoded(h, spec->iDirectionIncrementInDegrees) || !angle_can_be_encoded(h, spec->jDirectionIncrementInDegrees)) { - grib1_high_resolution_fix = 1; - /* Set flag to compute the increments */ + grib1_high_resolution_fix = true; + // Set flag to compute the increments SET_LONG_VALUE("ijDirectionIncrementGiven", 0); } } - /* default iScansNegatively=0 jScansPositively=0 is ok */ + // default iScansNegatively=0 jScansPositively=0 is ok COPY_SPEC_LONG(iScansNegatively); COPY_SPEC_LONG(jScansPositively); @@ -1094,7 +1091,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, if (spec->missingValue) COPY_SPEC_DOUBLE(missingValue); SET_LONG_VALUE("ijDirectionIncrementGiven", 1); - /* TODO: add Assert */ + // TODO: add Assert COPY_SPEC_LONG(Ni); COPY_SPEC_DOUBLE(iDirectionIncrementInDegrees); COPY_SPEC_LONG(Nj); @@ -1129,7 +1126,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, COPY_SPEC_LONG(Ni); COPY_SPEC_LONG(Nj); - /* default iScansNegatively=0 jScansPositively=0 is ok */ + // default iScansNegatively=0 jScansPositively=0 is ok COPY_SPEC_LONG(iScansNegatively); COPY_SPEC_LONG(jScansPositively); COPY_SPEC_DOUBLE(orientationOfTheGridInDegrees); @@ -1143,8 +1140,8 @@ grib_handle* grib_util_set_spec(grib_handle* h, COPY_SPEC_DOUBLE(longitudeOfFirstGridPointInDegrees); COPY_SPEC_DOUBLE(latitudeOfFirstGridPointInDegrees); - COPY_SPEC_LONG(Ni); /* same as Nx */ - COPY_SPEC_LONG(Nj); /* same as Ny */ + COPY_SPEC_LONG(Ni); // same as Nx + COPY_SPEC_LONG(Nj); // same as Ny COPY_SPEC_LONG(iScansNegatively); COPY_SPEC_LONG(jScansPositively); @@ -1160,15 +1157,15 @@ grib_handle* grib_util_set_spec(grib_handle* h, case GRIB_UTIL_GRID_SPEC_UNSTRUCTURED: COPY_SPEC_LONG(bitmapPresent); if (spec->missingValue) COPY_SPEC_DOUBLE(missingValue); - /* TODO(masn): Other keys */ + // TODO(masn): Other keys break; case GRIB_UTIL_GRID_SPEC_LAMBERT_CONFORMAL: COPY_SPEC_LONG(bitmapPresent); if (spec->missingValue) COPY_SPEC_DOUBLE(missingValue); COPY_SPEC_DOUBLE(longitudeOfFirstGridPointInDegrees); COPY_SPEC_DOUBLE(latitudeOfFirstGridPointInDegrees); - COPY_SPEC_LONG(Ni); /* same as Nx */ - COPY_SPEC_LONG(Nj); /* same as Ny */ + COPY_SPEC_LONG(Ni); // same as Nx + COPY_SPEC_LONG(Nj); // same as Ny COPY_SPEC_LONG(iScansNegatively); COPY_SPEC_LONG(jScansPositively); @@ -1239,7 +1236,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, break; } - /* Set rotation */ + // Set rotation switch (spec->grid_type) { case GRIB_UTIL_GRID_SPEC_ROTATED_LL: case GRIB_UTIL_GRID_SPEC_ROTATED_GG: @@ -1251,7 +1248,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, break; } - /* process packing options */ + // process packing options if (!packingTypeIsSet && packing_spec->packing == GRIB_UTIL_PACKING_USE_PROVIDED && strcmp(input_packing_type, "grid_simple_matrix")) { @@ -1271,7 +1268,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, case GRIB_UTIL_PACKING_TYPE_GRID_COMPLEX: if (!STR_EQUAL(input_packing_type, "grid_complex")) { SET_STRING_VALUE("packingType", "grid_complex"); - convertEditionEarlier=1; + convertEditionEarlier = true; } break; case GRIB_UTIL_PACKING_TYPE_JPEG: @@ -1310,7 +1307,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, long numberOfDirections, numberOfFrequencies; int keep_matrix = h->context->keep_matrix; if (packing_spec->packing_type == GRIB_UTIL_PACKING_TYPE_GRID_SIMPLE) { - keep_matrix = 0; /* ECC-911 */ + keep_matrix = 0; // ECC-911 } if (keep_matrix) { SET_STRING_VALUE("packingType", "grid_simple_matrix"); @@ -1384,14 +1381,14 @@ grib_handle* grib_util_set_spec(grib_handle* h, packing_spec->extra_settings[i].long_value == 1) { /* GRIB-922: Request is for a global grid. Setting this key will * calculate the lat/lon values. So the spec's lat/lon can be ignored */ - global_grid = 1; + global_grid = true; } } } } - /* grib_write_message(h,"input.grib","w"); */ - /* grib_write_message(h_sample,"geo.grib","w"); */ - /* copy product and local sections from h to h_sample handle and store in h_out */ + // grib_write_message(h,"input.grib","w"); + // grib_write_message(h_sample,"geo.grib","w"); + // copy product and local sections from h to h_sample handle and store in h_out if ((h_out = grib_util_sections_copy(h, h_sample, GRIB_SECTION_PRODUCT | GRIB_SECTION_LOCAL, err)) == NULL) { goto cleanup; } @@ -1399,7 +1396,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, grib_handle_delete(h_sample); Assert(*err == 0); - /* GRIB-857: Set "pl" array if provided (For reduced Gaussian grids) */ + // GRIB-857: Set "pl" array if provided (For reduced Gaussian grids) Assert(spec->pl_size >= 0); if (spec->pl && spec->pl_size == 0) { fprintf(stderr, "%s: pl array not NULL but pl_size == 0!\n", __func__); @@ -1434,7 +1431,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, print_values(h->context, spec, packing_spec, input_packing_type, data_values, data_values_count, values, count); } - /* Apply adjustments to bounding box if needed */ + // Apply adjustments to bounding box if needed if (expandBoundingBox) { if ((*err = expand_bounding_box(h_out, values, count)) != 0) { fprintf(stderr, "%s: Cannot expand bounding box: %s\n", __func__, grib_get_error_message(*err)); @@ -1445,6 +1442,14 @@ grib_handle* grib_util_set_spec(grib_handle* h, } if (convertEditionEarlier && packing_spec->editionNumber > 1) { + // Note: + // If the input is GRIB1 and the requested grid type is HealPix or ORCA etc, + // we deliberately fail unless the user specifies edition conversion. + // i.e., we do not automatically convert edition + // If we later change our mind, we need to change editionNumber to 2 here: + // long new_edition = packing_spec->editionNumber; + // if (new_edition == 0) new_edition = 2; + // *err = grib_set_long(h_out, "edition", packing_spec->editionNumber); if (*err) { fprintf(stderr, "%s: Cannot convert to edition %ld.\n", __func__, packing_spec->editionNumber); @@ -1477,8 +1482,8 @@ grib_handle* grib_util_set_spec(grib_handle* h, } */ if (grib1_high_resolution_fix) { - /* GRIB-863: must set increments to MISSING */ - /* increments are not coded in message but computed */ + // GRIB-863: must set increments to MISSING + // increments are not coded in message but computed if ((*err = grib_set_missing(h_out, "iDirectionIncrement")) != 0) { fprintf(stderr, "%s: Cannot set Di to missing: %s\n", __func__, grib_get_error_message(*err)); goto cleanup; @@ -1489,8 +1494,8 @@ grib_handle* grib_util_set_spec(grib_handle* h, } } - /*grib_dump_content(h_out, stdout,"debug", ~0, NULL);*/ - /* convert to second_order if not constant field. (Also see ECC-326) */ + //grib_dump_content(h_out, stdout,"debug", ~0, NULL); + // convert to second_order if not constant field. (Also see ECC-326) if (setSecondOrder) { int constant = 0; double missingValue = 0; @@ -1505,7 +1510,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, slen = 17; grib_set_string(htmp, "packingType", "grid_second_order", &slen); grib_get_long(htmp, "numberOfGroups", &numberOfGroups); - /* GRIBEX is not able to decode overflown numberOfGroups with SPD */ + // GRIBEX is not able to decode overflown numberOfGroups with SPD if (numberOfGroups > 65534 && h_out->context->no_spd) { slen = 24; grib_set_string(h_out, "packingType", "grid_second_order_no_SPD", &slen); @@ -1546,8 +1551,8 @@ grib_handle* grib_util_set_spec(grib_handle* h, } } - if (editionNumber > 1 || packing_spec->editionNumber > 1) { /* ECC-353 */ - /* Some packing types are not available in GRIB1 and have to be done AFTER we set data values */ + if (editionNumber > 1 || packing_spec->editionNumber > 1) { // ECC-353 + // Some packing types are not available in GRIB1 and have to be done AFTER we set data values if (setJpegPacking == 1) { *err = grib_set_string(h_out, "packingType", "grid_jpeg", &slen); if (*err != GRIB_SUCCESS) { @@ -1570,9 +1575,9 @@ grib_handle* grib_util_set_spec(grib_handle* h, grib_set_long(h_out, "deleteLocalDefinition", 1); } - /* ECC-445 */ + // ECC-445 if (expandBoundingBox) { - Assert(!global_grid); /* ECC-576: "global" should not be set */ + Assert(!global_grid); // ECC-576: "global" should not be set } if ((*err = check_geometry(h_out, spec, data_values_count, global_grid)) != GRIB_SUCCESS) { @@ -1632,9 +1637,7 @@ cleanup: // } // } // grib_iterator_delete(iter); - // ret = grib_get_double(h, "missingValue", &missingValue); - // centroidX = 0; // centroidY = 0; // mass = 0; @@ -1650,10 +1653,8 @@ cleanup: // centroidX /= mass; // centroidY /= mass; // mass /= *count; - // for (j = 0; j < order * order; j++) // moments[j] = 0; - // for (i = 0; i < numberOfPoints; i++) { // if (values[i] != missingValue) { // dx = (lon[i] - centroidX); @@ -1693,7 +1694,7 @@ static void set_value(grib_values* value, char* str, int equal) { char *p = 0, *q = 0, *s = 0; char buf[1000] = {0,}; - grib_context* c = grib_context_get_default(); + const grib_context* c = grib_context_get_default(); value->equal = equal; q = str; @@ -1814,7 +1815,7 @@ int parse_keyval_string(const char* grib_tool, int equal = 1; char* value = NULL; if (values_required) { - /* Can be either k=v or k!=v */ + // Can be either k=v or k!=v p = (char*)values[i].name; while (*p != '=' && *p != '!' && *p != '\0') p++; @@ -2046,7 +2047,7 @@ size_t sum_of_pl_array(const long* pl, size_t plsize) return count; } -int grib_is_earth_oblate(grib_handle* h) +int grib_is_earth_oblate(const grib_handle* h) { long oblate = 0; int err = grib_get_long(h, "earthIsOblate", &oblate); @@ -2058,8 +2059,8 @@ int grib_is_earth_oblate(grib_handle* h) int grib_check_data_values_minmax(grib_handle* h, const double min_val, const double max_val) { - int result = GRIB_SUCCESS; - grib_context* ctx = h->context; + int result = GRIB_SUCCESS; + const grib_context* ctx = h->context; if (!(min_val < DBL_MAX && min_val > -DBL_MAX)) { grib_context_log(ctx, GRIB_LOG_ERROR, "Minimum value out of range: %g", min_val); @@ -2079,10 +2080,10 @@ int grib_check_data_values_minmax(grib_handle* h, const double min_val, const do } // Return true(1) if large constant fields are to be created, otherwise false(0) -int grib_producing_large_constant_fields(grib_handle* h, int edition) +int grib_producing_large_constant_fields(const grib_handle* h, int edition) { // First check if the transient key is set - grib_context* c = h->context; + const grib_context* c = h->context; long produceLargeConstantFields = 0; if (grib_get_long(h, "produceLargeConstantFields", &produceLargeConstantFields) == GRIB_SUCCESS && produceLargeConstantFields != 0) { @@ -2097,13 +2098,12 @@ int grib_producing_large_constant_fields(grib_handle* h, int edition) return c->large_constant_fields; } - int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max_val) { - int err = 0; + int err = 0; double min_field_value_allowed = 0, max_field_value_allowed = 0; long paramId = 0; - grib_context* ctx = h->context; + const grib_context* ctx = h->context; bool is_error = true; char description[1024] = {0,}; char step[32] = "unknown"; From cf47f8d18649eebcd3158ccc4d581f9d93dfb049 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 13:37:15 +0000 Subject: [PATCH 115/244] Use bool rather than int --- src/grib_util.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/grib_util.cc b/src/grib_util.cc index 7ecc75f72..670dbd8aa 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -643,7 +643,6 @@ static int check_geometry(grib_handle* handle, const grib_util_grid_spec* spec, return err; } - #if defined(CHECK_HANDLE_AGAINST_SPEC) /* Check what is coded in the handle is what is requested by the spec. */ /* Return GRIB_SUCCESS if the geometry matches, otherwise the error code */ @@ -830,10 +829,10 @@ static const char* get_grid_type_name(const int spec_grid_type) return NULL; } -static int is_constant_field(const double missingValue, const double* data_values, size_t data_values_count) +static bool is_constant_field(const double missingValue, const double* data_values, size_t data_values_count) { size_t ii = 0; - int constant = 1; + bool constant = true; double value = missingValue; for (ii = 0; ii < data_values_count; ii++) { @@ -843,7 +842,7 @@ static int is_constant_field(const double missingValue, const double* data_value } else { if (value != data_values[ii]) { - constant = 0; + constant = false; break; } } @@ -1497,10 +1496,9 @@ grib_handle* grib_util_set_spec(grib_handle* h, //grib_dump_content(h_out, stdout,"debug", ~0, NULL); // convert to second_order if not constant field. (Also see ECC-326) if (setSecondOrder) { - int constant = 0; double missingValue = 0; grib_get_double(h_out, "missingValue", &missingValue); - constant = is_constant_field(missingValue, data_values, data_values_count); + bool constant = is_constant_field(missingValue, data_values, data_values_count); if (!constant) { if (editionNumber == 1) { From 457fad43488571d319b0cdb7ba51b50b65dd83a7 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 15:15:44 +0000 Subject: [PATCH 116/244] Time validation: Fix comment --- src/codes_util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codes_util.cc b/src/codes_util.cc index 2d91fa598..57613109a 100644 --- a/src/codes_util.cc +++ b/src/codes_util.cc @@ -230,7 +230,7 @@ int is_time_valid(long number) long hours = number / 100; // Get the first two digits as hours long minutes = number % 100; // Get the last two digits as minutes - // Check if hours are within the valid range (00-23) + // Check if hours are within the valid range (00-24) if (hours < 0 || hours > 24) { return 0; } From ec5223618c18fe58a5e2a1c1da2f566f16c97896 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 16:52:47 +0000 Subject: [PATCH 117/244] ECC-1767: Make new keys read-only --- definitions/grib2/template.4.optical.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/definitions/grib2/template.4.optical.def b/definitions/grib2/template.4.optical.def index 385513edc..71dcf77e0 100644 --- a/definitions/grib2/template.4.optical.def +++ b/definitions/grib2/template.4.optical.def @@ -15,5 +15,5 @@ alias firstWavelengthInMetres = firstWavelength; alias secondWavelengthInMetres = secondWavelength; constant billion = 1000000000 : hidden; -meta firstWavelengthInNanometres multdouble(firstWavelength, billion); -meta secondWavelengthInNanometres multdouble(secondWavelength, billion); +meta firstWavelengthInNanometres multdouble(firstWavelength, billion) : read_only; +meta secondWavelengthInNanometres multdouble(secondWavelength, billion) : read_only; From 81e84a282d50368cac083d9ee8e4fd7575e5c17e Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 17:17:37 +0000 Subject: [PATCH 118/244] ECC-1778: Crash: Decoding invalid BUFR file --- src/grib_io.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/grib_io.cc b/src/grib_io.cc index 64c197a29..c47e4d509 100644 --- a/src/grib_io.cc +++ b/src/grib_io.cc @@ -820,6 +820,9 @@ static int read_BUFR(reader* r, int no_alloc) GROW_BUF_IF_REQUIRED(sec1len + sec2len + sec3len + 4 + 3); /* Read section 3 */ + if (sec3len < 5) { + return GRIB_INVALID_MESSAGE; // ECC-1778 + } if ((r->read(r->read_data, tmp + i, sec3len - 3, &err) != sec3len - 3) || err) return err; i += sec3len - 3; From 9709382d8f2101fef0b8b83b6e3528d01282244c Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 17:25:31 +0000 Subject: [PATCH 119/244] ECC-1779: GRIB2: Add keys to identify experimental and deprecated templates --- definitions/grib2/boot.def | 7 +++++++ definitions/grib2/template.3.1000.def | 5 +++++ definitions/grib2/template.3.1100.def | 5 +++++ definitions/grib2/template.3.1200.def | 4 ++++ definitions/grib2/template.4.10.def | 3 +++ definitions/grib2/template.4.1000.def | 3 +++ definitions/grib2/template.4.1001.def | 3 +++ definitions/grib2/template.4.1100.def | 4 +++- definitions/grib2/template.4.1101.def | 1 + definitions/grib2/template.4.44.def | 1 + definitions/grib2/template.4.83.def | 4 +++- definitions/grib2/template.5.1.def | 3 ++- definitions/grib2/template.5.61.def | 3 ++- definitions/grib2/template.7.1.def | 4 +++- definitions/grib2/template.7.61.def | 1 + 15 files changed, 46 insertions(+), 5 deletions(-) diff --git a/definitions/grib2/boot.def b/definitions/grib2/boot.def index 4ed94b503..5c3be280c 100644 --- a/definitions/grib2/boot.def +++ b/definitions/grib2/boot.def @@ -43,3 +43,10 @@ template core "grib2/sections.def"; #} template section_8 "grib2/section.8.def"; + +concept isTemplateDeprecated(false) { + 1 = { template_is_deprecated = 1; } +} +concept isTemplateExperimental(false) { + 1 = { template_is_experimental = 1; } +} diff --git a/definitions/grib2/template.3.1000.def b/definitions/grib2/template.3.1000.def index e76507aaf..8f825f393 100644 --- a/definitions/grib2/template.3.1000.def +++ b/definitions/grib2/template.3.1000.def @@ -1,6 +1,11 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 3.1000, Cross-section grid, with points equally spaced on the horizontal + +# This template is simply experimental, was not validated at the time of publication +# and should be used only for bilateral previously agreed tests +transient template_is_experimental = 1 : hidden ; + include "grib2/template.3.shape_of_the_earth.def" constant isGridded = true; diff --git a/definitions/grib2/template.3.1100.def b/definitions/grib2/template.3.1100.def index 26fe4a92a..de65bca94 100644 --- a/definitions/grib2/template.3.1100.def +++ b/definitions/grib2/template.3.1100.def @@ -1,6 +1,11 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 3.1100, Hovmoller diagram grid with points equally spaced on the horizontal + +# This template is simply experimental, was not validated at the time of publication +# and should be used only for bilateral previously agreed tests +transient template_is_experimental = 1 : hidden; + include "grib2/template.3.shape_of_the_earth.def" constant isGridded = true; diff --git a/definitions/grib2/template.3.1200.def b/definitions/grib2/template.3.1200.def index 0b7e234ae..06bb38c96 100644 --- a/definitions/grib2/template.3.1200.def +++ b/definitions/grib2/template.3.1200.def @@ -1,6 +1,10 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 3.1200, Time section grid +# This template is simply experimental, was not validated at the time of publication +# and should be used only for bilateral previously agreed tests +transient template_is_experimental = 1 : hidden; + constant isGridded = true; # NT - Number of time steps diff --git a/definitions/grib2/template.4.10.def b/definitions/grib2/template.4.10.def index 1bcd610b0..84b437bdc 100644 --- a/definitions/grib2/template.4.10.def +++ b/definitions/grib2/template.4.10.def @@ -2,6 +2,9 @@ # TEMPLATE 4.10, Percentile forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +# This template was not validated at the time of publication and should be used with caution. +transient template_is_experimental = 1 : hidden; + include "grib2/template.4.parameter.def" include "grib2/template.4.generating_process.def" include "grib2/template.4.forecast_time.def" diff --git a/definitions/grib2/template.4.1000.def b/definitions/grib2/template.4.1000.def index a31654ff5..f179ae483 100644 --- a/definitions/grib2/template.4.1000.def +++ b/definitions/grib2/template.4.1000.def @@ -1,6 +1,9 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 4.1000, Cross section of analysis and forecast at a point in time +# This template is experimental, was not validated at the time of publication +# and should be used only for bilateral previously agreed tests +transient template_is_experimental = 1 : hidden; include "grib2/template.4.parameter.def" include "grib2/template.4.generating_process.def" diff --git a/definitions/grib2/template.4.1001.def b/definitions/grib2/template.4.1001.def index b0e1ca17e..5fafe70f3 100644 --- a/definitions/grib2/template.4.1001.def +++ b/definitions/grib2/template.4.1001.def @@ -1,6 +1,9 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 4.1001, Cross section of averaged or otherwise statistically processed analysis or forecast over a range of time +# This template is experimental, was not validated at the time of publication +# and should be used only for bilateral previously agreed tests +transient template_is_experimental = 1 : hidden; include "grib2/template.4.parameter.def" include "grib2/template.4.generating_process.def" diff --git a/definitions/grib2/template.4.1100.def b/definitions/grib2/template.4.1100.def index 87016a586..ac65bc69f 100644 --- a/definitions/grib2/template.4.1100.def +++ b/definitions/grib2/template.4.1100.def @@ -1,7 +1,9 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 4.1100, Hovmoller-type grid with no averaging or other statistical processing -# This template is experimental, was not validated at the time of publication and should be used only for bilateral previously agreed tests +# This template is experimental, was not validated at the time of publication +# and should be used only for bilateral previously agreed tests +transient template_is_experimental = 1 : hidden; include "grib2/template.4.parameter.def" include "grib2/template.4.generating_process.def" diff --git a/definitions/grib2/template.4.1101.def b/definitions/grib2/template.4.1101.def index 6f27693f2..83e46a389 100644 --- a/definitions/grib2/template.4.1101.def +++ b/definitions/grib2/template.4.1101.def @@ -4,6 +4,7 @@ # This template is experimental, was not validated at the time of publication and should be used only for bilateral previously agreed tests. # (Octets 35-50 are very similar to octets 43-58 of product definition template 4.8, but the meaning of some fields differs slightly) +transient template_is_experimental = 1 : hidden; include "grib2/template.4.parameter.def" include "grib2/template.4.generating_process.def" diff --git a/definitions/grib2/template.4.44.def b/definitions/grib2/template.4.44.def index fa1bf2d74..1fbadeec8 100644 --- a/definitions/grib2/template.4.44.def +++ b/definitions/grib2/template.4.44.def @@ -2,6 +2,7 @@ # TEMPLATE 4.44, Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for aerosol # It is recommended not to use this template. PDT 4.48 should be used instead with optical wave length range set to missing +transient template_is_deprecated = 1 : hidden; # GRIB-530: Special case for aerosol thanks to WMO error diff --git a/definitions/grib2/template.4.83.def b/definitions/grib2/template.4.83.def index a92e3cfd4..395931e68 100644 --- a/definitions/grib2/template.4.83.def +++ b/definitions/grib2/template.4.83.def @@ -1,7 +1,9 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 4.83, Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval with source/sink -# Note: This template is deprecated. Template 4.84 should be used instead. + +# It is recommended not to use this template. Product definition template 4.84 should be used instead because it contains an additional octet to specify the type of generating process +transient template_is_deprecated = 1 : hidden; include "grib2/template.4.parameter.def" include "grib2/template.4.aerosol.def" diff --git a/definitions/grib2/template.5.1.def b/definitions/grib2/template.5.1.def index 8f1c22bea..14864c9f5 100644 --- a/definitions/grib2/template.5.1.def +++ b/definitions/grib2/template.5.1.def @@ -1,8 +1,9 @@ # (C) Copyright 2005- ECMWF. # TEMPLATE 5.1, Matrix values at grid point - simple packing -# Preliminary note: + # This template was not validated at the time of publication and should be used with caution +transient template_is_experimental = 1 : hidden; include "grib2/template.5.packing.def" diff --git a/definitions/grib2/template.5.61.def b/definitions/grib2/template.5.61.def index 9c8e73a9e..f19db39ee 100644 --- a/definitions/grib2/template.5.61.def +++ b/definitions/grib2/template.5.61.def @@ -2,8 +2,9 @@ # TEMPLATE 5.61, Grid point data - Simple packing with logarithmic preprocessing -# Note from WMO document: # This template is experimental, was not validated at the time of publication and should be used only for bilateral previously agreed tests +transient template_is_experimental = 1 : hidden; + constant typeOfPreProcessing = 1; include "grib2/template.5.packing.def" diff --git a/definitions/grib2/template.7.1.def b/definitions/grib2/template.7.1.def index 7d49264b1..1426d4fe7 100644 --- a/definitions/grib2/template.7.1.def +++ b/definitions/grib2/template.7.1.def @@ -1,6 +1,8 @@ # (C) Copyright 2005- ECMWF. -# TEMPLATE 7.1, Matrix values at grid point -simple packing +# TEMPLATE 7.1, Matrix values at grid point - simple packing +# This template was not validated at the time of publication and should be used with caution +transient template_is_experimental = 1 : hidden; meta codedValues data_g2simple_packing( section7Length, diff --git a/definitions/grib2/template.7.61.def b/definitions/grib2/template.7.61.def index 328afbcaa..6f7f3fdd6 100644 --- a/definitions/grib2/template.7.61.def +++ b/definitions/grib2/template.7.61.def @@ -4,6 +4,7 @@ # Note from WMO document: # This template is experimental, was not validated at the time of publication and should be used only for bilateral previously agreed tests +transient template_is_deprecated = 1 : hidden; meta codedValues data_g2simple_packing_with_preprocessing( section7Length, From c6ef32e28cb017e1b78efde757bb0afc9d6201ec Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 17:33:28 +0000 Subject: [PATCH 120/244] ECC-1779: Test --- tests/grib2_templates.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/grib2_templates.sh b/tests/grib2_templates.sh index 437eb36b1..024dd26dd 100755 --- a/tests/grib2_templates.sh +++ b/tests/grib2_templates.sh @@ -180,6 +180,21 @@ test_PDTN_conversions 57 67 test_PDTN_conversions 58 68 test_PDTN_conversions 71 73 +# ECC-1779: Deprecated and experimental templates +# ------------------------------------------------ +grib_check_key_equals $sample2 isTemplateDeprecated,isTemplateExperimental '0 0' + +$tools_dir/grib_set -s productDefinitionTemplateNumber=44 $sample2 $temp +grib_check_key_equals $temp isTemplateDeprecated,isTemplateExperimental '1 0' + +$tools_dir/grib_set -s productDefinitionTemplateNumber=10 $sample2 $temp +grib_check_key_equals $temp isTemplateDeprecated,isTemplateExperimental '0 1' + +$tools_dir/grib_set -s gridType=cross_section $sample2 $temp +grib_check_key_equals $temp isTemplateDeprecated,isTemplateExperimental '0 1' +$tools_dir/grib_set -s gridType=time_section $sample2 $temp +grib_check_key_equals $temp isTemplateDeprecated,isTemplateExperimental '0 1' + # Clean up rm -f $temp $temp1 $temp2 $tempFilt $tempText From 16c99d7f36f3abcacbe7ab25b426eec864a653c3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 29 Feb 2024 21:38:15 +0000 Subject: [PATCH 121/244] Testing: dump on repeated keys --- tests/grib_dump.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/grib_dump.sh b/tests/grib_dump.sh index c2844ec0d..c413f93f1 100755 --- a/tests/grib_dump.sh +++ b/tests/grib_dump.sh @@ -111,6 +111,16 @@ file=$data_dir/sample.grib2 ECCODES_DEBUG=1 ${tools_dir}/grib_dump $file > $temp 2>&1 +# Repeated key numberOfSection +file=$data_dir/sample.grib2 +${tools_dir}/grib_dump -O $file > $temp +grep -q "numberOfSection = 1" $temp +grep -q "numberOfSection = 3" $temp +grep -q "numberOfSection = 4" $temp +grep -q "numberOfSection = 5" $temp +grep -q "numberOfSection = 7" $temp + + # Dump long array # ---------------- input=$data_dir/lfpw.grib1 From 41ed4d12c83ae047af74c19b5e6acb462b1d592b Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 12:10:27 +0000 Subject: [PATCH 122/244] Tools: Dead code removal --- tools/bufr_compare.cc | 25 ++++++------------------- tools/grib_compare.cc | 15 ++------------- tools/gts_compare.cc | 10 +++------- tools/metar_compare.cc | 18 +++--------------- 4 files changed, 14 insertions(+), 54 deletions(-) diff --git a/tools/bufr_compare.cc b/tools/bufr_compare.cc index c6714fedb..3fa715669 100644 --- a/tools/bufr_compare.cc +++ b/tools/bufr_compare.cc @@ -236,7 +236,7 @@ int grib_tool_before_getopt(grib_runtime_options* options) int grib_tool_init(grib_runtime_options* options) { - int ret = 0, i; + int ret = 0; grib_context* context = grib_context_get_default(); options->strict = 1; @@ -315,16 +315,6 @@ int grib_tool_init(grib_runtime_options* options) compare_double = &compare_double_absolute; if (grib_options_on("R:")) { global_tolerance = 0; - for (i = 0; i < options->tolerance_count; i++) { - if (!strcmp((options->tolerance[i]).name, "all")) { - global_tolerance = (options->tolerance[i]).double_value; - break; - } - if (!strcmp((options->tolerance[i]).name, "global")) { - global_tolerance = (options->tolerance[i]).double_value; - break; - } - } compare_double = &compare_double_relative; compareAbsolute = 0; } @@ -342,9 +332,9 @@ int grib_tool_init(grib_runtime_options* options) tolerance_factor = atof(grib_options_get_option("t:")); if (grib_options_on("R:")) { - char* sarg = grib_options_get_option("R:"); + char* sarg = grib_options_get_option("R:"); options->tolerance_count = MAX_KEYS; - ret = parse_keyval_string(tool_name, sarg, 1, GRIB_TYPE_DOUBLE, options->tolerance, &(options->tolerance_count)); + ret = parse_keyval_string(tool_name, sarg, 1, GRIB_TYPE_DOUBLE, options->tolerance, &(options->tolerance_count)); if (ret == GRIB_INVALID_ARGUMENT) { usage(); exit(1); @@ -771,11 +761,10 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g return GRIB_COUNT_MISMATCH; } */ - if (options->mode != MODE_BUFR) { + Assert(options->mode == MODE_BUFR); /* TODO: Ignore missing values for keys in BUFR. Not yet implemented */ //isMissing1 = ((grib_is_missing(handle1, name, &err1) == 1) && (err1 == 0)) ? 1 : 0; //isMissing2 = ((grib_is_missing(handle2, name, &err2) == 1) && (err2 == 0)) ? 1 : 0; - } if ((isMissing1 == 1) && (isMissing2 == 1)) { // if (verbose) printf(" is set to missing in both fields\n"); @@ -1081,16 +1070,14 @@ static int compare_values(grib_runtime_options* options, grib_handle* handle1, g break; case GRIB_TYPE_BYTES: - if (options->mode == MODE_BUFR) - return 0; + return 0; // Not in BUFR break; case GRIB_TYPE_LABEL: break; default: - if (verbose) - printf("\n"); + if (verbose) printf("\n"); printInfo(handle1); save_error(c, name); printf("Cannot compare [%s], unsupported type %d\n", name, type1); diff --git a/tools/grib_compare.cc b/tools/grib_compare.cc index e70119d6d..f9f4d0977 100644 --- a/tools/grib_compare.cc +++ b/tools/grib_compare.cc @@ -330,18 +330,7 @@ int grib_tool_init(grib_runtime_options* options) global_tolerance = 0; compare_double = &compare_double_absolute; if (grib_options_on("R:")) { - int i; global_tolerance = 0; - for (i = 0; i < options->tolerance_count; i++) { - if (!strcmp((options->tolerance[i]).name, "all")) { - global_tolerance = (options->tolerance[i]).double_value; - break; - } - if (!strcmp((options->tolerance[i]).name, "global")) { - global_tolerance = (options->tolerance[i]).double_value; - break; - } - } compare_double = &compare_double_relative; compareAbsolute = 0; } @@ -374,9 +363,9 @@ int grib_tool_init(grib_runtime_options* options) tolerance_factor = atof(grib_options_get_option("T:")); if (grib_options_on("R:")) { - char* sarg = grib_options_get_option("R:"); + char* sarg = grib_options_get_option("R:"); options->tolerance_count = MAX_KEYS; - ret = parse_keyval_string(tool_name, sarg, 1, GRIB_TYPE_DOUBLE, options->tolerance, &(options->tolerance_count)); + ret = parse_keyval_string(tool_name, sarg, 1, GRIB_TYPE_DOUBLE, options->tolerance, &(options->tolerance_count)); if (ret == GRIB_INVALID_ARGUMENT) { usage(); exit(1); diff --git a/tools/gts_compare.cc b/tools/gts_compare.cc index cedbfa4b6..9133b3435 100644 --- a/tools/gts_compare.cc +++ b/tools/gts_compare.cc @@ -439,12 +439,10 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, save_error(c, name); return err; } - - //if (options->mode != MODE_GTS) { + Assert(options->mode == MODE_GTS); /* TODO: Ignore missing values for keys in GTS. Not yet implemented */ //isMissing1 = ((grib_is_missing(h1, name, &err1) == 1) && (err1 == 0)) ? 1 : 0; //isMissing2 = ((grib_is_missing(h2, name, &err2) == 1) && (err2 == 0)) ? 1 : 0; - //} if ((isMissing1 == 1) && (isMissing2 == 1)) { if (verbose) @@ -573,10 +571,8 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, break; case GRIB_TYPE_BYTES: - if (options->mode == MODE_GTS) { - // We do not want to compare the message itself - return 0; - } + // We do not want to compare the message itself + return 0; break; case GRIB_TYPE_LABEL: diff --git a/tools/metar_compare.cc b/tools/metar_compare.cc index 973794988..e4318bd44 100644 --- a/tools/metar_compare.cc +++ b/tools/metar_compare.cc @@ -249,16 +249,6 @@ int grib_tool_init(grib_runtime_options* options) compare_double = &compare_double_absolute; if (grib_options_on("R:")) { global_tolerance = 0; - for (int i = 0; i < options->tolerance_count; i++) { - if (!strcmp((options->tolerance[i]).name, "all")) { - global_tolerance = (options->tolerance[i]).double_value; - break; - } - if (!strcmp((options->tolerance[i]).name, "global")) { - global_tolerance = (options->tolerance[i]).double_value; - break; - } - } compare_double = &compare_double_relative; compareAbsolute = 0; } @@ -276,7 +266,7 @@ int grib_tool_init(grib_runtime_options* options) tolerance_factor = atof(grib_options_get_option("t:")); if (grib_options_on("R:")) { - char* sarg = grib_options_get_option("R:"); + char* sarg = grib_options_get_option("R:"); options->tolerance_count = MAX_KEYS; int err = parse_keyval_string(tool_name, sarg, 1, GRIB_TYPE_DOUBLE, options->tolerance, &(options->tolerance_count)); if (err == GRIB_INVALID_ARGUMENT) { @@ -514,11 +504,10 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, return err; } - // if (options->mode != MODE_METAR) { + Assert(options->mode == MODE_METAR); // // TODO: Ignore missing values for keys in METAR. Not yet implemented // isMissing1 = ((grib_is_missing(h1, name, &err1) == 1) && (err1 == 0)) ? 1 : 0; // isMissing2 = ((grib_is_missing(h2, name, &err2) == 1) && (err2 == 0)) ? 1 : 0; - // } if ((isMissing1 == 1) && (isMissing2 == 1)) { if (verbose) @@ -746,8 +735,7 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, break; case GRIB_TYPE_BYTES: - if (options->mode == MODE_METAR) - return 0; + return 0; // No such type for METAR break; case GRIB_TYPE_LABEL: From 6941c672b9cba2c2abca37efefdd744a35c613b0 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 12:10:51 +0000 Subject: [PATCH 123/244] ECC-1779: Comment --- definitions/grib2/boot.def | 3 +++ 1 file changed, 3 insertions(+) diff --git a/definitions/grib2/boot.def b/definitions/grib2/boot.def index 5c3be280c..d2c44fb74 100644 --- a/definitions/grib2/boot.def +++ b/definitions/grib2/boot.def @@ -44,6 +44,9 @@ template core "grib2/sections.def"; template section_8 "grib2/section.8.def"; +# ECC-1779: Add keys to identify experimental and deprecated templates +# The low-level transient keys template_is_XXX +# are set inside the template definition files concept isTemplateDeprecated(false) { 1 = { template_is_deprecated = 1; } } From 40357e1dbe9ad02687194ec602a605b3ec7fc49e Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 14:07:30 +0000 Subject: [PATCH 124/244] Testing: Split grib_filter tests --- tests/CMakeLists.txt | 1 + tests/grib_filter.sh | 81 ---------------------------- tests/grib_filter_fail.sh | 111 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 81 deletions(-) create mode 100755 tests/grib_filter_fail.sh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 092d9ea83..55bf2adee 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -301,6 +301,7 @@ if( HAVE_BUILD_TOOLS ) grib_ls grib_ls_json grib_filter + grib_filter_fail grib_multi grib_nearest_test pseudo_budg diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh index c4e6a4021..250302890 100755 --- a/tests/grib_filter.sh +++ b/tests/grib_filter.sh @@ -36,24 +36,6 @@ rm -f ${data_dir}/split/* rmdir ${data_dir}/split rm -f ${data_dir}/f.rules -echo "Test with nonexistent keys. Note spelling of centre!" -# --------------------------------------------------------- -cat >${data_dir}/nonexkey.rules < $REDIRECT > $REDIRECT -if [ $? -eq 0 ]; then - echo "grib_filter should have failed if key not found" >&2 - exit 1 -fi -set -e -# Now repeat with -f option (do not exit on error) -${tools_dir}/grib_filter -f ${data_dir}/nonexkey.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT - -rm -f ${data_dir}/nonexkey.rules - echo "Test GRIB-308: format specifier for integer keys" # ---------------------------------------------------- cat > ${data_dir}/formatint.rules < $tempOut grep -q "defined and equal to -42" $tempOut -echo "Test IEEE float overflow" -# ----------------------------------------- -input="${samp_dir}/GRIB2.tmpl" -cat >$tempFilt < $tempOut -status=$? -set -e -[ $status -ne 0 ] -grep -q "ECCODES ERROR.*Number is too large" $tempOut - - echo "Padded count for filenames" # ----------------------------------------- input=${data_dir}/tigge_af_ecmwf.grib2 @@ -378,16 +345,6 @@ EOF ${tools_dir}/grib_filter $tempFilt $ECCODES_SAMPLES_PATH/GRIB2.tmpl > $tempOut -cat >$tempFilt < $tempOut -status=$? -set -e -[ $status -ne 0 ] -grep "Assertion failure" $tempOut - # Use of the "length" expression cat >$tempFilt < $tempOut 2>&1 -status=$? -set -e -[ $status -ne 0 ] -grep -q "Invalid argument" $tempOut - # GTS header # --------------- @@ -463,27 +413,6 @@ set -e [ $status -ne 0 ] -# Bad write -set +e -echo 'write "/";' | ${tools_dir}/grib_filter - $input > $tempOut 2>&1 -status=$? -set -e -[ $status -ne 0 ] -grep -q "Unable to open file" $tempOut - -# Signed bits -# ----------- -cat >$tempFilt < $tempOut 2>&1 -status=$? -set -e -[ $status -ne 0 ] - - # Setting step # ------------- input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl @@ -505,16 +434,6 @@ EOF ${tools_dir}/grib_filter $tempFilt $input -# Bad filter -# ---------------- -set +e -${tools_dir}/grib_filter a_non_existent_filter_file $ECCODES_SAMPLES_PATH/GRIB2.tmpl > $tempOut 2>&1 -status=$? -set -e -[ $status -ne 0 ] -grep -q "Cannot include file" $tempOut - - # Clean up rm -f $tempGrib $tempFilt $tempOut $tempRef rm -f ${data_dir}/formatint.rules ${data_dir}/binop.rules diff --git a/tests/grib_filter_fail.sh b/tests/grib_filter_fail.sh new file mode 100755 index 000000000..cf66e7b6c --- /dev/null +++ b/tests/grib_filter_fail.sh @@ -0,0 +1,111 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +REDIRECT=/dev/null + +label="grib_filter_fail_test" +tempFilt="temp.$label.filt" +tempGrib="temp.$label.grib" +tempOut="temp.$label.txt" +tempRef="temp.$label.ref" + +echo "Test with nonexistent keys. Note spelling of centre!" +# --------------------------------------------------------- +cat >${data_dir}/nonexkey.rules < $REDIRECT > $REDIRECT +if [ $? -eq 0 ]; then + echo "grib_filter should have failed if key not found" >&2 + exit 1 +fi +set -e + +# Now repeat with -f option (do not exit on error) +${tools_dir}/grib_filter -f ${data_dir}/nonexkey.rules ${data_dir}/tigge_pf_ecmwf.grib2 2> $REDIRECT > $REDIRECT + +rm -f ${data_dir}/nonexkey.rules + +echo "Test IEEE float overflow" +# ----------------------------------------- +input="${samp_dir}/GRIB2.tmpl" +cat >$tempFilt < $tempOut +status=$? +set -e +[ $status -ne 0 ] +grep -q "ECCODES ERROR.*Number is too large" $tempOut + +# Assert statement +# ----------------- +cat >$tempFilt < $tempOut +status=$? +set -e +[ $status -ne 0 ] +grep "Assertion failure" $tempOut + + +# Bad write +# --------- +input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl + +set +e +echo 'write(-10);' | ${tools_dir}/grib_filter -o $tempGrib - $input > $tempOut 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Invalid argument" $tempOut + +# Bad write +# ---------- +set +e +echo 'write "/";' | ${tools_dir}/grib_filter - $input > $tempOut 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Unable to open file" $tempOut + +# Signed bits +# ----------- +cat >$tempFilt < $tempOut 2>&1 +status=$? +set -e +[ $status -ne 0 ] + + +# Non existent filter +# -------------------- +set +e +${tools_dir}/grib_filter a_non_existent_filter_file $ECCODES_SAMPLES_PATH/GRIB2.tmpl > $tempOut 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Cannot include file" $tempOut + + +# Clean up +rm -f $tempGrib $tempFilt $tempOut $tempRef From 3b2ed365d92d7948f4c801cdf37e6db94fab1b05 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 14:57:25 +0000 Subject: [PATCH 125/244] ECC-1780: GRIB HEALPix: In the 'geography' namespace replace 'pointsOrdering' with 'orderingConvention' --- definitions/grib2/template.3.healpix.def | 2 +- tests/CMakeLists.txt | 1 + tests/grib_grid_healpix.sh | 3 ++- tests/grib_units_bias_factor.sh | 34 ++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100755 tests/grib_units_bias_factor.sh diff --git a/definitions/grib2/template.3.healpix.def b/definitions/grib2/template.3.healpix.def index bd59c3246..bf0429a5b 100644 --- a/definitions/grib2/template.3.healpix.def +++ b/definitions/grib2/template.3.healpix.def @@ -27,7 +27,7 @@ concept orderingConvention(unknown) { "ring" = { ordering = 0; } "nested" = { ordering = 1; } } : dump; -alias geography.pointsOrdering = orderingConvention; +alias geography.orderingConvention = orderingConvention; flags[1] scanningMode 'grib2/tables/[tablesVersion]/3.13.table'; flagbit iScansNegatively(scanningMode,7) : dump; # WMO bit 1 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 55bf2adee..2a211f511 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -169,6 +169,7 @@ if( HAVE_BUILD_TOOLS ) # and/or take much longer list(APPEND tests_extra grib_data_quality_checks + grib_units_bias_factor grib_set_large_message_fail grib_g1monthlydate grib_g1fcperiod diff --git a/tests/grib_grid_healpix.sh b/tests/grib_grid_healpix.sh index 9b3560693..59652e57b 100755 --- a/tests/grib_grid_healpix.sh +++ b/tests/grib_grid_healpix.sh @@ -42,7 +42,8 @@ if [ $latest -gt 31 ]; then fi ${tools_dir}/grib_dump -O -p section_3 $tempGrib -${tools_dir}/grib_ls -jn geography $tempGrib +${tools_dir}/grib_ls -jn geography $tempGrib > $tempLog +grep -q "orderingConvention.*ring" $tempLog # Geoiterator # ------------- diff --git a/tests/grib_units_bias_factor.sh b/tests/grib_units_bias_factor.sh new file mode 100755 index 000000000..e10662d7a --- /dev/null +++ b/tests/grib_units_bias_factor.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +label="grib_units_bias_factor_test" +outfile=temp.$label.grib + +infile=${data_dir}/sample.grib2 +max=`${tools_dir}/grib_get -F%.3f -p max $infile` +[ "$max" = "311.099" ] + +${tools_dir}/grib_set -rs unitsFactor=1.1,unitsBias=4 $infile $outfile +max=`${tools_dir}/grib_get -F%.3f -p max $outfile` +[ "$max" = "346.209" ] + +${tools_dir}/grib_set -rs unitsFactor=2 $infile $outfile +max=`${tools_dir}/grib_get -F%.3f -p max $outfile` +[ "$max" = "622.197" ] + +${tools_dir}/grib_set -rs unitsBias=4 $infile $outfile +max=`${tools_dir}/grib_get -F%.3f -p max $outfile` +[ "$max" = "315.099" ] + + +# Clean up +rm -f $outfile From d0caf0e4cf97fb2bad8e5c946fd4b74e6dca5da0 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 15:24:56 +0000 Subject: [PATCH 126/244] Refactoring --- ...ib_accessor_class_data_g1simple_packing.cc | 18 ++++++---- ...ib_accessor_class_data_g2simple_packing.cc | 17 ++++++---- ...ib_accessor_class_data_jpeg2000_packing.cc | 19 +++++++---- ...grib_accessor_class_data_simple_packing.cc | 17 ++++++---- tests/grib_units_bias_factor.sh | 33 ++++++++++++------- 5 files changed, 67 insertions(+), 37 deletions(-) diff --git a/src/grib_accessor_class_data_g1simple_packing.cc b/src/grib_accessor_class_data_g1simple_packing.cc index e9f4aefdc..82c72c64c 100644 --- a/src/grib_accessor_class_data_g1simple_packing.cc +++ b/src/grib_accessor_class_data_g1simple_packing.cc @@ -194,16 +194,22 @@ static int pack_double(grib_accessor* a, const double* cval, size_t* len) } if (units_factor != 1.0) { - if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] = val[i] * units_factor + units_bias; - else - for (i = 0; i < n_vals; i++) + } + } + else { + for (i = 0; i < n_vals; i++) { val[i] *= units_factor; + } + } } - else if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + else if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] += units_bias; + } + } if (c->ieee_packing && self->ieee_packing) { long precision = 0; /* Either 1(=32 bits) or 2(=64 bits) */ diff --git a/src/grib_accessor_class_data_g2simple_packing.cc b/src/grib_accessor_class_data_g2simple_packing.cc index 69e1bdbc9..56441fc96 100644 --- a/src/grib_accessor_class_data_g2simple_packing.cc +++ b/src/grib_accessor_class_data_g2simple_packing.cc @@ -177,16 +177,21 @@ static int pack_double(grib_accessor* a, const double* cval, size_t* len) } if (units_factor != 1.0) { - if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] = val[i] * units_factor + units_bias; - else - for (i = 0; i < n_vals; i++) + } + } else { + for (i = 0; i < n_vals; i++) { val[i] *= units_factor; + } + } } - else if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + else if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] += units_bias; + } + } /* IEEE packing */ if (c->ieee_packing) { diff --git a/src/grib_accessor_class_data_jpeg2000_packing.cc b/src/grib_accessor_class_data_jpeg2000_packing.cc index 66d6f6767..b00160214 100644 --- a/src/grib_accessor_class_data_jpeg2000_packing.cc +++ b/src/grib_accessor_class_data_jpeg2000_packing.cc @@ -225,7 +225,7 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) grib_accessor_data_jpeg2000_packing* self = (grib_accessor_data_jpeg2000_packing*)a; int err = GRIB_SUCCESS; - int i; + size_t i = 0; size_t buflen = grib_byte_count(a); double bscale = 0; @@ -304,16 +304,21 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) val[i] = (val[i] * bscale + reference_value) * dscale; } if (units_factor != 1.0) { - if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] = val[i] * units_factor + units_bias; - else - for (i = 0; i < n_vals; i++) + } + } else { + for (i = 0; i < n_vals; i++) { val[i] *= units_factor; + } + } } - else if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + else if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] += units_bias; + } + } return err; } diff --git a/src/grib_accessor_class_data_simple_packing.cc b/src/grib_accessor_class_data_simple_packing.cc index 0d44acd7f..e78bda53c 100644 --- a/src/grib_accessor_class_data_simple_packing.cc +++ b/src/grib_accessor_class_data_simple_packing.cc @@ -406,16 +406,21 @@ static int unpack(grib_accessor* a, T* val, size_t* len) *len = (long)n_vals; if (units_factor != 1.0) { - if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] = val[i] * units_factor + units_bias; - else - for (i = 0; i < n_vals; i++) + } + } else { + for (i = 0; i < n_vals; i++) { val[i] *= units_factor; + } + } } - else if (units_bias != 0.0) - for (i = 0; i < n_vals; i++) + else if (units_bias != 0.0) { + for (i = 0; i < n_vals; i++) { val[i] += units_bias; + } + } return err; } diff --git a/tests/grib_units_bias_factor.sh b/tests/grib_units_bias_factor.sh index e10662d7a..4dbc9db81 100755 --- a/tests/grib_units_bias_factor.sh +++ b/tests/grib_units_bias_factor.sh @@ -13,22 +13,31 @@ label="grib_units_bias_factor_test" outfile=temp.$label.grib -infile=${data_dir}/sample.grib2 -max=`${tools_dir}/grib_get -F%.3f -p max $infile` -[ "$max" = "311.099" ] +infiles="${data_dir}/sample.grib2 ${data_dir}/regular_latlon_surface.grib1" +for infile in $infiles; do + #infile=${data_dir}/sample.grib2 + max=`${tools_dir}/grib_get -F%.3f -p max $infile` + [ "$max" = "311.099" ] -${tools_dir}/grib_set -rs unitsFactor=1.1,unitsBias=4 $infile $outfile -max=`${tools_dir}/grib_get -F%.3f -p max $outfile` -[ "$max" = "346.209" ] + ${tools_dir}/grib_set -rs unitsFactor=1.1,unitsBias=4 $infile $outfile + max=`${tools_dir}/grib_get -F%.3f -p max $outfile` + [ "$max" = "346.209" ] -${tools_dir}/grib_set -rs unitsFactor=2 $infile $outfile -max=`${tools_dir}/grib_get -F%.3f -p max $outfile` -[ "$max" = "622.197" ] + ${tools_dir}/grib_set -rs unitsFactor=2 $infile $outfile + max=`${tools_dir}/grib_get -F%.3f -p max $outfile` + [ "$max" = "622.197" ] -${tools_dir}/grib_set -rs unitsBias=4 $infile $outfile -max=`${tools_dir}/grib_get -F%.3f -p max $outfile` -[ "$max" = "315.099" ] + ${tools_dir}/grib_set -rs unitsBias=4 $infile $outfile + max=`${tools_dir}/grib_get -F%.3f -p max $outfile` + [ "$max" = "315.099" ] +done +if [ $HAVE_JPEG -eq 1 ]; then + infile=${data_dir}/jpeg.grib2 + ${tools_dir}/grib_get -p max -s unitsBias=1.5 $infile $outfile + ${tools_dir}/grib_get -p min -s unitsFactor=2 $infile $outfile + ${tools_dir}/grib_get -p avg -s unitsFactor=1.1,unitsBias=100 $infile $outfile +fi # Clean up rm -f $outfile From fdd650cba9788b98e791f8c69f38ebf5742d9e98 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Fri, 1 Mar 2024 17:18:18 +0000 Subject: [PATCH 127/244] GTS: Another instance of ECC-735 --- src/grib_io.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grib_io.cc b/src/grib_io.cc index c47e4d509..b20dbce7b 100644 --- a/src/grib_io.cc +++ b/src/grib_io.cc @@ -952,7 +952,7 @@ static int read_any_gts(reader* r) unsigned long magic = 0; unsigned long start = 0x010d0d0a; /* SOH CR CR LF */ unsigned long theEnd = 0x0d0d0a03; /* CR CR LF ETX */ - unsigned char tmp[1024] = {0,}; /* See ECC-735 */ + unsigned char tmp[16384] = {0,}; /* See ECC-735 */ size_t message_size = 0; size_t already_read = 0; int i = 0; From 40b0f34701ee3b72624db14d7be5c4ee34672f29 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 23:01:36 +0000 Subject: [PATCH 128/244] Bamboo CIE: Enable extra tools --- bamboo/flags.cmake | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bamboo/flags.cmake b/bamboo/flags.cmake index 832133409..b434036aa 100644 --- a/bamboo/flags.cmake +++ b/bamboo/flags.cmake @@ -1,4 +1,5 @@ -SET(ENABLE_EXTRA_TESTS ON CACHE BOOL "Enable extra tests") -SET(ENABLE_ECCODES_THREADS ON CACHE BOOL "Enable POSIX threads") -SET(ENABLE_MEMFS ON CACHE BOOL "Enable MEMFS") +SET(ENABLE_EXTRA_TESTS ON CACHE BOOL "Enable extra tests") +SET(ECCODES_INSTALL_EXTRA_TOOLS ON CACHE BOOL "Install extra tools") +SET(ENABLE_ECCODES_THREADS ON CACHE BOOL "Enable POSIX threads") +SET(ENABLE_MEMFS ON CACHE BOOL "Enable MEMFS") # SET(ENABLE_JPG_LIBOPENJPEG OFF CACHE BOOL "Disable OpenJPEG") From 4112313874e5c77854dd17991e2e9484274f75c6 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 23:12:05 +0000 Subject: [PATCH 129/244] Make local function static --- src/action_class_template.cc | 9 +++------ src/eccodes_prototypes.h | 1 - 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/action_class_template.cc b/src/action_class_template.cc index 8f240ea27..33a753513 100644 --- a/src/action_class_template.cc +++ b/src/action_class_template.cc @@ -10,7 +10,6 @@ /*************************************************************************** * Jean Baptiste Filippi - 01.11.2005 * - * Enrico Fucile * ***************************************************************************/ #include "grib_api_internal.h" @@ -115,19 +114,17 @@ static void dump(grib_action* act, FILE* f, int lvl) grib_context_print(act->context, f, "Template %s %s\n", act->name, a->arg); } -grib_action* get_empty_template(grib_context* c, int* err) +static grib_action* get_empty_template(grib_context* c, int* err) { char fname[] = "empty_template.def"; - char* path = 0; - - path = grib_context_full_defs_path(c, fname); + char* path = grib_context_full_defs_path(c, fname); if (path) { *err = GRIB_SUCCESS; return grib_parse_file(c, path); } else { *err = GRIB_INTERNAL_ERROR; - grib_context_log(c, GRIB_LOG_ERROR, "get_empty_template: unable to get template %s", fname); + grib_context_log(c, GRIB_LOG_ERROR, "%s: Unable to get template %s", __func__, fname); return NULL; } } diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 34a63088f..67ae32d11 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -57,7 +57,6 @@ grib_action* grib_action_create_assert(grib_context* context, grib_expression* e /* action_class_template.cc*/ grib_action* grib_action_create_template(grib_context* context, int nofail, const char* name, const char* arg1); -grib_action* get_empty_template(grib_context* c, int* err); /* action_class_trigger.cc*/ grib_action* grib_action_create_trigger(grib_context* context, grib_arguments* args, grib_action* block); From e24fdb90f1f37defde75938f8ba456a77c68c7d7 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 23:34:10 +0000 Subject: [PATCH 130/244] Rename template to sample --- src/eccodes_prototypes.h | 4 ++-- src/grib_handle.cc | 7 +++---- src/grib_templates.cc | 34 ++++++++++++++++++---------------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 67ae32d11..73f47e3a3 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1101,8 +1101,8 @@ double grib_power(long s, long n); long grib_get_binary_scale_fact(double max, double min, long bpval, int* error); /* grib_templates.cc*/ -grib_handle* codes_external_template(grib_context* c, ProductKind product_kind, const char* name); -char* get_external_template_path(grib_context* c, const char* name); +grib_handle* codes_external_sample(grib_context* c, ProductKind product_kind, const char* name); +char* get_external_sample_path(grib_context* c, const char* name); /* grib_dependency.cc*/ grib_handle* grib_handle_of_accessor(const grib_accessor* a); diff --git a/src/grib_handle.cc b/src/grib_handle.cc index e1c361eba..732537f12 100644 --- a/src/grib_handle.cc +++ b/src/grib_handle.cc @@ -10,7 +10,6 @@ /*************************************************************************** * Jean Baptiste Filippi - 01.11.2005 * - * Enrico Fucile * ***************************************************************************/ #include "grib_api_internal.h" @@ -228,7 +227,7 @@ grib_handle* codes_handle_new_from_samples(grib_context* c, const char* name) fprintf(stderr, "ECCODES DEBUG codes_handle_new_from_samples '%s'\n", name); } - g = codes_external_template(c, PRODUCT_ANY, name); + g = codes_external_sample(c, PRODUCT_ANY, name); if (!g) { grib_context_log(c, GRIB_LOG_ERROR, "Unable to load sample file '%s.tmpl'\n" @@ -256,7 +255,7 @@ grib_handle* grib_handle_new_from_samples(grib_context* c, const char* name) fprintf(stderr, "ECCODES DEBUG grib_handle_new_from_samples '%s'\n", name); } - g = codes_external_template(c, PRODUCT_GRIB, name); + g = codes_external_sample(c, PRODUCT_GRIB, name); if (!g) grib_context_log(c, GRIB_LOG_ERROR, "Unable to load GRIB sample file '%s.tmpl'\n" @@ -279,7 +278,7 @@ grib_handle* codes_bufr_handle_new_from_samples(grib_context* c, const char* nam fprintf(stderr, "ECCODES DEBUG bufr_handle_new_from_samples '%s'\n", name); } - g = codes_external_template(c, PRODUCT_BUFR, name); + g = codes_external_sample(c, PRODUCT_BUFR, name); if (!g) { grib_context_log(c, GRIB_LOG_ERROR, "Unable to load BUFR sample file '%s.tmpl'\n" diff --git a/src/grib_templates.cc b/src/grib_templates.cc index 3e357382c..ca2076a2a 100644 --- a/src/grib_templates.cc +++ b/src/grib_templates.cc @@ -35,15 +35,15 @@ // return NULL; // } -/* Windows always has a colon in pathnames e.g. C:\temp\file. It uses semi-colons as delimiter */ +// Windows always has a colon in pathnames e.g. C:\temp\file. It uses semi-colons as delimiter #ifdef ECCODES_ON_WINDOWS #define ECC_PATH_DELIMITER_CHAR ';' #else #define ECC_PATH_DELIMITER_CHAR ':' #endif -/* if product_kind is PRODUCT_ANY, the type of sample file is determined at runtime */ -static grib_handle* try_product_template(grib_context* c, ProductKind product_kind, const char* dir, const char* name) +// if product_kind is PRODUCT_ANY, the type of sample file is determined at runtime +static grib_handle* try_product_sample(grib_context* c, ProductKind product_kind, const char* dir, const char* name) { char path[1024]; grib_handle* g = NULL; @@ -55,10 +55,10 @@ static grib_handle* try_product_template(grib_context* c, ProductKind product_ki snprintf(path, sizeof(path), "%s/%s.tmpl", dir, name); if (c->debug) { - fprintf(stderr, "ECCODES DEBUG try_product_template product=%s, path='%s'\n", codes_get_product_name(product_kind), path); + fprintf(stderr, "ECCODES DEBUG try_product_sample product=%s, path='%s'\n", codes_get_product_name(product_kind), path); } - if (codes_access(path, F_OK) == 0) { /* 0 means file exists */ + if (codes_access(path, F_OK) == 0) { // 0 means file exists FILE* f = codes_fopen(path, "r"); if (!f) { grib_context_log(c, GRIB_LOG_PERROR, "cannot open %s", path); @@ -66,7 +66,7 @@ static grib_handle* try_product_template(grib_context* c, ProductKind product_ki } if (product_kind == PRODUCT_ANY) { - /* Determine the product kind from sample file */ + // Determine the product kind from sample file char* mesg = NULL; size_t size = 0; off_t offset = 0; @@ -89,7 +89,7 @@ static grib_handle* try_product_template(grib_context* c, ProductKind product_ki if (product_kind == PRODUCT_BUFR) { g = codes_bufr_handle_new_from_file(c, f, &err); } else { - /* Note: Pseudo GRIBs like DIAG and BUDG also come here */ + // Note: Pseudo GRIBs like DIAG and BUDG also come here DEBUG_ASSERT(product_kind == PRODUCT_GRIB); g = grib_handle_new_from_file(c, f, &err); } @@ -102,22 +102,24 @@ static grib_handle* try_product_template(grib_context* c, ProductKind product_ki return g; } -static char* try_template_path(grib_context* c, const char* dir, const char* name) +static char* try_sample_path(grib_context* c, const char* dir, const char* name) { + // The ".tmpl" extension is historic. It should have been ".sample" char path[2048]; if (string_ends_with(name, ".tmpl")) snprintf(path, sizeof(path), "%s/%s", dir, name); else snprintf(path, sizeof(path), "%s/%s.tmpl", dir, name); - if (codes_access(path, F_OK) == 0) { /* 0 means file exists */ + if (codes_access(path, F_OK) == 0) { // 0 means file exists return grib_context_strdup(c, path); } return NULL; } -grib_handle* codes_external_template(grib_context* c, ProductKind product_kind, const char* name) +// External here means on disk +grib_handle* codes_external_sample(grib_context* c, ProductKind product_kind, const char* name) { const char* base = c->grib_samples_path; char buffer[1024]; @@ -130,21 +132,21 @@ grib_handle* codes_external_template(grib_context* c, ProductKind product_kind, while (*base) { if (*base == ECC_PATH_DELIMITER_CHAR) { *p = 0; - g = try_product_template(c, product_kind, buffer, name); + g = try_product_sample(c, product_kind, buffer, name); if (g) return g; p = buffer; - base++; /*advance past delimiter*/ + base++; //advance past delimiter } *p++ = *base++; } *p = 0; - g = try_product_template(c, product_kind, buffer, name); + g = try_product_sample(c, product_kind, buffer, name); return g; } -char* get_external_template_path(grib_context* c, const char* name) +char* get_external_sample_path(grib_context* c, const char* name) { const char* base = c->grib_samples_path; char buffer[1024]; @@ -157,7 +159,7 @@ char* get_external_template_path(grib_context* c, const char* name) while (*base) { if (*base == ECC_PATH_DELIMITER_CHAR) { *p = 0; - g = try_template_path(c, buffer, name); + g = try_sample_path(c, buffer, name); if (g) return g; p = buffer; @@ -167,5 +169,5 @@ char* get_external_template_path(grib_context* c, const char* name) } *p = 0; - return g = try_template_path(c, buffer, name); + return g = try_sample_path(c, buffer, name); } From 278ee348c4377fbb551f2c525c415a4be62d5266 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 1 Mar 2024 23:34:18 +0000 Subject: [PATCH 131/244] Rename template to sample --- tools/codes_export_resource.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/codes_export_resource.cc b/tools/codes_export_resource.cc index f2d484fbb..61a8b7db6 100644 --- a/tools/codes_export_resource.cc +++ b/tools/codes_export_resource.cc @@ -62,7 +62,7 @@ int main(int argc, char* argv[]) } if (resource_type == SAMPLE) { - full_path = get_external_template_path(c, resource_path); + full_path = get_external_sample_path(c, resource_path); } else if (resource_type == DEFINITION) { full_path = grib_context_full_defs_path(c, resource_path); From 71cabbf6ddb8a5df843cd4db6d17b9634aa59da3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 3 Mar 2024 19:05:57 +0000 Subject: [PATCH 132/244] C++ flags: Add them in a failsafe manner --- CMakeLists.txt | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f60682739..2b340ad1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,17 +73,11 @@ endif() ############################################################################### # some variables/options of this project -if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ) - ecbuild_add_cxx_flags("-Wno-write-strings") - ecbuild_add_cxx_flags("-Wno-deprecated") -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16) - ecbuild_add_cxx_flags("-Wno-write-strings") - ecbuild_add_cxx_flags("-Wno-deprecated") - else() - ecbuild_add_cxx_flags("-Wno-writable-strings") - endif() -elseif( CMAKE_CXX_COMPILER_ID STREQUAL "Cray" ) +ecbuild_add_cxx_flags("-Wno-write-strings" NO_FAIL) +ecbuild_add_cxx_flags("-Wno-writable-strings" NO_FAIL) +ecbuild_add_cxx_flags("-Wno-deprecated" NO_FAIL) + +if( CMAKE_CXX_COMPILER_ID STREQUAL "Cray" ) set(CMAKE_CXX_FLAGS "-hstd=c++11 ${CMAKE_CXX_FLAGS}") endif() From 12a2484c13ede467c17b0986fc795f51fcb295cf Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 10:25:35 +0000 Subject: [PATCH 133/244] Const correctness and cppcheck warnings --- src/eccodes_prototypes.h | 2 +- src/grib_accessor_classes_hash.cc | 2 +- src/grib_context.cc | 2 +- src/grib_hash_keys.cc | 2 +- src/make_accessor_class_hash.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 73f47e3a3..2ac2f9e13 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1104,7 +1104,7 @@ long grib_get_binary_scale_fact(double max, double min, long bpval, int* error); grib_handle* codes_external_sample(grib_context* c, ProductKind product_kind, const char* name); char* get_external_sample_path(grib_context* c, const char* name); -/* grib_dependency.cc*/ +/* grib_dependency.cc */ grib_handle* grib_handle_of_accessor(const grib_accessor* a); void grib_dependency_add(grib_accessor* observer, grib_accessor* observed); void grib_dependency_remove_observed(grib_accessor* observed); diff --git a/src/grib_accessor_classes_hash.cc b/src/grib_accessor_classes_hash.cc index 2643a32fb..5617c9456 100644 --- a/src/grib_accessor_classes_hash.cc +++ b/src/grib_accessor_classes_hash.cc @@ -35,7 +35,7 @@ #include "grib_accessor_class.h" #line 6 "accessor_class_list.gperf" -struct accessor_class_hash { char *name; grib_accessor_class **cclass;}; +struct accessor_class_hash { const char *name; grib_accessor_class **cclass;}; #define TOTAL_KEYWORDS 205 #define MIN_WORD_LENGTH 1 diff --git a/src/grib_context.cc b/src/grib_context.cc index 446481c4a..a22fcc654 100644 --- a/src/grib_context.cc +++ b/src/grib_context.cc @@ -453,7 +453,7 @@ grib_context* grib_context_get_default() #ifdef ECCODES_SAMPLES_PATH if (!default_grib_context.grib_samples_path) - default_grib_context.grib_samples_path = ECCODES_SAMPLES_PATH; + default_grib_context.grib_samples_path = (char*)ECCODES_SAMPLES_PATH; #endif default_grib_context.grib_definition_files_path = codes_getenv("ECCODES_DEFINITION_PATH"); diff --git a/src/grib_hash_keys.cc b/src/grib_hash_keys.cc index a71738e88..ba26dbe03 100644 --- a/src/grib_hash_keys.cc +++ b/src/grib_hash_keys.cc @@ -31,7 +31,7 @@ #include "grib_api_internal.h" -struct grib_keys_hash { char* name; int id;}; +struct grib_keys_hash { const char* name; int id;}; #include #define TOTAL_KEYWORDS 2535 diff --git a/src/make_accessor_class_hash.sh b/src/make_accessor_class_hash.sh index 8a3f26f79..72955ae4a 100755 --- a/src/make_accessor_class_hash.sh +++ b/src/make_accessor_class_hash.sh @@ -6,7 +6,7 @@ cat > accessor_class_list.gperf < Date: Mon, 4 Mar 2024 10:25:52 +0000 Subject: [PATCH 134/244] Const correctness and cppcheck warnings --- tests/list_all_keys.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/list_all_keys.sh b/tests/list_all_keys.sh index 573d166d6..78ee26631 100755 --- a/tests/list_all_keys.sh +++ b/tests/list_all_keys.sh @@ -32,7 +32,7 @@ cat >keys <> keys From f7ba64e1304910639a52e1f4f8d48e154edd9e1b Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 11:03:26 +0000 Subject: [PATCH 135/244] Openjpeg 2.5.2 fixes the problem with 2.5.1 --- src/grib_openjpeg_encoding.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/grib_openjpeg_encoding.cc b/src/grib_openjpeg_encoding.cc index 9b3b67566..f03ba2fcb 100644 --- a/src/grib_openjpeg_encoding.cc +++ b/src/grib_openjpeg_encoding.cc @@ -13,8 +13,10 @@ #if HAVE_LIBOPENJPEG #include "openjpeg.h" + // The older versions did not have the opj_config.h file -// So we use a more recent macro to detect whether it is there +// So we use a more recent macro to detect whether it is there. +// Also see https://github.com/uclouvain/openjpeg/issues/1514 #if defined(OPJ_IMG_INFO) #include "opj_config.h" #endif From 2482483e76f41d1dc9e1008ce6a4b6a662a9d58f Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 11:03:44 +0000 Subject: [PATCH 136/244] Const correctness and cppcheck warnings --- tools/grib_options.cc | 2 +- tools/grib_tools.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/grib_options.cc b/tools/grib_options.cc index f9ef49400..8059f1b0b 100644 --- a/tools/grib_options.cc +++ b/tools/grib_options.cc @@ -139,7 +139,7 @@ char* grib_options_get_option(const char* id) int i = 0; for (i = 0; i < grib_options_count; i++) { if (!strcmp(id, grib_options[i].id)) - return grib_options[i].value; + return (char*)grib_options[i].value; } return NULL; } diff --git a/tools/grib_tools.h b/tools/grib_tools.h index 34465b628..6f54074e1 100644 --- a/tools/grib_tools.h +++ b/tools/grib_tools.h @@ -83,7 +83,7 @@ typedef struct grib_option const char* help; int on; int command_line; - char* value; + const char* value; } grib_option; typedef struct grib_failed grib_failed; From 4e4b7676f91dcc1448b3560a6e67e79dc561862b Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 11:04:54 +0000 Subject: [PATCH 137/244] C++ flags: No need for suppressing writable-strings warnings --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b340ad1d..3ff3609ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,9 +73,9 @@ endif() ############################################################################### # some variables/options of this project -ecbuild_add_cxx_flags("-Wno-write-strings" NO_FAIL) -ecbuild_add_cxx_flags("-Wno-writable-strings" NO_FAIL) -ecbuild_add_cxx_flags("-Wno-deprecated" NO_FAIL) +# ecbuild_add_cxx_flags("-Wno-write-strings" NO_FAIL) +# ecbuild_add_cxx_flags("-Wno-writable-strings" NO_FAIL) +# ecbuild_add_cxx_flags("-Wno-deprecated" NO_FAIL) if( CMAKE_CXX_COMPILER_ID STREQUAL "Cray" ) set(CMAKE_CXX_FLAGS "-hstd=c++11 ${CMAKE_CXX_FLAGS}") From 33223f4c5abe9922cd7237cdf600d3e2e33e8005 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 12:55:25 +0000 Subject: [PATCH 138/244] Testing: skipping messages --- tests/grib_ls.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/grib_ls.sh b/tests/grib_ls.sh index bdbdba4d4..390df9d7c 100755 --- a/tests/grib_ls.sh +++ b/tests/grib_ls.sh @@ -172,6 +172,14 @@ grep -q "0 of 38 messages" $tempText ${tools_dir}/grib_ls -w units!=K $file > $tempText grep -q "30 of 38 messages" $tempText +${tools_dir}/grib_ls -w scaleFactorOfSecondFixedSurface=missing $file > $tempText +grep -q "36 of 38 messages" $tempText +${tools_dir}/grib_ls -w scaleFactorOfSecondFixedSurface!=missing $file > $tempText +grep -q "2 of 38 messages" $tempText + +${tools_dir}/grib_ls -w referenceValue=0 $file > $tempText +grep -q "11 of 38 messages" $tempText + file=mixed.grib # Has 14 messages ${tools_dir}/grib_ls -w packingType=grid_simple,gridType=regular_ll/regular_gg $file > $tempText grep -q "12 of 14 messages" $tempText From 3e3f0063cff534c8818d7cb713fc27e8016e396e Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 13:15:11 +0000 Subject: [PATCH 139/244] Tools: Dead code removal --- tools/grib_options.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tools/grib_options.cc b/tools/grib_options.cc index 8059f1b0b..c15de1d80 100644 --- a/tools/grib_options.cc +++ b/tools/grib_options.cc @@ -357,12 +357,6 @@ int grib_process_runtime_options(grib_context* context, int argc, char** argv, g else grib_gts_header_off(context); - if (grib_options_on("V")) { - printf("\necCodes Version "); - grib_print_api_version(stdout); - printf("\n\n"); - } - if (grib_options_on("s:")) { sarg = grib_options_get_option("s:"); options->set_values_count = MAX_KEYS; From 8347bbcae67583aa668e5c6a8b29747e66550bd6 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 13:15:49 +0000 Subject: [PATCH 140/244] Testing: Basic tools invocation --- tests/grib_ls.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/grib_ls.sh b/tests/grib_ls.sh index 390df9d7c..8e895b48a 100755 --- a/tests/grib_ls.sh +++ b/tests/grib_ls.sh @@ -32,6 +32,24 @@ set -e grep -q "Full documentation and examples at" $tempLog grep -q "https://confluence.ecmwf.int/display/ECC/grib_ls" $tempLog +set +e +${tools_dir}/grib_ls -? > $tempLog +status=$? +set -e +[ $status -ne 0 ] + +set +e +${tools_dir}/grib_ls -h > $tempLog +status=$? +set -e +[ $status -ne 0 ] + +set +e +DOXYGEN_USAGE=1 ${tools_dir}/grib_ls > $tempLog +status=$? +set -e +[ $status -ne 0 ] + ${tools_dir}/grib_ls -P count $infile > $tempLog ${tools_dir}/grib_ls -p count,step $infile >> $tempLog From 6f10faac1ca8ba89cf5973d31932e6d216270821 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 18:35:10 +0000 Subject: [PATCH 141/244] Testing: Several time ranges --- tests/grib_step.sh | 56 ++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/tests/grib_step.sh b/tests/grib_step.sh index e7e9e28ff..4ed45a3f1 100755 --- a/tests/grib_step.sh +++ b/tests/grib_step.sh @@ -14,8 +14,9 @@ REDIRECT=/dev/null label=grib_step_test tempGrb=${data_dir}/temp.$label.out.grib -templog=${data_dir}/temp.$label.log -rm -f $templog $tempGrb +tempLog=${data_dir}/temp.$label.log +tempFilt=${data_dir}/temp.$label.filt +rm -f $tempLog $tempGrb grib1_sample=$ECCODES_SAMPLES_PATH/GRIB1.tmpl grib2_sample=$ECCODES_SAMPLES_PATH/GRIB2.tmpl @@ -31,7 +32,7 @@ do #echo grib_set -s ${key}=$s ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb #grib_get -p step,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb ${tools_dir}/grib_get -p mars.step,stepRange,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange:l \ - ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb >> ${templog} + ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb >> $tempLog done done done @@ -44,7 +45,7 @@ do #echo grib_set -s ${key}=$s ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb #grib_ls -p step,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb ${tools_dir}/grib_get -p mars.step,stepRange,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange:l \ - ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb >> ${templog} + ${data_dir}/timeRangeIndicator_${i}.grib $tempGrb >> $tempLog done rm -f $tempGrb @@ -52,17 +53,17 @@ rm -f $tempGrb # test added for ifs stepType=max,min ${tools_dir}/grib_set -s stepType=max,startStep=3,endStep=6 ${data_dir}/reduced_gaussian_model_level.grib1 $tempGrb ${tools_dir}/grib_get -p mars.step,stepRange,startStep,endStep,P1,P2,timeRangeIndicator,indicatorOfUnitOfTimeRange:l \ - ${data_dir}/reduced_gaussian_model_level.grib1 $tempGrb >> ${templog} + ${data_dir}/reduced_gaussian_model_level.grib1 $tempGrb >> $tempLog rm -f $tempGrb -diff ${data_dir}/step.log ${templog} +diff ${data_dir}/step.log $tempLog -(${tools_dir}/grib_filter ${data_dir}/step_grib1.filter ${data_dir}/timeRangeIndicator_0.grib > ${templog}) 2>$REDIRECT +(${tools_dir}/grib_filter ${data_dir}/step_grib1.filter ${data_dir}/timeRangeIndicator_0.grib > $tempLog) 2>$REDIRECT -diff ${data_dir}/step_grib1.log ${templog} +diff ${data_dir}/step_grib1.log $tempLog -rm -f ${templog} +rm -f $tempLog # GRIB-180 # ------------ @@ -166,10 +167,10 @@ grib_check_key_equals $temp day 7 # Seconds (ignored) # ----------------- -${tools_dir}/grib_ls -s second=9 -n time $grib2_sample 2>$templog +${tools_dir}/grib_ls -s second=9 -n time $grib2_sample 2>$tempLog # Something should have been written to stderr -[ -s $templog ] -grep -q "Truncating time: non-zero seconds.* ignored" $templog +[ -s $tempLog ] +grep -q "Truncating time: non-zero seconds.* ignored" $tempLog # Hour or minute set to 255 # --------------------------- @@ -214,33 +215,50 @@ ECCODES_GRIBEX_MODE_ON=1 ${tools_dir}/grib_set -s stepRange=11-12 $input $temp grib_check_key_equals $temp P1,P2 '0 11' set +e -${tools_dir}/grib_set -s stepRange=11-12 $input $temp 2>$templog +${tools_dir}/grib_set -s stepRange=11-12 $input $temp 2>$tempLog status=$? set -e [ $status -ne 0 ] -grep -q "Unable to set stepRange" $templog +grep -q "Unable to set stepRange" $tempLog # GRIB1: sub-hourly # ----------------- ${tools_dir}/grib_set -s unitOfTimeRange=0,P1=5 $grib1_sample $temp set +e -${tools_dir}/grib_get -p step $temp 2>$templog +${tools_dir}/grib_get -p step $temp 2>$tempLog status=$? set -e [ $status -ne 0 ] -grep -q "unable to represent the step in h" $templog +grep -q "unable to represent the step in h" $tempLog # GRIB1: Unknown timeRangeIndicator ${tools_dir}/grib_set -s timeRangeIndicator=138 $grib1_sample $temp set +e -${tools_dir}/grib_get -p step $temp 2>$templog +${tools_dir}/grib_get -p step $temp 2>$tempLog status=$? set -e [ $status -ne 0 ] -grep -q "Unknown stepType" $templog +grep -q "Unknown stepType" $tempLog +# Several time ranges +# -------------------- +cat >$tempFilt < $tempLog +cat $tempLog +grep -q "255 8 7" $tempLog # Clean up -rm -f $temp $templog +rm -f $temp $tempLog $tempFilt rm -f $grib2File.p8tmp ${grib2File}.tmp x.grib From 0514d24a72d1c3144b93fa93f4663e2008e824bc Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 18:52:22 +0000 Subject: [PATCH 142/244] Testing: Cleanup --- tests/grib_bpv_limit.cc | 8 +------- tests/grib_ecc-1467.cc | 15 ++++----------- tests/grib_ecc-386.cc | 27 ++++----------------------- tests/grib_multi_from_message.cc | 28 +++++----------------------- 4 files changed, 14 insertions(+), 64 deletions(-) diff --git a/tests/grib_bpv_limit.cc b/tests/grib_bpv_limit.cc index b5a3af0f6..97be2e39c 100644 --- a/tests/grib_bpv_limit.cc +++ b/tests/grib_bpv_limit.cc @@ -25,12 +25,6 @@ static double compare_double_absolute(double a, double b, double tolerance) return ret; } -static void usage(const char* prog) -{ - fprintf(stderr, "usage: %s input\n", prog); - exit(1); -} - static int check_error_code(int err) { if (err == GRIB_INVALID_BPV || err == GRIB_DECODING_ERROR) @@ -49,7 +43,7 @@ int main(int argc, char** argv) grib_handle* h; char* filename; - if (argc < 2) usage(argv[0]); + Assert(argc == 2); filename = argv[1]; for (i = 0; i < 255; i++) { diff --git a/tests/grib_ecc-1467.cc b/tests/grib_ecc-1467.cc index 20a2b7268..3e20bdb08 100644 --- a/tests/grib_ecc-1467.cc +++ b/tests/grib_ecc-1467.cc @@ -26,21 +26,14 @@ int main(int argc, char** argv) double dmin, dmax, dval; float fval; - FILE* in = NULL; - const char* filename = 0; - codes_handle* h = NULL; - - if (argc != 2) { - fprintf(stderr, "usage: %s file\n", argv[0]); - return 1; - } - filename = argv[1]; + Assert(argc == 2); + const char* filename = argv[1]; printf("Opening %s\n", filename); - in = fopen(filename, "rb"); + FILE* in = fopen(filename, "rb"); Assert(in); - h = codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err); + codes_handle* h = codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err); Assert(h); CODES_CHECK(codes_get_float(h, "referenceValue", &fval), 0); diff --git a/tests/grib_ecc-386.cc b/tests/grib_ecc-386.cc index d4e238c4f..10f2adcdb 100644 --- a/tests/grib_ecc-386.cc +++ b/tests/grib_ecc-386.cc @@ -9,18 +9,11 @@ */ /* - * Description: Reads a GRIB message from file, measures read time. - * + * Description: Reads a GRIB message from file, measures time taken */ #include #include "grib_api_internal.h" -static void usage(const char* prog) -{ - printf("usage: %s filename\n", prog); - exit(1); -} - int main(int argc, char** argv) { grib_timer* tes = grib_get_timer(0, "decoding", 0, 0); @@ -33,21 +26,15 @@ int main(int argc, char** argv) const double duration_max = 3.6; /* seconds */ const int num_repetitions = 100; - if (argc < 2) usage(argv[0]); + if (argc < 2) return 1; in = fopen(argv[1], "rb"); - if (!in) { - printf("ERROR: unable to open file %s\n", argv[1]); - return 1; - } + Assert(in); /* create new handle */ err = 0; h = grib_handle_new_from_file(0, in, &err); - if (h == NULL) { - printf("Error: unable to create handle from file.\n"); - return 1; - } + Assert(h); /* get the size of the values array*/ GRIB_CHECK(grib_get_size(h, "values", &values_len), 0); @@ -72,9 +59,3 @@ int main(int argc, char** argv) fclose(in); return 0; } - -// int main(int argc, char** argv) -// { -// return 0; -// } -// #endif diff --git a/tests/grib_multi_from_message.cc b/tests/grib_multi_from_message.cc index 798230db5..1728e371c 100644 --- a/tests/grib_multi_from_message.cc +++ b/tests/grib_multi_from_message.cc @@ -8,25 +8,14 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/* - * test: reading GRIB2 multi fields messages from memory - */ +/* Test: reading GRIB2 multi fields messages from memory */ #include "grib_api_internal.h" - -static void usage(const char* prog) -{ - fprintf(stderr, "usage: %s [-m] file.grib\n", prog); - exit(1); -} - int main(int argc, char* argv[]) { struct stat finfo; - char shortName[20] = { - 0, - }; + char shortName[20] = {0,}; size_t len; grib_handle* h = NULL; size_t fsize; @@ -49,25 +38,18 @@ int main(int argc, char* argv[]) else if (argc == 2) filename = argv[1]; else - usage(argv[0]); + return 1; Assert(filename); f = fopen(filename, "rb"); - if (!f) { - perror(filename); - exit(1); - } + Assert(f); stat(filename, &finfo); fsize = finfo.st_size; data = (unsigned char*)malloc(fsize); p = data; - - if (!data) { - fprintf(stderr, "unable to allocate %ld bytes\n", (long)fsize); - exit(1); - } + Assert(data); if (fread(data, 1, fsize, f) != fsize) { perror(filename); From c38285e5674f6287e212a898ec5576149efb005f Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 18:54:38 +0000 Subject: [PATCH 143/244] Testing: Cleanup --- tests/read_any.cc | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/read_any.cc b/tests/read_any.cc index f340aede9..98f1d450f 100644 --- a/tests/read_any.cc +++ b/tests/read_any.cc @@ -9,12 +9,6 @@ */ #include "grib_api.h" -static void usage(const char* prog) -{ - printf("usage: %s infile\n", prog); - exit(1); -} - static unsigned char buffer[50000000]; int main(int argc, char* argv[]) @@ -35,7 +29,7 @@ int main(int argc, char* argv[]) size_t len; if (argc != 2) - usage(argv[0]); + return 1; filename = argv[1]; f = fopen(filename, "rb"); From 3fc47dcf77d405c0e9677b8dadcc680da904733d Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 4 Mar 2024 20:45:39 +0000 Subject: [PATCH 144/244] Testing: Coverage --- tests/bufr_keys_iter.cc | 9 +-------- tests/gauss_sub.cc | 8 +------- tests/grib_clone_headers_only.cc | 9 ++------- tests/grib_ecc-1467.cc | 6 ++++-- tests/grib_ecc-1467.sh | 2 ++ tests/grib_fieldset.cc | 8 +------- tests/index_orderby.cc | 8 +------- tests/largefile.cc | 8 +------- 8 files changed, 13 insertions(+), 45 deletions(-) diff --git a/tests/bufr_keys_iter.cc b/tests/bufr_keys_iter.cc index f2ab295b7..9938fcdd5 100644 --- a/tests/bufr_keys_iter.cc +++ b/tests/bufr_keys_iter.cc @@ -12,12 +12,6 @@ #undef NDEBUG #include -static void usage(const char* prog) -{ - printf("usage: %s [-a|-d] infile\n", prog); - exit(1); -} - #define ITER_ALL_KEYS 1 #define ITER_DATA_KEYS 2 @@ -28,12 +22,11 @@ int main(int argc, char* argv[]) codes_handle* h = NULL; codes_bufr_keys_iterator* kiter = NULL; char* input_filename = NULL; - const char* prog = argv[0]; FILE* f = NULL; int iterator_mode = ITER_ALL_KEYS; if (argc == 1 || argc > 3) - usage(prog); + return 1; // usage: prog [-a|-d] infile for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-a") == 0) { diff --git a/tests/gauss_sub.cc b/tests/gauss_sub.cc index b1114e964..b743b5d3c 100644 --- a/tests/gauss_sub.cc +++ b/tests/gauss_sub.cc @@ -10,12 +10,6 @@ #include "grib_api.h" -static void usage(char* prog) -{ - printf("usage: %s file1.grib file2.grib\n", prog); - exit(1); -} - int main(int argc, char* argv[]) { grib_handle *h1, *h2; @@ -34,7 +28,7 @@ int main(int argc, char* argv[]) c = grib_context_get_default(); - if (argc < 3) usage(argv[0]); + if (argc < 3) return 1;//usage: %s file1.grib file2.grib infile1 = argv[1]; infile2 = argv[2]; diff --git a/tests/grib_clone_headers_only.cc b/tests/grib_clone_headers_only.cc index f59b204ed..6a029b1ca 100644 --- a/tests/grib_clone_headers_only.cc +++ b/tests/grib_clone_headers_only.cc @@ -12,11 +12,6 @@ #undef NDEBUG #include -static void usage(const char* app) -{ - fprintf(stderr, "Usage is: %s input_file ouput_file\n", app); -} - int main(int argc, char* argv[]) { FILE* in = NULL; @@ -32,7 +27,7 @@ int main(int argc, char* argv[]) size_t messageLength_src = 0, messageLength_dst = 0; if (argc != 3) { - usage(argv[0]); + // Usage: prog input_file ouput_file return 1; } @@ -73,7 +68,7 @@ int main(int argc, char* argv[]) assert(isConstant_dst == 1); } - /* write out the cloned buffer */ + // write out the cloned buffer if (fwrite(buffer, 1, messageLength_dst, out) != messageLength_dst) { perror(argv[1]); return 1; diff --git a/tests/grib_ecc-1467.cc b/tests/grib_ecc-1467.cc index 3e20bdb08..5c5e8e53b 100644 --- a/tests/grib_ecc-1467.cc +++ b/tests/grib_ecc-1467.cc @@ -8,6 +8,9 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ +// +// ECC-1467: Support data values array decoded as "floats" (single-precision) +// #include #include "eccodes.h" #include "grib_api_internal.h" @@ -60,8 +63,7 @@ int main(int argc, char** argv) fval = fvalues[i]; if (!((dmin <= fval) && (fval <= dmax))) { - fprintf(stderr, "Error:\n"); - fprintf(stderr, "dvalue: %f, fvalue: %f\n", dvalues[i], fvalues[i]); + fprintf(stderr, "Error: dvalue: %f, fvalue: %f\n", dvalues[i], fvalues[i]); fprintf(stderr, "\tmin < fvalue < max = %.20e < %.20e < %.20e FAILED\n", dmin, fvalues[i], dmax); fprintf(stderr, "\tfvalue - min = %.20e (%s)\n", diff --git a/tests/grib_ecc-1467.sh b/tests/grib_ecc-1467.sh index fb5d0bd1c..abb9aa5f3 100755 --- a/tests/grib_ecc-1467.sh +++ b/tests/grib_ecc-1467.sh @@ -8,6 +8,8 @@ # virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. # +# ECC-1467: Support data values array decoded as "floats" (single-precision) + . ./include.ctest.sh # Constant fields diff --git a/tests/grib_fieldset.cc b/tests/grib_fieldset.cc index a6eb38ce7..d1431b021 100644 --- a/tests/grib_fieldset.cc +++ b/tests/grib_fieldset.cc @@ -13,12 +13,6 @@ #include "grib_api.h" -static void usage(const char* prog) -{ - fprintf(stderr, "Usage: %s order_by grib_file grib_file ...\n", prog); - exit(1); -} - int main(int argc, char** argv) { int err = 0; @@ -34,7 +28,7 @@ int main(int argc, char** argv) size_t lenDate = 10, lenParam = 20, lenLevel = 50; char* order_by = NULL; - if (argc != 3) usage(argv[0]); + if (argc != 3) return 1; //Usage: prog order_by grib_file grib_file ... nkeys = sizeof(keys) / sizeof(*keys); order_by = argv[1]; diff --git a/tests/index_orderby.cc b/tests/index_orderby.cc index f2346fc82..55ff9c2f5 100644 --- a/tests/index_orderby.cc +++ b/tests/index_orderby.cc @@ -10,12 +10,6 @@ #include "grib_api.h" -void usage(char* prog) -{ - printf("usage: %s infile\n", prog); - exit(1); -} - int main(int argc, char* argv[]) { grib_index* index = NULL; @@ -27,7 +21,7 @@ int main(int argc, char* argv[]) size_t lenshortName = 200; int ret = 0, count = 0; - if (argc != 2) usage(argv[0]); + if (argc != 2) return 1; infile = argv[1]; outfile = argv[2]; diff --git a/tests/largefile.cc b/tests/largefile.cc index a09d84be4..51e77949b 100644 --- a/tests/largefile.cc +++ b/tests/largefile.cc @@ -14,12 +14,6 @@ #include #endif -void usage(const char* prog) -{ - printf("usage: %s filename\n", prog); - exit(1); -} - int main(int argc, char* argv[]) { off_t offsetin = 0, offsetout = 0; @@ -30,7 +24,7 @@ int main(int argc, char* argv[]) char str[10]; int i; - if (argc != 2) usage(argv[0]); + if (argc != 2) return 1; printf("sizeof(off_t)=%zu sizeof(long)=%zu\n", sizeof(off_t), sizeof(long)); From 99a21bdd0f1a9c74ade031dd1850a265bf3a21a8 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 5 Mar 2024 13:19:31 +0000 Subject: [PATCH 145/244] Testing: headers only clone --- tests/grib_clone_headers_only.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/grib_clone_headers_only.cc b/tests/grib_clone_headers_only.cc index 6a029b1ca..f96048a15 100644 --- a/tests/grib_clone_headers_only.cc +++ b/tests/grib_clone_headers_only.cc @@ -21,7 +21,7 @@ int main(int argc, char* argv[]) int err = 0; long totalLength_src = 0, totalLength_dst = 0; - long edition = 0, isGridded = 0, bitmapPresent = 0; + long edition = 0, isGridded_src = 0, bitmapPresent = 0; long isConstant_src = 0, isConstant_dst = 0; long dataSectionLength_src = 0, dataSectionLength_dst = 0; size_t messageLength_src = 0, messageLength_dst = 0; @@ -41,8 +41,8 @@ int main(int argc, char* argv[]) assert(clone_handle); codes_get_long(source_handle, "isConstant", &isConstant_src); - codes_get_long(source_handle, "isGridded", &isGridded); - if (isGridded && !isConstant_src) { + codes_get_long(source_handle, "isGridded", &isGridded_src); + if (isGridded_src && !isConstant_src) { CODES_CHECK(codes_get_message(source_handle, &buffer, &messageLength_src), 0); CODES_CHECK(codes_get_message(clone_handle, &buffer, &messageLength_dst), 0); From b83641aa474c4a4271278b0b10d2ae7cfb03958b Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 5 Mar 2024 13:42:57 +0000 Subject: [PATCH 146/244] ECC-1781: Geoiterator: Support reduced Gaussian grid with rotation --- src/grib_iterator_class_gaussian_reduced.cc | 52 +++++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/src/grib_iterator_class_gaussian_reduced.cc b/src/grib_iterator_class_gaussian_reduced.cc index cde71f746..7882cc54a 100644 --- a/src/grib_iterator_class_gaussian_reduced.cc +++ b/src/grib_iterator_class_gaussian_reduced.cc @@ -53,6 +53,11 @@ typedef struct grib_iterator_gaussian_reduced{ double *las; double *los; long Nj; + long isRotated; + double angleOfRotation; + double southPoleLat; + double southPoleLon; + long disableUnrotate; } grib_iterator_gaussian_reduced; extern grib_iterator_class* grib_iterator_class_gen; @@ -76,9 +81,9 @@ grib_iterator_class* grib_iterator_class_gaussian_reduced = &_grib_iterator_clas static void init_class(grib_iterator_class* c) { - c->previous = (*(c->super))->previous; - c->reset = (*(c->super))->reset; - c->has_next = (*(c->super))->has_next; + c->previous = (*(c->super))->previous; + c->reset = (*(c->super))->reset; + c->has_next = (*(c->super))->has_next; } /* END_CLASS_IMP */ @@ -87,16 +92,29 @@ static void init_class(grib_iterator_class* c) static int next(grib_iterator* iter, double* lat, double* lon, double* val) { grib_iterator_gaussian_reduced* self = (grib_iterator_gaussian_reduced*)iter; + double ret_lat=0, ret_lon=0; if (iter->e >= (long)(iter->nv - 1)) return 0; iter->e++; - *lat = self->las[iter->e]; - *lon = self->los[iter->e]; + ret_lat = self->las[iter->e]; + ret_lon = self->los[iter->e]; if (val && iter->data) { *val = iter->data[iter->e]; } + + if (self->isRotated && !self->disableUnrotate) { + double new_lat = 0, new_lon = 0; + unrotate(ret_lat, ret_lon, + self->angleOfRotation, self->southPoleLat, self->southPoleLon, + &new_lat, &new_lon); + ret_lat = new_lat; + ret_lon = new_lon; + } + *lat = ret_lat; + *lon = ret_lon; + return 1; } @@ -104,7 +122,7 @@ typedef void (*get_reduced_row_proc)(long pl, double lon_first, double lon_last, /* For a reduced Gaussian grid which is GLOBAL, the number of points is the sum of the 'pl' array */ /* i.e. the total number of points on all latitudes */ -static size_t count_global_points(long* pl, size_t plsize) +static size_t count_global_points(const long* pl, size_t plsize) { return sum_of_pl_array(pl, plsize); } @@ -288,9 +306,9 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) long* pl; long max_pl = 0; long nj = 0, order = 0, i; - long row_count = 0; - long angleSubdivisions = 0; - grib_context* c = h->context; + long row_count = 0; + long angleSubdivisions = 0; + const grib_context* c = h->context; grib_iterator_gaussian_reduced* self = (grib_iterator_gaussian_reduced*)iter; const char* slat_first = grib_arguments_get_name(h, args, self->carg++); const char* slon_first = grib_arguments_get_name(h, args, self->carg++); @@ -300,6 +318,22 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) const char* spl = grib_arguments_get_name(h, args, self->carg++); const char* snj = grib_arguments_get_name(h, args, self->carg++); + self->angleOfRotation = 0; + self->isRotated = 0; + self->southPoleLat = 0; + self->southPoleLon = 0; + self->disableUnrotate = 0; /* unrotate enabled by default */ + + ret = grib_get_long(h, "isRotatedGrid", &self->isRotated); + if (ret == GRIB_SUCCESS && self->isRotated) { + if ((ret = grib_get_double_internal(h, "angleOfRotation", &self->angleOfRotation))) + return ret; + if ((ret = grib_get_double_internal(h, "latitudeOfSouthernPoleInDegrees", &self->southPoleLat))) + return ret; + if ((ret = grib_get_double_internal(h, "longitudeOfSouthernPoleInDegrees", &self->southPoleLon))) + return ret; + } + if ((ret = grib_get_double_internal(h, slat_first, &lat_first)) != GRIB_SUCCESS) return ret; if ((ret = grib_get_double_internal(h, slon_first, &lon_first)) != GRIB_SUCCESS) From ed62343032afc3df7e281707e484dfc19afcd2d3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 5 Mar 2024 13:51:14 +0000 Subject: [PATCH 147/244] ECC-1781: Test --- tests/grib_iterator.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/grib_iterator.sh b/tests/grib_iterator.sh index 152e95c0c..d09f6ded5 100755 --- a/tests/grib_iterator.sh +++ b/tests/grib_iterator.sh @@ -45,6 +45,12 @@ grep -q "Latitude Longitude Value shortName level" $tempText ${tools_dir}/grib_get_data "$samp_dir/sh_ml_grib2.tmpl" > $tempText +# ECC-1781: Reduced Gaussian grid with rotation +# --------------------------------------------- +${tools_dir}/grib_get_data $samp_dir/reduced_rotated_gg_pl_320_grib1.tmpl > $tempText +${tools_dir}/grib_get_data $samp_dir/reduced_rotated_gg_pl_320_grib2.tmpl > $tempText + + # ECC-1642: badly encoded regular grids # ------------------------------------- ${tools_dir}/grib_set -s Ni=33 $samp_dir/GRIB2.tmpl $tempGrib From 5bddfc819e780656bfa39633c82689c40cdfa92e Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 10:01:00 +0000 Subject: [PATCH 148/244] ECC-1781: Further cleanup --- src/grib_iterator_class_gaussian_reduced.cc | 11 ++++++++--- tests/grib_iterator.sh | 2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/grib_iterator_class_gaussian_reduced.cc b/src/grib_iterator_class_gaussian_reduced.cc index 7882cc54a..b21f680b1 100644 --- a/src/grib_iterator_class_gaussian_reduced.cc +++ b/src/grib_iterator_class_gaussian_reduced.cc @@ -22,6 +22,11 @@ MEMBERS = double *las MEMBERS = double *los MEMBERS = long Nj + MEMBERS = long isRotated + MEMBERS = double angleOfRotation + MEMBERS = double southPoleLat + MEMBERS = double southPoleLon + MEMBERS = long disableUnrotate END_CLASS_DEF */ @@ -81,9 +86,9 @@ grib_iterator_class* grib_iterator_class_gaussian_reduced = &_grib_iterator_clas static void init_class(grib_iterator_class* c) { - c->previous = (*(c->super))->previous; - c->reset = (*(c->super))->reset; - c->has_next = (*(c->super))->has_next; + c->previous = (*(c->super))->previous; + c->reset = (*(c->super))->reset; + c->has_next = (*(c->super))->has_next; } /* END_CLASS_IMP */ diff --git a/tests/grib_iterator.sh b/tests/grib_iterator.sh index d09f6ded5..c1f549a53 100755 --- a/tests/grib_iterator.sh +++ b/tests/grib_iterator.sh @@ -49,6 +49,8 @@ ${tools_dir}/grib_get_data "$samp_dir/sh_ml_grib2.tmpl" > $tempText # --------------------------------------------- ${tools_dir}/grib_get_data $samp_dir/reduced_rotated_gg_pl_320_grib1.tmpl > $tempText ${tools_dir}/grib_get_data $samp_dir/reduced_rotated_gg_pl_320_grib2.tmpl > $tempText +ECCODES_DEBUG=-1 ${tools_dir}/grib_get_data ${data_dir}/reduced_gaussian_sub_area.grib2 > $tempText 2>&1 +grep -q "sub-area num points=53564" $tempText # ECC-1642: badly encoded regular grids From f6d1bb67cb9765535174fc64677477a2566d71b1 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 10:03:05 +0000 Subject: [PATCH 149/244] ECC-1781: Further cleanup --- src/grib_nearest_class_regular.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/grib_nearest_class_regular.cc b/src/grib_nearest_class_regular.cc index 7ff90e38f..adb5320a1 100644 --- a/src/grib_nearest_class_regular.cc +++ b/src/grib_nearest_class_regular.cc @@ -214,7 +214,6 @@ static int find(grib_nearest* nearest, grib_handle* h, } while (grib_iterator_next(iter, &lat, &lon, NULL)) { if (ilat < self->lats_count && olat != lat) { - /* Assert(ilat < self->lats_count); */ self->lats[ilat++] = lat; olat = lat; } From d0f68666e6abb438700f20951a40b90bebb54dce Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 10:25:42 +0000 Subject: [PATCH 150/244] ECC-1781: Further cleanup --- src/grib_nearest_class_latlon_reduced.cc | 2 +- src/grib_nearest_class_reduced.cc | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/grib_nearest_class_latlon_reduced.cc b/src/grib_nearest_class_latlon_reduced.cc index a5d2af222..e5c503e99 100644 --- a/src/grib_nearest_class_latlon_reduced.cc +++ b/src/grib_nearest_class_latlon_reduced.cc @@ -214,7 +214,7 @@ static int find_global(grib_nearest* nearest, grib_handle* h, return ret; } while (grib_iterator_next(iter, &lat, &lon, NULL)) { - if (olat != lat) { + if (ilat < self->lats_count && olat != lat) { self->lats[ilat++] = lat; olat = lat; } diff --git a/src/grib_nearest_class_reduced.cc b/src/grib_nearest_class_reduced.cc index f17d3b4e3..ef0e25c5b 100644 --- a/src/grib_nearest_class_reduced.cc +++ b/src/grib_nearest_class_reduced.cc @@ -251,7 +251,7 @@ static int find_global(grib_nearest* nearest, grib_handle* h, return err; } while (grib_iterator_next(iter, &lat, &lon, NULL)) { - if (olat != lat) { + if (ilat < self->lats_count && olat != lat) { self->lats[ilat++] = lat; olat = lat; } @@ -262,6 +262,7 @@ static int find_global(grib_nearest* nearest, grib_handle* h, if (lon > 180 && lon < 360) lon -= 360; } + DEBUG_ASSERT_ACCESS(self->lons, (long)ilon, (long)nearest->values_count); self->lons[ilon++] = lon; } self->lats_count = ilat; From 08369d1a096b248b96c8ca34b1900178e6c492ea Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 10:44:33 +0000 Subject: [PATCH 151/244] Nearest: Fix for rotated reduced --- src/grib_nearest_class_reduced.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/grib_nearest_class_reduced.cc b/src/grib_nearest_class_reduced.cc index ef0e25c5b..4c369d9cc 100644 --- a/src/grib_nearest_class_reduced.cc +++ b/src/grib_nearest_class_reduced.cc @@ -152,8 +152,10 @@ static int find(grib_nearest* nearest, grib_handle* h, { int err = 0; grib_nearest_reduced* self = (grib_nearest_reduced*)nearest; + long isRotated = 0; + err = grib_get_long(h, "isRotatedGrid", &isRotated); - if (self->global) { + if (self->global && !isRotated) { err = find_global(nearest, h, inlat, inlon, flags, outlats, outlons, values, From 89e1a643e32f2a4c9d7e66568178d15926ae5b3c Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 11:40:13 +0000 Subject: [PATCH 152/244] ECC-1781: Fix nearest --- src/grib_nearest_class_reduced.cc | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/grib_nearest_class_reduced.cc b/src/grib_nearest_class_reduced.cc index 4c369d9cc..713570264 100644 --- a/src/grib_nearest_class_reduced.cc +++ b/src/grib_nearest_class_reduced.cc @@ -29,6 +29,7 @@ MEMBERS = double lon_first MEMBERS = double lon_last MEMBERS = int legacy + MEMBERS = int rotated END_CLASS_DEF */ @@ -69,6 +70,7 @@ typedef struct grib_nearest_reduced{ double lon_first; double lon_last; int legacy; + int rotated; } grib_nearest_reduced; extern grib_nearest_class* grib_nearest_class_gen; @@ -101,6 +103,7 @@ static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args) self->pl = grib_arguments_get_name(h, args, self->cargs++); self->j = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t)); self->legacy = -1; + self->rotated = -1; if (!self->j) return GRIB_OUT_OF_MEMORY; self->k = (size_t*)grib_context_malloc(nearest->context, NUM_NEIGHBOURS * sizeof(size_t)); @@ -138,10 +141,21 @@ static int find_global(grib_nearest* nearest, grib_handle* h, static int is_legacy(grib_handle* h, int* legacy) { int err = 0; - long lLegacy = 0; - err = grib_get_long(h, "legacyGaussSubarea", &lLegacy); + long lVal = 0; + *legacy = 0; // false by default + err = grib_get_long(h, "legacyGaussSubarea", &lVal); if (err) return err; - *legacy = (int)lLegacy; + *legacy = (int)lVal; + return GRIB_SUCCESS; +} +static int is_rotated(grib_handle* h, int* rotated) +{ + int err = 0; + long lVal = 0; + *rotated = 0; // false by default + err = grib_get_long(h, "isRotatedGrid", &lVal); + if (err) return err; + *rotated = (int)lVal; return GRIB_SUCCESS; } @@ -152,10 +166,13 @@ static int find(grib_nearest* nearest, grib_handle* h, { int err = 0; grib_nearest_reduced* self = (grib_nearest_reduced*)nearest; - long isRotated = 0; - err = grib_get_long(h, "isRotatedGrid", &isRotated); - if (self->global && !isRotated) { + if (self->rotated == -1 || (flags & GRIB_NEAREST_SAME_GRID) == 0) { + err = is_rotated(h, &(self->rotated)); + if (err) return err; + } + + if (self->global && self->rotated == 0) { err = find_global(nearest, h, inlat, inlon, flags, outlats, outlons, values, From ec22e6019da3fc56ed63dd915809bfa4743c808f Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 13:25:27 +0000 Subject: [PATCH 153/244] Fortran: Refactoring --- fortran/grib_fortran.c | 77 ++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/fortran/grib_fortran.c b/fortran/grib_fortran.c index e1835ae47..c5fcb4fc3 100644 --- a/fortran/grib_fortran.c +++ b/fortran/grib_fortran.c @@ -1604,9 +1604,8 @@ int any_f_new_from_loaded_(int* msgid, int* gid) /*****************************************************************************/ int codes_f_clear_loaded_from_file_(void) { - grib_context* c = grib_context_get_default(); /* grib_oarray_delete_content(c,binary_messages); */ - grib_oarray_delete(c, binary_messages); + grib_oarray_delete(grib_context_get_default(), binary_messages); return GRIB_SUCCESS; } @@ -1711,10 +1710,10 @@ int grib_f_headers_only_new_from_file_(int* fid, int* gid) } /*****************************************************************************/ -int grib_f_new_from_index_(int* iid, int* gid) +int grib_f_new_from_index_(int* index_id, int* gid) { int err = 0; - grib_index* i = get_index(*iid); + grib_index* i = get_index(*index_id); grib_handle *h = NULL; if (i) { @@ -1757,16 +1756,15 @@ int grib_f_index_new_from_file_(char* file, char* keys, int* gid, int lfile, int } /*****************************************************************************/ -int grib_f_index_add_file_(int* iid, char* file, int lfile) +int grib_f_index_add_file_(int* index_id, char* file, int lfile) { - grib_index *i = get_index(*iid); - int err = GRIB_SUCCESS; + grib_index *i = get_index(*index_id); char buf[1024]; if (!i) { return GRIB_INVALID_INDEX; } else { - err = grib_index_add_file(i,cast_char(buf,file,lfile)); + int err = grib_index_add_file(i,cast_char(buf,file,lfile)); return err; } } @@ -1928,9 +1926,9 @@ int grib_f_get_size_long_(int* gid, char* key, long* val, int len) } /*****************************************************************************/ -int grib_f_index_get_size_int_(int* gid, char* key, int* val, int len) +int grib_f_index_get_size_int_(int* index_id, char* key, int* val, int len) { - grib_index *h = get_index(*gid); + grib_index *h = get_index(*index_id); int err = GRIB_SUCCESS; char buf[1024]; size_t tsize = 0; @@ -1944,19 +1942,18 @@ int grib_f_index_get_size_int_(int* gid, char* key, int* val, int len) } } -int grib_f_index_get_size_long_(int* gid, char* key, long* val, int len) +int grib_f_index_get_size_long_(int* index_id, char* key, long* val, int len) { - grib_index *h = get_index(*gid); - int err = GRIB_SUCCESS; + grib_index *h = get_index(*index_id); char buf[1024]; size_t tsize = 0; - if(!h){ + if (!h){ return GRIB_INVALID_GRIB; - }else{ - err = grib_index_get_size(h, cast_char(buf,key,len), &tsize); + } else{ + int err = grib_index_get_size(h, cast_char(buf,key,len), &tsize); *val = tsize; - return err; + return err; } } @@ -2063,9 +2060,9 @@ int grib_f_get_byte_array_(int* gid, char* key, unsigned char *val, int* size, i } /*****************************************************************************/ -int grib_f_index_get_string_(int* gid, char* key, char* val, int *eachsize,int* size, int len) +int grib_f_index_get_string_(int* index_id, char* key, char* val, int *eachsize,int* size, int len) { - grib_index *h = get_index(*gid); + grib_index *h = get_index(*index_id); int err = GRIB_SUCCESS; int i; char buf[1024]; @@ -2104,23 +2101,22 @@ int grib_f_index_get_string_(int* gid, char* key, char* val, int *eachsize,int* } /*****************************************************************************/ -int grib_f_index_get_long_(int* gid, char* key, long *val, int* size, int len) +int grib_f_index_get_long_(int* index_id, char* key, long *val, int* size, int len) { - grib_index *h = get_index(*gid); - int err = GRIB_SUCCESS; + grib_index* h = get_index(*index_id); char buf[1024]; size_t lsize = *size; - if(!h) return GRIB_INVALID_GRIB; - err = grib_index_get_long(h, cast_char(buf,key,len), val, &lsize); + if (!h) return GRIB_INVALID_GRIB; + int err = grib_index_get_long(h, cast_char(buf,key,len), val, &lsize); *size = lsize; - return err; + return err; } /*****************************************************************************/ -int grib_f_index_get_int_(int* gid, char* key, int *val, int* size, int len) +int grib_f_index_get_int_(int* index_id, char* key, int *val, int* size, int len) { - grib_index *h = get_index(*gid); + grib_index *h = get_index(*index_id); int err = GRIB_SUCCESS; char buf[1024]; size_t lsize = *size, i = 0; @@ -2140,17 +2136,16 @@ int grib_f_index_get_int_(int* gid, char* key, int *val, int* size, int len) } /*****************************************************************************/ -int grib_f_index_get_real8_(int* gid, char* key, double *val, int* size, int len) +int grib_f_index_get_real8_(int* index_id, char* key, double *val, int* size, int len) { - grib_index *h = get_index(*gid); - int err = GRIB_SUCCESS; + grib_index* h = get_index(*index_id); char buf[1024]; size_t lsize = *size; - if(!h) return GRIB_INVALID_GRIB; - err = grib_index_get_double(h, cast_char(buf,key,len), val, &lsize); + if (!h) return GRIB_INVALID_GRIB; + int err = grib_index_get_double(h, cast_char(buf,key,len), val, &lsize); *size = lsize; - return err; + return err; } /*****************************************************************************/ @@ -2438,9 +2433,9 @@ int grib_f_set_real4_array_(int* gid, char* key, float* val, int* size, int len) } /*****************************************************************************/ -int grib_f_index_select_real8_(int* gid, char* key, double* val, int len) +int grib_f_index_select_real8_(int* index_id, char* key, double* val, int len) { - grib_index *h = get_index(*gid); + grib_index *h = get_index(*index_id); char buf[1024]; if(!h) return GRIB_INVALID_GRIB; @@ -2448,9 +2443,9 @@ int grib_f_index_select_real8_(int* gid, char* key, double* val, int len) } /*****************************************************************************/ -int grib_f_index_select_string_(int* gid, char* key, char* val, int len, int vallen) +int grib_f_index_select_string_(int* index_id, char* key, char* val, int len, int vallen) { - grib_index *h = get_index(*gid); + grib_index *h = get_index(*index_id); char buf[1024]; char bufval[1024]; @@ -2465,9 +2460,9 @@ int grib_f_index_select_string_(int* gid, char* key, char* val, int len, int val } /*****************************************************************************/ -int grib_f_index_select_int_(int* gid, char* key, int* val, int len) +int grib_f_index_select_int_(int* index_id, char* key, int* val, int len) { - grib_index *h = get_index(*gid); + grib_index *h = get_index(*index_id); long lval = *val; char buf[1024] = {0,}; @@ -2476,9 +2471,9 @@ int grib_f_index_select_int_(int* gid, char* key, int* val, int len) } /*****************************************************************************/ -int grib_f_index_select_long_(int* gid, char* key, long* val, int len) +int grib_f_index_select_long_(int* index_id, char* key, long* val, int len) { - grib_index *h = get_index(*gid); + grib_index *h = get_index(*index_id); char buf[1024] = {0,}; if (!h) return GRIB_INVALID_GRIB; From b9f82580888f8fd40f96b21c29a9c3d77e0175f9 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 13:41:23 +0000 Subject: [PATCH 154/244] Cleanup --- examples/F90/bufr_ecc-1019.f90 | 1 - examples/F90/bufr_ecc-1284.f90 | 1 - tests/grib_get_fail.sh | 9 ++++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/F90/bufr_ecc-1019.f90 b/examples/F90/bufr_ecc-1019.f90 index 5974132e6..8bbceb900 100644 --- a/examples/F90/bufr_ecc-1019.f90 +++ b/examples/F90/bufr_ecc-1019.f90 @@ -18,7 +18,6 @@ program operator_3_test call codes_bufr_new_from_samples(ibufr,'BUFR4',iret) if (iret /= CODES_SUCCESS) then - print *,'ERROR creating BUFR from BUFR4' stop 1 endif diff --git a/examples/F90/bufr_ecc-1284.f90 b/examples/F90/bufr_ecc-1284.f90 index 69600a1c7..53b18b7c5 100644 --- a/examples/F90/bufr_ecc-1284.f90 +++ b/examples/F90/bufr_ecc-1284.f90 @@ -22,7 +22,6 @@ program bufr_encode call codes_bufr_new_from_samples(ibufr,'BUFR4',iret) if (iret/=CODES_SUCCESS) then - print *,'ERROR creating BUFR from BUFR4' stop 1 endif call codes_set(ibufr,'masterTableNumber',0) diff --git a/tests/grib_get_fail.sh b/tests/grib_get_fail.sh index d7d0d5b1b..1dd028fcb 100755 --- a/tests/grib_get_fail.sh +++ b/tests/grib_get_fail.sh @@ -35,6 +35,13 @@ grep -q "Nh (Key/value not found)" $tempText # Nearest # --------- +set +e +${tools_dir}/grib_get -l abc $ECCODES_SAMPLES_PATH/GRIB2.tmpl > $tempText 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Wrong latitude value" $tempText + set +e ${tools_dir}/grib_get -s Nj=MISSING -l 0,0,1 $ECCODES_SAMPLES_PATH/reduced_ll_sfc_grib1.tmpl > $tempText 2>&1 status=$? @@ -51,7 +58,7 @@ grep -q "Key Nj cannot be 0" $tempText set +e -${tools_dir}/grib_get -l 0,0,5 $ECCODES_SAMPLES_PATH/reduced_ll_sfc_grib1.tmpl > $tempText 2>&1 +${tools_dir}/grib_get -l 0,0,5 $ECCODES_SAMPLES_PATH/reduced_ll_sfc_grib2.tmpl > $tempText 2>&1 status=$? set -e [ $status -ne 0 ] From d108c4a118dee7dd1717c39f6d9fdfad5c206321 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 14:07:46 +0000 Subject: [PATCH 155/244] Testing: check_gaussian_grids --- tests/grib_check_gaussian_grids.sh | 33 +++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/grib_check_gaussian_grids.sh b/tests/grib_check_gaussian_grids.sh index 474eaf726..c37013981 100755 --- a/tests/grib_check_gaussian_grids.sh +++ b/tests/grib_check_gaussian_grids.sh @@ -28,6 +28,17 @@ for gg in ${samples_dir}/reduced_gg_*tmpl; do done +# Set wrong Nj. Should fail +input=$samples_dir/reduced_gg_pl_32_grib2.tmpl +${tools_dir}/grib_set -s Nj=1 $input $tempGrib +set +e +${tools_dir}/grib_check_gaussian_grid -v $tempGrib 2> $tempText +status=$? +set -e +[ $status -ne 0 ] +grep -q "Nj is 1 but should be 2\*N" $tempText + + # Set wrong N. Should fail input=$samples_dir/reduced_gg_pl_32_grib2.tmpl ${tools_dir}/grib_set -s N=0 $input $tempGrib @@ -38,6 +49,7 @@ set -e [ $status -eq 1 ] grep -q "Error: N should be > 0" $tempText + # Set wrong angle. Should fail input=$samples_dir/reduced_gg_pl_1280_grib2.tmpl ${tools_dir}/grib_set -s longitudeOfLastGridPoint=359929680 $input $tempGrib @@ -49,6 +61,17 @@ set -e grep -q "Error: longitudeOfLastGridPointInDegrees.*but should be" $tempText +# Set wrong lat2. Should fail +input=$samples_dir/reduced_gg_pl_1280_grib2.tmpl +${tools_dir}/grib_set -s latitudeOfLastGridPointInDegrees=9 $input $tempGrib +set +e +${tools_dir}/grib_check_gaussian_grid -v $tempGrib 2> $tempText +status=$? +set -e +[ $status -ne 0 ] +grep -q "First latitude must be = last latitude but opposite in sign" $tempText + + # Set wrong numberOfDataPoints. Should fail input=$samples_dir/reduced_gg_pl_96_grib2.tmpl ${tools_dir}/grib_set -s numberOfDataPoints=44 $input $tempGrib @@ -68,9 +91,17 @@ ${tools_dir}/grib_check_gaussian_grid -f -v $tempGrib 2> $tempText status=$? set -e [ $status -eq 1 ] -cat $tempText grep -q "Error: Sum of pl array 50662 does not match numberOfValues 44" $tempText +# Octahedral +set +e +${tools_dir}/grib_check_gaussian_grid -v $data_dir/msl.octa.glob.grib1 > $tempText 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "This is an Octahedral Gaussian grid" $tempText +grep -q "Error: longitudeOfLastGridPointInDegrees.*should be" $tempText + # Other errors/warnings # ---------------------- From 05b0cc0db9dee24b367558e7b8640eade21d0a43 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 16:03:07 +0000 Subject: [PATCH 156/244] Testing: grib_update_sections_lengths --- src/action_class_set_missing.cc | 16 ++++---- src/grib_expression_class_logical_or.cc | 3 +- src/grib_expression_class_unop.cc | 10 ++--- tests/CMakeLists.txt | 2 + tests/grib_update_sections_lengths.cc | 49 +++++++++++++++++++++++++ tests/grib_update_sections_lengths.sh | 22 +++++++++++ 6 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 tests/grib_update_sections_lengths.cc create mode 100755 tests/grib_update_sections_lengths.sh diff --git a/src/action_class_set_missing.cc b/src/action_class_set_missing.cc index 3a40038b5..03bd4ffc3 100644 --- a/src/action_class_set_missing.cc +++ b/src/action_class_set_missing.cc @@ -8,9 +8,6 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/*************************************************************************** - * Enrico Fucile * - ***************************************************************************/ #include "grib_api_internal.h" /* This is used by make_class.pl @@ -103,12 +100,13 @@ static int execute(grib_action* a, grib_handle* h) static void dump(grib_action* act, FILE* f, int lvl) { - int i = 0; - const grib_action_set_missing* self = (grib_action_set_missing*)act; - for (i = 0; i < lvl; i++) - grib_context_print(act->context, f, " "); - grib_context_print(act->context, f, self->name); - printf("\n"); + grib_context_log(act->context, GRIB_LOG_ERROR, "%s %s(): Not implemented", __FILE__, __func__); + // int i = 0; + // const grib_action_set_missing* self = (grib_action_set_missing*)act; + // for (i = 0; i < lvl; i++) + // grib_context_print(act->context, f, " "); + // grib_context_print(act->context, f, self->name); + // printf("\n"); } static void destroy(grib_context* context, grib_action* act) diff --git a/src/grib_expression_class_logical_or.cc b/src/grib_expression_class_logical_or.cc index 212ff3084..ce5e4d765 100644 --- a/src/grib_expression_class_logical_or.cc +++ b/src/grib_expression_class_logical_or.cc @@ -129,9 +129,8 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) static int evaluate_double(grib_expression* g, grib_handle* h, double* dres) { long lres = 0; - int ret = 0; - ret = evaluate_long(g, h, &lres); + int ret = evaluate_long(g, h, &lres); *dres = (double)lres; return ret; diff --git a/src/grib_expression_class_unop.cc b/src/grib_expression_class_unop.cc index 1f4d6f9d0..6188b4586 100644 --- a/src/grib_expression_class_unop.cc +++ b/src/grib_expression_class_unop.cc @@ -77,10 +77,9 @@ grib_expression_class* grib_expression_class_unop = &_grib_expression_class_unop static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) { - int ret; - long v = 0; + long v = 0; grib_expression_unop* e = (grib_expression_unop*)g; - ret = grib_expression_evaluate_long(h, e->exp, &v); + int ret = grib_expression_evaluate_long(h, e->exp, &v); if (ret != GRIB_SUCCESS) return ret; *lres = e->long_func(v); @@ -89,10 +88,9 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) static int evaluate_double(grib_expression* g, grib_handle* h, double* dres) { - int ret; - double v = 0; + double v = 0; grib_expression_unop* e = (grib_expression_unop*)g; - ret = grib_expression_evaluate_double(h, e->exp, &v); + int ret = grib_expression_evaluate_double(h, e->exp, &v); if (ret != GRIB_SUCCESS) return ret; *dres = e->double_func ? e->double_func(v) : e->long_func(v); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2a211f511..e282ee85a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -18,6 +18,7 @@ list(APPEND test_c_bins grib_double_cmp read_any julian + grib_update_sections_lengths grib_indexing grib_fieldset grib_multi_from_message @@ -169,6 +170,7 @@ if( HAVE_BUILD_TOOLS ) # and/or take much longer list(APPEND tests_extra grib_data_quality_checks + grib_update_sections_lengths grib_units_bias_factor grib_set_large_message_fail grib_g1monthlydate diff --git a/tests/grib_update_sections_lengths.cc b/tests/grib_update_sections_lengths.cc new file mode 100644 index 000000000..a077b3ebd --- /dev/null +++ b/tests/grib_update_sections_lengths.cc @@ -0,0 +1,49 @@ +/* + * (C) Copyright 2005- ECMWF. + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + * + * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by + * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. + */ + +#include "grib_api_internal.h" + +int main(int argc, char* argv[]) +{ + grib_handle* h = NULL; + FILE* inf = NULL; + FILE* ouf = NULL; + char* infile = 0; + char* oufile = 0; + int err = 0; + size_t size; + const void* buffer = NULL; + + if (argc < 3) return 1; // prog in out + + infile = argv[1]; + oufile = argv[2]; + + inf = fopen(infile, "r"); + Assert(inf); + + ouf = fopen(oufile, "w"); + Assert(ouf); + + while ((h = grib_handle_new_from_file(0, inf, &err)) != NULL) { + grib_update_sections_lengths(h); + GRIB_CHECK(grib_get_message(h, &buffer, &size), 0); + if (fwrite(buffer, 1, size, ouf) != size) { + perror(oufile); + exit(1); + } + } + + grib_handle_delete(h); + fclose(inf); + fclose(ouf); + + return 0; +} diff --git a/tests/grib_update_sections_lengths.sh b/tests/grib_update_sections_lengths.sh new file mode 100755 index 000000000..028bd8156 --- /dev/null +++ b/tests/grib_update_sections_lengths.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +label="grib_update_sections_lengths_test" +tempGrib=temp.$label.grib + +gfiles="$data_dir/sample.grib2 $data_dir/missing_field.grib1" +for f in $gfiles; do + $EXEC ${test_dir}/grib_update_sections_lengths $f $tempGrib + cmp $f $tempGrib +done + +rm -f $tempGrib From 79f51dd0a427838067ec0895358c0e75c2c48d0d Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 16:27:33 +0000 Subject: [PATCH 157/244] Fix broken test --- tests/grib_check_gaussian_grids.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/grib_check_gaussian_grids.sh b/tests/grib_check_gaussian_grids.sh index c37013981..4f16966e4 100755 --- a/tests/grib_check_gaussian_grids.sh +++ b/tests/grib_check_gaussian_grids.sh @@ -94,13 +94,13 @@ set -e grep -q "Error: Sum of pl array 50662 does not match numberOfValues 44" $tempText # Octahedral -set +e -${tools_dir}/grib_check_gaussian_grid -v $data_dir/msl.octa.glob.grib1 > $tempText 2>&1 -status=$? -set -e -[ $status -ne 0 ] -grep -q "This is an Octahedral Gaussian grid" $tempText -grep -q "Error: longitudeOfLastGridPointInDegrees.*should be" $tempText +# set +e +# ${tools_dir}/grib_check_gaussian_grid -v $data_dir/msl.octa.glob.grib1 > $tempText 2>&1 +# status=$? +# set -e +# [ $status -ne 0 ] +# grep -q "This is an Octahedral Gaussian grid" $tempText +# grep -q "Error: longitudeOfLastGridPointInDegrees.*should be" $tempText # Other errors/warnings From 2aba61bbae4e21deae280270c50e777d486682fb Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 16:31:23 +0000 Subject: [PATCH 158/244] Fix broken test --- fortran/grib_fortran.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fortran/grib_fortran.c b/fortran/grib_fortran.c index c5fcb4fc3..ce9298348 100644 --- a/fortran/grib_fortran.c +++ b/fortran/grib_fortran.c @@ -2103,12 +2103,13 @@ int grib_f_index_get_string_(int* index_id, char* key, char* val, int *eachsize, /*****************************************************************************/ int grib_f_index_get_long_(int* index_id, char* key, long *val, int* size, int len) { + int err = 0; grib_index* h = get_index(*index_id); char buf[1024]; size_t lsize = *size; if (!h) return GRIB_INVALID_GRIB; - int err = grib_index_get_long(h, cast_char(buf,key,len), val, &lsize); + err = grib_index_get_long(h, cast_char(buf,key,len), val, &lsize); *size = lsize; return err; } @@ -2138,12 +2139,13 @@ int grib_f_index_get_int_(int* index_id, char* key, int *val, int* size, int len /*****************************************************************************/ int grib_f_index_get_real8_(int* index_id, char* key, double *val, int* size, int len) { + int err = 0; grib_index* h = get_index(*index_id); char buf[1024]; size_t lsize = *size; if (!h) return GRIB_INVALID_GRIB; - int err = grib_index_get_double(h, cast_char(buf,key,len), val, &lsize); + err = grib_index_get_double(h, cast_char(buf,key,len), val, &lsize); *size = lsize; return err; } From fbd27b037e1e547d30dfe0c7c61af25e586c8c5a Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 18:31:15 +0000 Subject: [PATCH 159/244] Testing: Bit access --- tests/grib_filter.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh index 250302890..660d568b3 100755 --- a/tests/grib_filter.sh +++ b/tests/grib_filter.sh @@ -324,6 +324,20 @@ EOF ${tools_dir}/grib_filter $tempFilt $ECCODES_SAMPLES_PATH/GRIB2.tmpl > $tempOut grep -q "No args: false" $tempOut +# Bit on off +cat >$tempFilt < $tempOut +cat $tempOut +grep -q "xx1=1" $tempOut +grep -q "xx2=0" $tempOut +grep -q "yy1=0" $tempOut +grep -q "yy2=1" $tempOut + # Use of dummy expression (=true) cat >$tempFilt < Date: Wed, 6 Mar 2024 18:31:35 +0000 Subject: [PATCH 160/244] Dead code removal --- src/eccodes_prototypes.h | 6 -- src/grib_accessor.cc | 130 +++++++++++++++++++-------------------- 2 files changed, 63 insertions(+), 73 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 2ac2f9e13..abd512a9f 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -108,7 +108,6 @@ grib_action* grib_action_create_transient_darray(grib_context* context, const ch /* grib_accessor.cc*/ void grib_accessor_dump(grib_accessor* a, grib_dumper* f); int grib_pack_missing(grib_accessor* a); -int grib_pack_zero(grib_accessor* a); int grib_is_missing_internal(grib_accessor* a); int grib_pack_double(grib_accessor* a, const double* v, size_t* len); int grib_pack_float(grib_accessor* a, const float* v, size_t* len); @@ -150,17 +149,12 @@ grib_accessor* grib_next_accessor(grib_accessor* a); void grib_resize(grib_accessor* a, size_t new_size); int grib_compare_accessors(grib_accessor* a1, grib_accessor* a2, int compare_flags); int grib_accessor_add_attribute(grib_accessor* a, grib_accessor* attr, int nest_if_clash); -int grib_accessor_replace_attribute(grib_accessor* a, grib_accessor* attr); -int grib_accessor_delete_attribute(grib_accessor* a, const char* name); -grib_accessor* grib_accessor_get_attribute_by_index(grib_accessor* a, int index); -const char* grib_accessor_get_name(grib_accessor* a); grib_accessor* grib_accessor_get_attribute_index(grib_accessor* a, const char* name, int* index); int grib_accessor_has_attributes(grib_accessor* a); grib_accessor* grib_accessor_get_attribute(grib_accessor* a, const char* name); grib_accessors_list* grib_accessors_list_create(grib_context* c); void grib_accessors_list_push(grib_accessors_list* al, grib_accessor* a, int rank); grib_accessors_list* grib_accessors_list_last(grib_accessors_list* al); -grib_accessors_list* grib_accessors_list_find(grib_accessors_list* al, const grib_accessor* a); void grib_accessors_list_delete(grib_context* c, grib_accessors_list* al); /* grib_concept.cc*/ diff --git a/src/grib_accessor.cc b/src/grib_accessor.cc index 0b4b7ed99..a08f5348e 100644 --- a/src/grib_accessor.cc +++ b/src/grib_accessor.cc @@ -54,18 +54,18 @@ int grib_pack_missing(grib_accessor* a) return 0; } -int grib_pack_zero(grib_accessor* a) -{ - grib_accessor_class* c = a->cclass; - while (c) { - if (c->clear) { - return c->clear(a); - } - c = c->super ? *(c->super) : NULL; - } - DEBUG_ASSERT(0); - return 0; -} +// int grib_pack_zero(grib_accessor* a) +// { +// grib_accessor_class* c = a->cclass; +// while (c) { +// if (c->clear) { +// return c->clear(a); +// } +// c = c->super ? *(c->super) : NULL; +// } +// DEBUG_ASSERT(0); +// return 0; +// } int grib_is_missing_internal(grib_accessor* a) { @@ -526,7 +526,7 @@ int grib_accessor_notify_change(grib_accessor* a, grib_accessor* changed) c = c->super ? *(c->super) : NULL; } if (a && a->cclass) - printf("notify_change not implemented for %s %s\n", a->cclass->name, a->name); + fprintf(stderr, "Error: notify_change not implemented for %s %s\n", a->cclass->name, a->name); DEBUG_ASSERT(0); return 0; } @@ -726,48 +726,47 @@ int grib_accessor_add_attribute(grib_accessor* a, grib_accessor* attr, int nest_ return GRIB_TOO_MANY_ATTRIBUTES; } -int grib_accessor_replace_attribute(grib_accessor* a, grib_accessor* attr) -{ - int id = 0; - int idx = 0; - if (grib_accessor_get_attribute_index(a, attr->name, &id) != NULL) { - grib_accessor_delete(a->context, a->attributes[id]); - a->attributes[id] = attr; - attr->parent_as_attribute = a; - if (a->same) - attr->same = grib_accessor_get_attribute_index(a->same, attr->name, &idx); - } - else { - grib_accessor_add_attribute(a, attr, 0); - } - return GRIB_SUCCESS; -} +// int grib_accessor_replace_attribute(grib_accessor* a, grib_accessor* attr) +// { +// int id = 0; +// int idx = 0; +// if (grib_accessor_get_attribute_index(a, attr->name, &id) != NULL) { +// grib_accessor_delete(a->context, a->attributes[id]); +// a->attributes[id] = attr; +// attr->parent_as_attribute = a; +// if (a->same) +// attr->same = grib_accessor_get_attribute_index(a->same, attr->name, &idx); +// } +// else { +// grib_accessor_add_attribute(a, attr, 0); +// } +// return GRIB_SUCCESS; +// } -int grib_accessor_delete_attribute(grib_accessor* a, const char* name) -{ - int id = 0; - if (grib_accessor_get_attribute_index(a, name, &id) != NULL) { - grib_accessor_delete(a->context, a->attributes[id]); - a->attributes[id] = NULL; - return GRIB_SUCCESS; - } - else { - return GRIB_NOT_FOUND; - } -} +// int grib_accessor_delete_attribute(grib_accessor* a, const char* name) +// { +// int id = 0; +// if (grib_accessor_get_attribute_index(a, name, &id) != NULL) { +// grib_accessor_delete(a->context, a->attributes[id]); +// a->attributes[id] = NULL; +// return GRIB_SUCCESS; +// } +// else { +// return GRIB_NOT_FOUND; +// } +// } -grib_accessor* grib_accessor_get_attribute_by_index(grib_accessor* a, int index) -{ - if (index < MAX_ACCESSOR_ATTRIBUTES) - return a->attributes[index]; +// grib_accessor* grib_accessor_get_attribute_by_index(grib_accessor* a, int index) +// { +// if (index < MAX_ACCESSOR_ATTRIBUTES) +// return a->attributes[index]; +// return NULL; +// } - return NULL; -} - -const char* grib_accessor_get_name(grib_accessor* a) -{ - return a->name; -} +// const char* grib_accessor_get_name(grib_accessor* a) +// { +// return a->name; +// } grib_accessor* grib_accessor_get_attribute_index(grib_accessor* a, const char* name, int* index) { @@ -847,24 +846,21 @@ grib_accessors_list* grib_accessors_list_last(grib_accessors_list* al) // last=next; // next=last->next; // } - return al->last; } -grib_accessors_list* grib_accessors_list_find(grib_accessors_list* al, const grib_accessor* a) -{ - grib_accessors_list* last = al; - grib_accessors_list* next = al->next; - - while (next) { - if (last->accessor == a) - return last; - last = next; - next = last->next; - } - - return NULL; -} +// grib_accessors_list* grib_accessors_list_find(grib_accessors_list* al, const grib_accessor* a) +// { +// grib_accessors_list* last = al; +// grib_accessors_list* next = al->next; +// while (next) { +// if (last->accessor == a) +// return last; +// last = next; +// next = last->next; +// } +// return NULL; +// } void grib_accessors_list_delete(grib_context* c, grib_accessors_list* al) { From 5cd1f39afc82d8092935e02046fd1a8857459572 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 20:31:31 +0000 Subject: [PATCH 161/244] Testing: Fix for Windows --- tests/grib_update_sections_lengths.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/grib_update_sections_lengths.sh b/tests/grib_update_sections_lengths.sh index 028bd8156..698a8b975 100755 --- a/tests/grib_update_sections_lengths.sh +++ b/tests/grib_update_sections_lengths.sh @@ -16,7 +16,7 @@ tempGrib=temp.$label.grib gfiles="$data_dir/sample.grib2 $data_dir/missing_field.grib1" for f in $gfiles; do $EXEC ${test_dir}/grib_update_sections_lengths $f $tempGrib - cmp $f $tempGrib + ${tools_dir}/grib_compare $f $tempGrib done rm -f $tempGrib From 4b08450a0dd65afcd858055592f2b78394871b91 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 20:37:10 +0000 Subject: [PATCH 162/244] Const correctness and cppcheck warnings --- src/action_class_hash_array.cc | 7 ++++--- src/action_class_noop.cc | 5 ++--- src/action_class_set.cc | 4 ++-- src/action_class_template.cc | 2 +- src/action_class_transient_darray.cc | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/action_class_hash_array.cc b/src/action_class_hash_array.cc index 609e763f2..430fdd92a 100644 --- a/src/action_class_hash_array.cc +++ b/src/action_class_hash_array.cc @@ -199,8 +199,9 @@ static void destroy(grib_context* context, grib_action* act) { grib_action_hash_array* self = (grib_action_hash_array*)act; - grib_hash_array_value* v = self->hash_array; - Assert(!v); // not implemented + // This is currently unset. So assert that it is NULL + const grib_hash_array_value* v = self->hash_array; + Assert(v == NULL); // if (v) // grib_trie_delete(v->index); // while (v) { @@ -335,6 +336,6 @@ grib_hash_array_value* get_hash_array(grib_handle* h, grib_action* a) const char* get_hash_array_full_path(grib_action* a) { - grib_action_hash_array* self = (grib_action_hash_array*)a; + const grib_action_hash_array* self = (grib_action_hash_array*)a; return self->full_path; } diff --git a/src/action_class_noop.cc b/src/action_class_noop.cc index a898da06a..aa5196a46 100644 --- a/src/action_class_noop.cc +++ b/src/action_class_noop.cc @@ -73,16 +73,15 @@ grib_action* grib_action_create_noop(grib_context* context, const char* fname) { char buf[1024]; - grib_action_noop* a; grib_action_class* c = grib_action_class_noop; grib_action* act = (grib_action*)grib_context_malloc_clear_persistent(context, c->size); act->op = grib_context_strdup_persistent(context, "section"); act->cclass = c; - a = (grib_action_noop*)act; + grib_action_noop* a = (grib_action_noop*)act; act->context = context; - snprintf(buf, 1024, "_noop%p", (void*)a); + snprintf(buf, sizeof(buf), "_noop%p", (void*)a); act->name = grib_context_strdup_persistent(context, buf); diff --git a/src/action_class_set.cc b/src/action_class_set.cc index 1068181d5..fee2ca406 100644 --- a/src/action_class_set.cc +++ b/src/action_class_set.cc @@ -114,8 +114,8 @@ static int execute(grib_action* a, grib_handle* h) static void dump(grib_action* act, FILE* f, int lvl) { - int i = 0; - grib_action_set* self = (grib_action_set*)act; + int i = 0; + const grib_action_set* self = (grib_action_set*)act; for (i = 0; i < lvl; i++) grib_context_print(act->context, f, " "); grib_context_print(act->context, f, self->name); diff --git a/src/action_class_template.cc b/src/action_class_template.cc index 33a753513..79fd2aeaf 100644 --- a/src/action_class_template.cc +++ b/src/action_class_template.cc @@ -117,7 +117,7 @@ static void dump(grib_action* act, FILE* f, int lvl) static grib_action* get_empty_template(grib_context* c, int* err) { char fname[] = "empty_template.def"; - char* path = grib_context_full_defs_path(c, fname); + const char* path = grib_context_full_defs_path(c, fname); if (path) { *err = GRIB_SUCCESS; return grib_parse_file(c, path); diff --git a/src/action_class_transient_darray.cc b/src/action_class_transient_darray.cc index 9990beb41..673f83502 100644 --- a/src/action_class_transient_darray.cc +++ b/src/action_class_transient_darray.cc @@ -122,8 +122,8 @@ static int execute(grib_action* act, grib_handle* h) static void dump(grib_action* act, FILE* f, int lvl) { - int i = 0; - grib_action_transient_darray* self = (grib_action_transient_darray*)act; + int i = 0; + const grib_action_transient_darray* self = (grib_action_transient_darray*)act; for (i = 0; i < lvl; i++) grib_context_print(act->context, f, " "); grib_context_print(act->context, f, self->name); From 92cbaa050d2547dcfe592607ac7be5489ee1b9b3 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 6 Mar 2024 22:05:57 +0000 Subject: [PATCH 163/244] Testing: Fix for Windows --- tests/grib_update_sections_lengths.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/grib_update_sections_lengths.cc b/tests/grib_update_sections_lengths.cc index a077b3ebd..cda520643 100644 --- a/tests/grib_update_sections_lengths.cc +++ b/tests/grib_update_sections_lengths.cc @@ -18,7 +18,7 @@ int main(int argc, char* argv[]) char* infile = 0; char* oufile = 0; int err = 0; - size_t size; + size_t size = 0; const void* buffer = NULL; if (argc < 3) return 1; // prog in out @@ -26,15 +26,16 @@ int main(int argc, char* argv[]) infile = argv[1]; oufile = argv[2]; - inf = fopen(infile, "r"); + inf = fopen(infile, "rb"); Assert(inf); - ouf = fopen(oufile, "w"); + ouf = fopen(oufile, "wb"); Assert(ouf); while ((h = grib_handle_new_from_file(0, inf, &err)) != NULL) { grib_update_sections_lengths(h); GRIB_CHECK(grib_get_message(h, &buffer, &size), 0); + printf("size = %zu\n", size); if (fwrite(buffer, 1, size, ouf) != size) { perror(oufile); exit(1); From 95aa40fc234679d4d5066d9ea5d5e012f4489e74 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 7 Mar 2024 13:34:33 +0000 Subject: [PATCH 164/244] Examples: Use binary write mode for fopen --- examples/C/grib_multi_write.c | 2 +- examples/C/grib_multi_write.sh | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/C/grib_multi_write.c b/examples/C/grib_multi_write.c index b68df1517..d0f275c58 100644 --- a/examples/C/grib_multi_write.c +++ b/examples/C/grib_multi_write.c @@ -72,7 +72,7 @@ int main(int argc, char** argv) } /* open output file */ - of = fopen(ofilename, "w"); + of = fopen(ofilename, "wb"); if (!of) { fprintf(stderr, "ERROR: unable to open output file %s\n", ofilename); exit(1); diff --git a/examples/C/grib_multi_write.sh b/examples/C/grib_multi_write.sh index a6a621a59..73942c663 100755 --- a/examples/C/grib_multi_write.sh +++ b/examples/C/grib_multi_write.sh @@ -9,20 +9,20 @@ . ./include.ctest.sh -#if [ ! -f "${data_dir}/sample.grib2" ] -#then -# echo SKIP: $0 -# exit -#fi +label="grib_multi_write_c" +tempGrib=temp.$label.grib +tempText=temp.$label.txt -${examples_dir}/c_grib_multi_write ${data_dir}/sample.grib2 ${data_dir}/multi_sample.grib2 > /dev/null +${examples_dir}/c_grib_multi_write ${data_dir}/sample.grib2 $tempGrib > /dev/null -${tools_dir}/grib_get -p step ${data_dir}/multi_sample.grib2 > ${data_dir}/multi_step.test +${tools_dir}/grib_get -p step $tempGrib > $tempText -diff ${data_dir}/multi_step.test ${data_dir}/multi_step.txt - -step=`${tools_dir}/grib_get -M -p step ${data_dir}/multi_sample.grib2` +reference=${data_dir}/multi_step.txt +diff $reference $tempText +# -M = Turn multi-field support off +step=`${tools_dir}/grib_get -M -p step $tempGrib` [ $step -eq 12 ] -rm -f ${data_dir}/multi_sample.grib2 ${data_dir}/multi_step.test +# Clean up +rm -f $tempGrib $tempText From 5521445e568146105d35cea13cb7e9bb2aeb134f Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 7 Mar 2024 16:00:50 +0000 Subject: [PATCH 165/244] Tools: Check overflow/underflow --- src/grib_accessor_class_variable.cc | 7 ++++++- src/grib_util.cc | 7 +++++++ tests/grib_set_fail.sh | 13 +++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/grib_accessor_class_variable.cc b/src/grib_accessor_class_variable.cc index 13b31706b..1eb04f897 100644 --- a/src/grib_accessor_class_variable.cc +++ b/src/grib_accessor_class_variable.cc @@ -208,11 +208,16 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len) const double dval = *val; if (*len != 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s it contains %d values", a->name, 1); + grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains %d values", a->name, 1); *len = 1; return GRIB_ARRAY_TOO_SMALL; } + //if (std::isnan(dval)) { + // grib_context_log(a->context, GRIB_LOG_ERROR, "%s: Invalid number for %s: %g", __func__, a->name, dval); + // return GRIB_INVALID_ARGUMENT; + //} + self->dval = dval; if (dval < (double)LONG_MIN || dval > (double)LONG_MAX) self->type = GRIB_TYPE_DOUBLE; diff --git a/src/grib_util.cc b/src/grib_util.cc index 670dbd8aa..d2c1af775 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -1748,6 +1748,13 @@ static void set_value(grib_values* value, char* str, int equal) case GRIB_TYPE_UNDEFINED: value->long_value = strtol(buf, &p, 10); if (*p == 0) { + // check the conversion from string to long + if ((errno == ERANGE && (value->long_value == LONG_MAX || value->long_value == LONG_MIN)) || + (errno != 0 && value->long_value == 0)) { + fprintf(stderr, "ECCODES WARNING : Setting %s=%s causes overflow/underflow\n", value->name, buf); + fprintf(stderr, "ECCODES WARNING : Value adjusted to %ld\n", value->long_value); + //perror("strtol"); + } value->type = GRIB_TYPE_LONG; value->has_value = 1; } diff --git a/tests/grib_set_fail.sh b/tests/grib_set_fail.sh index 1a44b5a3b..e3fd7acd9 100755 --- a/tests/grib_set_fail.sh +++ b/tests/grib_set_fail.sh @@ -19,7 +19,7 @@ temp=${data_dir}/temp.$label.out infile=${data_dir}/regular_gaussian_surface.grib2 -# Set without -s. Expected to fail +# Set without -s # ---------------------------------------------------- set +e ${tools_dir}/grib_set -p levtype $infile $outfile > $temp 2>&1 @@ -28,7 +28,7 @@ set -e [ $status -ne 0 ] grep -q "provide some keys to set" $temp -# Set with empty -s. Expected to fail +# Set with empty -s # ---------------------------------------------------- set +e ${tools_dir}/grib_set -s '' $infile $outfile > $temp 2>&1 @@ -37,7 +37,7 @@ set -e [ $status -ne 0 ] grep -q "provide some keys to set" $temp -# Out-of-bounds value. Expected to fail +# Out-of-bounds value # ---------------------------------------------------- input=${data_dir}/reduced_gaussian_sub_area.grib2 set +e @@ -47,7 +47,7 @@ set -e [ $status -ne 0 ] grep -q "Trying to encode value of 1000 but the maximum allowable value is 255 (number of bits=8)" $temp -# Negative value for an unsigned key. Expected to fail +# Negative value for an unsigned key # ---------------------------------------------------- input=${data_dir}/reduced_gaussian_sub_area.grib2 set +e @@ -181,6 +181,11 @@ set -e [ $status -ne 0 ] grep -q "centre: No such code table entry.*Did you mean.*ecmf" $temp +# Overflow/Underflow +# ------------------------ +input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl +${tools_dir}/grib_set -s missingValue=9223372036854776666 $input $outfile > $temp 2>&1 +grep -q "ECCODES WARNING : Setting .* causes overflow/underflow" $temp # ------------------------ # Unreadable message From 84f23bf5020134ec9bf3fe43cf5c1eb8efe7fc73 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 7 Mar 2024 16:58:23 +0000 Subject: [PATCH 166/244] ECC-1782: Repacking sample GRIB2.tmpl fails when ECCODES_GRIB_DATA_QUALITY_CHECKS=1 --- samples/GRIB2.tmpl | Bin 179 -> 179 bytes tests/codes_ecc-1698.sh | 4 ++-- tests/grib_data_quality_checks.sh | 17 ++++++++++++++--- tests/grib_decimalPrecision.sh | 8 +++++--- tests/grib_ecc-1271.sh | 2 +- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/samples/GRIB2.tmpl b/samples/GRIB2.tmpl index 5c7b111ce7bff3a14a194351d67418d3aa6342ce..e2f890a57d52dea5ea01d64c3285a1babd51bab1 100644 GIT binary patch delta 32 gcmdnYxS4UnEJ^2%28ISM1_)qd`wwKWvYP_|0EIXPbN~PV delta 32 gcmdnYxS4UnEJ^zY28ISM1_)qd`wwKWvYP_|0C $tempDir/param_limits.def < 4 -${tools_dir}/grib_set -s paramId=260509,step=12,scaleValuesBy=1000 $sample_g2 $tempGrib2 +# The GRIB2 sample has max values of 273. We need to use 1 for this test +${tools_dir}/grib_set -s paramId=260509,step=12,values=1,scaleValuesBy=1000 $sample_g2 $tempGrib2 # Step of 0 doesn't satisfy the condition so will use 400 +# The GRIB2 sample has max values of 273. We need to use 1 for this test set +e -${tools_dir}/grib_set -s paramId=260509,scaleValuesBy=1000 $sample_g2 $tempGrib2 +${tools_dir}/grib_set -s paramId=260509,values=1,scaleValuesBy=1000 $sample_g2 $tempGrib2 status=$? set -e [ $status -ne 0 ] diff --git a/tests/grib_decimalPrecision.sh b/tests/grib_decimalPrecision.sh index 66a4c6253..afe13ad74 100755 --- a/tests/grib_decimalPrecision.sh +++ b/tests/grib_decimalPrecision.sh @@ -10,6 +10,9 @@ . ./include.ctest.sh +label="grib_decimalPrecision_test" + +temp=temp.$label.grib REDIRECT=/dev/null files="regular_latlon_surface.grib2 \ @@ -29,7 +32,6 @@ for file in $files; do done # ECC-458: spectral_complex packing -temp=temp.grib_decimalPrecision.grib infile=${data_dir}/spectral_complex.grib1 # Catch errors re negative values export ECCODES_FAIL_IF_LOG_MESSAGE=1 @@ -42,7 +44,7 @@ sample2=$ECCODES_SAMPLES_PATH/GRIB2.tmpl ${tools_dir}/grib_set -s decimalScaleFactor=3 $sample1 $temp grib_check_key_equals $temp min,max,const,decimalScaleFactor,referenceValue '47485.4 47485.4 1 3 47485.4' ${tools_dir}/grib_set -s decimalScaleFactor=3 $sample2 $temp -grib_check_key_equals $temp min,max,const,decimalScaleFactor,referenceValue '1 1 1 3 1' - +grib_check_key_equals $temp min,max,const,decimalScaleFactor,referenceValue '273 273 1 3 273' +# Clean up rm -f $temp diff --git a/tests/grib_ecc-1271.sh b/tests/grib_ecc-1271.sh index 04a25d828..8e9f7ed13 100755 --- a/tests/grib_ecc-1271.sh +++ b/tests/grib_ecc-1271.sh @@ -23,6 +23,6 @@ $sample_grib2 $temp grib_check_key_equals $temp Ni,Nj "16 31" grib_check_key_equals $temp centreLatitudeInDegrees,centreLongitudeInDegrees "0 30" -grib_check_key_equals $temp minimum,maximum "1 1" +grib_check_key_equals $temp minimum,maximum "273 273" rm -f $temp From 017794f8e1c8a9a40e6390c50d684401866fb9f9 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 7 Mar 2024 21:10:30 +0000 Subject: [PATCH 167/244] Refactoring: removal of duplicated code (dump) --- src/grib_accessor_class_bit.cc | 9 ++------- src/grib_accessor_class_bufrdc_expanded_descriptors.cc | 10 ++-------- src/grib_accessor_class_expanded_descriptors.cc | 10 ++-------- src/grib_accessor_class_g1date.cc | 10 ++-------- src/grib_accessor_class_g1monthlydate.cc | 10 ++-------- src/grib_accessor_class_g1verificationdate.cc | 10 ++-------- src/grib_accessor_class_g2date.cc | 10 ++-------- src/grib_accessor_class_g2level.cc | 10 ++-------- src/grib_accessor_class_rdbtime_guess_date.cc | 10 ++-------- src/grib_accessor_class_signed_bits.cc | 10 ++-------- src/grib_accessor_class_spd.cc | 10 ++-------- src/grib_accessor_class_time.cc | 10 ++-------- src/grib_accessor_class_validity_date.cc | 10 ++-------- src/grib_accessor_class_validity_time.cc | 10 ++-------- 14 files changed, 28 insertions(+), 111 deletions(-) diff --git a/src/grib_accessor_class_bit.cc b/src/grib_accessor_class_bit.cc index 17c1d3c8c..e3099d259 100644 --- a/src/grib_accessor_class_bit.cc +++ b/src/grib_accessor_class_bit.cc @@ -17,7 +17,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init MEMBERS = const char* owner MEMBERS = int bit_index END_CLASS_DEF @@ -36,7 +36,6 @@ or edit "accessor.class" and rerun ./make_class.pl static int pack_long(grib_accessor*, const long* val, size_t* len); static int unpack_long(grib_accessor*, long* val, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_bit @@ -60,7 +59,7 @@ static grib_accessor_class _grib_accessor_class_bit = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -112,10 +111,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* arg) self->bit_index = grib_arguments_get_long(grib_handle_of_accessor(a), arg, 1); } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} static int unpack_long(grib_accessor* a, long* val, size_t* len) { diff --git a/src/grib_accessor_class_bufrdc_expanded_descriptors.cc b/src/grib_accessor_class_bufrdc_expanded_descriptors.cc index 8476f4708..929e21724 100644 --- a/src/grib_accessor_class_bufrdc_expanded_descriptors.cc +++ b/src/grib_accessor_class_bufrdc_expanded_descriptors.cc @@ -24,7 +24,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long IMPLEMENTS = unpack_string_array -IMPLEMENTS = init;dump;destroy +IMPLEMENTS = init;destroy IMPLEMENTS = value_count MEMBERS = const char* expandedDescriptors MEMBERS = grib_accessor* expandedDescriptorsAccessor @@ -47,7 +47,6 @@ static int unpack_long(grib_accessor*, long* val, size_t* len); static int unpack_string_array(grib_accessor*, char**, size_t* len); static int value_count(grib_accessor*, long*); static void destroy(grib_context*, grib_accessor*); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_bufrdc_expanded_descriptors @@ -71,7 +70,7 @@ static grib_accessor_class _grib_accessor_class_bufrdc_expanded_descriptors = { &init, /* init */ 0, /* post_init */ &destroy, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ &value_count, /* get number of values */ @@ -125,11 +124,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* args) a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static grib_accessor* get_accessor(grib_accessor* a) { grib_accessor_bufrdc_expanded_descriptors* self = (grib_accessor_bufrdc_expanded_descriptors*)a; diff --git a/src/grib_accessor_class_expanded_descriptors.cc b/src/grib_accessor_class_expanded_descriptors.cc index d515e4dcb..b4cb0ece7 100644 --- a/src/grib_accessor_class_expanded_descriptors.cc +++ b/src/grib_accessor_class_expanded_descriptors.cc @@ -26,7 +26,7 @@ SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long IMPLEMENTS = unpack_double IMPLEMENTS = unpack_string_array -IMPLEMENTS = init;dump;destroy +IMPLEMENTS = init;destroy IMPLEMENTS = value_count; get_native_type MEMBERS = const char* unexpandedDescriptors MEMBERS = const char* sequence @@ -59,7 +59,6 @@ static int unpack_long(grib_accessor*, long* val, size_t* len); static int unpack_string_array(grib_accessor*, char**, size_t* len); static int value_count(grib_accessor*, long*); static void destroy(grib_context*, grib_accessor*); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_expanded_descriptors @@ -90,7 +89,7 @@ static grib_accessor_class _grib_accessor_class_expanded_descriptors = { &init, /* init */ 0, /* post_init */ &destroy, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ &value_count, /* get number of values */ @@ -180,11 +179,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* args) a->length = 0; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static bufr_descriptors_array* do_expand(grib_accessor* a, bufr_descriptors_array* unexpanded, change_coding_params* ccp, int* err); #define BUFR_DESCRIPTORS_ARRAY_USED_SIZE(v) ((v)->n) diff --git a/src/grib_accessor_class_g1date.cc b/src/grib_accessor_class_g1date.cc index 10294a935..c53b3768a 100644 --- a/src/grib_accessor_class_g1date.cc +++ b/src/grib_accessor_class_g1date.cc @@ -17,7 +17,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long;unpack_string - IMPLEMENTS = init;dump;value_count + IMPLEMENTS = init;value_count MEMBERS=const char* century MEMBERS=const char* year MEMBERS=const char* month @@ -40,7 +40,6 @@ static int pack_long(grib_accessor*, const long* val, size_t* len); static int unpack_long(grib_accessor*, long* val, size_t* len); static int unpack_string(grib_accessor*, char*, size_t* len); static int value_count(grib_accessor*, long*); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_g1date @@ -66,7 +65,7 @@ static grib_accessor_class _grib_accessor_class_g1date = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ &value_count, /* get number of values */ @@ -122,11 +121,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) self->day = grib_arguments_get_name(hand, c, n++); } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_g1date* self = (grib_accessor_g1date*)a; diff --git a/src/grib_accessor_class_g1monthlydate.cc b/src/grib_accessor_class_g1monthlydate.cc index 503d0daa4..57c3ea729 100644 --- a/src/grib_accessor_class_g1monthlydate.cc +++ b/src/grib_accessor_class_g1monthlydate.cc @@ -22,7 +22,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init MEMBERS=const char* date END_CLASS_DEF @@ -39,7 +39,6 @@ or edit "accessor.class" and rerun ./make_class.pl */ static int unpack_long(grib_accessor*, long* val, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_g1monthlydate @@ -62,7 +61,7 @@ static grib_accessor_class _grib_accessor_class_g1monthlydate = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -115,11 +114,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_g1monthlydate* self = (grib_accessor_g1monthlydate*)a; diff --git a/src/grib_accessor_class_g1verificationdate.cc b/src/grib_accessor_class_g1verificationdate.cc index a3272acc2..03c871617 100644 --- a/src/grib_accessor_class_g1verificationdate.cc +++ b/src/grib_accessor_class_g1verificationdate.cc @@ -17,7 +17,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init MEMBERS=const char* date MEMBERS=const char* time MEMBERS=const char* step @@ -36,7 +36,6 @@ or edit "accessor.class" and rerun ./make_class.pl */ static int unpack_long(grib_accessor*, long* val, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_g1verificationdate @@ -61,7 +60,7 @@ static grib_accessor_class _grib_accessor_class_g1verificationdate = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -117,11 +116,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_g1verificationdate* self = (grib_accessor_g1verificationdate*)a; diff --git a/src/grib_accessor_class_g2date.cc b/src/grib_accessor_class_g2date.cc index c85e86b9e..698cd4a26 100644 --- a/src/grib_accessor_class_g2date.cc +++ b/src/grib_accessor_class_g2date.cc @@ -16,7 +16,7 @@ START_CLASS_DEF CLASS = accessor SUPER = grib_accessor_class_long - IMPLEMENTS = unpack_long;pack_long;init;dump + IMPLEMENTS = unpack_long;pack_long;init MEMBERS=const char* century MEMBERS=const char* year MEMBERS=const char* month @@ -37,7 +37,6 @@ or edit "accessor.class" and rerun ./make_class.pl static int pack_long(grib_accessor*, const long* val, size_t* len); static int unpack_long(grib_accessor*, long* val, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_g2date @@ -63,7 +62,7 @@ static grib_accessor_class _grib_accessor_class_g2date = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -116,11 +115,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) self->day = grib_arguments_get_name(grib_handle_of_accessor(a), c, n++); } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { const grib_accessor_g2date* self = (grib_accessor_g2date*)a; diff --git a/src/grib_accessor_class_g2level.cc b/src/grib_accessor_class_g2level.cc index e1d8aaa38..39bd79033 100644 --- a/src/grib_accessor_class_g2level.cc +++ b/src/grib_accessor_class_g2level.cc @@ -17,7 +17,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_double;pack_double - IMPLEMENTS = unpack_long;pack_long;init;dump;is_missing + IMPLEMENTS = unpack_long;pack_long;init;is_missing MEMBERS=const char* type_first MEMBERS=const char* scale_first MEMBERS=const char* value_first @@ -41,7 +41,6 @@ static int pack_double(grib_accessor*, const double* val, size_t* len); static int pack_long(grib_accessor*, const long* val, size_t* len); static int unpack_double(grib_accessor*, double* val, size_t* len); static int unpack_long(grib_accessor*, long* val, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_g2level @@ -67,7 +66,7 @@ static grib_accessor_class _grib_accessor_class_g2level = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -126,11 +125,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) a->flags |= GRIB_ACCESSOR_FLAG_COPY_IF_CHANGING_EDITION; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static bool is_tigge(grib_handle* h) { long productionStatus = 0; diff --git a/src/grib_accessor_class_rdbtime_guess_date.cc b/src/grib_accessor_class_rdbtime_guess_date.cc index 7bd8a3c4a..8a3bfa2a1 100644 --- a/src/grib_accessor_class_rdbtime_guess_date.cc +++ b/src/grib_accessor_class_rdbtime_guess_date.cc @@ -17,7 +17,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init MEMBERS=const char* typicalYear MEMBERS=const char* typicalMonth MEMBERS=const char* typicalDay @@ -39,7 +39,6 @@ or edit "accessor.class" and rerun ./make_class.pl static int pack_long(grib_accessor*, const long* val, size_t* len); static int unpack_long(grib_accessor*, long* val, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_rdbtime_guess_date @@ -66,7 +65,7 @@ static grib_accessor_class _grib_accessor_class_rdbtime_guess_date = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -124,11 +123,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) /* a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; */ } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_rdbtime_guess_date* self = (grib_accessor_rdbtime_guess_date*)a; diff --git a/src/grib_accessor_class_signed_bits.cc b/src/grib_accessor_class_signed_bits.cc index 1750af3eb..dc8ccf488 100644 --- a/src/grib_accessor_class_signed_bits.cc +++ b/src/grib_accessor_class_signed_bits.cc @@ -16,7 +16,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init IMPLEMENTS = next_offset IMPLEMENTS = byte_count IMPLEMENTS = value_count @@ -45,7 +45,6 @@ static long byte_count(grib_accessor*); static long byte_offset(grib_accessor*); static long next_offset(grib_accessor*); static int value_count(grib_accessor*, long*); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); static void update_size(grib_accessor*, size_t); @@ -70,7 +69,7 @@ static grib_accessor_class _grib_accessor_class_signed_bits = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ &next_offset, /* next_offset */ 0, /* get length of string */ &value_count, /* get number of values */ @@ -152,11 +151,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* args) a->length = compute_byte_count(a); } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { return GRIB_NOT_IMPLEMENTED; diff --git a/src/grib_accessor_class_spd.cc b/src/grib_accessor_class_spd.cc index 22fa03dc5..734c0bc89 100644 --- a/src/grib_accessor_class_spd.cc +++ b/src/grib_accessor_class_spd.cc @@ -16,7 +16,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init IMPLEMENTS = next_offset IMPLEMENTS = byte_count IMPLEMENTS = value_count @@ -45,7 +45,6 @@ static long byte_count(grib_accessor*); static long byte_offset(grib_accessor*); static long next_offset(grib_accessor*); static int value_count(grib_accessor*, long*); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); static void update_size(grib_accessor*, size_t); @@ -70,7 +69,7 @@ static grib_accessor_class _grib_accessor_class_spd = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ &next_offset, /* next_offset */ 0, /* get length of string */ &value_count, /* get number of values */ @@ -153,11 +152,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* args) a->length = compute_byte_count(a); } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_spd* self = (grib_accessor_spd*)a; diff --git a/src/grib_accessor_class_time.cc b/src/grib_accessor_class_time.cc index 36aa290c9..3251fdd33 100644 --- a/src/grib_accessor_class_time.cc +++ b/src/grib_accessor_class_time.cc @@ -18,7 +18,7 @@ SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long IMPLEMENTS = unpack_string - IMPLEMENTS = init;dump + IMPLEMENTS = init MEMBERS=const char* hour MEMBERS=const char* minute MEMBERS=const char* second @@ -39,7 +39,6 @@ or edit "accessor.class" and rerun ./make_class.pl static int pack_long(grib_accessor*, const long* val, size_t* len); static int unpack_long(grib_accessor*, long* val, size_t* len); static int unpack_string(grib_accessor*, char*, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_time @@ -64,7 +63,7 @@ static grib_accessor_class _grib_accessor_class_time = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -119,11 +118,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) self->second = grib_arguments_get_name(hand, c, n++); } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { const grib_accessor_time* self = (grib_accessor_time*)a; diff --git a/src/grib_accessor_class_validity_date.cc b/src/grib_accessor_class_validity_date.cc index 8182228ae..760b7bccd 100644 --- a/src/grib_accessor_class_validity_date.cc +++ b/src/grib_accessor_class_validity_date.cc @@ -17,7 +17,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init MEMBERS=const char* date MEMBERS=const char* time MEMBERS=const char* step @@ -40,7 +40,6 @@ or edit "accessor.class" and rerun ./make_class.pl */ static int unpack_long(grib_accessor*, long* val, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_validity_date @@ -69,7 +68,7 @@ static grib_accessor_class _grib_accessor_class_validity_date = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -165,11 +164,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_validity_date* self = (grib_accessor_validity_date*)a; diff --git a/src/grib_accessor_class_validity_time.cc b/src/grib_accessor_class_validity_time.cc index 0b2c9697f..34eb78128 100644 --- a/src/grib_accessor_class_validity_time.cc +++ b/src/grib_accessor_class_validity_time.cc @@ -18,7 +18,7 @@ SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long IMPLEMENTS = unpack_string - IMPLEMENTS = init;dump + IMPLEMENTS = init MEMBERS=const char* date MEMBERS=const char* time MEMBERS=const char* step @@ -41,7 +41,6 @@ or edit "accessor.class" and rerun ./make_class.pl static int unpack_long(grib_accessor*, long* val, size_t* len); static int unpack_string(grib_accessor*, char*, size_t* len); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); typedef struct grib_accessor_validity_time @@ -69,7 +68,7 @@ static grib_accessor_class _grib_accessor_class_validity_time = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ 0, /* next_offset */ 0, /* get length of string */ 0, /* get number of values */ @@ -164,11 +163,6 @@ static void init(grib_accessor* a, const long l, grib_arguments* c) a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_validity_time* self = (grib_accessor_validity_time*)a; From 13e38aae9222a8b102e5653cb568d06982203708 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 7 Mar 2024 21:11:32 +0000 Subject: [PATCH 168/244] Deprecated travis yaml --- .travis.yml => deprecated/.travis.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .travis.yml => deprecated/.travis.yml (100%) diff --git a/.travis.yml b/deprecated/.travis.yml similarity index 100% rename from .travis.yml rename to deprecated/.travis.yml From 5af33b3ef6ab7094f30baedb9b4a7372a2e503c3 Mon Sep 17 00:00:00 2001 From: Robert Osinski Date: Fri, 8 Mar 2024 08:14:19 +0000 Subject: [PATCH 169/244] extended and modified stepTypeForConversion --- .../ecmf/stepTypeForConversion.def | 217 +++++++++++++++--- 1 file changed, 191 insertions(+), 26 deletions(-) diff --git a/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def b/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def index c649d29a6..a0f508ebe 100644 --- a/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def +++ b/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def @@ -7,31 +7,196 @@ "accum" = {timeRangeIndicator=1;indicatorOfParameter=228;gribTablesVersionNo=128;centre=98;} "accum" = {timeRangeIndicator=10;indicatorOfParameter=228;gribTablesVersionNo=128;centre=98;} -# sshf -"accum" = {indicatorOfParameter=146;gribTablesVersionNo=128;centre=98;} -# slhf -"accum" = {indicatorOfParameter=147;gribTablesVersionNo=128;centre=98;} -# ssrd -"accum" = {indicatorOfParameter=169;gribTablesVersionNo=128;centre=98;} -# strd -"accum" = {indicatorOfParameter=175;gribTablesVersionNo=128;centre=98;} -# ssr -"accum" = {indicatorOfParameter=176;gribTablesVersionNo=128;centre=98;} -# str -"accum" = {indicatorOfParameter=177;gribTablesVersionNo=128;centre=98;} -# ttr -"accum" = {indicatorOfParameter=179;gribTablesVersionNo=128;centre=98;} -# sund -"accum" = {indicatorOfParameter=189;gribTablesVersionNo=128;centre=98;} -# runoff -"accum" = {indicatorOfParameter=205;gribTablesVersionNo=128;centre=98;} # sro -"accum" = {indicatorOfParameter=8;gribTablesVersionNo=128;centre=98;} -# e -"accum" = {indicatorOfParameter=182;gribTablesVersionNo=128;centre=98;} -# lsp -"accum" = {indicatorOfParameter=142;gribTablesVersionNo=128;centre=98;} -# pev -"accum" = {indicatorOfParameter=251;gribTablesVersionNo=228;centre=98;} +"accum"={gribTablesVersionNo=128;indicatorOfParameter=8;centre=98;} +# ssro +"accum"={gribTablesVersionNo=128;indicatorOfParameter=9;centre=98;} +# parcs +"accum"={gribTablesVersionNo=128;indicatorOfParameter=20;centre=98;} +# es +"accum"={gribTablesVersionNo=128;indicatorOfParameter=44;centre=98;} +# smlt +"accum"={gribTablesVersionNo=128;indicatorOfParameter=45;centre=98;} +# dsrp +"accum"={gribTablesVersionNo=128;indicatorOfParameter=47;centre=98;} +# 10fg +"max"={gribTablesVersionNo=128;indicatorOfParameter=49;centre=98;} +# lspf +"accum"={gribTablesVersionNo=128;indicatorOfParameter=50;centre=98;} +# mx2t24 +"max"={gribTablesVersionNo=128;indicatorOfParameter=51;centre=98;} +# mn2t24 +"min"={gribTablesVersionNo=128;indicatorOfParameter=52;centre=98;} # uvb -"accum" = {indicatorOfParameter=57;gribTablesVersionNo=128;centre=98;} +"accum"={gribTablesVersionNo=128;indicatorOfParameter=57;centre=98;} +# par +"accum"={gribTablesVersionNo=128;indicatorOfParameter=58;centre=98;} +# mx2t6 +"max"={gribTablesVersionNo=128;indicatorOfParameter=121;centre=98;} +# mn2t6 +"min"={gribTablesVersionNo=128;indicatorOfParameter=122;centre=98;} +# lsp +"accum"={gribTablesVersionNo=128;indicatorOfParameter=142;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=142;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=142;centre=98;} +# cp +"accum"={gribTablesVersionNo=128;indicatorOfParameter=143;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=143;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=143;centre=98;} +# sf +"accum"={gribTablesVersionNo=128;indicatorOfParameter=144;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=144;centre=98;} +# bld +"accum"={gribTablesVersionNo=128;indicatorOfParameter=145;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=145;centre=98;} +# sshf +"accum"={gribTablesVersionNo=128;indicatorOfParameter=146;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=146;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=146;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=146;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=146;centre=98;} +# slhf +"accum"={gribTablesVersionNo=128;indicatorOfParameter=147;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=147;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=147;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=147;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=147;centre=98;} +# snr +"accum"={gribTablesVersionNo=128;indicatorOfParameter=149;centre=98;} +# tnr +"accum"={gribTablesVersionNo=128;indicatorOfParameter=150;centre=98;} +# ssrd +"accum"={gribTablesVersionNo=128;indicatorOfParameter=169;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=169;centre=98;} +# strd +"accum"={gribTablesVersionNo=128;indicatorOfParameter=175;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=175;centre=98;} +# ssr +"accum"={gribTablesVersionNo=128;indicatorOfParameter=176;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=176;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=176;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=176;centre=98;} +# str +"accum"={gribTablesVersionNo=128;indicatorOfParameter=177;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=177;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=177;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=177;centre=98;} +# tsr +"accum"={gribTablesVersionNo=128;indicatorOfParameter=178;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=178;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=178;centre=98;} +# ttr +"accum"={gribTablesVersionNo=128;indicatorOfParameter=179;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=179;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=179;centre=98;} +# ewss +"accum"={gribTablesVersionNo=128;indicatorOfParameter=180;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=180;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=180;centre=98;} +# nsss +"accum"={gribTablesVersionNo=128;indicatorOfParameter=181;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=181;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=181;centre=98;} +# e +"accum"={gribTablesVersionNo=128;indicatorOfParameter=182;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=182;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=182;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=182;centre=98;} +# sund +"accum"={gribTablesVersionNo=128;indicatorOfParameter=189;centre=98;} +# lgws +"accum"={gribTablesVersionNo=128;indicatorOfParameter=195;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=195;centre=98;} +# mgws +"accum"={gribTablesVersionNo=128;indicatorOfParameter=196;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=196;centre=98;} +# gwd +"accum"={gribTablesVersionNo=128;indicatorOfParameter=197;centre=98;} +"accum"={gribTablesVersionNo=160;indicatorOfParameter=197;centre=98;} +# mx2t +"max"={gribTablesVersionNo=128;indicatorOfParameter=201;centre=98;} +"max"={gribTablesVersionNo=170;indicatorOfParameter=201;centre=98;} +"max"={gribTablesVersionNo=190;indicatorOfParameter=201;centre=98;} +# mn2t +"min"={gribTablesVersionNo=128;indicatorOfParameter=202;centre=98;} +"min"={gribTablesVersionNo=170;indicatorOfParameter=202;centre=98;} +"min"={gribTablesVersionNo=190;indicatorOfParameter=202;centre=98;} +# ro +"accum"={gribTablesVersionNo=128;indicatorOfParameter=205;centre=98;} +"accum"={gribTablesVersionNo=180;indicatorOfParameter=205;centre=98;} +# tsrc +"accum"={gribTablesVersionNo=128;indicatorOfParameter=208;centre=98;} +# ttrc +"accum"={gribTablesVersionNo=128;indicatorOfParameter=209;centre=98;} +# ssrc +"accum"={gribTablesVersionNo=128;indicatorOfParameter=210;centre=98;} +# strc +"accum"={gribTablesVersionNo=128;indicatorOfParameter=211;centre=98;} +# tisr +"accum"={gribTablesVersionNo=128;indicatorOfParameter=212;centre=98;} +# vimd +"accum"={gribTablesVersionNo=128;indicatorOfParameter=213;centre=98;} +# tp +"accum"={gribTablesVersionNo=160;indicatorOfParameter=228;centre=98;} +"accum"={gribTablesVersionNo=170;indicatorOfParameter=228;centre=98;} +"accum"={gribTablesVersionNo=190;indicatorOfParameter=228;centre=98;} +# csf +"accum"={gribTablesVersionNo=128;indicatorOfParameter=239;centre=98;} +# lsf +"accum"={gribTablesVersionNo=128;indicatorOfParameter=240;centre=98;} +# fdir +"accum"={gribTablesVersionNo=228;indicatorOfParameter=21;centre=98;} +# cdir +"accum"={gribTablesVersionNo=228;indicatorOfParameter=22;centre=98;} +# mx2t3 +"max"={gribTablesVersionNo=228;indicatorOfParameter=26;centre=98;} +# mn2t3 +"min"={gribTablesVersionNo=228;indicatorOfParameter=27;centre=98;} +# 10fg3 +"max"={gribTablesVersionNo=228;indicatorOfParameter=28;centre=98;} +# litota1 +""={gribTablesVersionNo=228;indicatorOfParameter=51;centre=98;} +# licga1 +""={gribTablesVersionNo=228;indicatorOfParameter=53;centre=98;} +# ssrdc +"accum"={gribTablesVersionNo=228;indicatorOfParameter=129;centre=98;} +# strdc +"accum"={gribTablesVersionNo=228;indicatorOfParameter=130;centre=98;} +# fzra +"accum"={gribTablesVersionNo=228;indicatorOfParameter=216;centre=98;} +# mxtpr +"max"={gribTablesVersionNo=228;indicatorOfParameter=226;centre=98;} +# mntpr +"min"={gribTablesVersionNo=228;indicatorOfParameter=227;centre=98;} +# pev +"accum"={gribTablesVersionNo=228;indicatorOfParameter=251;centre=98;} +# srta +"accum"={gribTablesVersionNo=162;indicatorOfParameter=100;centre=98;} +# trta +"accum"={gribTablesVersionNo=162;indicatorOfParameter=101;centre=98;} +# srtca +"accum"={gribTablesVersionNo=162;indicatorOfParameter=102;centre=98;} +# trtca +"accum"={gribTablesVersionNo=162;indicatorOfParameter=103;centre=98;} +# umfa +"accum"={gribTablesVersionNo=162;indicatorOfParameter=104;centre=98;} +# dmfa +"accum"={gribTablesVersionNo=162;indicatorOfParameter=105;centre=98;} +# udra +"accum"={gribTablesVersionNo=162;indicatorOfParameter=106;centre=98;} +# ddra +"accum"={gribTablesVersionNo=162;indicatorOfParameter=107;centre=98;} +# tpfa +"accum"={gribTablesVersionNo=162;indicatorOfParameter=108;centre=98;} +# tdcha +"accum"={gribTablesVersionNo=162;indicatorOfParameter=109;centre=98;} +# ttpha +"accum"={gribTablesVersionNo=162;indicatorOfParameter=110;centre=98;} +# qtpha +"accum"={gribTablesVersionNo=162;indicatorOfParameter=111;centre=98;} +# utpha +"accum"={gribTablesVersionNo=162;indicatorOfParameter=112;centre=98;} +# vtpha +"accum"={gribTablesVersionNo=162;indicatorOfParameter=113;centre=98;} +# sf +"accum"={gribTablesVersionNo=228;indicatorOfParameter=144;centre=98;} From e0398e03d8ae5df3e6cdfb8c72124f8d2724af7e Mon Sep 17 00:00:00 2001 From: Matthew Griffith Date: Fri, 8 Mar 2024 09:12:15 +0000 Subject: [PATCH 170/244] ECC-1766: Added class ed for testing and implemented the grib.class.def structure. --- definitions/grib2/section.4.def | 3 ++- definitions/mars/class.table | 1 + definitions/mars/grib.ed.def | 10 ++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 definitions/mars/grib.ed.def diff --git a/definitions/grib2/section.4.def b/definitions/grib2/section.4.def index 512544da4..a966bbc1e 100644 --- a/definitions/grib2/section.4.def +++ b/definitions/grib2/section.4.def @@ -63,7 +63,8 @@ if (productDefinitionTemplateNumber >= 32768) { } if (defined(marsStream) && defined(marsType)) { - template_nofail marsKeywords1 "mars/grib.[marsStream:s].[marsType:s].def"; + template_nofail marsKeywordsByClass "mars/grib.[marsClass:s].def"; + template_nofail marsKeywordsByStreamAndType "mars/grib.[marsStream:s].[marsType:s].def"; } template parameters "grib2/parameters.def"; diff --git a/definitions/mars/class.table b/definitions/mars/class.table index efe2be6b1..bb740e63a 100644 --- a/definitions/mars/class.table +++ b/definitions/mars/class.table @@ -50,6 +50,7 @@ 49 gh C3S Global hydrology 50 ci CERISE project 51 ai Operational AIFS +52 ed EERIE project 99 te Test 100 at Austria 101 be Belgium diff --git a/definitions/mars/grib.ed.def b/definitions/mars/grib.ed.def new file mode 100644 index 000000000..ae4d2b3db --- /dev/null +++ b/definitions/mars/grib.ed.def @@ -0,0 +1,10 @@ +# Class ed EERIE project climate keywords + +codetable[2] activity "grib2/destine_activity.table" : dump; +alias mars.activity = activity; + +codetable[2] experiment "grib2/destine_experiment.table" : dump; +alias mars.experiment = experiment; + +unsigned[1] realization = 255 : dump; +alias mars.realization = realization; \ No newline at end of file From 83fe7591e52f577cef5ee15b1df906b313f2baa3 Mon Sep 17 00:00:00 2001 From: Robert Osinski Date: Fri, 8 Mar 2024 09:38:59 +0000 Subject: [PATCH 171/244] extended grib1 section 1 for min/max stepTypeForConversion --- definitions/grib1/section.1.def | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/definitions/grib1/section.1.def b/definitions/grib1/section.1.def index 500b7de8f..859b20e35 100644 --- a/definitions/grib1/section.1.def +++ b/definitions/grib1/section.1.def @@ -321,6 +321,22 @@ if (stepTypeForConversion is "accum" ) { alias productDefinitionTemplateNumber=eight; } } +if (stepTypeForConversion is "max" ) { + if (productDefinitionTemplateNumber == 1) { + alias productDefinitionTemplateNumber=eleven; + } + else { + alias productDefinitionTemplateNumber=eight; + } +} +if (stepTypeForConversion is "min" ) { + if (productDefinitionTemplateNumber == 1) { + alias productDefinitionTemplateNumber=eleven; + } + else { + alias productDefinitionTemplateNumber=eight; + } +} meta md5Section1 md5(offsetSection1,section1Length); # md5(start,length,blacklisted1,blacklisted2,...); From bf6ffb6790b11a2cb88c8bbca06e21d1fc506acc Mon Sep 17 00:00:00 2001 From: Robert Osinski Date: Fri, 8 Mar 2024 10:00:14 +0000 Subject: [PATCH 172/244] Add missing entries stepTypeForConversion.def --- .../grib1/localConcepts/ecmf/stepTypeForConversion.def | 4 ++-- definitions/grib1/section.1.def | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def b/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def index a0f508ebe..07ec7ae41 100644 --- a/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def +++ b/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def @@ -155,9 +155,9 @@ # 10fg3 "max"={gribTablesVersionNo=228;indicatorOfParameter=28;centre=98;} # litota1 -""={gribTablesVersionNo=228;indicatorOfParameter=51;centre=98;} +"avg"={gribTablesVersionNo=228;indicatorOfParameter=51;centre=98;} # licga1 -""={gribTablesVersionNo=228;indicatorOfParameter=53;centre=98;} +"avg"={gribTablesVersionNo=228;indicatorOfParameter=53;centre=98;} # ssrdc "accum"={gribTablesVersionNo=228;indicatorOfParameter=129;centre=98;} # strdc diff --git a/definitions/grib1/section.1.def b/definitions/grib1/section.1.def index 859b20e35..32ac08292 100644 --- a/definitions/grib1/section.1.def +++ b/definitions/grib1/section.1.def @@ -337,6 +337,14 @@ if (stepTypeForConversion is "min" ) { alias productDefinitionTemplateNumber=eight; } } +if (stepTypeForConversion is "avg" ) { + if (productDefinitionTemplateNumber == 1) { + alias productDefinitionTemplateNumber=eleven; + } + else { + alias productDefinitionTemplateNumber=eight; + } +} meta md5Section1 md5(offsetSection1,section1Length); # md5(start,length,blacklisted1,blacklisted2,...); From d21279d85757b8a78f2a925334153c68d4b5c04c Mon Sep 17 00:00:00 2001 From: Robert Osinski Date: Fri, 8 Mar 2024 10:30:15 +0000 Subject: [PATCH 173/244] remove stepTypeForConversion for not produced parameter --- definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def | 2 -- 1 file changed, 2 deletions(-) diff --git a/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def b/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def index 07ec7ae41..e74860061 100644 --- a/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def +++ b/definitions/grib1/localConcepts/ecmf/stepTypeForConversion.def @@ -198,5 +198,3 @@ "accum"={gribTablesVersionNo=162;indicatorOfParameter=112;centre=98;} # vtpha "accum"={gribTablesVersionNo=162;indicatorOfParameter=113;centre=98;} -# sf -"accum"={gribTablesVersionNo=228;indicatorOfParameter=144;centre=98;} From 4752afb09e63a0e0831d442c4822979c53c7c59c Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 12:07:15 +0000 Subject: [PATCH 174/244] ECC-1783: grib_to_netcdf: No error message when input file has invalid fields --- tools/grib_to_netcdf.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/grib_to_netcdf.cc b/tools/grib_to_netcdf.cc index c1e09d7cc..0dad044ab 100644 --- a/tools/grib_to_netcdf.cc +++ b/tools/grib_to_netcdf.cc @@ -4225,7 +4225,15 @@ int grib_tool_new_filename_action(grib_runtime_options* options, const char* fil grib_handle_delete(h); } - grib_file_close(file->name, 0, &e); + if (e != GRIB_SUCCESS) { + grib_context_log(ctx, GRIB_LOG_ERROR, "%s (message %d)", grib_get_error_message(e), i); + } + + int e2 = 0; + grib_file_close(file->name, 0, &e2); + if (e2 != GRIB_SUCCESS) { + grib_context_log(ctx, GRIB_LOG_ERROR, "Failed to close file %s (%s)", file->name, grib_get_error_message(e2)); + } { /* Now do some checks */ From 73a147286f95b29fec0276fe6f6da3651d68836b Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 12:07:53 +0000 Subject: [PATCH 175/244] Examples: Correct arguments to perror --- examples/C/grib_clone.c | 2 +- examples/C/grib_precision.c | 2 +- examples/C/grib_set_keys.c | 2 +- examples/C/grib_set_missing.c | 2 +- examples/C/grib_set_pv.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/C/grib_clone.c b/examples/C/grib_clone.c index d54ab4440..c2964b54a 100644 --- a/examples/C/grib_clone.c +++ b/examples/C/grib_clone.c @@ -68,7 +68,7 @@ int main(int argc, char* argv[]) CODES_CHECK(codes_get_message(clone_handle, &buffer, &size), 0); /* write the buffer to a file */ if (fwrite(buffer, 1, size, out) != size) { - perror(argv[1]); + perror(argv[2]); return 1; } codes_handle_delete(clone_handle); diff --git a/examples/C/grib_precision.c b/examples/C/grib_precision.c index ae39318b2..4f3657610 100644 --- a/examples/C/grib_precision.c +++ b/examples/C/grib_precision.c @@ -116,7 +116,7 @@ int main(int argc, char** argv) /* write the buffer in a file*/ if (fwrite(buffer, 1, size, out) != size) { - perror(argv[1]); + perror(outfile); exit(1); } diff --git a/examples/C/grib_set_keys.c b/examples/C/grib_set_keys.c index feea6731a..50aeff372 100644 --- a/examples/C/grib_set_keys.c +++ b/examples/C/grib_set_keys.c @@ -78,7 +78,7 @@ int main(int argc, char** argv) /* write the buffer in a file*/ if (fwrite(buffer, 1, size, out) != size) { - perror(argv[1]); + perror(outfile); exit(1); } diff --git a/examples/C/grib_set_missing.c b/examples/C/grib_set_missing.c index 82f698975..98395c120 100644 --- a/examples/C/grib_set_missing.c +++ b/examples/C/grib_set_missing.c @@ -77,7 +77,7 @@ int main(int argc, char** argv) /* write the buffer in a file*/ if (fwrite(buffer, 1, size, out) != size) { - perror(argv[1]); + perror(outfile); exit(1); } diff --git a/examples/C/grib_set_pv.c b/examples/C/grib_set_pv.c index 7ca4c32fe..e279aec8b 100644 --- a/examples/C/grib_set_pv.c +++ b/examples/C/grib_set_pv.c @@ -78,7 +78,7 @@ int main(int argc, char** argv) /* write the buffer in a file*/ if (fwrite(buffer, 1, size, out) != size) { - perror(argv[1]); + perror(outfile); exit(1); } From 626aee752d82df41563bc6d064501d63205056e8 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 12:08:39 +0000 Subject: [PATCH 176/244] Refactoring: removal of duplicated code (dump) --- src/grib_accessor_class_unexpanded_descriptors.cc | 10 ++-------- src/grib_accessor_class_unsigned_bits.cc | 10 ++-------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/grib_accessor_class_unexpanded_descriptors.cc b/src/grib_accessor_class_unexpanded_descriptors.cc index b583ce5cd..a026388f2 100644 --- a/src/grib_accessor_class_unexpanded_descriptors.cc +++ b/src/grib_accessor_class_unexpanded_descriptors.cc @@ -16,7 +16,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init IMPLEMENTS = next_offset IMPLEMENTS = value_count IMPLEMENTS = byte_offset @@ -43,7 +43,6 @@ static int unpack_long(grib_accessor*, long* val, size_t* len); static long byte_offset(grib_accessor*); static long next_offset(grib_accessor*); static int value_count(grib_accessor*, long*); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); static void update_size(grib_accessor*, size_t); @@ -68,7 +67,7 @@ static grib_accessor_class _grib_accessor_class_unexpanded_descriptors = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ &next_offset, /* next_offset */ 0, /* get length of string */ &value_count, /* get number of values */ @@ -122,11 +121,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* args) a->length = 0; } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_unexpanded_descriptors* self = (grib_accessor_unexpanded_descriptors*)a; diff --git a/src/grib_accessor_class_unsigned_bits.cc b/src/grib_accessor_class_unsigned_bits.cc index 026d4ff67..53824a994 100644 --- a/src/grib_accessor_class_unsigned_bits.cc +++ b/src/grib_accessor_class_unsigned_bits.cc @@ -16,7 +16,7 @@ CLASS = accessor SUPER = grib_accessor_class_long IMPLEMENTS = unpack_long;pack_long - IMPLEMENTS = init;dump + IMPLEMENTS = init IMPLEMENTS = next_offset IMPLEMENTS = byte_count IMPLEMENTS = value_count @@ -45,7 +45,6 @@ static long byte_count(grib_accessor*); static long byte_offset(grib_accessor*); static long next_offset(grib_accessor*); static int value_count(grib_accessor*, long*); -static void dump(grib_accessor*, grib_dumper*); static void init(grib_accessor*, const long, grib_arguments*); static void update_size(grib_accessor*, size_t); @@ -70,7 +69,7 @@ static grib_accessor_class _grib_accessor_class_unsigned_bits = { &init, /* init */ 0, /* post_init */ 0, /* destroy */ - &dump, /* dump */ + 0, /* dump */ &next_offset, /* next_offset */ 0, /* get length of string */ &value_count, /* get number of values */ @@ -149,11 +148,6 @@ static void init(grib_accessor* a, const long len, grib_arguments* args) a->length = compute_byte_count(a); } -static void dump(grib_accessor* a, grib_dumper* dumper) -{ - grib_dump_long(dumper, a, NULL); -} - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_unsigned_bits* self = (grib_accessor_unsigned_bits*)a; From b4aa46878cc35cdbfffd1a22ff08f1488962da27 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 12:21:39 +0000 Subject: [PATCH 177/244] ECC-1783: Test --- tests/grib_to_netcdf.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/grib_to_netcdf.sh b/tests/grib_to_netcdf.sh index c07dc89e9..f13d8475b 100755 --- a/tests/grib_to_netcdf.sh +++ b/tests/grib_to_netcdf.sh @@ -148,7 +148,9 @@ set -e [ $status -ne 0 ] grep -q "Wrong number of fields" $tempText -# Not regular grid + +echo "Not a regular grid ..." +# -------------------------- input=${data_dir}/reduced_gaussian_pressure_level.grib2 set +e ${tools_dir}/grib_to_netcdf -o $tempNetcdf $input > $tempText 2>&1 @@ -158,6 +160,17 @@ set -e grep -q "not on a regular lat/lon grid or on a regular Gaussian grid" $tempText +# ECC-1783: No error message when input file has invalid fields +input=$data_dir/bad.grib +set +e +${tools_dir}/grib_to_netcdf -o $tempNetcdf $input > $tempText 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Wrong message length" $tempText + + +# Validity time check export GRIB_TO_NETCDF_CHECKVALIDTIME=0 ${tools_dir}/grib_to_netcdf -o $tempNetcdf $tempGrib [ -f "$tempNetcdf" ] From 8dc64c35c6b13b168bfc2855fa3e2b05922f7981 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 15:13:17 +0000 Subject: [PATCH 178/244] Testing: BUFR headers and key comparisons --- tests/bufr_extract_headers.sh | 34 ++++++++++++++++++++++++++++++++++ tests/codes_compare_keys.cc | 2 ++ tests/codes_compare_keys.sh | 2 ++ 3 files changed, 38 insertions(+) diff --git a/tests/bufr_extract_headers.sh b/tests/bufr_extract_headers.sh index a20602391..0d518d732 100755 --- a/tests/bufr_extract_headers.sh +++ b/tests/bufr_extract_headers.sh @@ -199,4 +199,38 @@ status=$? set -e [ $status -ne 0 ] + +echo "Test with nonexistent file..." +# --------------------------------- +set +e +$EXEC ${test_dir}/bufr_extract_headers centre nosuchfile > $temp1 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Unable to read file" $temp1 + + +echo "Test with bad BUFR file..." +# --------------------------------- +echo BUFR > $temp1 +set +e +$EXEC ${test_dir}/bufr_extract_headers centre $temp1 > $temp2 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Unable to count BUFR messages" $temp2 + + +echo "Test with GRIB file..." +# --------------------------------- +input=${data_dir}/sample.grib2 +set +e +$EXEC ${test_dir}/bufr_extract_headers centre $input > $temp2 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "No BUFR messages in file" $temp2 + + +# Clean up rm -f $temp1 $temp2 diff --git a/tests/codes_compare_keys.cc b/tests/codes_compare_keys.cc index 116998de7..2b930ea11 100644 --- a/tests/codes_compare_keys.cc +++ b/tests/codes_compare_keys.cc @@ -54,6 +54,8 @@ int main(int argc, char* argv[]) codes_compare_key(h1, h2, "computeStatistics", 0); // statistics codes_compare_key(h1, h2, "paramId", 0); // concept codes_compare_key(h1, h2, "identifier", 0); // ascii + err = codes_compare_key(h1, h2, "abcdefghij", 0); // no such key + Assert(err == GRIB_NOT_FOUND); if (list_provided_keys) { for (i = 0; list_provided_keys[i] != NULL; ++i) { diff --git a/tests/codes_compare_keys.sh b/tests/codes_compare_keys.sh index 1a678ede8..b07e6edc0 100755 --- a/tests/codes_compare_keys.sh +++ b/tests/codes_compare_keys.sh @@ -37,6 +37,7 @@ key: hoursAfterDataCutoff (Long values are different) key: minutesAfterDataCutoff (Long values are different) key: numberOfValues (Long values are different) key: referenceValue (Double values are different) +ECCODES ERROR : Key abcdefghij not found in first message Comparison failed: 13 differences EOF @@ -57,6 +58,7 @@ cat $tempLog cat > $tempRef < Date: Fri, 8 Mar 2024 16:05:13 +0000 Subject: [PATCH 179/244] Testing: Dump output --- tests/grib_ccsds.sh | 5 +++++ tests/grib_ecc-1212.sh | 2 ++ 2 files changed, 7 insertions(+) diff --git a/tests/grib_ccsds.sh b/tests/grib_ccsds.sh index bb37f060c..13533ab90 100755 --- a/tests/grib_ccsds.sh +++ b/tests/grib_ccsds.sh @@ -22,6 +22,11 @@ logfile=temp.$label.log rm -f $outfile1 $outfile2 +# Debug info +ECCODES_DEBUG=-1 ${tools_dir}/grib_copy -r $infile $outfile1 > $logfile 2>&1 +grep -q "ECCODES DEBUG CCSDS .* aec_stream.flags" $logfile + + # Convert a non-constant grib2 file (Note: not using -r) grib2_sample=$ECCODES_SAMPLES_PATH/gg_sfc_grib2.tmpl ${tools_dir}/grib_set -s packingType=grid_ccsds $grib2_sample $outfile1 diff --git a/tests/grib_ecc-1212.sh b/tests/grib_ecc-1212.sh index e1f32e596..7ff7c2ead 100755 --- a/tests/grib_ecc-1212.sh +++ b/tests/grib_ecc-1212.sh @@ -112,6 +112,8 @@ ${tools_dir}/grib_filter -o $tempGrib $tempFilt $sample_grib2 grib_check_key_equals $tempGrib selectedFcIndex,step '1 4' grib_check_key_equals $tempGrib mars.date,mars.time '20220607 300' +${tools_dir}/grib_dump -Dat $tempGrib > $tempOut + for pdtn in 88 92 93 94 95 96 97 98; do ${tools_dir}/grib_set -s \ tablesVersion=30,productDefinitionTemplateNumber=$pdtn,numberOfForecastsUsedInLocalTime=1 \ From 7b0a7798902d887af63b2947a13acd4baac5f552 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 17:55:13 +0000 Subject: [PATCH 180/244] Testing: subarray unpack --- src/grib_accessor_class_bit.cc | 29 +++++++++++++---------------- src/grib_accessor_class_bitmap.cc | 30 ++++++++++++------------------ tests/grib_unpack_subarray.sh | 3 +++ 3 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/grib_accessor_class_bit.cc b/src/grib_accessor_class_bit.cc index e3099d259..ab81eecda 100644 --- a/src/grib_accessor_class_bit.cc +++ b/src/grib_accessor_class_bit.cc @@ -106,22 +106,20 @@ grib_accessor_class* grib_accessor_class_bit = &_grib_accessor_class_bit; static void init(grib_accessor* a, const long len, grib_arguments* arg) { grib_accessor_bit* self = (grib_accessor_bit*)a; - a->length = 0; - self->owner = grib_arguments_get_name(grib_handle_of_accessor(a), arg, 0); - self->bit_index = grib_arguments_get_long(grib_handle_of_accessor(a), arg, 1); + a->length = 0; + self->owner = grib_arguments_get_name(grib_handle_of_accessor(a), arg, 0); + self->bit_index = grib_arguments_get_long(grib_handle_of_accessor(a), arg, 1); } - static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_bit* self = (grib_accessor_bit*)a; - int ret = 0; - + int ret = 0; long data = 0; if (*len < 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_bit : unpack_long : Wrong size for %s it contains %d values ", a->name, 1); - *len = 0; + grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_bit: unpack_long: Wrong size for %s, it contains %d values ", a->name, 1); + *len = 1; return GRIB_ARRAY_TOO_SMALL; } @@ -142,23 +140,22 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) static int pack_long(grib_accessor* a, const long* val, size_t* len) { grib_accessor_bit* self = (grib_accessor_bit*)a; - grib_accessor* owner = NULL; - unsigned char* mdata = 0; + if (*len < 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_bit : pack_long : At least one value to pack for %s", a->name); - *len = 0; + grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_bit: pack_long: At least one value to pack for %s", a->name); + *len = 1; return GRIB_ARRAY_TOO_SMALL; } - owner = grib_find_accessor(grib_handle_of_accessor(a), self->owner); - + grib_accessor* owner = grib_find_accessor(grib_handle_of_accessor(a), self->owner); if (!owner) { - grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_bit : Cannot get the owner %s for computing the bit value of %s ", self->owner, a->name); + grib_context_log(a->context, GRIB_LOG_ERROR, "grib_accessor_bit: Cannot get the owner %s for computing the bit value of %s", + self->owner, a->name); *len = 0; return GRIB_NOT_FOUND; } - mdata = grib_handle_of_accessor(a)->buffer->data; + unsigned char* mdata = grib_handle_of_accessor(a)->buffer->data; mdata += grib_byte_offset(owner); /* Note: In the definitions, flagbit numbers go from 7 to 0 (the bit_index), while WMO convention is from 1 to 8 */ diff --git a/src/grib_accessor_class_bitmap.cc b/src/grib_accessor_class_bitmap.cc index bd52d16cd..b86b34332 100644 --- a/src/grib_accessor_class_bitmap.cc +++ b/src/grib_accessor_class_bitmap.cc @@ -161,8 +161,8 @@ static void compute_size(grib_accessor* a) static void init(grib_accessor* a, const long len, grib_arguments* arg) { grib_accessor_bitmap* self = (grib_accessor_bitmap*)a; - grib_handle* hand = grib_handle_of_accessor(a); - int n = 0; + grib_handle* hand = grib_handle_of_accessor(a); + int n = 0; self->tableReference = grib_arguments_get_name(hand, arg, n++); self->missing_value = grib_arguments_get_name(hand, arg, n++); @@ -190,23 +190,21 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int unpack_long(grib_accessor* a, long* val, size_t* len) { - long pos = a->offset * 8; - long tlen = 0; - long i = 0; - int err = 0; + long pos = a->offset * 8; + long tlen = 0; const grib_handle* hand = grib_handle_of_accessor(a); - err = grib_value_count(a, &tlen); + int err = grib_value_count(a, &tlen); if (err) return err; if (*len < tlen) { grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains %ld values", a->name, tlen); - *len = 0; + *len = tlen; return GRIB_ARRAY_TOO_SMALL; } - for (i = 0; i < tlen; i++) { + for (long i = 0; i < tlen; i++) { val[i] = (long)grib_decode_unsigned_long(hand->buffer->data, &pos, 1); } *len = tlen; @@ -219,21 +217,19 @@ static int unpack(grib_accessor* a, T* val, size_t* len) static_assert(std::is_floating_point::value, "Requires floating points numbers"); long pos = a->offset * 8; long tlen; - long i; - int err = 0; grib_handle* hand = grib_handle_of_accessor(a); - err = grib_value_count(a, &tlen); + int err = grib_value_count(a, &tlen); if (err) return err; if (*len < tlen) { grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains %ld values", a->name, tlen); - *len = 0; + *len = tlen; return GRIB_ARRAY_TOO_SMALL; } - for (i = 0; i < tlen; i++) { + for (long i = 0; i < tlen; i++) { val[i] = (T)grib_decode_unsigned_long(hand->buffer->data, &pos, 1); } *len = tlen; @@ -261,8 +257,7 @@ static int unpack_double_element(grib_accessor* a, size_t idx, double* val) } static int unpack_double_element_set(grib_accessor* a, const size_t* index_array, size_t len, double* val_array) { - size_t i = 0; - for (i=0; ilength; @@ -293,7 +287,7 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) return GRIB_BUFFER_TOO_SMALL; } - for (i = 0; i < a->length; i++) { + for (long i = 0; i < a->length; i++) { val[i] = hand->buffer->data[a->offset + i]; } diff --git a/tests/grib_unpack_subarray.sh b/tests/grib_unpack_subarray.sh index 43bc730d8..3ac3b2530 100755 --- a/tests/grib_unpack_subarray.sh +++ b/tests/grib_unpack_subarray.sh @@ -13,6 +13,9 @@ label="grib_unpack_subarray_test" temp=${label}".grib.tmp" +infile=$data_dir/constant_field.grib2 +$EXEC ${test_dir}/grib_unpack_subarray $infile + infile=$data_dir/sample.grib2 $EXEC ${test_dir}/grib_unpack_subarray $infile From 87d14a89b80ed2986350a9a1482c315e665c27a6 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 21:15:31 +0000 Subject: [PATCH 181/244] Tools: Check overflow/underflow (Fix) --- src/grib_util.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/grib_util.cc b/src/grib_util.cc index d2c1af775..5a4241fef 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -1749,8 +1749,7 @@ static void set_value(grib_values* value, char* str, int equal) value->long_value = strtol(buf, &p, 10); if (*p == 0) { // check the conversion from string to long - if ((errno == ERANGE && (value->long_value == LONG_MAX || value->long_value == LONG_MIN)) || - (errno != 0 && value->long_value == 0)) { + if (errno == ERANGE && (value->long_value == LONG_MAX || value->long_value == LONG_MIN)) { fprintf(stderr, "ECCODES WARNING : Setting %s=%s causes overflow/underflow\n", value->name, buf); fprintf(stderr, "ECCODES WARNING : Value adjusted to %ld\n", value->long_value); //perror("strtol"); From 85daceab7f02c2d974fc780d597d8fe2b6603201 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 8 Mar 2024 21:15:54 +0000 Subject: [PATCH 182/244] Testing: GRIB2 product def templates --- tests/grib2_templates.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/grib2_templates.sh b/tests/grib2_templates.sh index 024dd26dd..64b43e4ad 100755 --- a/tests/grib2_templates.sh +++ b/tests/grib2_templates.sh @@ -195,6 +195,46 @@ grib_check_key_equals $temp isTemplateDeprecated,isTemplateExperimental '0 1' $tools_dir/grib_set -s gridType=time_section $sample2 $temp grib_check_key_equals $temp isTemplateDeprecated,isTemplateExperimental '0 1' +# Use of eps key (for local section) +# ----------------------------------- +input=$ECCODES_SAMPLES_PATH/reduced_gg_pl_32_grib2.tmpl +$tools_dir/grib_set -s stepType=accum,eps=1 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber '11' + +#17 Ensemble mean +#18 Ensemble standard deviation +$tools_dir/grib_set -s type=17,stepType=accum,eps=1 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber,derivedForecast '12 0' + +$tools_dir/grib_set -s type=18,stepType=accum,eps=1 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber,derivedForecast '12 4' + +# Chemicals +$tools_dir/grib_set -s paramId=217019,stepType=instant,eps=0 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber '40' + +$tools_dir/grib_set -s paramId=217019,stepType=instant,eps=1 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber '41' + +$tools_dir/grib_set -s paramId=217019,stepType=accum,eps=0 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber '42' + +$tools_dir/grib_set -s paramId=217019,stepType=accum,eps=1 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber '43' + +# Aerosol 210072 +$tools_dir/grib_set -s paramId=210072,stepType=instant,eps=0 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber '48' + +$tools_dir/grib_set -s paramId=210072,stepType=instant,eps=1 $input $temp +grib_check_key_equals $temp productDefinitionTemplateNumber '45' + +#$tools_dir/grib_set -s paramId=210072,stepType=accum,eps=0 $input $temp +#grib_check_key_equals $temp productDefinitionTemplateNumber '42' + +#$tools_dir/grib_set -s paramId=210072,stepType=accum,eps=1 $input $temp +#grib_check_key_equals $temp productDefinitionTemplateNumber '43' + # Clean up rm -f $temp $temp1 $temp2 $tempFilt $tempText From 6f710bdcbf4cdf325caa9fab2b8e5be01be244c0 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 9 Mar 2024 12:47:54 +0000 Subject: [PATCH 183/244] Must clear errno before calling strtol --- src/grib_util.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/grib_util.cc b/src/grib_util.cc index 5a4241fef..546fb726d 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -1723,6 +1723,7 @@ static void set_value(grib_values* value, char* str, int equal) } break; case GRIB_TYPE_LONG: + errno = 0; // must clear errno before calling strtol value->long_value = strtol(buf, &p, 10); if (*p != 0) value->has_value = 1; @@ -1746,6 +1747,7 @@ static void set_value(grib_values* value, char* str, int equal) } break; case GRIB_TYPE_UNDEFINED: + errno = 0; // must clear errno before calling strtol value->long_value = strtol(buf, &p, 10); if (*p == 0) { // check the conversion from string to long From 9cda220036bddc6ec61369ef98b16f45b82e9067 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 9 Mar 2024 18:50:28 +0000 Subject: [PATCH 184/244] Accessors: Return correct array length --- src/grib_accessor_class_codetable.cc | 4 ++-- src/grib_accessor_class_spd.cc | 4 ++-- src/grib_accessor_class_unsigned_bits.cc | 2 +- src/grib_accessor_class_variable.cc | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/grib_accessor_class_codetable.cc b/src/grib_accessor_class_codetable.cc index 0d97efdfb..9e39ed633 100644 --- a/src/grib_accessor_class_codetable.cc +++ b/src/grib_accessor_class_codetable.cc @@ -908,9 +908,9 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) } if (*len < rlen) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size (%lu) for %s, it contains %ld values", + grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size (%zu) for %s, it contains %ld values", *len, a->name, rlen); - *len = 0; + *len = rlen; return GRIB_ARRAY_TOO_SMALL; } diff --git a/src/grib_accessor_class_spd.cc b/src/grib_accessor_class_spd.cc index 734c0bc89..e0f4a20a7 100644 --- a/src/grib_accessor_class_spd.cc +++ b/src/grib_accessor_class_spd.cc @@ -167,8 +167,8 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) if (*len < rlen) { grib_context_log(a->context, GRIB_LOG_ERROR, - "Wrong size (%ld) for %s it contains %ld values", *len, a->name, rlen); - *len = 0; + "Wrong size (%zu) for %s, it contains %ld values", *len, a->name, rlen); + *len = rlen; return GRIB_ARRAY_TOO_SMALL; } diff --git a/src/grib_accessor_class_unsigned_bits.cc b/src/grib_accessor_class_unsigned_bits.cc index 53824a994..38c3425cf 100644 --- a/src/grib_accessor_class_unsigned_bits.cc +++ b/src/grib_accessor_class_unsigned_bits.cc @@ -163,7 +163,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) if (*len < rlen) { grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size (%ld) for %s, it contains %ld values", *len, a->name, rlen); - *len = 0; + *len = rlen; return GRIB_ARRAY_TOO_SMALL; } diff --git a/src/grib_accessor_class_variable.cc b/src/grib_accessor_class_variable.cc index 1eb04f897..8c5bbe7b0 100644 --- a/src/grib_accessor_class_variable.cc +++ b/src/grib_accessor_class_variable.cc @@ -208,7 +208,7 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len) const double dval = *val; if (*len != 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains %d values", a->name, 1); + grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains 1 value", a->name); *len = 1; return GRIB_ARRAY_TOO_SMALL; } @@ -233,7 +233,7 @@ static int pack_float(grib_accessor* a, const float* val, size_t* len) const double fval = *val; if (*len != 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains %d values", a->name, 1); + grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s, it contains 1 value", a->name); *len = 1; return GRIB_ARRAY_TOO_SMALL; } @@ -252,7 +252,7 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) grib_accessor_variable* self = (grib_accessor_variable*)a; if (*len != 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s it contains %d values ", a->name, 1); + grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s it contains 1 value", a->name); *len = 1; return GRIB_ARRAY_TOO_SMALL; } From 9c5df40768641bf48e0e4c24e30e8563a1f46fab Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 9 Mar 2024 19:47:41 +0000 Subject: [PATCH 185/244] Testing: bitsPerValue --- tests/grib_bpv_limit.cc | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/tests/grib_bpv_limit.cc b/tests/grib_bpv_limit.cc index 97be2e39c..896e0cff7 100644 --- a/tests/grib_bpv_limit.cc +++ b/tests/grib_bpv_limit.cc @@ -34,28 +34,24 @@ static int check_error_code(int err) int main(int argc, char** argv) { - int err = 0, i; + int err = 0, i; size_t values_len = 0; - double* values = NULL; - char error_msg[100]; const double tolerance = 1e-5; - size_t slong = sizeof(long) * 8; - grib_handle* h; - char* filename; + size_t slong = sizeof(long) * 8; Assert(argc == 2); - filename = argv[1]; + char* filename = argv[1]; for (i = 0; i < 255; i++) { FILE* in = fopen(filename, "rb"); Assert(in); - h = grib_handle_new_from_file(0, in, &err); + grib_handle* h = grib_handle_new_from_file(0, in, &err); Assert(h); /* get the size of the values array*/ GRIB_CHECK(grib_get_size(h, "values", &values_len), 0); - values = (double*)malloc(values_len * sizeof(double)); + double* values = (double*)malloc(values_len * sizeof(double)); err = grib_get_double_array(h, "values", values, &values_len); if (compare_double_absolute(values[0], 2.7900000000e+02, tolerance) != 0) @@ -82,9 +78,8 @@ int main(int argc, char** argv) /* do nothing */ } else { - snprintf(error_msg, sizeof(error_msg), "Error decoding when bpv=%d. Error message:%s", i, grib_get_error_message(err)); - perror(error_msg); - exit(1); + fprintf(stderr, "Error decoding when bpv=%d. Error message:%s\n", i, grib_get_error_message(err)); + return 1; } values = (double*)malloc(values_len * sizeof(double)); @@ -102,9 +97,8 @@ int main(int argc, char** argv) /* do nothing */ } else { - snprintf(error_msg, sizeof(error_msg), "Error decoding when bpv=%d. Error message:%s", i, grib_get_error_message(err)); - perror(error_msg); - exit(1); + fprintf(stderr, "Error decoding when bpv=%d. Error message:%s\n", i, grib_get_error_message(err)); + return 1; } free(values); From 9ce9b1f41c399636ac08b81c87e1880ec24afc60 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 9 Mar 2024 19:55:22 +0000 Subject: [PATCH 186/244] Dead code removal --- src/eccodes_prototypes.h | 1 - src/grib_filepool.cc | 8 ++++---- tests/bufr_ecc-517.cc | 22 +++++++--------------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index abd512a9f..6ae285fd2 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -918,7 +918,6 @@ grib_handle* grib_fieldset_retrieve(grib_fieldset* set, int i, int* err); /* grib_filepool.cc*/ void grib_file_pool_clean(void); -grib_file* grib_file_pool_get_files(void); grib_file* grib_file_open(const char* filename, const char* mode, int* err); void grib_file_pool_delete_file(grib_file* file); void grib_file_close(const char* filename, int force, int* err); diff --git a/src/grib_filepool.cc b/src/grib_filepool.cc index 8d55f3d3d..28606e8c9 100644 --- a/src/grib_filepool.cc +++ b/src/grib_filepool.cc @@ -132,10 +132,10 @@ void grib_file_pool_clean() // return grib_write_file(fh, file->next); // } -grib_file* grib_file_pool_get_files() -{ - return file_pool.first; -} +// grib_file* grib_file_pool_get_files() +// { +// return file_pool.first; +// } // int grib_file_pool_read(grib_context* c, FILE* fh) // { diff --git a/tests/bufr_ecc-517.cc b/tests/bufr_ecc-517.cc index 37c538fde..2ad8d7ab4 100644 --- a/tests/bufr_ecc-517.cc +++ b/tests/bufr_ecc-517.cc @@ -20,10 +20,9 @@ int main(int argc, char** argv) codes_handle* h = NULL; long* ivalues = NULL; const char* sampleName = "BUFR3_local"; - char* outfilename = NULL; assert(argc == 2); - outfilename = argv[1]; + char* outfilename = argv[1]; // Test non-existent sample file. Should fail h = codes_bufr_handle_new_from_samples(NULL, "some rubbish"); @@ -33,10 +32,8 @@ int main(int argc, char** argv) assert(h); ivalues = (long*)malloc(1 * sizeof(long)); - if (!ivalues) { - fprintf(stderr, "Failed to allocate memory (ivalues).\n"); - return 1; - } + assert(ivalues); + size = 1; ivalues[0] = 1; CODES_CHECK(codes_set_long_array(h, "inputDelayedDescriptorReplicationFactor", ivalues, size), 0); @@ -89,10 +86,8 @@ int main(int argc, char** argv) free(ivalues); ivalues = (long*)malloc(9 * sizeof(long)); - if (!ivalues) { - fprintf(stderr, "Failed to allocate memory (ivalues).\n"); - return 1; - } + assert(ivalues); + size = 4; ivalues[0] = 309052; ivalues[1] = 5001; @@ -104,11 +99,8 @@ int main(int argc, char** argv) CODES_CHECK(codes_set_long(h, "pack", 1), 0); fout = fopen(outfilename, "wb"); - if (!fout) { - fprintf(stderr, "Failed to open (create) output file.\n"); - free(ivalues); - return 1; - } + assert(fout); + CODES_CHECK(codes_get_message(h, &buffer, &size), 0); CODES_CHECK(codes_check_message_header(buffer, size, PRODUCT_BUFR), 0); CODES_CHECK(codes_check_message_footer(buffer, size, PRODUCT_BUFR), 0); From 63d7f7ffae25ddd87e66197585a41749ff135c3a Mon Sep 17 00:00:00 2001 From: Robert Osinski Date: Mon, 11 Mar 2024 11:33:53 +0000 Subject: [PATCH 187/244] Merging multiple if clauses into a single one --- definitions/grib1/section.1.def | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/definitions/grib1/section.1.def b/definitions/grib1/section.1.def index 32ac08292..2bda52ec7 100644 --- a/definitions/grib1/section.1.def +++ b/definitions/grib1/section.1.def @@ -313,31 +313,7 @@ alias time.stepType=stepType; # ECC-457: GRIB1 to GRIB2 conversion concept_nofail stepTypeForConversion (unknown, "stepTypeForConversion.def", conceptsDir2, conceptsDir1); -if (stepTypeForConversion is "accum" ) { - if (productDefinitionTemplateNumber == 1) { - alias productDefinitionTemplateNumber=eleven; - } - else { - alias productDefinitionTemplateNumber=eight; - } -} -if (stepTypeForConversion is "max" ) { - if (productDefinitionTemplateNumber == 1) { - alias productDefinitionTemplateNumber=eleven; - } - else { - alias productDefinitionTemplateNumber=eight; - } -} -if (stepTypeForConversion is "min" ) { - if (productDefinitionTemplateNumber == 1) { - alias productDefinitionTemplateNumber=eleven; - } - else { - alias productDefinitionTemplateNumber=eight; - } -} -if (stepTypeForConversion is "avg" ) { +if (stepTypeForConversion is "accum" || stepTypeForConversion is "max" || stepTypeForConversion is "min" || stepTypeForConversion is "avg") { if (productDefinitionTemplateNumber == 1) { alias productDefinitionTemplateNumber=eleven; } From 6013a2646176120984ce7c32028d267da18f0588 Mon Sep 17 00:00:00 2001 From: Pedro Maciel Date: Mon, 11 Mar 2024 11:42:16 +0000 Subject: [PATCH 188/244] HEALPix modernise --- src/grib_iterator_class_healpix.cc | 121 +++++++++++++++++------------ 1 file changed, 70 insertions(+), 51 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index 6d7aad5c4..5622c955d 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -38,38 +38,39 @@ or edit "iterator.class" and rerun ./make_class.pl */ -static void init_class (grib_iterator_class*); +static void init_class(grib_iterator_class*); -static int init (grib_iterator* i,grib_handle*,grib_arguments*); -static int next (grib_iterator* i, double *lat, double *lon, double *val); -static int destroy (grib_iterator* i); +static int init(grib_iterator* i, grib_handle*, grib_arguments*); +static int next(grib_iterator* i, double* lat, double* lon, double* val); +static int destroy(grib_iterator* i); -typedef struct grib_iterator_healpix{ - grib_iterator it; +struct grib_iterator_healpix +{ + grib_iterator it; /* Members defined in gen */ int carg; const char* missingValue; /* Members defined in healpix */ - double *lats; - double *lons; + double* lats; + double* lons; long Nsides; -} grib_iterator_healpix; +}; extern grib_iterator_class* grib_iterator_class_gen; static grib_iterator_class _grib_iterator_class_healpix = { - &grib_iterator_class_gen, /* super */ - "healpix", /* name */ - sizeof(grib_iterator_healpix),/* size of instance */ - 0, /* inited */ - &init_class, /* init_class */ - &init, /* constructor */ - &destroy, /* destructor */ - &next, /* Next Value */ - 0, /* Previous Value */ - 0, /* Reset the counter */ - 0, /* has next values */ + &grib_iterator_class_gen, /* super */ + "healpix", /* name */ + sizeof(grib_iterator_healpix), /* size of instance */ + 0, /* inited */ + &init_class, /* init_class */ + &init, /* constructor */ + &destroy, /* destructor */ + &next, /* Next Value */ + nullptr, /* Previous Value */ + nullptr, /* Reset the counter */ + nullptr, /* has next values */ }; grib_iterator_class* grib_iterator_class_healpix = &_grib_iterator_class_healpix; @@ -77,14 +78,14 @@ grib_iterator_class* grib_iterator_class_healpix = &_grib_iterator_class_healpix static void init_class(grib_iterator_class* c) { - c->previous = (*(c->super))->previous; - c->reset = (*(c->super))->reset; - c->has_next = (*(c->super))->has_next; + c->previous = (*(c->super))->previous; + c->reset = (*(c->super))->reset; + c->has_next = (*(c->super))->has_next; } /* END_CLASS_IMP */ #define ITER "HEALPix Geoiterator" -#define RAD2DEG 57.29577951308232087684 // 180 over pi +constexpr double RAD2DEG = 57.29577951308232087684; // 180 over pi size_t HEALPix_nj(size_t N, size_t i) { @@ -92,7 +93,7 @@ size_t HEALPix_nj(size_t N, size_t i) size_t ni = 4 * N - 1; Assert(i < ni); return i < N ? 4 * (i + 1) : i < 3 * N ? 4 * N - : HEALPix_nj(N, ni - 1 - i); + : HEALPix_nj(N, ni - 1 - i); } // Thanks to Willem Deconinck and Pedro Maciel @@ -137,22 +138,28 @@ static std::vector HEALPix_longitudes(size_t N, size_t i) static int iterate_healpix(grib_iterator_healpix* self, long N) { - size_t ny, nx; - ny = nx = 4*N - 1; - std::vector latitudes(ny); + size_t Ny = 4 * static_cast(N) - 1; + auto Nd = static_cast(N); + + std::vector latitudes(Ny); for (long r = 1; r < N; r++) { - latitudes[r - 1] = 90.0 - RAD2DEG * std::acos(1.0 - r * r / (3.0 * N * N)); + auto rd = static_cast(r); + latitudes[r - 1] = 90.0 - RAD2DEG * std::acos(1.0 - rd * rd / (3.0 * Nd * Nd)); latitudes[4 * N - 1 - r] = -latitudes[r - 1]; } + // Polar caps for (long r = 1; r < N; r++) { - latitudes[r - 1] = 90.0 - RAD2DEG * std::acos(1.0 - r * r / (3.0 * N * N)); + auto rd = static_cast(r); + latitudes[r - 1] = 90.0 - RAD2DEG * std::acos(1.0 - rd * rd / (3.0 * Nd * Nd)); latitudes[4 * N - 1 - r] = -latitudes[r - 1]; } + // Equatorial belt for (long r = N; r < 2 * N; r++) { - latitudes[r - 1] = 90.0 - RAD2DEG * std::acos((4.0 * N - 2.0 * r) / (3.0 * N)); + auto rd = static_cast(r); + latitudes[r - 1] = 90.0 - RAD2DEG * std::acos((4.0 * Nd - 2.0 * rd) / (3.0 * Nd)); latitudes[4 * N - 1 - r] = -latitudes[r - 1]; } @@ -160,11 +167,11 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) latitudes[2 * N - 1] = 0.0; size_t k = 0; - for (size_t i = 0; i < ny; i++) { + for (size_t i = 0; i < Ny; i++) { // Compute the longitudes at a given latitude std::vector longitudes = HEALPix_longitudes(N, i); - for (size_t j = 0; j < longitudes.size(); j++) { - self->lons[k] = longitudes[j]; + for (double longitude : longitudes) { + self->lons[k] = longitude; self->lats[k] = latitudes[i]; ++k; } @@ -175,44 +182,54 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) { - int err = 0; - grib_iterator_healpix* self = (grib_iterator_healpix*)iter; + int err = 0; + auto* self = (grib_iterator_healpix*)iter; const char* snside = grib_arguments_get_name(h, args, self->carg++); const char* sorder = grib_arguments_get_name(h, args, self->carg++); long N = 0; - if ((err = grib_get_long_internal(h, snside, &N)) != GRIB_SUCCESS) return err; + if ((err = grib_get_long_internal(h, snside, &N)) != GRIB_SUCCESS) { + return err; + } if (N <= 0) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Key %s must be greater than zero", ITER, snside); return GRIB_WRONG_GRID; } - char ordering[32] = {0,}; + char ordering[32] = { + 0, + }; size_t slen = sizeof(ordering); - if ((err = grib_get_string_internal(h, sorder, ordering, &slen)) != GRIB_SUCCESS) + if ((err = grib_get_string_internal(h, sorder, ordering, &slen)) != GRIB_SUCCESS) { return err; + } if (!STR_EQUAL(ordering, "ring")) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only ring ordering is supported", ITER); return GRIB_GEOCALCULUS_PROBLEM; } - if (grib_is_earth_oblate(h)) { + if (grib_is_earth_oblate(h) != 0) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only spherical earth is supported", ITER); return GRIB_WRONG_GRID; } if (iter->nv != 12 * N * N) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Wrong number of points (%zu!=12x%ldx%ld)", - ITER, iter->nv, N, N); + ITER, iter->nv, N, N); return GRIB_WRONG_GRID; } - self->lats = (double*)grib_context_malloc(h->context, iter->nv * sizeof(double)); - if (self->lats == NULL) return GRIB_OUT_OF_MEMORY; - self->lons = (double*)grib_context_malloc(h->context, iter->nv * sizeof(double)); - if (self->lons == NULL) return GRIB_OUT_OF_MEMORY; + self->lats = static_cast(grib_context_malloc(h->context, iter->nv * sizeof(double))); + if (self->lats == nullptr) { + return GRIB_OUT_OF_MEMORY; + } + + self->lons = static_cast(grib_context_malloc(h->context, iter->nv * sizeof(double))); + if (self->lons == nullptr) { + return GRIB_OUT_OF_MEMORY; + } try { err = iterate_healpix(self, N); @@ -228,24 +245,26 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) static int next(grib_iterator* iter, double* lat, double* lon, double* val) { - grib_iterator_healpix* self = (grib_iterator_healpix*)iter; + auto* self = (grib_iterator_healpix*)iter; - if ((long)iter->e >= (long)(iter->nv - 1)) + if (iter->e >= static_cast(iter->nv - 1)) { return 0; + } + iter->e++; *lat = self->lats[iter->e]; *lon = self->lons[iter->e]; - if (val && iter->data) { + if (val != nullptr && iter->data != nullptr) { *val = iter->data[iter->e]; } return 1; } -static int destroy(grib_iterator* i) +static int destroy(grib_iterator* iter) { - grib_iterator_healpix* self = (grib_iterator_healpix*)i; - const grib_context* c = i->h->context; + auto* self = (grib_iterator_healpix*)iter; + const auto* c = iter->h->context; grib_context_free(c, self->lats); grib_context_free(c, self->lons); From 7d6f6c12f7dd89745aa427ad00f777ff086e083b Mon Sep 17 00:00:00 2001 From: Pedro Maciel Date: Mon, 11 Mar 2024 11:49:06 +0000 Subject: [PATCH 189/244] HEALPix orderingConvention=nested --- src/grib_iterator_class_healpix.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index 5622c955d..b83fac397 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -55,6 +55,7 @@ struct grib_iterator_healpix double* lats; double* lons; long Nsides; + bool nested; }; extern grib_iterator_class* grib_iterator_class_gen; @@ -177,6 +178,10 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) } } + if (self->nested) { + Assert(false); // TODO + } + return GRIB_SUCCESS; } @@ -205,8 +210,9 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) return err; } - if (!STR_EQUAL(ordering, "ring")) { - grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only ring ordering is supported", ITER); + self->nested = STR_EQUAL(ordering, "nested"); + if (!STR_EQUAL(ordering, "ring") && !self->nested) { + grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only orderingConvention=(ring|nested) are supported", ITER); return GRIB_GEOCALCULUS_PROBLEM; } From ebd0b01bb9ab05ab7bd7bbba428917677914831d Mon Sep 17 00:00:00 2001 From: Pedro Maciel Date: Mon, 11 Mar 2024 12:22:51 +0000 Subject: [PATCH 190/244] HEALPix orderingConvention=nested --- src/grib_iterator_class_healpix.cc | 143 ++++++++++++++++++++++++++++- 1 file changed, 141 insertions(+), 2 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index b83fac397..f94e825a5 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -9,9 +9,13 @@ */ #include "grib_api_internal.h" -#include -#include + #include +#include +#include +#include +#include +#include /* This is used by make_class.pl @@ -85,6 +89,76 @@ static void init_class(grib_iterator_class* c) } /* END_CLASS_IMP */ +namespace +{ + +struct CodecFijNest +{ + static constexpr uint64_t __masks[] = { 0x00000000ffffffff, 0x0000ffff0000ffff, 0x00ff00ff00ff00ff, + 0x0f0f0f0f0f0f0f0f, 0x3333333333333333, 0x5555555555555555 }; + + inline static int nest_encode_bits(int n) + { + auto b = static_cast(n) & __masks[0]; + b = (b ^ (b << 16)) & __masks[1]; + b = (b ^ (b << 8)) & __masks[2]; + b = (b ^ (b << 4)) & __masks[3]; + b = (b ^ (b << 2)) & __masks[4]; + b = (b ^ (b << 1)) & __masks[5]; + return static_cast(b); + } + + inline static int nest_decode_bits(int n) + { + auto b = static_cast(n) & __masks[5]; + b = (b ^ (b >> 1)) & __masks[4]; + b = (b ^ (b >> 2)) & __masks[3]; + b = (b ^ (b >> 4)) & __masks[2]; + b = (b ^ (b >> 8)) & __masks[1]; + b = (b ^ (b >> 16)) & __masks[0]; + return static_cast(b); + } + + static std::tuple nest_to_fij(int n, int k) + { + Assert(0 <= n); + auto f = n >> (2 * k); // f = n / (Nside * Nside) + n &= (1 << (2 * k)) - 1; // n = n % (Nside * Nside) + auto i = nest_decode_bits(n); + auto j = nest_decode_bits(n >> 1); + return { f, i, j }; + } + + static int fij_to_nest(int f, int i, int j, int k) + { + return (f << (2 * k)) + nest_encode_bits(i) + (nest_encode_bits(j) << 1); + } +}; + +inline int int_sqrt(int n) +{ + return static_cast(std::sqrt(static_cast(n) + 0.5)); +} + +// for division result within [0; 3] +inline int div_03(int a, int b) +{ + int t = (a >= (b << 1)) ? 1 : 0; + a -= t * (b << 1); + return (t << 1) + (a >= b ? 1 : 0); +} + +inline bool is_power_of_2(int n) +{ + return std::bitset(n).count() == 1; +} + +inline int pll(int f) +{ + constexpr int __pll[] = { 1, 3, 5, 7, 0, 2, 4, 6, 1, 3, 5, 7 }; + return __pll[f]; +} + #define ITER "HEALPix Geoiterator" constexpr double RAD2DEG = 57.29577951308232087684; // 180 over pi @@ -179,12 +253,77 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) } if (self->nested) { + Assert(is_power_of_2(N)); + + const auto Nside = static_cast(N); + const auto k = static_cast(std::log2(Nside)); + const int Npix = 12 * Nside * Nside; + const int Ncap = (Nside * (Nside - 1)) << 1; + + auto to_nest = [&](int f, //!< base pixel index + int ring, //!< 1-based ring number + int Nring, //!< number of pixels in ring + int phi, //!< index in longitude + int shift //!< if ring's first pixel is not at phi=0 + ) -> int { + int r = ((2 + (f >> 2)) << k) - ring - 1; + int p = 2 * phi - pll(f) * Nring - shift - 1; + if (p >= 2 * Nside) { + p -= 8 * Nside; + } + + int i = (r + p) >> 1; + int j = (r - p) >> 1; + + Assert(f < 12 && i < Nside && j < Nside); + return CodecFijNest::fij_to_nest(f, i, j, k); + }; + + std::vector ring_to_nest(Npix); + for (int r = 0; r < Npix; ++r) { + if (r < Ncap) { + // North polar cap + int Nring = (1 + int_sqrt(2 * r + 1)) >> 1; + int phi = 1 + r - 2 * Nring * (Nring - 1); + int f = div_03(phi - 1, Nring); + + ring_to_nest[r] = to_nest(f, Nring, Nring, phi, 0); + continue; + } + + if (Npix - Ncap <= r) { + // South polar cap + int Nring = (1 + int_sqrt(2 * Npix - 2 * r - 1)) >> 1; + int phi = 1 + r + 2 * Nring * (Nring - 1) + 4 * Nring - Npix; + int ring = 4 * Nside - Nring; // (from South pole) + int f = div_03(phi - 1, Nring) + 8; + + ring_to_nest[r] = to_nest(f, ring, Nring, phi, 0); + continue; + } + + // Equatorial belt + int ip = r - Ncap; + int tmp = ip >> (k + 2); + + int phi = ip - tmp * 4 * Nside + 1; + int ring = tmp + Nside; + + int ifm = 1 + ((phi - 1 - ((1 + tmp) >> 1)) >> k); + int ifp = 1 + ((phi - 1 - ((1 - tmp + 2 * Nside) >> 1)) >> k); + int f = (ifp == ifm) ? (ifp | 4) : ((ifp < ifm) ? ifp : (ifm + 8)); + + ring_to_nest[r] = to_nest(f, ring, Nside, phi, ring & 1); + } + Assert(false); // TODO } return GRIB_SUCCESS; } +} // anonymous namespace + static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) { int err = 0; From 5e6be438a4e1e8ba4d2537dfa885da28ddc87293 Mon Sep 17 00:00:00 2001 From: Matthew Griffith Date: Mon, 11 Mar 2024 12:25:42 +0000 Subject: [PATCH 191/244] ECC-1766: Implementation will be done via new local template (43). --- definitions/mars/grib.ed.def | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 definitions/mars/grib.ed.def diff --git a/definitions/mars/grib.ed.def b/definitions/mars/grib.ed.def deleted file mode 100644 index ae4d2b3db..000000000 --- a/definitions/mars/grib.ed.def +++ /dev/null @@ -1,10 +0,0 @@ -# Class ed EERIE project climate keywords - -codetable[2] activity "grib2/destine_activity.table" : dump; -alias mars.activity = activity; - -codetable[2] experiment "grib2/destine_experiment.table" : dump; -alias mars.experiment = experiment; - -unsigned[1] realization = 255 : dump; -alias mars.realization = realization; \ No newline at end of file From 45d7f659f80f9edf4a20e3503cf7c412ff5b838e Mon Sep 17 00:00:00 2001 From: Matthew Griffith Date: Mon, 11 Mar 2024 12:27:08 +0000 Subject: [PATCH 192/244] ECC-1766: Implementation will be done via new local template (43). --- definitions/grib2/local.98.43.def | 10 ++++++++++ definitions/grib2/section.4.def | 3 +-- 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 definitions/grib2/local.98.43.def diff --git a/definitions/grib2/local.98.43.def b/definitions/grib2/local.98.43.def new file mode 100644 index 000000000..e7141c91e --- /dev/null +++ b/definitions/grib2/local.98.43.def @@ -0,0 +1,10 @@ +# Class ed EERIE project climate keywords + +codetable[2] activity "grib2/destine_activity.table" ; +alias mars.activity = activity; + +codetable[2] experiment "grib2/destine_experiment.table" ; +alias mars.experiment = experiment; + +unsigned[1] realization = 255 ; +alias mars.realization = realization; \ No newline at end of file diff --git a/definitions/grib2/section.4.def b/definitions/grib2/section.4.def index a966bbc1e..512544da4 100644 --- a/definitions/grib2/section.4.def +++ b/definitions/grib2/section.4.def @@ -63,8 +63,7 @@ if (productDefinitionTemplateNumber >= 32768) { } if (defined(marsStream) && defined(marsType)) { - template_nofail marsKeywordsByClass "mars/grib.[marsClass:s].def"; - template_nofail marsKeywordsByStreamAndType "mars/grib.[marsStream:s].[marsType:s].def"; + template_nofail marsKeywords1 "mars/grib.[marsStream:s].[marsType:s].def"; } template parameters "grib2/parameters.def"; From b0977972a45eee5a96bed79d2ffbf6010dc79610 Mon Sep 17 00:00:00 2001 From: Pedro Maciel Date: Mon, 11 Mar 2024 12:33:43 +0000 Subject: [PATCH 193/244] HEALPix orderingConvention=nested --- src/grib_iterator_class_healpix.cc | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index f94e825a5..5f4fe2c18 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -241,17 +241,6 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) // Equator latitudes[2 * N - 1] = 0.0; - size_t k = 0; - for (size_t i = 0; i < Ny; i++) { - // Compute the longitudes at a given latitude - std::vector longitudes = HEALPix_longitudes(N, i); - for (double longitude : longitudes) { - self->lons[k] = longitude; - self->lats[k] = latitudes[i]; - ++k; - } - } - if (self->nested) { Assert(is_power_of_2(N)); @@ -316,7 +305,23 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) ring_to_nest[r] = to_nest(f, ring, Nside, phi, ring & 1); } - Assert(false); // TODO + for (size_t i = 0, j=0; i < Ny; i++) { + // Compute the longitudes at a given latitude + for (double longitude : HEALPix_longitudes(N, i)) { + self->lons[ring_to_nest.at(j)] = longitude; + self->lats[ring_to_nest.at(j)] = latitudes[i]; + ++j; + } + } + } else { + for (size_t i = 0, j = 0; i < Ny; i++) { + // Compute the longitudes at a given latitude + for (double longitude : HEALPix_longitudes(N, i)) { + self->lons[j] = longitude; + self->lats[j] = latitudes[i]; + ++j; + } + } } return GRIB_SUCCESS; From 8f366f2d76125f536e4072e7de1c339f7749ed2c Mon Sep 17 00:00:00 2001 From: Matthew Griffith Date: Mon, 11 Mar 2024 15:29:48 +0000 Subject: [PATCH 194/244] ECC-1766: Addition of test along with a few small tweaks. --- .../grib2/grib2LocalSectionNumber.98.table | 1 + definitions/grib2/local.98.43.def | 12 ++++- tests/CMakeLists.txt | 1 + tests/grib_ecc-1766.sh | 45 +++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100755 tests/grib_ecc-1766.sh diff --git a/definitions/grib2/grib2LocalSectionNumber.98.table b/definitions/grib2/grib2LocalSectionNumber.98.table index dcb8e84cd..26d0b1ec0 100644 --- a/definitions/grib2/grib2LocalSectionNumber.98.table +++ b/definitions/grib2/grib2LocalSectionNumber.98.table @@ -21,6 +21,7 @@ 39 39 4DVar model errors for long window 4Dvar system 41 41 The Flood Awareness System 42 42 Lead Centre for Wave Forecast Verification +43 43 EERIE project MARS labelling 60 60 Ocean data analysis date and analysis time 192 192 Multiple ECMWF local definitions 300 300 Multi-dimensional parameters (deprecated) diff --git a/definitions/grib2/local.98.43.def b/definitions/grib2/local.98.43.def index e7141c91e..008a528eb 100644 --- a/definitions/grib2/local.98.43.def +++ b/definitions/grib2/local.98.43.def @@ -1,10 +1,20 @@ # Class ed EERIE project climate keywords +# CMIP related activity keyword codetable[2] activity "grib2/destine_activity.table" ; alias mars.activity = activity; +# CMIP related experiment keyword codetable[2] experiment "grib2/destine_experiment.table" ; alias mars.experiment = experiment; +# Climate run realization keyword, which relates to an initial condition perturbation unsigned[1] realization = 255 ; -alias mars.realization = realization; \ No newline at end of file +alias mars.realization = realization; + +# Remove mars domain from this data +unalias mars.domain; + +# Add some padding just in case we want more keys in the future +pad padding_loc43(30); + diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e282ee85a..31a644601 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -144,6 +144,7 @@ if( HAVE_BUILD_TOOLS ) grib_ecc-1671 grib_ecc-1708 grib_ecc-1691 + grib_ecc-1766 bufr_ecc-1028 bufr_ecc-1195 bufr_ecc-1259 diff --git a/tests/grib_ecc-1766.sh b/tests/grib_ecc-1766.sh new file mode 100755 index 000000000..79e273b1d --- /dev/null +++ b/tests/grib_ecc-1766.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +REDIRECT=/dev/null + +# ECC-1766: EERIE project metadata support + +label="grib_ecc-1766_test" +temp_grib=temp.$label.grib +eerie_sample=temp.$label.eerie.grib +sample_grib2=$ECCODES_SAMPLES_PATH/GRIB2.tmpl + +tablesVersionLatest=$( ${tools_dir}/grib_get -p tablesVersionLatest $sample_grib2 ) + +# Setup GRIB message with MARS keys +# Set latest tables version and add local section with MARS labeling +${tools_dir}/grib_set -s tablesVersion=$tablesVersionLatest,setLocalDefinition=1 $sample_grib2 $temp_grib + +# Then change to EERIE project GRIB message --> grib2LocalSectionNumber=43 +${tools_dir}/grib_set -s grib2LocalSectionNumber=43,class=ed $temp_grib $eerie_sample + +# Check EERIE related keys are present and correct +grib_check_key_exists $eerie_sample activity,experiment,realization +grib_check_key_equals $eerie_sample "activity,experiment,realization" "0 0 255" + +# Check domain key is unaliased +[ $( ${tools_dir}/grib_get -f -p mars.domain $eerie_sample ) = "not_found" ] + +# Check an example where a few additional things are set +${tools_dir}/grib_set -s activity=1,experiment=1,realization=1 $eerie_sample $temp_grib + +grib_check_key_equals $temp_grib "activity,experiment,realization" "1 1 1" +grib_check_key_equals $temp_grib "activity:s,experiment:s" "CMIP6 hist" + +# Clean up +rm -f $temp_grib $eerie_sample From 26eb3e21795a53d2b5e5ed0df5582841b8337dcf Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 11 Mar 2024 16:31:47 +0000 Subject: [PATCH 195/244] ECC-1784: GRIB: HEALPix Geoiterator: Support nested ordering --- src/grib_iterator_class_healpix.cc | 33 ++++++++++++++---------- tests/grib_grid_healpix.sh | 40 ++++++++++++++++++++++++------ 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index 5f4fe2c18..8d8f06120 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -119,15 +119,15 @@ struct CodecFijNest return static_cast(b); } - static std::tuple nest_to_fij(int n, int k) - { - Assert(0 <= n); - auto f = n >> (2 * k); // f = n / (Nside * Nside) - n &= (1 << (2 * k)) - 1; // n = n % (Nside * Nside) - auto i = nest_decode_bits(n); - auto j = nest_decode_bits(n >> 1); - return { f, i, j }; - } + // static std::tuple nest_to_fij(int n, int k) + // { + // Assert(0 <= n); + // auto f = n >> (2 * k); // f = n / (Nside * Nside) + // n &= (1 << (2 * k)) - 1; // n = n % (Nside * Nside) + // auto i = nest_decode_bits(n); + // auto j = nest_decode_bits(n >> 1); + // return { f, i, j }; + // } static int fij_to_nest(int f, int i, int j, int k) { @@ -242,7 +242,11 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) latitudes[2 * N - 1] = 0.0; if (self->nested) { - Assert(is_power_of_2(N)); + if (!is_power_of_2(N)) { + grib_context* c = grib_context_get_default(); + grib_context_log(c, GRIB_LOG_ERROR, "%s: For nested ordering, Nside must be a power of 2", ITER); + return GRIB_WRONG_GRID; + } const auto Nside = static_cast(N); const auto k = static_cast(std::log2(Nside)); @@ -308,6 +312,7 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) for (size_t i = 0, j=0; i < Ny; i++) { // Compute the longitudes at a given latitude for (double longitude : HEALPix_longitudes(N, i)) { + Assert( ring_to_nest.at(j) < Npix ); self->lons[ring_to_nest.at(j)] = longitude; self->lats[ring_to_nest.at(j)] = latitudes[i]; ++j; @@ -346,9 +351,7 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) return GRIB_WRONG_GRID; } - char ordering[32] = { - 0, - }; + char ordering[32] = {0,}; size_t slen = sizeof(ordering); if ((err = grib_get_string_internal(h, sorder, ordering, &slen)) != GRIB_SUCCESS) { return err; @@ -359,6 +362,10 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only orderingConvention=(ring|nested) are supported", ITER); return GRIB_GEOCALCULUS_PROBLEM; } + if (self->nested && N == 1) { + grib_context_log(h->context, GRIB_LOG_ERROR, "%s: For orderingConvention=nested, N must be greater than 1", ITER); + return GRIB_GEOCALCULUS_PROBLEM; + } if (grib_is_earth_oblate(h) != 0) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only spherical earth is supported", ITER); diff --git a/tests/grib_grid_healpix.sh b/tests/grib_grid_healpix.sh index 59652e57b..96a719e28 100755 --- a/tests/grib_grid_healpix.sh +++ b/tests/grib_grid_healpix.sh @@ -72,6 +72,39 @@ EOF ${tools_dir}/grib_filter $tempFilt $tempGrib + +# Nested ordering +# --------------- +rm -f $tempGrib +cat > $tempFilt < $tempLog + +# Nested ordering: N must be a power of 2 +input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl +${tools_dir}/grib_set -s gridType=healpix,Nside=3,orderingConvention=nested,numberOfDataPoints=108,numberOfValues=108 $input $tempGrib +set +e +${tools_dir}/grib_get_data $tempGrib > $tempLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Nside must be a power of 2" $tempLog + + # Invalid cases # -------------- set +e @@ -81,13 +114,6 @@ set -e [ $status -ne 0 ] grep -q "Nside must be greater than zero" $tempLog -set +e -${tools_dir}/grib_get_data -s orderingConvention=nested $tempGrib > $tempLog 2>&1 -status=$? -set -e -[ $status -ne 0 ] -grep -q "Only ring ordering is supported" $tempLog - # Clean up rm -f $tempFilt $tempGrib $tempLog From 0e93fbfc0821ee414851a2b8003a4a215713326c Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 11 Mar 2024 17:03:41 +0000 Subject: [PATCH 196/244] ECC-1784: GRIB: HEALPix Geoiterator: Support nested ordering --- src/grib_iterator_class_healpix.cc | 56 +++++++++++++++--------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index 8d8f06120..33baa876b 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -28,6 +28,7 @@ MEMBERS = double *lats MEMBERS = double *lons MEMBERS = long Nsides + MEMBERS = bool nested END_CLASS_DEF */ @@ -42,40 +43,39 @@ or edit "iterator.class" and rerun ./make_class.pl */ -static void init_class(grib_iterator_class*); +static void init_class (grib_iterator_class*); -static int init(grib_iterator* i, grib_handle*, grib_arguments*); -static int next(grib_iterator* i, double* lat, double* lon, double* val); -static int destroy(grib_iterator* i); +static int init (grib_iterator* i,grib_handle*,grib_arguments*); +static int next (grib_iterator* i, double *lat, double *lon, double *val); +static int destroy (grib_iterator* i); -struct grib_iterator_healpix -{ - grib_iterator it; +typedef struct grib_iterator_healpix{ + grib_iterator it; /* Members defined in gen */ int carg; const char* missingValue; /* Members defined in healpix */ - double* lats; - double* lons; + double *lats; + double *lons; long Nsides; bool nested; -}; +} grib_iterator_healpix; extern grib_iterator_class* grib_iterator_class_gen; static grib_iterator_class _grib_iterator_class_healpix = { - &grib_iterator_class_gen, /* super */ - "healpix", /* name */ - sizeof(grib_iterator_healpix), /* size of instance */ - 0, /* inited */ - &init_class, /* init_class */ - &init, /* constructor */ - &destroy, /* destructor */ - &next, /* Next Value */ - nullptr, /* Previous Value */ - nullptr, /* Reset the counter */ - nullptr, /* has next values */ + &grib_iterator_class_gen, /* super */ + "healpix", /* name */ + sizeof(grib_iterator_healpix),/* size of instance */ + 0, /* inited */ + &init_class, /* init_class */ + &init, /* constructor */ + &destroy, /* destructor */ + &next, /* Next Value */ + 0, /* Previous Value */ + 0, /* Reset the counter */ + 0, /* has next values */ }; grib_iterator_class* grib_iterator_class_healpix = &_grib_iterator_class_healpix; @@ -89,6 +89,9 @@ static void init_class(grib_iterator_class* c) } /* END_CLASS_IMP */ +#define ITER "HEALPix Geoiterator" +constexpr double RAD2DEG = 57.29577951308232087684; // 180 over pi + namespace { @@ -159,9 +162,6 @@ inline int pll(int f) return __pll[f]; } -#define ITER "HEALPix Geoiterator" -constexpr double RAD2DEG = 57.29577951308232087684; // 180 over pi - size_t HEALPix_nj(size_t N, size_t i) { Assert(0 < N); @@ -337,7 +337,7 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) { int err = 0; - auto* self = (grib_iterator_healpix*)iter; + grib_iterator_healpix* self = (grib_iterator_healpix*)iter; const char* snside = grib_arguments_get_name(h, args, self->carg++); const char* sorder = grib_arguments_get_name(h, args, self->carg++); @@ -367,7 +367,7 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) return GRIB_GEOCALCULUS_PROBLEM; } - if (grib_is_earth_oblate(h) != 0) { + if (grib_is_earth_oblate(h)) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only spherical earth is supported", ITER); return GRIB_WRONG_GRID; } @@ -378,12 +378,12 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) return GRIB_WRONG_GRID; } - self->lats = static_cast(grib_context_malloc(h->context, iter->nv * sizeof(double))); + self->lats = (double*)grib_context_malloc(h->context, iter->nv * sizeof(double)); if (self->lats == nullptr) { return GRIB_OUT_OF_MEMORY; } - self->lons = static_cast(grib_context_malloc(h->context, iter->nv * sizeof(double))); + self->lons = (double*)grib_context_malloc(h->context, iter->nv * sizeof(double)); if (self->lons == nullptr) { return GRIB_OUT_OF_MEMORY; } From 62de7e1ebab2ce00750d6e07df9f4f8812190f14 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 11 Mar 2024 17:11:01 +0000 Subject: [PATCH 197/244] Tools: Print formula for calculating lon2 --- tools/grib_check_gaussian_grid.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/grib_check_gaussian_grid.cc b/tools/grib_check_gaussian_grid.cc index ce944fa28..9c0e8ab2a 100644 --- a/tools/grib_check_gaussian_grid.cc +++ b/tools/grib_check_gaussian_grid.cc @@ -227,7 +227,8 @@ static int process_file(const char* filename) } if (fabs(lon2 - expected_lon2) > angular_tolerance) { - error(filename, msg_num, "longitudeOfLastGridPointInDegrees=%f but should be %f\n", lon2, expected_lon2); + error(filename, msg_num, "longitudeOfLastGridPointInDegrees=%f but should be %f (= 360 - 360/max(pl) )\n", + lon2, expected_lon2); } GRIB_CHECK(grib_get_size(h, "values", &sizeOfValuesArray), 0); From a98990fd713812e463ab85b4438b3542b3357c4d Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 11 Mar 2024 17:34:02 +0000 Subject: [PATCH 198/244] ECC-1784: Remove unused code --- src/grib_iterator_class_healpix.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index 33baa876b..0b5c09da0 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -111,16 +111,16 @@ struct CodecFijNest return static_cast(b); } - inline static int nest_decode_bits(int n) - { - auto b = static_cast(n) & __masks[5]; - b = (b ^ (b >> 1)) & __masks[4]; - b = (b ^ (b >> 2)) & __masks[3]; - b = (b ^ (b >> 4)) & __masks[2]; - b = (b ^ (b >> 8)) & __masks[1]; - b = (b ^ (b >> 16)) & __masks[0]; - return static_cast(b); - } + // inline static int nest_decode_bits(int n) + // { + // auto b = static_cast(n) & __masks[5]; + // b = (b ^ (b >> 1)) & __masks[4]; + // b = (b ^ (b >> 2)) & __masks[3]; + // b = (b ^ (b >> 4)) & __masks[2]; + // b = (b ^ (b >> 8)) & __masks[1]; + // b = (b ^ (b >> 16)) & __masks[0]; + // return static_cast(b); + // } // static std::tuple nest_to_fij(int n, int k) // { From eda5565bdc4b028ff562e55338d700c9d8a5d664 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 11 Mar 2024 17:34:16 +0000 Subject: [PATCH 199/244] ECC-1784: Test --- tests/grib_grid_healpix.sh | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/grib_grid_healpix.sh b/tests/grib_grid_healpix.sh index 96a719e28..1557a84a7 100755 --- a/tests/grib_grid_healpix.sh +++ b/tests/grib_grid_healpix.sh @@ -94,7 +94,7 @@ EOF ${tools_dir}/grib_filter -o $tempGrib $tempFilt $input ${tools_dir}/grib_get_data $tempGrib > $tempLog -# Nested ordering: N must be a power of 2 +# Nested: N must be a power of 2 input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl ${tools_dir}/grib_set -s gridType=healpix,Nside=3,orderingConvention=nested,numberOfDataPoints=108,numberOfValues=108 $input $tempGrib set +e @@ -105,8 +105,26 @@ set -e grep -q "Nside must be a power of 2" $tempLog -# Invalid cases -# -------------- +# Nested. Bad N +${tools_dir}/grib_set -s gridType=healpix,Nside=1,orderingConvention=nested $input $tempGrib +set +e +${tools_dir}/grib_get_data $tempGrib > $tempLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +cat $tempLog +grep -q "N must be greater than 1" $tempLog + +# Bad ordering +${tools_dir}/grib_set -s gridType=healpix,Nside=1,ordering=6 $input $tempGrib +set +e +${tools_dir}/grib_get_data $tempGrib > $tempLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Only orderingConvention.*are supported" $tempLog + +# N = 0 set +e ${tools_dir}/grib_get_data -sN=0 $tempGrib > $tempLog 2>&1 status=$? From f46e49b185fd3d49a25a012ef0e442fc95456c2d Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 12 Mar 2024 11:27:00 +0000 Subject: [PATCH 200/244] ECC-1776: GRIB2: Additional activity and experiment table entries for DestinE ClimateDT --- definitions/grib2/local.98.28.def | 4 +++- definitions/grib2/local.98.42.def | 2 +- definitions/grib2/local.98.43.def | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/definitions/grib2/local.98.28.def b/definitions/grib2/local.98.28.def index eeb30d063..cf801b6fc 100644 --- a/definitions/grib2/local.98.28.def +++ b/definitions/grib2/local.98.28.def @@ -1,4 +1,6 @@ -# Local Definition 28 - COSMO local area EPS +# (C) Copyright 2005- ECMWF. + +# Local definition 28 - COSMO local area EPS unsigned[4] baseDateEPS : dump; unsigned[2] baseTimeEPS : dump; diff --git a/definitions/grib2/local.98.42.def b/definitions/grib2/local.98.42.def index 1bb73af47..48b891ed9 100644 --- a/definitions/grib2/local.98.42.def +++ b/definitions/grib2/local.98.42.def @@ -1,6 +1,6 @@ # (C) Copyright 2005- ECMWF. -# Definition 42 - WMO Lead Centre for Wave Forecast Verification (LC-WFV) +# Local definition 42 - WMO Lead Centre for Wave Forecast Verification (LC-WFV) codetable[2] lcwfvSuiteName "grib2/lcwfv_suiteName.table" : dump; alias mars.origin = lcwfvSuiteName; diff --git a/definitions/grib2/local.98.43.def b/definitions/grib2/local.98.43.def index 008a528eb..3728cd185 100644 --- a/definitions/grib2/local.98.43.def +++ b/definitions/grib2/local.98.43.def @@ -1,4 +1,6 @@ -# Class ed EERIE project climate keywords +# (C) Copyright 2005- ECMWF. + +# Local definition 43 - Class ed EERIE project climate keywords # CMIP related activity keyword codetable[2] activity "grib2/destine_activity.table" ; @@ -17,4 +19,3 @@ unalias mars.domain; # Add some padding just in case we want more keys in the future pad padding_loc43(30); - From 1bbca16e3fa0f2cf8e001ae6b7ff359628b06178 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 12 Mar 2024 11:59:49 +0000 Subject: [PATCH 201/244] ECC-1784: Add support for N=1 nested --- src/grib_iterator_class_healpix.cc | 12 ++++++------ tests/grib_grid_healpix.sh | 26 ++++++++++++-------------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/grib_iterator_class_healpix.cc b/src/grib_iterator_class_healpix.cc index 0b5c09da0..7befaf894 100644 --- a/src/grib_iterator_class_healpix.cc +++ b/src/grib_iterator_class_healpix.cc @@ -265,8 +265,8 @@ static int iterate_healpix(grib_iterator_healpix* self, long N) p -= 8 * Nside; } - int i = (r + p) >> 1; - int j = (r - p) >> 1; + int i = std::max(0, (r + p)) >> 1; + int j = std::max(0, (r - p)) >> 1; Assert(f < 12 && i < Nside && j < Nside); return CodecFijNest::fij_to_nest(f, i, j, k); @@ -362,10 +362,10 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only orderingConvention=(ring|nested) are supported", ITER); return GRIB_GEOCALCULUS_PROBLEM; } - if (self->nested && N == 1) { - grib_context_log(h->context, GRIB_LOG_ERROR, "%s: For orderingConvention=nested, N must be greater than 1", ITER); - return GRIB_GEOCALCULUS_PROBLEM; - } + // if (self->nested && N == 1) { + // grib_context_log(h->context, GRIB_LOG_ERROR, "%s: For orderingConvention=nested, N must be greater than 1", ITER); + // return GRIB_GEOCALCULUS_PROBLEM; + // } if (grib_is_earth_oblate(h)) { grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Only spherical earth is supported", ITER); diff --git a/tests/grib_grid_healpix.sh b/tests/grib_grid_healpix.sh index 1557a84a7..7ff56382c 100755 --- a/tests/grib_grid_healpix.sh +++ b/tests/grib_grid_healpix.sh @@ -19,7 +19,8 @@ input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl latest=`${tools_dir}/grib_get -p tablesVersionLatest $input` -# Create a filter +# Check basic keys and grid template +# ----------------------------------- cat > $tempFilt < $tempLog grep -q "orderingConvention.*ring" $tempLog -# Geoiterator -# ------------- +# Geoiterator ring-ordering +# -------------------------- rm -f $tempGrib cat > $tempFilt < $tempFilt < $tempLog 2>&1 -status=$? -set -e -[ $status -ne 0 ] -cat $tempLog -grep -q "N must be greater than 1" $tempLog +# Nested N=1 +input=$ECCODES_SAMPLES_PATH/GRIB2.tmpl +${tools_dir}/grib_set -s gridType=healpix,Nside=1,orderingConvention=nested,numberOfDataPoints=12,numberOfValues=12 $input $tempGrib +${tools_dir}/grib_get_data $tempGrib > $tempLog +# Invalid cases +# ------------------ # Bad ordering ${tools_dir}/grib_set -s gridType=healpix,Nside=1,ordering=6 $input $tempGrib set +e From a4667c0046373d317cba43a2b360134108fc1952 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 12 Mar 2024 12:00:15 +0000 Subject: [PATCH 202/244] CMake: Option descriptions --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ff3609ac..2da7bf145 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,8 +195,8 @@ ecbuild_add_option( FEATURE INSTALL_ECCODES_SAMPLES ecbuild_add_option( FEATURE MEMORY_MANAGEMENT DESCRIPTION "Enable memory management" DEFAULT OFF ADVANCED ) ecbuild_add_option( FEATURE ALIGN_MEMORY DESCRIPTION "Enable memory alignment" DEFAULT OFF ADVANCED ) ecbuild_add_option( FEATURE TIMER DESCRIPTION "Enable timer" DEFAULT OFF ADVANCED ) -ecbuild_add_option( FEATURE ECCODES_THREADS DESCRIPTION "Enable POSIX threads" DEFAULT OFF ADVANCED ) -ecbuild_add_option( FEATURE ECCODES_OMP_THREADS DESCRIPTION "Enable OpenMP threads" DEFAULT OFF ADVANCED ) +ecbuild_add_option( FEATURE ECCODES_THREADS DESCRIPTION "Enable thread-safety using POSIX threads" DEFAULT OFF ADVANCED ) +ecbuild_add_option( FEATURE ECCODES_OMP_THREADS DESCRIPTION "Enable thread-safety using OpenMP threads" DEFAULT OFF ADVANCED ) ecbuild_add_option( FEATURE EXTRA_TESTS DESCRIPTION "Enable extended regression testing" DEFAULT OFF ADVANCED ) ############################################################################### From 20302b5af7f7f44a5f6414b7e6b6cc9e4113c837 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 12 Mar 2024 12:05:25 +0000 Subject: [PATCH 203/244] Copyright --- src/eccodes_prototypes.h | 10 ++++++++++ src/grib_scaling.h | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 6ae285fd2..7905f7978 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -1,3 +1,13 @@ +/* + * (C) Copyright 2005- ECMWF. + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + * + * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by + * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. + */ + #pragma once #ifdef ECCODES_ON_WINDOWS diff --git a/src/grib_scaling.h b/src/grib_scaling.h index c48b3aa2c..3aebfe78f 100644 --- a/src/grib_scaling.h +++ b/src/grib_scaling.h @@ -1,3 +1,13 @@ +/* + * (C) Copyright 2005- ECMWF. + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + * + * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by + * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. + */ + #pragma once /* Return n to the power of s */ From cb0e953316aa02abccfb9cfc51ea5b9453993274 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 12 Mar 2024 22:27:28 +0000 Subject: [PATCH 204/244] ECC-1773: Indexing multi-field GRIBs --- src/grib_index.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/grib_index.cc b/src/grib_index.cc index 66718a58b..29754dfea 100644 --- a/src/grib_index.cc +++ b/src/grib_index.cc @@ -9,6 +9,7 @@ */ #include "grib_api_internal.h" +#include #define UNDEF_LONG -99999 #define UNDEF_DOUBLE -99999 @@ -1083,6 +1084,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename grib_field_tree* field_tree; grib_file* file = NULL; grib_context* c; + bool warn_about_duplicates = true; if (!index) return GRIB_NULL_INDEX; @@ -1121,6 +1123,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename fseeko(file->handle, 0, SEEK_SET); + std::map map_of_offsets; while ((h = new_message_from_file(message_type, c, file->handle, &err)) != NULL) { grib_string_list* v = 0; index_key = index->keys; @@ -1240,6 +1243,18 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename field->file = file; index->count++; field->offset = h->offset; + if (warn_about_duplicates) { + const bool offset_is_unique = map_of_offsets.insert( std::pair(h->offset, h) ).second; + if (!offset_is_unique) { + fprintf(stderr, "ECCODES WARNING : File '%s': field offset %lld is not unique.\n", filename, h->offset); + long edition = 0; + if (grib_get_long(h, "edition", &edition) == GRIB_SUCCESS && edition == 2) { + fprintf(stderr, "ECCODES WARNING : This can happen if the file contains multi-field GRIB messages.\n"); + fprintf(stderr, "ECCODES WARNING : Indexing multi-field messages is not fully supported.\n"); + } + warn_about_duplicates = false; + } + } err = grib_get_long(h, "totalLength", &length); if (err) From 2ef6df5efa942ae9f76b22610b695038db5b63e1 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 13 Mar 2024 12:51:33 +0000 Subject: [PATCH 205/244] Testing: Indexing with preset values --- src/grib_index.cc | 12 ++++++++++-- tests/grib_indexing.sh | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/grib_index.cc b/src/grib_index.cc index 29754dfea..1be83df79 100644 --- a/src/grib_index.cc +++ b/src/grib_index.cc @@ -10,6 +10,7 @@ #include "grib_api_internal.h" #include +#include #define UNDEF_LONG -99999 #define UNDEF_DOUBLE -99999 @@ -1132,18 +1133,25 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename message_count++; { - char* envsetkeys = getenv("ECCODES_INDEX_SET_KEYS"); + const char* set_keys_env_var = "ECCODES_INDEX_SET_KEYS"; + char* envsetkeys = getenv(set_keys_env_var); if (envsetkeys) { grib_values set_values[MAX_NUM_KEYS]; int set_values_count = MAX_NUM_KEYS; + std::string copy_of_env(envsetkeys); //parse_keyval_string changes envsetkeys! int error = parse_keyval_string(NULL, envsetkeys, 1, GRIB_TYPE_UNDEFINED, set_values, &set_values_count); if (!error && set_values_count != 0) { err = grib_set_values(h, set_values, set_values_count); if (err) { - grib_context_log(c, GRIB_LOG_ERROR,"codes_index_add_file: Unable to set %s\n", envsetkeys); + grib_context_log(c, GRIB_LOG_ERROR, + "codes_index_add_file: Unable to set %s", copy_of_env.c_str()); return err; } + } else { + grib_context_log(c, GRIB_LOG_ERROR, "codes_index_add_file: Unable to parse %s (%s)", + set_keys_env_var, grib_get_error_message(error)); + return error; } } } diff --git a/tests/grib_indexing.sh b/tests/grib_indexing.sh index 79026c9a3..bd4908bf1 100755 --- a/tests/grib_indexing.sh +++ b/tests/grib_indexing.sh @@ -147,8 +147,8 @@ mkdir $temp_dir_B cp ${data_dir}/tigge/tigge_rjtd_pl_*grib $temp_dir_A cp ${data_dir}/tigge/tigge_rjtd_sfc_*grib $temp_dir_B -${tools_dir}/grib_index_build -o $tempIndex1 $temp_dir_A -${tools_dir}/grib_dump $tempIndex1 +${tools_dir}/grib_index_build -o $tempIndex1 $temp_dir_A > /dev/null +${tools_dir}/grib_dump $tempIndex1 > /dev/null rm -rf $temp_dir_A @@ -159,6 +159,39 @@ ${tools_dir}/grib_index_build -N -o $tempIndex1 $sample1 > /dev/null ${tools_dir}/grib_dump $tempIndex1 >/dev/null +# ECC-1773: GRIB2 multi-field messages +# ------------------------------------- +infile=$data_dir/multi.grib2 +${tools_dir}/grib_index_build -o $tempIndex1 $infile > $temp 2>&1 +grep -q "Indexing multi-field messages is not fully supported" $temp + +# Change keys before indexing +# ---------------------------- +infile=$data_dir/tigge_pf_ecmwf.grib2 + +${tools_dir}/grib_index_build -N -o $tempIndex1 $infile > $temp +grep -q "mars.stream = { enfo }" $temp +grep -q "mars.type = { pf }" $temp + +ECCODES_INDEX_SET_KEYS='typeOfProcessedData=af' ${tools_dir}/grib_index_build -N -o $tempIndex1 $infile > $temp +grep -q "mars.stream = { oper }" $temp +grep -q "mars.type = { fc }" $temp + +set +e +ECCODES_INDEX_SET_KEYS='nosuchkey=1,typeOfProcessedData=af' ${tools_dir}/grib_index_build -N -o $tempIndex1 $infile > $temp 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Unable to set nosuchkey=1,typeOfProcessedData=af" $temp + +set +e +ECCODES_INDEX_SET_KEYS='rubbish' ${tools_dir}/grib_index_build -N -o $tempIndex1 $infile > $temp 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Unable to parse" $temp + + # ------------------ # Error conditions # ------------------ From cd03fcb6cb302583ecdcf4425dc318c42ff16ca8 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 13 Mar 2024 14:23:10 +0000 Subject: [PATCH 206/244] Data quality checks: Print extra info --- src/grib_util.cc | 55 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/src/grib_util.cc b/src/grib_util.cc index 546fb726d..4be428c13 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -10,6 +10,8 @@ #include "grib_api_internal.h" #include +#include +#include typedef enum { @@ -2104,6 +2106,30 @@ int grib_producing_large_constant_fields(const grib_handle* h, int edition) return c->large_constant_fields; } +static std::string grib_data_quality_check_extra_info(const grib_handle* h) +{ + char step[32] = "unknown"; + char marsClass[32] = {0,}; + char marsStream[32] = {0,}; + char marsType[32] = {0,}; + std::string result; + std::stringstream ss; + size_t len = 32; + int err1 = grib_get_string(h, "step", step, &len); + len = 32; + int err2 = grib_get_string(h, "class", marsClass, &len); + len = 32; + int err3 = grib_get_string(h, "stream", marsStream, &len); + len = 32; + int err4 = grib_get_string(h, "type", marsType, &len); + if (!err1 && !err2 && !err3 && !err4) { + ss << "step=" << step << ", class=" << marsClass << ", stream=" << marsStream << ", type=" << marsType; + result = ss.str(); + } + + return result; +} + int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max_val) { int err = 0; @@ -2112,7 +2138,6 @@ int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max const grib_context* ctx = h->context; bool is_error = true; char description[1024] = {0,}; - char step[32] = "unknown"; char shortName[64] = {0,}; char name[526] = {0,}; size_t len = 0; @@ -2128,8 +2153,9 @@ int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max len = sizeof(shortName); err = grib_get_string(h, "shortName", shortName, &len); if (err || STR_EQUAL(shortName, invalid_shortName)) { - fprintf(stderr, "ECCODES %s : Invalid metadata: shortName='%s'\n", - (is_error ? "ERROR" : "WARNING"), invalid_shortName); + std::string info( grib_data_quality_check_extra_info(h) ); + fprintf(stderr, "ECCODES %s : (%s) Invalid metadata: shortName='%s'\n", + (is_error ? "ERROR" : "WARNING"), info.c_str(), invalid_shortName); if (is_error) return GRIB_INVALID_MESSAGE; } @@ -2157,21 +2183,20 @@ int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max if (get_concept_condition_string(h, "param_value_max", NULL, description) == GRIB_SUCCESS) { printf("ECCODES DEBUG grib_data_quality_check: Checking condition '%s' (allowed=%g, %g) (actual=%g, %g)\n", description, min_field_value_allowed, max_field_value_allowed, - min_val, max_val - ); + min_val, max_val); } } if (min_val < min_field_value_allowed) { - grib_get_string(h, "step", step, &len); + std::string info( grib_data_quality_check_extra_info(h) ); if (get_concept_condition_string(h, "param_value_min", NULL, description) == GRIB_SUCCESS) { - fprintf(stderr, "ECCODES %s : (%s, step=%s): minimum (%g) is less than the allowable limit (%g)\n", - (is_error ? "ERROR" : "WARNING"), description, step, min_val, min_field_value_allowed); + fprintf(stderr, "ECCODES %s : (%s, %s): minimum (%g) is less than the allowable limit (%g)\n", + (is_error ? "ERROR" : "WARNING"), description, info.c_str(), min_val, min_field_value_allowed); } else { if (grib_get_long(h, "paramId", ¶mId) == GRIB_SUCCESS) { - fprintf(stderr, "ECCODES %s : (paramId=%ld, step=%s): minimum (%g) is less than the default allowable limit (%g)\n", - (is_error ? "ERROR" : "WARNING"), paramId, step, min_val, min_field_value_allowed); + fprintf(stderr, "ECCODES %s : (paramId=%ld, %s): minimum (%g) is less than the default allowable limit (%g)\n", + (is_error ? "ERROR" : "WARNING"), paramId, info.c_str(), min_val, min_field_value_allowed); } } if (is_error) { @@ -2179,15 +2204,15 @@ int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max } } if (max_val > max_field_value_allowed) { - grib_get_string(h, "step", step, &len); + std::string info( grib_data_quality_check_extra_info(h) ); if (get_concept_condition_string(h, "param_value_max", NULL, description) == GRIB_SUCCESS) { - fprintf(stderr, "ECCODES %s : (%s, step=%s): maximum (%g) is more than the allowable limit (%g)\n", - (is_error ? "ERROR" : "WARNING"), description, step, max_val, max_field_value_allowed); + fprintf(stderr, "ECCODES %s : (%s, %s): maximum (%g) is more than the allowable limit (%g)\n", + (is_error ? "ERROR" : "WARNING"), description, info.c_str(), max_val, max_field_value_allowed); } else { if (grib_get_long(h, "paramId", ¶mId) == GRIB_SUCCESS) { - fprintf(stderr, "ECCODES %s : (paramId=%ld, step=%s): maximum (%g) is more than the default allowable limit (%g)\n", - (is_error ? "ERROR" : "WARNING"), paramId, step, max_val, max_field_value_allowed); + fprintf(stderr, "ECCODES %s : (paramId=%ld, %s): maximum (%g) is more than the default allowable limit (%g)\n", + (is_error ? "ERROR" : "WARNING"), paramId, info.c_str(), max_val, max_field_value_allowed); } } if (is_error) { From a9acb2673e79334a68ee542594e87ff2031f3df8 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 13 Mar 2024 15:13:16 +0000 Subject: [PATCH 207/244] Testing: Indexing BUFR --- tests/bufr_indexing.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/bufr_indexing.sh b/tests/bufr_indexing.sh index 297f71bba..cc1c4cb39 100755 --- a/tests/bufr_indexing.sh +++ b/tests/bufr_indexing.sh @@ -45,6 +45,15 @@ ${tools_dir}/bufr_index_build -k mars.ident -o $tempIndex $infile |\ # ------------------ # Error conditions # ------------------ +infile=${data_dir}/bufr/vos308014_v3_26.bufr +set +e +${tools_dir}/bufr_index_build -o $tempIndex $infile > $tempOut 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Unable to unpack BUFR to create index" $tempOut + + echo BUFR > $tempBufr set +e ${tools_dir}/bufr_index_build $tempBufr > $tempOut 2>&1 From 73d2bec684bf3d43280d9857736639ae94f198d7 Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 13 Mar 2024 16:47:58 +0000 Subject: [PATCH 208/244] Testing: Template selection and min/max checks --- tests/grib_util_set_spec.cc | 6 ++++++ tests/unit_tests.cc | 30 ++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/tests/grib_util_set_spec.cc b/tests/grib_util_set_spec.cc index 31af1bcb5..e47672868 100644 --- a/tests/grib_util_set_spec.cc +++ b/tests/grib_util_set_spec.cc @@ -132,6 +132,12 @@ static void test_reduced_gg(int remove_local_def, int edition, const char* packi Assert(err == GRIB_ENCODING_ERROR); Assert(!h2); if (h2) exit(1); + + values[0] = -INFINITY; + h2 = grib_util_set_spec(handle, &spec, &packing_spec, set_spec_flags, values, outlen, &err); + Assert(err == GRIB_ENCODING_ERROR); + Assert(!h2); + if (h2) exit(1); #endif } diff --git a/tests/unit_tests.cc b/tests/unit_tests.cc index 110e8c4ee..d5e228124 100644 --- a/tests/unit_tests.cc +++ b/tests/unit_tests.cc @@ -679,7 +679,7 @@ void test_grib2_select_PDTN() int chemical_srcsink = 1; int chemical_distfn = 1; int aerosol = 1; - //int aerosol_optical = 1; + int aerosol_optical = 1; // arguments = eps instant chemical chemical_srcsink chemical_distfn aerosol aerosol_optical @@ -690,19 +690,29 @@ void test_grib2_select_PDTN() Assert( 43 == grib2_select_PDTN(eps, !instant, chemical, 0, 0, 0, 0) ); // Chemical source/sink - Assert( 76 == grib2_select_PDTN(!eps, instant, !chemical, chemical_srcsink,0,0,0) ); - Assert( 77 == grib2_select_PDTN(eps, instant, !chemical, chemical_srcsink,0,0,0) ); - Assert( 78 == grib2_select_PDTN(!eps, !instant, !chemical, chemical_srcsink,0,0,0) ); - Assert( 79 == grib2_select_PDTN(eps, !instant, !chemical, chemical_srcsink,0,0,0) ); + Assert( 76 == grib2_select_PDTN(!eps, instant, !chemical, chemical_srcsink, 0,0,0) ); + Assert( 77 == grib2_select_PDTN(eps, instant, !chemical, chemical_srcsink, 0,0,0) ); + Assert( 78 == grib2_select_PDTN(!eps, !instant, !chemical, chemical_srcsink, 0,0,0) ); + Assert( 79 == grib2_select_PDTN(eps, !instant, !chemical, chemical_srcsink, 0,0,0) ); + + // Chemical distrib. function + Assert( 58 == grib2_select_PDTN(eps, instant, 0, 0, chemical_distfn, 0, 0) ); + Assert( 68 == grib2_select_PDTN(eps, !instant, 0, 0, chemical_distfn, 0, 0) ); + Assert( 57 == grib2_select_PDTN(!eps, instant, 0, 0, chemical_distfn, 0, 0) ); + Assert( 67 == grib2_select_PDTN(!eps, !instant, 0, 0, chemical_distfn, 0, 0) ); // Aerosols - Assert( 48 == grib2_select_PDTN(!eps, instant, !chemical, !chemical_srcsink, !chemical_distfn, aerosol, 0) ); - Assert( 46 == grib2_select_PDTN(!eps, !instant, !chemical, !chemical_srcsink, !chemical_distfn, aerosol, 0) ); - Assert( 45 == grib2_select_PDTN(eps, instant, !chemical, !chemical_srcsink, !chemical_distfn, aerosol, 0) ); - Assert( 85 == grib2_select_PDTN(eps, !instant, !chemical, !chemical_srcsink, !chemical_distfn, aerosol, 0) ); + Assert( 48 == grib2_select_PDTN(!eps, instant, 0, 0, 0, aerosol, 0) ); + Assert( 46 == grib2_select_PDTN(!eps, !instant, 0, 0, 0, aerosol, 0) ); + Assert( 45 == grib2_select_PDTN(eps, instant, 0, 0, 0, aerosol, 0) ); + Assert( 85 == grib2_select_PDTN(eps, !instant, 0, 0, 0, aerosol, 0) ); + + // Aerosol optical + Assert( 49 == grib2_select_PDTN(eps, instant, 0, 0, 0, 0, aerosol_optical) ); + Assert( 48 == grib2_select_PDTN(!eps, instant, 0, 0, 0, 0, aerosol_optical) ); // Plain vanilla - Assert( 0 == grib2_select_PDTN(!eps, instant, !chemical, !chemical_srcsink, !chemical_distfn, !aerosol,0) ); + Assert( 0 == grib2_select_PDTN(!eps, instant, !chemical, !chemical_srcsink, !chemical_distfn, !aerosol, 0) ); Assert( 1 == grib2_select_PDTN(1,1,0,0,0, !aerosol,0) ); Assert( 8 == grib2_select_PDTN(0,0,0,0,0, !aerosol,0) ); Assert( 11 == grib2_select_PDTN(1,0,0,0,0, !aerosol,0) ); From 6241682c47716a167fc8354c7886effc4beea9cb Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 13 Mar 2024 17:21:00 +0000 Subject: [PATCH 209/244] ECC-1785: BUFR: Allow encoding satelliteID when rdbType=30 --- definitions/bufr/section.3.def | 2 +- tests/CMakeLists.txt | 1 + tests/bufr_ecc-1785.sh | 35 ++++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100755 tests/bufr_ecc-1785.sh diff --git a/definitions/bufr/section.3.def b/definitions/bufr/section.3.def index 1d9d8c7f9..d223bbbb2 100644 --- a/definitions/bufr/section.3.def +++ b/definitions/bufr/section.3.def @@ -51,7 +51,7 @@ unsigned[2] numberOfSubsets : dump; alias ls.numberOfSubsets=numberOfSubsets; if (section2Present && bufrHeaderCentre==98 && section2Length==52) { - if ( rdbType == 2 || rdbType == 3 || rdbType == 8 || rdbType == 12 ) { + if ( rdbType == 2 || rdbType == 3 || rdbType == 8 || rdbType == 12 || rdbType == 30 ) { transient isSatelliteType=1; } else { transient isSatelliteType=0; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 31a644601..e1f11445c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -249,6 +249,7 @@ if( HAVE_BUILD_TOOLS ) bufr_ecc-1305 bufr_ecc-1476 bufr_ecc-1623 + bufr_ecc-1785 grib_ecc-490 grib_ecc-756 grib_ecc-806 diff --git a/tests/bufr_ecc-1785.sh b/tests/bufr_ecc-1785.sh new file mode 100755 index 000000000..a09751e8b --- /dev/null +++ b/tests/bufr_ecc-1785.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +# --------------------------------------------------------- +# This is the test for the JIRA issue ECC-1785 +# BUFR: Allow encoding satelliteID when rdbType=30 +# --------------------------------------------------------- + +label="bufr_ecc-1785_test" + +tempBufr=temp.$label.bufr +tempFilt=temp.$label.filt +tempLog=temp.$label.log +tempRef=temp.$label.ref + +sample_bufr4=$ECCODES_SAMPLES_PATH/BUFR3_local_satellite.tmpl + +echo 'set numberOfSubsets=1; set rdbType=30; set satelliteID=78; write;' > $tempFilt + +${tools_dir}/codes_bufr_filter -o $tempBufr $tempFilt $sample_bufr4 + +result=$(${tools_dir}/bufr_get -p isSatelliteType,isSatellite,satelliteID $tempBufr) +[ "$result" = "1 1 78" ] + +# Clean up +rm -f $tempBufr $tempFilt $tempLog $tempRef From 53e32320a84c5ad67618a0c9801d8da4a06b9fd1 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 14 Mar 2024 11:10:38 +0000 Subject: [PATCH 210/244] ECC-1785: More testing --- src/bufr_util.cc | 2 +- src/grib_index.cc | 2 +- tests/bufr_ecc-1785.sh | 3 +-- tests/bufr_extract_headers.sh | 11 +++++++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/bufr_util.cc b/src/bufr_util.cc index 0b4ffb0e7..95ff8eeb2 100644 --- a/src/bufr_util.cc +++ b/src/bufr_util.cc @@ -220,7 +220,7 @@ static int bufr_decode_extra_rdb_keys(const void* message, long offset_section2, DEBUG_ASSERT(hdr->ecmwfLocalSectionPresent); - if (hdr->rdbType == 2 || hdr->rdbType == 3 || hdr->rdbType == 8 || hdr->rdbType == 12) { + if (hdr->rdbType == 2 || hdr->rdbType == 3 || hdr->rdbType == 8 || hdr->rdbType == 12 || hdr->rdbType == 30) { isSatelliteType = true; } if (isSatelliteType || hdr->numberOfSubsets > 1) { diff --git a/src/grib_index.cc b/src/grib_index.cc index 1be83df79..b6eb0b3a2 100644 --- a/src/grib_index.cc +++ b/src/grib_index.cc @@ -1254,7 +1254,7 @@ static int codes_index_add_file_internal(grib_index* index, const char* filename if (warn_about_duplicates) { const bool offset_is_unique = map_of_offsets.insert( std::pair(h->offset, h) ).second; if (!offset_is_unique) { - fprintf(stderr, "ECCODES WARNING : File '%s': field offset %lld is not unique.\n", filename, h->offset); + fprintf(stderr, "ECCODES WARNING : File '%s': field offset %ld is not unique.\n", filename, (long)h->offset); long edition = 0; if (grib_get_long(h, "edition", &edition) == GRIB_SUCCESS && edition == 2) { fprintf(stderr, "ECCODES WARNING : This can happen if the file contains multi-field GRIB messages.\n"); diff --git a/tests/bufr_ecc-1785.sh b/tests/bufr_ecc-1785.sh index a09751e8b..1a4ae4a2c 100755 --- a/tests/bufr_ecc-1785.sh +++ b/tests/bufr_ecc-1785.sh @@ -20,7 +20,6 @@ label="bufr_ecc-1785_test" tempBufr=temp.$label.bufr tempFilt=temp.$label.filt tempLog=temp.$label.log -tempRef=temp.$label.ref sample_bufr4=$ECCODES_SAMPLES_PATH/BUFR3_local_satellite.tmpl @@ -32,4 +31,4 @@ result=$(${tools_dir}/bufr_get -p isSatelliteType,isSatellite,satelliteID $tempB [ "$result" = "1 1 78" ] # Clean up -rm -f $tempBufr $tempFilt $tempLog $tempRef +rm -f $tempBufr $tempFilt $tempLog diff --git a/tests/bufr_extract_headers.sh b/tests/bufr_extract_headers.sh index 0d518d732..481a5cd2f 100755 --- a/tests/bufr_extract_headers.sh +++ b/tests/bufr_extract_headers.sh @@ -14,6 +14,8 @@ label="bufr_extract_headers_test" temp1="temp.${label}.1" temp2="temp.${label}.2" +tempBufr=temp.$label.bufr +tempFilt=temp.$label.filt # Multi-message BUFR # -------------------- @@ -190,6 +192,14 @@ ${tools_dir}/bufr_set -s restricted=1 $input $temp1 r=`$EXEC ${test_dir}/bufr_extract_headers restricted $temp1` [ "$r" = "1" ] +# ECC-1785 Allow encoding satelliteID when rdbType=30 +# ---------------------------------------------------- +sample_bufr4=$ECCODES_SAMPLES_PATH/BUFR3_local_satellite.tmpl +echo 'set numberOfSubsets=1; set rdbType=30; set satelliteID=78; write;' > $tempFilt +${tools_dir}/codes_bufr_filter -o $tempBufr $tempFilt $sample_bufr4 +r=$(${test_dir}/bufr_extract_headers isSatellite,satelliteID $tempBufr) +[ "$r" = "1 78" ] + echo "Test with invalid inputs..." # --------------------------------- @@ -234,3 +244,4 @@ grep -q "No BUFR messages in file" $temp2 # Clean up rm -f $temp1 $temp2 +rm -f $tempBufr $tempFilt From 73b4eccf35ffd3875522d9184b78bd452e6ce94f Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 14 Mar 2024 16:15:47 +0000 Subject: [PATCH 211/244] Documentation re pip --- INSTALL | 2 -- README.md | 5 ----- 2 files changed, 7 deletions(-) diff --git a/INSTALL b/INSTALL index b75d5b2b5..bccdbc3fb 100644 --- a/INSTALL +++ b/INSTALL @@ -33,8 +33,6 @@ However it requires that cmake be installed on your system. To add the Python3 bindings, use pip3 install from PyPI as follows: > pip3 install eccodes - or - > pip3 install --install-option="--prefix=/path/to/where/you/install/eccodes" eccodes You can also pass options to the cmake command above. Some typical examples are: diff --git a/README.md b/README.md index f63d65384..6859a1f1a 100644 --- a/README.md +++ b/README.md @@ -60,11 +60,6 @@ To add the Python3 bindings, use pip3 install from PyPI as follows: ``` pip3 install eccodes ``` - or - ``` - pip3 install --install-option="--prefix=/path/to/where/you/install/eccodes" eccodes - ``` - For more details, please see: https://confluence.ecmwf.int/display/ECC/ecCodes+installation From 9c71ac509c4a2de25365248bf4e897aaad20bbea Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 15 Mar 2024 12:46:10 +0000 Subject: [PATCH 212/244] Tools: Print hint about product when wrong tool used --- tests/bufr_get.sh | 19 +++++++++++++++++++ tests/grib_get_fail.sh | 11 +++++++++++ tools/grib_tools.cc | 28 ++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/tests/bufr_get.sh b/tests/bufr_get.sh index 0449cfc92..6be077eae 100755 --- a/tests/bufr_get.sh +++ b/tests/bufr_get.sh @@ -119,6 +119,25 @@ result=`${tools_dir}/bufr_get -p unpack:d,heightOfStation aaen_55.bufr` result=`${tools_dir}/bufr_get -p unpack:s,heightOfStation aaen_55.bufr` [ "$result" = "0 858000" ] +# ---------------------------------------- +# Wrong message type +# ---------------------------------------- +f=$data_dir/sample.grib2 +set +e +${tools_dir}/bufr_get -p edition $f > $fLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Input file seems to be GRIB" $fLog + +f=$ECCODES_SAMPLES_PATH/budg.tmpl +set +e +${tools_dir}/bufr_get -p edition $f > $fLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Input file seems to be GRIB" $fLog + # ---------------------------------------- # Unreadable message diff --git a/tests/grib_get_fail.sh b/tests/grib_get_fail.sh index 1dd028fcb..7f1c967e4 100755 --- a/tests/grib_get_fail.sh +++ b/tests/grib_get_fail.sh @@ -88,5 +88,16 @@ grep -q "unreadable message" $tempText rm -f $outfile +# ---------------------- +# Wrong message type +# ---------------------- +set +e +${tools_dir}/grib_get -p edition $ECCODES_SAMPLES_PATH/BUFR3.tmpl > $tempText 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep -q "Input file seems to be BUFR" $tempText + + # Clean up rm -f $tempText diff --git a/tools/grib_tools.cc b/tools/grib_tools.cc index 2124bc0ab..13ce07eaa 100644 --- a/tools/grib_tools.cc +++ b/tools/grib_tools.cc @@ -10,6 +10,7 @@ #include "grib_tools.h" #include +#include #if HAVE_LIBJASPER /* Remove compiler warnings re macros being redefined */ @@ -308,6 +309,29 @@ static int grib_tool_with_orderby(grib_runtime_options* options) static char iobuf[1024 * 1024]; +// Read the first few bytes of the file to guess what kind of product +// it could be. Returns an empty string if it fails +static std::string guess_file_product(const std::string& filename) +{ + std::string result; + char buffer[5] = {0,}; + FILE* fin = fopen(filename.c_str(), "rb"); + if (fin) { + size_t bytes = fread(buffer, 1, sizeof(buffer), fin); + if (bytes == sizeof(buffer)) { + if (strncmp(buffer, "GRIB", 4)==0) { + result = "GRIB"; + } else if (strncmp(buffer, "BUDG", 4)==0) { + result = "GRIB"; + } else if (strncmp(buffer, "BUFR", 4)==0) { + result = "BUFR"; + } + } + fclose(fin); + } + return result; +} + static int grib_tool_without_orderby(grib_runtime_options* options) { int err = 0; @@ -419,6 +443,10 @@ static int grib_tool_without_orderby(grib_runtime_options* options) if (infile->handle_count == 0) { fprintf(stderr, "%s: No messages found in %s\n", tool_name, infile->name); + std::string product = guess_file_product(infile->name); + if (!product.empty()) { + fprintf(stderr, "%s: Input file seems to be %s\n", tool_name, product.c_str()); + } if (options->fail) exit(1); } From e87675b1aeb9a8b065bb7d0ffd4bd994af14a937 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 15 Mar 2024 13:16:42 +0000 Subject: [PATCH 213/244] Const correctness and cppcheck warnings --- src/grib_accessor_class_bufr_data_array.cc | 12 +++--- ...rib_accessor_class_bufr_extract_subsets.cc | 9 ++--- ...rib_accessor_class_bufr_simple_thinning.cc | 14 +++---- ...r_class_change_alternative_row_scanning.cc | 2 +- ...ccessor_class_change_scanning_direction.cc | 2 +- src/grib_accessor_class_closest_date.cc | 5 ++- src/grib_accessor_class_codeflag.cc | 16 ++++---- src/grib_accessor_class_data_ccsds_packing.cc | 4 +- ...rib_accessor_class_expanded_descriptors.cc | 38 +++++++++---------- 9 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/grib_accessor_class_bufr_data_array.cc b/src/grib_accessor_class_bufr_data_array.cc index c1bff6ea6..3d044835a 100644 --- a/src/grib_accessor_class_bufr_data_array.cc +++ b/src/grib_accessor_class_bufr_data_array.cc @@ -1523,10 +1523,10 @@ static int build_bitmap(grib_accessor_bufr_data_array* self, unsigned char* data int bitmapSize = 0, iDelayedReplication = 0; int i, localReference, width, bitmapEndElementsDescriptorsIndex; long ppos, n; - grib_accessor* a = (grib_accessor*)self; - grib_context* c = a->context; + grib_accessor* a = (grib_accessor*)self; + const grib_context* c = a->context; bufr_descriptor** descriptors = self->expanded->v; - long* edi = elementsDescriptorsIndex->v; + const long* edi = elementsDescriptorsIndex->v; /* int iel=grib_iarray_used_size(elementsDescriptorsIndex)-1; */ int err = 0; @@ -1652,10 +1652,10 @@ static int build_bitmap_new_data(grib_accessor_bufr_data_array* self, unsigned c int bitmapSize = 0, iDelayedReplication = 0; int i, bitmapEndElementsDescriptorsIndex; long n; - grib_accessor* a = (grib_accessor*)self; - grib_context* c = a->context; + grib_accessor* a = (grib_accessor*)self; + const grib_context* c = a->context; bufr_descriptor** descriptors = self->expanded->v; - long* edi = elementsDescriptorsIndex->v; + const long* edi = elementsDescriptorsIndex->v; switch (descriptors[iBitmapOperator]->code) { case 222000: diff --git a/src/grib_accessor_class_bufr_extract_subsets.cc b/src/grib_accessor_class_bufr_extract_subsets.cc index 599d1d7b4..567ceb61a 100644 --- a/src/grib_accessor_class_bufr_extract_subsets.cc +++ b/src/grib_accessor_class_bufr_extract_subsets.cc @@ -108,7 +108,7 @@ grib_accessor_class* grib_accessor_class_bufr_extract_subsets = &_grib_accessor_ static void get_accessors(grib_accessor* a) { grib_accessor_bufr_extract_subsets* self = (grib_accessor_bufr_extract_subsets*)a; - grib_handle* h = grib_handle_of_accessor(a); + const grib_handle* h = grib_handle_of_accessor(a); if (self->packAccessor) return; @@ -118,7 +118,7 @@ static void get_accessors(grib_accessor* a) static void init(grib_accessor* a, const long len, grib_arguments* arg) { - int n = 0; + int n = 0; grib_accessor_bufr_extract_subsets* self = (grib_accessor_bufr_extract_subsets*)a; a->length = 0; @@ -134,15 +134,14 @@ static int get_native_type(grib_accessor* a) static int pack_long(grib_accessor* a, const long* val, size_t* len) { - int err = 0; grib_accessor_bufr_extract_subsets* self = (grib_accessor_bufr_extract_subsets*)a; - size_t l = 1; + size_t l = 1; long v[1]; get_accessors(a); v[0] = 1; - err = grib_pack_long(self->packAccessor, v, &l); + int err = grib_pack_long(self->packAccessor, v, &l); if (err) { if (err == GRIB_ENCODING_ERROR) grib_context_log(a->context, GRIB_LOG_ERROR, "Could not extract subset(s).\n\tHint: Did you forget to set unpack=1?"); diff --git a/src/grib_accessor_class_bufr_simple_thinning.cc b/src/grib_accessor_class_bufr_simple_thinning.cc index b457d0e9e..cd0181fe4 100644 --- a/src/grib_accessor_class_bufr_simple_thinning.cc +++ b/src/grib_accessor_class_bufr_simple_thinning.cc @@ -133,18 +133,17 @@ static int get_native_type(grib_accessor* a) static int apply_thinning(grib_accessor* a) { - grib_accessor_bufr_simple_thinning* self = (grib_accessor_bufr_simple_thinning*)a; - int ret = 0; + const grib_accessor_bufr_simple_thinning* self = (grib_accessor_bufr_simple_thinning*)a; + long skip; grib_handle* h = grib_handle_of_accessor(a); grib_context* c = h->context; long compressed = 0, nsubsets; - long i; grib_iarray* subsets; long* subsets_ar = 0; long start = 0, radius = 0; - ret = grib_get_long(h, "compressedData", &compressed); + int ret = grib_get_long(h, "compressedData", &compressed); if (ret) return ret; if (compressed) { @@ -168,7 +167,7 @@ static int apply_thinning(grib_accessor* a) return ret; subsets = grib_iarray_new(c, numberOfSubsets / skip + 1, 10); - for (i = 0; i < numberOfSubsets; i += skip + 1) { + for (long i = 0; i < numberOfSubsets; i += skip + 1) { grib_iarray_push(subsets, i + 1); } @@ -200,12 +199,11 @@ static int apply_thinning(grib_accessor* a) static int pack_long(grib_accessor* a, const long* val, size_t* len) { - int err = 0; - grib_accessor_bufr_simple_thinning* self = (grib_accessor_bufr_simple_thinning*)a; + const grib_accessor_bufr_simple_thinning* self = (grib_accessor_bufr_simple_thinning*)a; if (*len == 0) return GRIB_SUCCESS; - err = apply_thinning(a); + int err = apply_thinning(a); if (err) return err; diff --git a/src/grib_accessor_class_change_alternative_row_scanning.cc b/src/grib_accessor_class_change_alternative_row_scanning.cc index 394bb8409..d8eef0eb4 100644 --- a/src/grib_accessor_class_change_alternative_row_scanning.cc +++ b/src/grib_accessor_class_change_alternative_row_scanning.cc @@ -125,7 +125,7 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) { int err = 0; grib_accessor_change_alternative_row_scanning* self = (grib_accessor_change_alternative_row_scanning*)a; - grib_context* c = a->context; + const grib_context* c = a->context; grib_handle* h = grib_handle_of_accessor(a); long i, j, jr, theEnd, Ni, Nj, k, kp, alternativeRowScanning; size_t size = 0; diff --git a/src/grib_accessor_class_change_scanning_direction.cc b/src/grib_accessor_class_change_scanning_direction.cc index 88fbc35fb..f951c9083 100644 --- a/src/grib_accessor_class_change_scanning_direction.cc +++ b/src/grib_accessor_class_change_scanning_direction.cc @@ -146,7 +146,7 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) size_t size = 0; double* values = NULL; grib_accessor_change_scanning_direction* self = (grib_accessor_change_scanning_direction*)a; - grib_context* c = a->context; + const grib_context* c = a->context; grib_handle* h = grib_handle_of_accessor(a); const char* cclass_name = a->cclass->name; diff --git a/src/grib_accessor_class_closest_date.cc b/src/grib_accessor_class_closest_date.cc index b4729822f..08ba9f333 100644 --- a/src/grib_accessor_class_closest_date.cc +++ b/src/grib_accessor_class_closest_date.cc @@ -159,6 +159,8 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) /* Sets val to the 'index' of the closes date */ static int unpack_double(grib_accessor* a, double* val, size_t* len) { + const grib_accessor_closest_date* self = (grib_accessor_closest_date*)a; + int err = 0; long num_forecasts = 0; /* numberOfForecastsUsedInLocalTime */ /* These relate to the date and time in Section 1 */ @@ -171,9 +173,8 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) /* These relate to the forecast dates and times in Section 4 */ long *yearArray, *monthArray, *dayArray, *hourArray, *minuteArray, *secondArray; - grib_accessor_closest_date* self = (grib_accessor_closest_date*)a; grib_handle* h = grib_handle_of_accessor(a); - grib_context* c = a->context; + const grib_context* c = a->context; *val = -1; /* initialise to an invalid index */ if ((err = grib_get_long_internal(h, self->numForecasts, &num_forecasts)) != GRIB_SUCCESS) return err; diff --git a/src/grib_accessor_class_codeflag.cc b/src/grib_accessor_class_codeflag.cc index 77789389d..ab86a64b1 100644 --- a/src/grib_accessor_class_codeflag.cc +++ b/src/grib_accessor_class_codeflag.cc @@ -110,8 +110,8 @@ grib_accessor_class* grib_accessor_class_codeflag = &_grib_accessor_class_codefl static void init(grib_accessor* a, const long len, grib_arguments* param) { grib_accessor_codeflag* self = (grib_accessor_codeflag*)a; - a->length = len; - self->tablename = grib_arguments_get_string(grib_handle_of_accessor(a), param, 0); + a->length = len; + self->tablename = grib_arguments_get_string(grib_handle_of_accessor(a), param, 0); Assert(a->length >= 0); } @@ -123,8 +123,8 @@ static int test_bit(long a, long b) static int grib_get_codeflag(grib_accessor* a, long code, char* codename) { - grib_accessor_codeflag* self = (grib_accessor_codeflag*)a; - FILE* f = NULL; + const grib_accessor_codeflag* self = (grib_accessor_codeflag*)a; + FILE* f = NULL; char fname[1024]; char bval[50]; char num[50]; @@ -200,10 +200,10 @@ static int value_count(grib_accessor* a, long* count) static void dump(grib_accessor* a, grib_dumper* dumper) { - grib_accessor_codeflag* self = (grib_accessor_codeflag*)a; - long v; - char flagname[1024]; - char fname[1024]; + const grib_accessor_codeflag* self = (grib_accessor_codeflag*)a; + long v = 0; + char flagname[1024] = {0,}; + char fname[1024] = {0,}; size_t llen = 1; diff --git a/src/grib_accessor_class_data_ccsds_packing.cc b/src/grib_accessor_class_data_ccsds_packing.cc index 28e961e86..ccfd48c03 100644 --- a/src/grib_accessor_class_data_ccsds_packing.cc +++ b/src/grib_accessor_class_data_ccsds_packing.cc @@ -650,7 +650,7 @@ static int unpack_float(grib_accessor* a, float* val, size_t* len) static int unpack_double_element(grib_accessor* a, size_t idx, double* val) { // The index idx relates to codedValues NOT values! - grib_accessor_data_ccsds_packing* self = (grib_accessor_data_ccsds_packing*)a; + const grib_accessor_data_ccsds_packing* self = (grib_accessor_data_ccsds_packing*)a; grib_handle* hand = grib_handle_of_accessor(a); int err = 0; size_t size = 0; @@ -686,7 +686,7 @@ static int unpack_double_element(grib_accessor* a, size_t idx, double* val) static int unpack_double_element_set(grib_accessor* a, const size_t* index_array, size_t len, double* val_array) { - grib_accessor_data_ccsds_packing* self = (grib_accessor_data_ccsds_packing*)a; + const grib_accessor_data_ccsds_packing* self = (grib_accessor_data_ccsds_packing*)a; grib_handle* hand = grib_handle_of_accessor(a); size_t size = 0, i = 0; double* values = NULL; diff --git a/src/grib_accessor_class_expanded_descriptors.cc b/src/grib_accessor_class_expanded_descriptors.cc index b4cb0ece7..d57454996 100644 --- a/src/grib_accessor_class_expanded_descriptors.cc +++ b/src/grib_accessor_class_expanded_descriptors.cc @@ -161,11 +161,11 @@ typedef struct change_coding_params static void init(grib_accessor* a, const long len, grib_arguments* args) { grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; - int n = 0; - grib_handle* hand = grib_handle_of_accessor(a); - self->tablesAccessorName = grib_arguments_get_name(hand, args, n++); - self->expandedName = grib_arguments_get_name(hand, args, n++); - self->rank = grib_arguments_get_long(hand, args, n++); + int n = 0; + grib_handle* hand = grib_handle_of_accessor(a); + self->tablesAccessorName = grib_arguments_get_name(hand, args, n++); + self->expandedName = grib_arguments_get_name(hand, args, n++); + self->rank = grib_arguments_get_long(hand, args, n++); if (self->rank != 0) { self->expandedAccessor = grib_find_accessor(hand, self->expandedName); } @@ -231,7 +231,7 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_ if (BUFR_DESCRIPTORS_ARRAY_USED_SIZE(unexpanded) == 0) return; - us = grib_bufr_descriptor_clone(grib_bufr_descriptors_array_get(unexpanded, 0)); + us = grib_bufr_descriptor_clone(grib_bufr_descriptors_array_get(unexpanded, 0)); us->context = c; *err = 0; @@ -262,7 +262,7 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_ inner_unexpanded = grib_bufr_descriptors_array_new(c, DESC_SIZE_INIT, DESC_SIZE_INCR); for (i = 0; i < size; i++) { - vv = grib_bufr_descriptor_new(self->tablesAccessor, v_array[i], !SILENT, err); + vv = grib_bufr_descriptor_new(self->tablesAccessor, v_array[i], !SILENT, err); inner_unexpanded = grib_bufr_descriptors_array_push(inner_unexpanded, vv); } grib_context_free(c, v_array); @@ -707,27 +707,27 @@ static int expand(grib_accessor* a) int grib_accessor_class_expanded_descriptors_set_do_expand(grib_accessor* a, long do_expand) { grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; - self->do_expand = do_expand; + self->do_expand = do_expand; return 0; } bufr_descriptors_array* grib_accessor_class_expanded_descriptors_get_expanded(grib_accessor* a, int* err) { - grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; - *err = expand(a); + const grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; + *err = expand(a); return self->expanded; } static int unpack_double(grib_accessor* a, double* val, size_t* len) { grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; - int ret = 0; - int i; + int ret = 0; + size_t i = 0; size_t expandedSize; if (self->rank != 2) { long* lval = (long*)grib_context_malloc_clear(a->context, *len * sizeof(long)); - ret = unpack_long(a, lval, len); + ret = unpack_long(a, lval, len); if (ret) return ret; for (i = 0; i < *len; i++) @@ -756,9 +756,9 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) static int unpack_long(grib_accessor* a, long* val, size_t* len) { grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; - int ret = 0; - size_t rlen = 0; - size_t i; + int ret = 0; + size_t rlen = 0; + size_t i = 0; ret = expand(a); if (ret) @@ -830,15 +830,15 @@ static int unpack_string_array(grib_accessor* a, char** buffer, size_t* len) static int pack_long(grib_accessor* a, const long* val, size_t* len) { grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; - self->do_expand = 1; + self->do_expand = 1; return GRIB_NOT_IMPLEMENTED; } static int value_count(grib_accessor* a, long* rlen) { grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; - int err = 0; - *rlen = 0; + int err = 0; + *rlen = 0; err = expand(a); if (err) { From 416242b8630ed174100e10d4c100ec0c1a86b6bc Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 15 Mar 2024 13:21:10 +0000 Subject: [PATCH 214/244] Const correctness and cppcheck warnings --- src/grib_util.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grib_util.cc b/src/grib_util.cc index 4be428c13..efccbdd9a 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -281,7 +281,7 @@ grib_handle* grib_util_sections_copy(grib_handle* hfrom, grib_handle* hto, int w static grib_trie* init_list(const char* name); static grib_trie* param_id_list = NULL; static grib_trie* mars_param_list = NULL; -// TODO thread safe + grib_string_list* grib_util_get_param_id(const char* mars_param) { if (!mars_param_list && (mars_param_list = init_list("mars_param.table")) == NULL) @@ -1092,7 +1092,7 @@ grib_handle* grib_util_set_spec(grib_handle* h, if (spec->missingValue) COPY_SPEC_DOUBLE(missingValue); SET_LONG_VALUE("ijDirectionIncrementGiven", 1); - // TODO: add Assert + // TODO(masn): add Assert COPY_SPEC_LONG(Ni); COPY_SPEC_DOUBLE(iDirectionIncrementInDegrees); COPY_SPEC_LONG(Nj); From a97e76c847c4441413f70af6cfdb35004ea9bb89 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 15 Mar 2024 17:22:12 +0000 Subject: [PATCH 215/244] Compiler warnings: NVHPC 24.1.0 --- src/action_class_list.cc | 4 ++-- src/grib_accessor_class_concept.cc | 1 - src/grib_accessor_class_data_g1simple_packing.cc | 4 ++-- src/grib_accessor_class_data_jpeg2000_packing.cc | 1 - src/grib_accessor_class_data_raw_packing.cc | 3 --- src/grib_accessor_class_expanded_descriptors.cc | 1 - src/grib_accessor_class_g2_mars_labeling.cc | 7 ------- src/grib_accessor_class_g2end_step.cc | 12 ++++-------- src/grib_accessor_class_long.cc | 5 +---- src/grib_expression_class_is_integer.cc | 4 +--- src/grib_io.cc | 6 +++--- src/grib_loader_from_handle.cc | 3 --- src/grib_parse_utils.cc | 5 ----- tools/bufr_compare.cc | 2 -- tools/gts_compare.cc | 2 -- tools/metar_compare.cc | 2 -- 16 files changed, 13 insertions(+), 49 deletions(-) diff --git a/src/action_class_list.cc b/src/action_class_list.cc index c9693a554..163a6da55 100644 --- a/src/action_class_list.cc +++ b/src/action_class_list.cc @@ -160,10 +160,10 @@ static grib_action* reparse(grib_action* a, grib_accessor* acc, int* doit) { grib_action_list* self = (grib_action_list*)a; - int ret = 0; long val = 0; - if ((ret = grib_expression_evaluate_long(grib_handle_of_accessor(acc), self->expression, &val)) != GRIB_SUCCESS) { + int ret = grib_expression_evaluate_long(grib_handle_of_accessor(acc), self->expression, &val); + if (ret != GRIB_SUCCESS) { grib_context_log(acc->context, GRIB_LOG_ERROR, "List %s creating %ld values: Unable to evaluate long", acc->name, val); } diff --git a/src/grib_accessor_class_concept.cc b/src/grib_accessor_class_concept.cc index c409a6f92..6fa4122f8 100644 --- a/src/grib_accessor_class_concept.cc +++ b/src/grib_accessor_class_concept.cc @@ -290,7 +290,6 @@ static int concept_conditions_expression_apply(grib_handle* h, grib_concept_cond break; default: return GRIB_NOT_IMPLEMENTED; - break; } (*n)++; return err; diff --git a/src/grib_accessor_class_data_g1simple_packing.cc b/src/grib_accessor_class_data_g1simple_packing.cc index 82c72c64c..cc810e4ae 100644 --- a/src/grib_accessor_class_data_g1simple_packing.cc +++ b/src/grib_accessor_class_data_g1simple_packing.cc @@ -245,7 +245,7 @@ static int pack_double(grib_accessor* a, const double* cval, size_t* len) ret = grib_buffer_replace(a, NULL, 0, 1, 1); if (ret != GRIB_SUCCESS) return ret; return GRIB_SUCCESS; - break; + case GRIB_NO_VALUES: ret = grib_get_long(grib_handle_of_accessor(a), "constantFieldHalfByte", &constantFieldHalfByte); if (ret) @@ -262,7 +262,7 @@ static int pack_double(grib_accessor* a, const double* cval, size_t* len) ret = grib_buffer_replace(a, NULL, 0, 1, 1); if (ret != GRIB_SUCCESS) return ret; return GRIB_SUCCESS; - break; + case GRIB_INVALID_BPV: grib_context_log(a->context, GRIB_LOG_ERROR, "Unable to compute packing parameters. Invalid bits per value"); return ret; diff --git a/src/grib_accessor_class_data_jpeg2000_packing.cc b/src/grib_accessor_class_data_jpeg2000_packing.cc index b00160214..a1a43b6f7 100644 --- a/src/grib_accessor_class_data_jpeg2000_packing.cc +++ b/src/grib_accessor_class_data_jpeg2000_packing.cc @@ -389,7 +389,6 @@ static int pack_double(grib_accessor* a, const double* cval, size_t* len) grib_buffer_replace(a, NULL, 0, 1, 1); err = grib_set_long_internal(grib_handle_of_accessor(a), self->number_of_values, *len); return err; - break; case GRIB_SUCCESS: break; default: diff --git a/src/grib_accessor_class_data_raw_packing.cc b/src/grib_accessor_class_data_raw_packing.cc index 336c73684..27c3d62e3 100644 --- a/src/grib_accessor_class_data_raw_packing.cc +++ b/src/grib_accessor_class_data_raw_packing.cc @@ -164,7 +164,6 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) break; default: return GRIB_NOT_IMPLEMENTED; - break; } nvals = inlen / bytes; @@ -218,7 +217,6 @@ static int pack_double(grib_accessor* a, const double* val, size_t* len) default: code = GRIB_NOT_IMPLEMENTED; goto clean_up; - break; } bufsize = bytes * inlen; @@ -282,7 +280,6 @@ static int unpack_double_element(grib_accessor* a, size_t idx, double* val) default: return GRIB_NOT_IMPLEMENTED; - break; } pos = bytes * idx; diff --git a/src/grib_accessor_class_expanded_descriptors.cc b/src/grib_accessor_class_expanded_descriptors.cc index d57454996..11f4ba73b 100644 --- a/src/grib_accessor_class_expanded_descriptors.cc +++ b/src/grib_accessor_class_expanded_descriptors.cc @@ -786,7 +786,6 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) break; case 2: return GRIB_INVALID_TYPE; - break; case 3: for (i = 0; i < *len; i++) val[i] = self->expanded->v[i]->width; diff --git a/src/grib_accessor_class_g2_mars_labeling.cc b/src/grib_accessor_class_g2_mars_labeling.cc index f6437c279..ad0647e30 100644 --- a/src/grib_accessor_class_g2_mars_labeling.cc +++ b/src/grib_accessor_class_g2_mars_labeling.cc @@ -165,7 +165,6 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) grib_context_log(a->context, GRIB_LOG_ERROR, "invalid first argument of g2_mars_labeling in %s", a->name); return GRIB_INTERNAL_ERROR; - break; } return grib_get_long(grib_handle_of_accessor(a), key, val); @@ -190,7 +189,6 @@ static int unpack_string(grib_accessor* a, char* val, size_t* len) grib_context_log(a->context, GRIB_LOG_ERROR, "invalid first argument of g2_mars_labeling in %s", a->name); return GRIB_INTERNAL_ERROR; - break; } return grib_get_string(grib_handle_of_accessor(a), key, val, len); @@ -226,7 +224,6 @@ static int extra_set(grib_accessor* a, long val) case 0: /* class */ return ret; - break; case 1: /* type */ switch (val) { @@ -400,7 +397,6 @@ static int extra_set(grib_accessor* a, long val) grib_context_log(a->context, GRIB_LOG_ERROR, "invalid first argument of g2_mars_labeling in %s", a->name); return GRIB_INTERNAL_ERROR; - break; } if (productDefinitionTemplateNumberNew >= 0) { @@ -442,7 +438,6 @@ static int pack_string(grib_accessor* a, const char* val, size_t* len) grib_context_log(a->context, GRIB_LOG_ERROR, "invalid first argument of g2_mars_labeling in %s", a->name); return GRIB_INTERNAL_ERROR; - break; } ret = grib_set_string(grib_handle_of_accessor(a), key, val, len); @@ -476,7 +471,6 @@ static int pack_long(grib_accessor* a, const long* val, size_t* len) grib_context_log(a->context, GRIB_LOG_ERROR, "invalid first argument of g2_mars_labeling in %s", a->name); return GRIB_INTERNAL_ERROR; - break; } ret = grib_set_long(grib_handle_of_accessor(a), key, *val); @@ -513,7 +507,6 @@ static int get_native_type(grib_accessor* a) grib_context_log(a->context, GRIB_LOG_ERROR, "invalid first argument of g2_mars_labeling in %s", a->name); return GRIB_INTERNAL_ERROR; - break; } ret = grib_get_native_type(grib_handle_of_accessor(a), key, &type); diff --git a/src/grib_accessor_class_g2end_step.cc b/src/grib_accessor_class_g2end_step.cc index ed47e5133..a86733eb3 100644 --- a/src/grib_accessor_class_g2end_step.cc +++ b/src/grib_accessor_class_g2end_step.cc @@ -460,19 +460,17 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) try { if (numberOfTimeRange == 1) { ret = unpack_one_time_range_long_(a, val, len); - return ret; } else { ret = unpack_multiple_time_ranges_long_(a, val, len); - return ret; } } catch (std::exception& e) { grib_context_log(h->context, GRIB_LOG_ERROR, "grib_accessor_g2end_step::unpack_long: %s", e.what()); - return GRIB_DECODING_ERROR; + ret = GRIB_DECODING_ERROR; } - return GRIB_SUCCESS; + return ret; } static int unpack_double(grib_accessor* a, double* val, size_t* len) @@ -500,19 +498,17 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) try { if (numberOfTimeRange == 1) { ret = unpack_one_time_range_double_(a, val, len); - return ret; } else { ret = unpack_multiple_time_ranges_double_(a, val, len); - return ret; } } catch (std::exception& e) { grib_context_log(h->context, GRIB_LOG_ERROR, "grib_accessor_g2end_step::unpack_double: %s", e.what()); - return GRIB_DECODING_ERROR; + ret = GRIB_DECODING_ERROR; } - return GRIB_SUCCESS; + return ret; } static int pack_long_(grib_accessor* a, const long end_step_value, const long end_step_unit) diff --git a/src/grib_accessor_class_long.cc b/src/grib_accessor_class_long.cc index aeccdac78..5eb10fec5 100644 --- a/src/grib_accessor_class_long.cc +++ b/src/grib_accessor_class_long.cc @@ -116,18 +116,15 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int unpack_string(grib_accessor* a, char* v, size_t* len) { - int err = 0; long val = 0; size_t l = 1; char repres[1024]; char format[32] = "%ld"; grib_handle* h = grib_handle_of_accessor(a); - err = grib_unpack_long(a, &val, &l); + grib_unpack_long(a, &val, &l); /* TODO: We should catch all errors but in this case the test ERA_Gen.sh will fail * as the output from grib_ls will be different */ - /* if (err) return err; */ - (void)err; if ((val == GRIB_MISSING_LONG) && ((a->flags & GRIB_ACCESSOR_FLAG_CAN_BE_MISSING) != 0)) { snprintf(repres, sizeof(repres), "MISSING"); diff --git a/src/grib_expression_class_is_integer.cc b/src/grib_expression_class_is_integer.cc index e79f6c32c..da81cc4cb 100644 --- a/src/grib_expression_class_is_integer.cc +++ b/src/grib_expression_class_is_integer.cc @@ -92,7 +92,6 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* result) char mybuf[1024] = {0,}; size_t size = 1024; char* p = 0; - long val = 0; char* start = 0; if ((err = grib_get_string_internal(h, e->name, mybuf, &size)) != GRIB_SUCCESS) @@ -103,14 +102,13 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* result) if (e->length > 0) start[e->length] = 0; - val = strtol(start, &p, 10); + strtol(start, &p, 10); if (*p != 0) *result = 0; else *result = 1; - (void)val; return err; } diff --git a/src/grib_io.cc b/src/grib_io.cc index b20dbce7b..e6d2d03d2 100644 --- a/src/grib_io.cc +++ b/src/grib_io.cc @@ -1232,12 +1232,12 @@ int wmo_read_bufr_from_file_fast(FILE* f, size_t* msg_len, off_t* msg_offset) int wmo_read_gts_from_file_fast(FILE* f, size_t* msg_len, off_t* msg_offset) { //TODO(masn): Needs proper implementation; no malloc - unsigned char buffer[1024] = {0,}; + //unsigned char buffer[1024] = {0,}; void* mesg = NULL; int err = GRIB_SUCCESS; grib_context* c = grib_context_get_default(); - *msg_len = sizeof(buffer); + *msg_len = 1024; // sizeof(buffer) mesg = wmo_read_gts_from_file_malloc(f, 0, msg_len, msg_offset, &err); grib_context_free(c, mesg); return err; @@ -1339,7 +1339,7 @@ static size_t stream_read(void* data, void* buffer, size_t len, int* err) if (len > LONG_MAX) { /* size_t cannot be coded into long */ *err = GRIB_INTERNAL_ERROR; - return -1; + return 0; } n = s->stream_proc(s->stream_data, buffer, len); diff --git a/src/grib_loader_from_handle.cc b/src/grib_loader_from_handle.cc index cd5ae8513..a423c31cc 100644 --- a/src/grib_loader_from_handle.cc +++ b/src/grib_loader_from_handle.cc @@ -24,16 +24,13 @@ static int copy_values(grib_handle* h, grib_accessor* ga) switch (h->values[j][i].type) { case GRIB_TYPE_LONG: return grib_pack_long(ga, &h->values[j][i].long_value, &len); - break; case GRIB_TYPE_DOUBLE: return grib_pack_double(ga, &h->values[j][i].double_value, &len); - break; case GRIB_TYPE_STRING: len = strlen(h->values[j][i].string_value); return grib_pack_string(ga, h->values[j][i].string_value, &len); - break; } } } diff --git a/src/grib_parse_utils.cc b/src/grib_parse_utils.cc index 2fb771cb7..1d014995c 100644 --- a/src/grib_parse_utils.cc +++ b/src/grib_parse_utils.cc @@ -872,19 +872,14 @@ int grib_type_to_int(char id) switch (id) { case 'd': return GRIB_TYPE_DOUBLE; - break; case 'f': return GRIB_TYPE_DOUBLE; - break; case 'l': return GRIB_TYPE_LONG; - break; case 'i': return GRIB_TYPE_LONG; - break; case 's': return GRIB_TYPE_STRING; - break; } return GRIB_TYPE_UNDEFINED; } diff --git a/tools/bufr_compare.cc b/tools/bufr_compare.cc index 3fa715669..11f0e9dc7 100644 --- a/tools/bufr_compare.cc +++ b/tools/bufr_compare.cc @@ -84,7 +84,6 @@ static int compare_attribute(grib_handle* handle1, grib_handle* handle2, grib_ru static int error = 0; static int count = 0; -static int lastPrint = 0; static int force = 0; /* ECC-651: Boolean 'two_way' set to 1 when '-2' option used */ @@ -379,7 +378,6 @@ int grib_tool_new_file_action(grib_runtime_options* options, grib_tools_file* fi static void printInfo(grib_handle* h) { printf("== %d == DIFFERENCE == ", count); - lastPrint = count; } static void print_index_key_values(grib_index* index, int icounter, const char* error_message) diff --git a/tools/gts_compare.cc b/tools/gts_compare.cc index 9133b3435..2f570c61c 100644 --- a/tools/gts_compare.cc +++ b/tools/gts_compare.cc @@ -74,7 +74,6 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option int error = 0; int count = 0; -int lastPrint = 0; int force = 0; double maxAbsoluteError = 1e-19; int onlyListed = 1; @@ -245,7 +244,6 @@ int grib_tool_new_file_action(grib_runtime_options* options, grib_tools_file* fi static void printInfo(grib_handle* h) { printf("== %d == DIFFERENCE == ", count); - lastPrint = count; } static grib_handle* gts_handle_new_from_file_x( diff --git a/tools/metar_compare.cc b/tools/metar_compare.cc index e4318bd44..258a09024 100644 --- a/tools/metar_compare.cc +++ b/tools/metar_compare.cc @@ -74,7 +74,6 @@ static int compareAbsolute = 1; static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_options* options); static int error = 0; static int count = 0; -static int lastPrint = 0; static int force = 0; static double maxAbsoluteError = 1e-19; static int onlyListed = 1; @@ -306,7 +305,6 @@ int grib_tool_new_file_action(grib_runtime_options* options, grib_tools_file* fi static void printInfo(grib_handle* h) { printf("== %d == DIFFERENCE == ", count); - lastPrint = count; } static grib_handle* metar_handle_new_from_file_x(grib_context* c, FILE* f, int mode, int headers_only, int* err) From 168fccf13e8fcf29482f0b49d08ab5fb045d4852 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 15 Mar 2024 17:38:43 +0000 Subject: [PATCH 216/244] Compiler warnings: NVHPC 24.1.0 --- ...b_accessor_class_number_of_points_gaussian.cc | 16 ++++++---------- ...or_class_number_of_values_data_raw_packing.cc | 1 - src/grib_io.cc | 1 - src/grib_util.cc | 2 -- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/grib_accessor_class_number_of_points_gaussian.cc b/src/grib_accessor_class_number_of_points_gaussian.cc index 5d952b937..2114a9c87 100644 --- a/src/grib_accessor_class_number_of_points_gaussian.cc +++ b/src/grib_accessor_class_number_of_points_gaussian.cc @@ -276,7 +276,7 @@ static int unpack_long_new(grib_accessor* a, long* val, size_t* len) if (plpresent) { long max_pl = 0; int j = 0; - double lon_first_row = 0, lon_last_row = 0; + // double lon_first_row = 0, lon_last_row = 0; /*reduced*/ if ((err = grib_get_long_internal(h, self->order, &order)) != GRIB_SUCCESS) @@ -324,11 +324,9 @@ static int unpack_long_new(grib_accessor* a, long* val, size_t* len) return GRIB_GEOCALCULUS_PROBLEM; } grib_get_reduced_row_wrapper(h, pl[j], lon_first, lon_last, &row_count, &ilon_first, &ilon_last); - lon_first_row = ((ilon_first)*360.0) / pl[j]; - lon_last_row = ((ilon_last)*360.0) / pl[j]; + //lon_first_row = ((ilon_first)*360.0) / pl[j]; + //lon_last_row = ((ilon_last)*360.0) / pl[j]; *val += row_count; - (void)lon_last_row; - (void)lon_first_row; } } else { @@ -388,7 +386,7 @@ static int unpack_long_with_legacy_support(grib_accessor* a, long* val, size_t* if (plpresent) { long max_pl = 0; int j = 0; - double lon_first_row = 0, lon_last_row = 0; + // double lon_first_row = 0, lon_last_row = 0; /*reduced*/ if ((err = grib_get_long_internal(h, self->order, &order)) != GRIB_SUCCESS) @@ -452,11 +450,9 @@ static int unpack_long_with_legacy_support(grib_accessor* a, long* val, size_t* // if ( row_count != pl[j] ) { // printf("oops...... rc=%ld but pl[%d]=%ld\n", row_count, j,pl[j]); // } - lon_first_row = ((ilon_first)*360.0) / pl[j]; - lon_last_row = ((ilon_last)*360.0) / pl[j]; + // lon_first_row = ((ilon_first)*360.0) / pl[j]; + // lon_last_row = ((ilon_last)*360.0) / pl[j]; *val += row_count; - (void)lon_last_row; - (void)lon_first_row; #if EFDEBUG printf(" ilon_first=%ld lon_first=%.10e ilon_last=%ld lon_last=%.10e count=%ld row_count=%ld\n", ilon_first, lon_first_row, ilon_last, lon_last_row, *val, row_count); diff --git a/src/grib_accessor_class_number_of_values_data_raw_packing.cc b/src/grib_accessor_class_number_of_values_data_raw_packing.cc index 5bde2a163..5652797ac 100644 --- a/src/grib_accessor_class_number_of_values_data_raw_packing.cc +++ b/src/grib_accessor_class_number_of_values_data_raw_packing.cc @@ -152,7 +152,6 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) default: return GRIB_NOT_IMPLEMENTED; - break; } *val = byte_count / bytes; diff --git a/src/grib_io.cc b/src/grib_io.cc index e6d2d03d2..64477d39e 100644 --- a/src/grib_io.cc +++ b/src/grib_io.cc @@ -421,7 +421,6 @@ static int read_GRIB(reader* r, int no_alloc) r->seek_from_start(r->read_data, r->offset + 4); grib_buffer_delete(c, buf); return GRIB_UNSUPPORTED_EDITION; - break; } /* Assert(i <= buf->length); */ diff --git a/src/grib_util.cc b/src/grib_util.cc index efccbdd9a..9ff8e7270 100644 --- a/src/grib_util.cc +++ b/src/grib_util.cc @@ -1301,7 +1301,6 @@ grib_handle* grib_util_set_spec(grib_handle* h, fprintf(stderr, "%s: invalid packing_spec.packing_type (%ld)\n", __func__, packing_spec->packing_type); *err = GRIB_INTERNAL_ERROR; goto cleanup; - break; } } if (strcmp(input_packing_type, "grid_simple_matrix") == 0) { @@ -1363,7 +1362,6 @@ grib_handle* grib_util_set_spec(grib_handle* h, grib_handle_delete(h_sample); *err = GRIB_INTERNAL_ERROR; goto cleanup; - break; } if (packing_spec->extra_settings_count) { From e624ecff0b5991412b8fbdc4cc0b022062585f78 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 17 Mar 2024 14:31:55 +0000 Subject: [PATCH 217/244] Compiler warnings: NVHPC 24.1.0 --- tools/bufr_compare.cc | 3 +-- tools/grib_compare.cc | 6 ++++-- tools/gts_compare.cc | 23 +---------------------- tools/metar_compare.cc | 3 +-- 4 files changed, 7 insertions(+), 28 deletions(-) diff --git a/tools/bufr_compare.cc b/tools/bufr_compare.cc index 11f0e9dc7..e0447e20b 100644 --- a/tools/bufr_compare.cc +++ b/tools/bufr_compare.cc @@ -1257,10 +1257,9 @@ static int compare_handles(grib_handle* handle1, grib_handle* handle2, grib_runt else { const void *msg1 = NULL, *msg2 = NULL; size_t size1 = 0, size2 = 0; - int memcmp_ret = 0; GRIB_CHECK_NOLINE(grib_get_message(handle1, &msg1, &size1), 0); GRIB_CHECK_NOLINE(grib_get_message(handle2, &msg2, &size2), 0); - if (size1 == size2 && !(memcmp_ret = memcmp(msg1, msg2, size1))) { + if (size1 == size2 && 0 == memcmp(msg1, msg2, size1)) { return 0; } #if defined(BUFR_COMPARE_BYTES) diff --git a/tools/grib_compare.cc b/tools/grib_compare.cc index f9f4d0977..558ff0386 100644 --- a/tools/grib_compare.cc +++ b/tools/grib_compare.cc @@ -1201,8 +1201,9 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option grib_handle *h11, *h22; GRIB_CHECK_NOLINE(grib_get_message_headers(h1, &msg1, &size1), 0); GRIB_CHECK_NOLINE(grib_get_message_headers(h2, &msg2, &size2), 0); - if (size1 == size2 && !memcmp(msg1, msg2, size1)) + if ( size1 == size2 && (0 == memcmp(msg1, msg2, size1)) ) { return 0; + } err = 0; h11 = grib_handle_new_from_partial_message(h1->context, msg1, size1); @@ -1268,8 +1269,9 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option size_t size1 = 0, size2 = 0; GRIB_CHECK_NOLINE(grib_get_message(h1, &msg1, &size1), 0); GRIB_CHECK_NOLINE(grib_get_message(h2, &msg2, &size2), 0); - if (size1 == size2 && !memcmp(msg1, msg2, size1)) + if ( size1 == size2 && (0 == memcmp(msg1, msg2, size1)) ) { return 0; + } iter = grib_keys_iterator_new(h1, GRIB_KEYS_ITERATOR_SKIP_COMPUTED, NULL); if (!iter) { diff --git a/tools/gts_compare.cc b/tools/gts_compare.cc index 2f570c61c..fbfee8b00 100644 --- a/tools/gts_compare.cc +++ b/tools/gts_compare.cc @@ -658,34 +658,13 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option else { const void *msg1 = NULL, *msg2 = NULL; size_t size1 = 0, size2 = 0; - int memcmp_ret = 0; /* int ii=0; */ GRIB_CHECK_NOLINE(grib_get_message(h1, &msg1, &size1), 0); GRIB_CHECK_NOLINE(grib_get_message(h2, &msg2, &size2), 0); - if (size1 == size2 && !(memcmp_ret = memcmp(msg1, msg2, size1))) { + if ( size1 == size2 && (0 == memcmp(msg1, msg2, size1)) ) { return 0; } -// else { -// int lcount=count,ii; -// if (options->current_infile) lcount=options->current_infile->filter_handle_count; -// if (size1 != size2) { -// printf("#%d different size: %d!=%d\n",lcount,(int)size1,(int)size2); -// } -// if (memcmp_ret) { -// unsigned char *m1=(unsigned char*)msg1; -// unsigned char *m2=(unsigned char*)msg2; -// printf("=== list of different bytes for message %d\n",lcount); -// for (ii=0;iicompare_count; i++) { if (blocklisted(name)) diff --git a/tools/metar_compare.cc b/tools/metar_compare.cc index 258a09024..53fa0a5be 100644 --- a/tools/metar_compare.cc +++ b/tools/metar_compare.cc @@ -821,10 +821,9 @@ static int compare_handles(grib_handle* h1, grib_handle* h2, grib_runtime_option else { const void *msg1 = NULL, *msg2 = NULL; size_t size1 = 0, size2 = 0; - int memcmp_ret = 0; GRIB_CHECK_NOLINE(grib_get_message(h1, &msg1, &size1), 0); GRIB_CHECK_NOLINE(grib_get_message(h2, &msg2, &size2), 0); - if (size1 == size2 && !(memcmp_ret = memcmp(msg1, msg2, size1))) { + if ( size1 == size2 && (0 == memcmp(msg1, msg2, size1)) ) { return 0; } From 2446292dd065713a1509bff66f7a753134271311 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 21 Mar 2024 11:05:32 +0000 Subject: [PATCH 218/244] Testing: Add new datasets --- tests/grib_check_param_concepts.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/grib_check_param_concepts.sh b/tests/grib_check_param_concepts.sh index 24b2a3e5f..4810497c1 100755 --- a/tests/grib_check_param_concepts.sh +++ b/tests/grib_check_param_concepts.sh @@ -29,6 +29,7 @@ $EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/gri $EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/localConcepts/ecmf/paramId.def $EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/localConcepts/uerra/paramId.def $EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/localConcepts/hydro/paramId.def +$EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/localConcepts/cerise/paramId.def $EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/localConcepts/tigge/paramId.def $EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/localConcepts/s2s/paramId.def $EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/localConcepts/era6/paramId.def @@ -39,6 +40,7 @@ $EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/g $EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/grib2/localConcepts/ecmf/shortName.def $EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/grib2/localConcepts/uerra/shortName.def $EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/grib2/localConcepts/hydro/shortName.def +$EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/grib2/localConcepts/cerise/shortName.def $EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/grib2/localConcepts/tigge/shortName.def $EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/grib2/localConcepts/s2s/shortName.def $EXEC ${test_dir}/grib_check_param_concepts shortName $ECCODES_DEFINITION_PATH/grib2/localConcepts/era6/shortName.def @@ -75,8 +77,11 @@ defs_dirs=" $ECCODES_DEFINITION_PATH/grib2/localConcepts/uerra $ECCODES_DEFINITION_PATH/grib2/localConcepts/hydro + $ECCODES_DEFINITION_PATH/grib2/localConcepts/cerise $ECCODES_DEFINITION_PATH/grib2/localConcepts/tigge $ECCODES_DEFINITION_PATH/grib2/localConcepts/s2s + $ECCODES_DEFINITION_PATH/grib2/localConcepts/era6 + $ECCODES_DEFINITION_PATH/grib2/localConcepts/destine $ECCODES_DEFINITION_PATH/grib2/localConcepts/egrr $ECCODES_DEFINITION_PATH/grib2/localConcepts/ekmi From 5704dbacf24622f05c4fb28ba0151e78bf3de000 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Thu, 21 Mar 2024 11:05:58 +0000 Subject: [PATCH 219/244] ECC-1786: GRIB2: add local ECMWF parameters to pseudo-centre CERISE --- .../grib2/localConcepts/cerise/cfName.def | 53 +++++++++ .../grib2/localConcepts/cerise/cfVarName.def | 111 ++++++++++++++++++ .../grib2/localConcepts/cerise/name.def | 111 ++++++++++++++++++ .../grib2/localConcepts/cerise/paramId.def | 111 ++++++++++++++++++ .../grib2/localConcepts/cerise/shortName.def | 111 ++++++++++++++++++ .../grib2/localConcepts/cerise/units.def | 111 ++++++++++++++++++ 6 files changed, 608 insertions(+) create mode 100644 definitions/grib2/localConcepts/cerise/cfName.def diff --git a/definitions/grib2/localConcepts/cerise/cfName.def b/definitions/grib2/localConcepts/cerise/cfName.def new file mode 100644 index 000000000..741709b44 --- /dev/null +++ b/definitions/grib2/localConcepts/cerise/cfName.def @@ -0,0 +1,53 @@ +# Automatically generated by ./create_def.pl, do not edit +#Snow depth +'lwe_thickness_of_surface_snow_amount' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + } +#Large-scale precipitation +'lwe_thickness_of_stratiform_precipitation_amount' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Convective precipitation +'lwe_thickness_of_convective_precipitation_amount' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snowfall +'lwe_thickness_of_snowfall_amount' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Total cloud cover +'cloud_area_fraction' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + } +#Evaporation +'lwe_thickness_of_water_evaporation_amount' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; +} diff --git a/definitions/grib2/localConcepts/cerise/cfVarName.def b/definitions/grib2/localConcepts/cerise/cfVarName.def index 7861181b1..6810066ae 100644 --- a/definitions/grib2/localConcepts/cerise/cfVarName.def +++ b/definitions/grib2/localConcepts/cerise/cfVarName.def @@ -1,4 +1,106 @@ # Automatically generated by ./create_def.pl, do not edit +#Surface runoff +'sro' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Sub-surface runoff +'ssro' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snow depth +'sd' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + } +#Large-scale precipitation +'lsp' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Convective precipitation +'cp' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snowfall +'sf' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Total cloud cover +'tcc' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + } +#Evaporation +'e' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Low cloud cover +'lcc' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + } +#Runoff +'ro' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfStatisticalProcessing = 1 ; + } +#Total precipitation +'tp' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 1 ; + } +#Forecast albedo +'fal' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + } #Mean surface runoff rate 'msror' = { localTablesVersion = 1 ; @@ -17,6 +119,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Potential evaporation +'pev' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 200 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Mean total snowfall rate 'mtsfr' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/name.def b/definitions/grib2/localConcepts/cerise/name.def index 7fb9dff6c..d028b2155 100644 --- a/definitions/grib2/localConcepts/cerise/name.def +++ b/definitions/grib2/localConcepts/cerise/name.def @@ -1,4 +1,106 @@ # Automatically generated by ./create_def.pl, do not edit +#Surface runoff +'Surface runoff' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Sub-surface runoff +'Sub-surface runoff' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snow depth +'Snow depth' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + } +#Large-scale precipitation +'Large-scale precipitation' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Convective precipitation +'Convective precipitation' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snowfall +'Snowfall' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Total cloud cover +'Total cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + } +#Evaporation +'Evaporation' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Low cloud cover +'Low cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + } +#Runoff +'Runoff' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfStatisticalProcessing = 1 ; + } +#Total precipitation +'Total precipitation' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 1 ; + } +#Forecast albedo +'Forecast albedo' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + } #Mean surface runoff rate 'Mean surface runoff rate' = { localTablesVersion = 1 ; @@ -17,6 +119,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Potential evaporation +'Potential evaporation' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 200 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Mean total snowfall rate 'Mean total snowfall rate' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/paramId.def b/definitions/grib2/localConcepts/cerise/paramId.def index f905e10e0..96ac8ad97 100644 --- a/definitions/grib2/localConcepts/cerise/paramId.def +++ b/definitions/grib2/localConcepts/cerise/paramId.def @@ -1,4 +1,106 @@ # Automatically generated by ./create_def.pl, do not edit +#Surface runoff +'8' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Sub-surface runoff +'9' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snow depth +'141' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + } +#Large-scale precipitation +'142' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Convective precipitation +'143' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snowfall +'144' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Total cloud cover +'164' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + } +#Evaporation +'182' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Low cloud cover +'186' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + } +#Runoff +'205' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfStatisticalProcessing = 1 ; + } +#Total precipitation +'228' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 1 ; + } +#Forecast albedo +'243' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + } #Mean surface runoff rate '172008' = { localTablesVersion = 1 ; @@ -17,6 +119,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Potential evaporation +'228251' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 200 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Mean total snowfall rate '172144' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/shortName.def b/definitions/grib2/localConcepts/cerise/shortName.def index 7861181b1..6810066ae 100644 --- a/definitions/grib2/localConcepts/cerise/shortName.def +++ b/definitions/grib2/localConcepts/cerise/shortName.def @@ -1,4 +1,106 @@ # Automatically generated by ./create_def.pl, do not edit +#Surface runoff +'sro' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Sub-surface runoff +'ssro' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snow depth +'sd' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + } +#Large-scale precipitation +'lsp' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Convective precipitation +'cp' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snowfall +'sf' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Total cloud cover +'tcc' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + } +#Evaporation +'e' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Low cloud cover +'lcc' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + } +#Runoff +'ro' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfStatisticalProcessing = 1 ; + } +#Total precipitation +'tp' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 1 ; + } +#Forecast albedo +'fal' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + } #Mean surface runoff rate 'msror' = { localTablesVersion = 1 ; @@ -17,6 +119,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Potential evaporation +'pev' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 200 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Mean total snowfall rate 'mtsfr' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/units.def b/definitions/grib2/localConcepts/cerise/units.def index 36ab79310..d02b75b94 100644 --- a/definitions/grib2/localConcepts/cerise/units.def +++ b/definitions/grib2/localConcepts/cerise/units.def @@ -1,4 +1,106 @@ # Automatically generated by ./create_def.pl, do not edit +#Surface runoff +'m' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Sub-surface runoff +'m' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snow depth +'m of water equivalent' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + } +#Large-scale precipitation +'m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Convective precipitation +'m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Snowfall +'m of water equivalent' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Total cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + } +#Evaporation +'m of water equivalent' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } +#Low cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + } +#Runoff +'m' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfStatisticalProcessing = 1 ; + } +#Total precipitation +'m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 1 ; + } +#Forecast albedo +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + } #Mean surface runoff rate 'm s**-1' = { localTablesVersion = 1 ; @@ -17,6 +119,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Potential evaporation +'m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 200 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 1 ; + } #Mean total snowfall rate 'm of water equivalent s**-1' = { localTablesVersion = 1 ; From 4030e49c85a496fe175db61fe71a0b744a8b7306 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sat, 23 Mar 2024 19:19:08 +0000 Subject: [PATCH 220/244] Compiler warnings: set_but_not_used, code_is_unreachable --- tools/gts_compare.cc | 6 ++---- tools/metar_compare.cc | 13 +------------ 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/tools/gts_compare.cc b/tools/gts_compare.cc index fbfee8b00..d506dfc66 100644 --- a/tools/gts_compare.cc +++ b/tools/gts_compare.cc @@ -183,7 +183,7 @@ int grib_tool_init(grib_runtime_options* options) onlyListed = 1; if (grib_options_on("a") && !grib_options_on("c:")) { - printf("Error: -a option requires -c option. Please define a list of keys with the -c option.\n"); + fprintf(stderr, "Error: -a option requires -c option. Please define a list of keys with the -c option.\n"); exit(1); } @@ -571,7 +571,6 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, case GRIB_TYPE_BYTES: // We do not want to compare the message itself return 0; - break; case GRIB_TYPE_LABEL: break; @@ -580,9 +579,8 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, if (verbose) printf("\n"); printInfo(h1); save_error(c, name); - printf("Cannot compare [%s], unsupported type %d\n", name, type1); + fprintf(stderr, "Cannot compare [%s], unsupported type %d\n", name, type1); return GRIB_UNABLE_TO_COMPARE_ACCESSORS; - break; } return GRIB_SUCCESS; diff --git a/tools/metar_compare.cc b/tools/metar_compare.cc index 53fa0a5be..9ede65a4b 100644 --- a/tools/metar_compare.cc +++ b/tools/metar_compare.cc @@ -16,8 +16,6 @@ grib_option grib_options[] = { { "d", 0, "Write different messages on files\n", 0, 1, 0 }, { "T:", 0, 0, 1, 0, "M" }, /* METAR */ { "c:", 0, 0, 0, 1, 0 }, - { "S:", "start", "First field to be processed.\n", 0, 1, 0 }, - { "E:", "end", "Last field to be processed.\n", 0, 1, 0 }, { "a", 0, "-c option modifier. The keys listed with the option -c will be added to the list of keys compared without -c.\n", 0, 1, 0 }, { "R:", 0, 0, 0, 1, 0 }, { "A:", 0, 0, 0, 1, 0 }, @@ -84,8 +82,6 @@ static int verbose = 0; static double tolerance_factor = 1; static int write_error = 0; static grib_handle* global_handle = NULL; -static int start = -1; -static int end = -1; static int write_count = 0; GRIB_INLINE static double compare_double_absolute(const double* a, const double* b, const double* err) @@ -191,11 +187,6 @@ int grib_tool_init(grib_runtime_options* options) grib_context* context = grib_context_get_default(); options->strict = 1; - if (grib_options_on("S:")) - start = atoi(grib_options_get_option("S:")); - - if (grib_options_on("E:")) - end = atoi(grib_options_get_option("E:")); if (grib_options_on("f")) force = 1; @@ -734,7 +725,6 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, case GRIB_TYPE_BYTES: return 0; // No such type for METAR - break; case GRIB_TYPE_LABEL: break; @@ -744,9 +734,8 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, printf("\n"); printInfo(h1); save_error(c, name); - printf("Cannot compare [%s], unsupported type %d\n", name, type1); + fprintf(stderr, "Cannot compare [%s], unsupported type %d\n", name, type1); return GRIB_UNABLE_TO_COMPARE_ACCESSORS; - break; } return GRIB_SUCCESS; From 0075df3c3bc335491ee2e36f623d9e1f46c81e36 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Wed, 3 Apr 2024 12:41:01 +0000 Subject: [PATCH 221/244] ECC-1791: GRIB2: Modify and remove maximum individual wave parameters --- definitions/grib1/localConcepts/ecmf/cfVarName.def | 2 +- definitions/grib1/localConcepts/ecmf/name.def | 4 ++-- definitions/grib1/localConcepts/ecmf/paramId.def | 2 +- definitions/grib1/localConcepts/ecmf/shortName.def | 2 +- definitions/grib1/localConcepts/ecmf/units.def | 2 +- definitions/grib2/cfVarName.def | 10 ++-------- definitions/grib2/cfVarName.legacy.def | 6 ++++++ definitions/grib2/name.def | 12 +++--------- definitions/grib2/name.legacy.def | 6 ++++++ definitions/grib2/paramId.def | 10 ++-------- definitions/grib2/paramId.legacy.def | 6 ++++++ definitions/grib2/shortName.def | 10 ++-------- definitions/grib2/shortName.legacy.def | 6 ++++++ definitions/grib2/units.def | 10 ++-------- definitions/grib2/units.legacy.def | 6 ++++++ 15 files changed, 47 insertions(+), 47 deletions(-) diff --git a/definitions/grib1/localConcepts/ecmf/cfVarName.def b/definitions/grib1/localConcepts/ecmf/cfVarName.def index 6e19617e2..f652e0ac8 100644 --- a/definitions/grib1/localConcepts/ecmf/cfVarName.def +++ b/definitions/grib1/localConcepts/ecmf/cfVarName.def @@ -12659,7 +12659,7 @@ table2Version = 140 ; indicatorOfParameter = 217 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height 'hmax' = { table2Version = 140 ; indicatorOfParameter = 218 ; diff --git a/definitions/grib1/localConcepts/ecmf/name.def b/definitions/grib1/localConcepts/ecmf/name.def index bee6eddab..c6600060a 100644 --- a/definitions/grib1/localConcepts/ecmf/name.def +++ b/definitions/grib1/localConcepts/ecmf/name.def @@ -12659,8 +12659,8 @@ table2Version = 140 ; indicatorOfParameter = 217 ; } -#Maximum individual wave height -'Maximum individual wave height' = { +#Envelop-maximum individual wave height +'Envelop-maximum individual wave height' = { table2Version = 140 ; indicatorOfParameter = 218 ; } diff --git a/definitions/grib1/localConcepts/ecmf/paramId.def b/definitions/grib1/localConcepts/ecmf/paramId.def index bd07cf762..25b2986ec 100644 --- a/definitions/grib1/localConcepts/ecmf/paramId.def +++ b/definitions/grib1/localConcepts/ecmf/paramId.def @@ -12659,7 +12659,7 @@ table2Version = 140 ; indicatorOfParameter = 217 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height '140218' = { table2Version = 140 ; indicatorOfParameter = 218 ; diff --git a/definitions/grib1/localConcepts/ecmf/shortName.def b/definitions/grib1/localConcepts/ecmf/shortName.def index 54ef51c2b..70ccd9973 100644 --- a/definitions/grib1/localConcepts/ecmf/shortName.def +++ b/definitions/grib1/localConcepts/ecmf/shortName.def @@ -12659,7 +12659,7 @@ table2Version = 140 ; indicatorOfParameter = 217 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height 'hmax' = { table2Version = 140 ; indicatorOfParameter = 218 ; diff --git a/definitions/grib1/localConcepts/ecmf/units.def b/definitions/grib1/localConcepts/ecmf/units.def index c2c79b985..7fe4b06ee 100644 --- a/definitions/grib1/localConcepts/ecmf/units.def +++ b/definitions/grib1/localConcepts/ecmf/units.def @@ -12659,7 +12659,7 @@ table2Version = 140 ; indicatorOfParameter = 217 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height 'm' = { table2Version = 140 ; indicatorOfParameter = 218 ; diff --git a/definitions/grib2/cfVarName.def b/definitions/grib2/cfVarName.def index ce2d3e54f..5c02b0dad 100644 --- a/definitions/grib2/cfVarName.def +++ b/definitions/grib2/cfVarName.def @@ -1239,12 +1239,6 @@ parameterCategory = 0 ; parameterNumber = 52 ; } -#Envelope-maximum individual wave height -'envhmax' = { - discipline = 10 ; - parameterCategory = 0 ; - parameterNumber = 93 ; - } #Time domain maximum individual crest height 'tdcmax' = { discipline = 10 ; @@ -10023,11 +10017,11 @@ parameterCategory = 0 ; parameterNumber = 23 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height 'hmax' = { discipline = 10 ; parameterCategory = 0 ; - parameterNumber = 24 ; + parameterNumber = 93 ; } #Model bathymetry 'wmb' = { diff --git a/definitions/grib2/cfVarName.legacy.def b/definitions/grib2/cfVarName.legacy.def index 38c2868e6..40909c342 100644 --- a/definitions/grib2/cfVarName.legacy.def +++ b/definitions/grib2/cfVarName.legacy.def @@ -174,3 +174,9 @@ typeOfSecondFixedSurface = 168 ; typeOfStatisticalProcessing = 0 ; } +#Maximum individual wave height +'hmax' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 24 ; +} diff --git a/definitions/grib2/name.def b/definitions/grib2/name.def index 3ca2e8bd3..1f92dae00 100644 --- a/definitions/grib2/name.def +++ b/definitions/grib2/name.def @@ -1239,12 +1239,6 @@ parameterCategory = 0 ; parameterNumber = 52 ; } -#Envelope-maximum individual wave height -'Envelope-maximum individual wave height' = { - discipline = 10 ; - parameterCategory = 0 ; - parameterNumber = 93 ; - } #Time domain maximum individual crest height 'Time domain maximum individual crest height' = { discipline = 10 ; @@ -10023,11 +10017,11 @@ parameterCategory = 0 ; parameterNumber = 23 ; } -#Maximum individual wave height -'Maximum individual wave height' = { +#Envelop-maximum individual wave height +'Envelop-maximum individual wave height' = { discipline = 10 ; parameterCategory = 0 ; - parameterNumber = 24 ; + parameterNumber = 93 ; } #Model bathymetry 'Model bathymetry' = { diff --git a/definitions/grib2/name.legacy.def b/definitions/grib2/name.legacy.def index d55237eb9..c88070508 100644 --- a/definitions/grib2/name.legacy.def +++ b/definitions/grib2/name.legacy.def @@ -174,3 +174,9 @@ typeOfSecondFixedSurface = 168 ; typeOfStatisticalProcessing = 0 ; } +#Maximum individual wave height +'Maximum individual wave height' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 24 ; +} diff --git a/definitions/grib2/paramId.def b/definitions/grib2/paramId.def index f958d70d5..2c12b17ad 100644 --- a/definitions/grib2/paramId.def +++ b/definitions/grib2/paramId.def @@ -1239,12 +1239,6 @@ parameterCategory = 0 ; parameterNumber = 52 ; } -#Envelope-maximum individual wave height -'140130' = { - discipline = 10 ; - parameterCategory = 0 ; - parameterNumber = 93 ; - } #Time domain maximum individual crest height '140131' = { discipline = 10 ; @@ -10023,11 +10017,11 @@ parameterCategory = 0 ; parameterNumber = 23 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height '140218' = { discipline = 10 ; parameterCategory = 0 ; - parameterNumber = 24 ; + parameterNumber = 93 ; } #Model bathymetry '140219' = { diff --git a/definitions/grib2/paramId.legacy.def b/definitions/grib2/paramId.legacy.def index ad0ba7521..602e1e632 100644 --- a/definitions/grib2/paramId.legacy.def +++ b/definitions/grib2/paramId.legacy.def @@ -174,3 +174,9 @@ typeOfSecondFixedSurface = 168 ; typeOfStatisticalProcessing = 0 ; } +#Maximum individual wave height +'140218' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 24 ; +} diff --git a/definitions/grib2/shortName.def b/definitions/grib2/shortName.def index 657b668ea..f33047c40 100644 --- a/definitions/grib2/shortName.def +++ b/definitions/grib2/shortName.def @@ -1239,12 +1239,6 @@ parameterCategory = 0 ; parameterNumber = 52 ; } -#Envelope-maximum individual wave height -'envhmax' = { - discipline = 10 ; - parameterCategory = 0 ; - parameterNumber = 93 ; - } #Time domain maximum individual crest height 'tdcmax' = { discipline = 10 ; @@ -10023,11 +10017,11 @@ parameterCategory = 0 ; parameterNumber = 23 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height 'hmax' = { discipline = 10 ; parameterCategory = 0 ; - parameterNumber = 24 ; + parameterNumber = 93 ; } #Model bathymetry 'wmb' = { diff --git a/definitions/grib2/shortName.legacy.def b/definitions/grib2/shortName.legacy.def index 38c2868e6..40909c342 100644 --- a/definitions/grib2/shortName.legacy.def +++ b/definitions/grib2/shortName.legacy.def @@ -174,3 +174,9 @@ typeOfSecondFixedSurface = 168 ; typeOfStatisticalProcessing = 0 ; } +#Maximum individual wave height +'hmax' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 24 ; +} diff --git a/definitions/grib2/units.def b/definitions/grib2/units.def index c63afd045..0a396c1bb 100644 --- a/definitions/grib2/units.def +++ b/definitions/grib2/units.def @@ -1239,12 +1239,6 @@ parameterCategory = 0 ; parameterNumber = 52 ; } -#Envelope-maximum individual wave height -'m' = { - discipline = 10 ; - parameterCategory = 0 ; - parameterNumber = 93 ; - } #Time domain maximum individual crest height 'm' = { discipline = 10 ; @@ -10023,11 +10017,11 @@ parameterCategory = 0 ; parameterNumber = 23 ; } -#Maximum individual wave height +#Envelop-maximum individual wave height 'm' = { discipline = 10 ; parameterCategory = 0 ; - parameterNumber = 24 ; + parameterNumber = 93 ; } #Model bathymetry 'm' = { diff --git a/definitions/grib2/units.legacy.def b/definitions/grib2/units.legacy.def index f05dae694..e3e8e590e 100644 --- a/definitions/grib2/units.legacy.def +++ b/definitions/grib2/units.legacy.def @@ -174,3 +174,9 @@ typeOfSecondFixedSurface = 168 ; typeOfStatisticalProcessing = 0 ; } +#Maximum individual wave height +'m' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 24 ; +} From dbc307dd59df6c61e34ac2948be33c2ffb59fb7e Mon Sep 17 00:00:00 2001 From: shahramn Date: Wed, 3 Apr 2024 16:43:50 +0100 Subject: [PATCH 222/244] ECC-1792: GRIB: headers_only cloning does not work as expected after changing geography --- src/grib_accessor_class_latitudes.cc | 7 ++++ src/grib_accessor_class_longitudes.cc | 7 ++++ src/grib_iterator_class_gen.cc | 19 ++++++--- tests/CMakeLists.txt | 1 + tests/grib_ecc-1792.sh | 57 +++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 5 deletions(-) create mode 100755 tests/grib_ecc-1792.sh diff --git a/src/grib_accessor_class_latitudes.cc b/src/grib_accessor_class_latitudes.cc index 4131ff066..555fb5b19 100644 --- a/src/grib_accessor_class_latitudes.cc +++ b/src/grib_accessor_class_latitudes.cc @@ -221,6 +221,13 @@ static int value_count(grib_accessor* a, long* len) } *len = size; + // See ECC-1792 + // Give priority to the Grid Section (rather than the Data Section) + long numberOfDataPoints = 0; + if (grib_get_long(h, "numberOfDataPoints", &numberOfDataPoints) == GRIB_SUCCESS) { + *len = numberOfDataPoints; + } + if (self->distinct) { ret = get_distinct(a, &val, len); if (ret != GRIB_SUCCESS) diff --git a/src/grib_accessor_class_longitudes.cc b/src/grib_accessor_class_longitudes.cc index 083d40138..78fc7a733 100644 --- a/src/grib_accessor_class_longitudes.cc +++ b/src/grib_accessor_class_longitudes.cc @@ -196,6 +196,13 @@ static int value_count(grib_accessor* a, long* len) } *len = size; + // See ECC-1792 + // Give priority to the Grid Section (rather than the Data Section) + long numberOfDataPoints = 0; + if (grib_get_long(h, "numberOfDataPoints", &numberOfDataPoints) == GRIB_SUCCESS) { + *len = numberOfDataPoints; + } + if (self->distinct) { ret = get_distinct(a, &val, len); if (ret != GRIB_SUCCESS) diff --git a/src/grib_iterator_class_gen.cc b/src/grib_iterator_class_gen.cc index 02fe38c28..7124e8cf9 100644 --- a/src/grib_iterator_class_gen.cc +++ b/src/grib_iterator_class_gen.cc @@ -193,12 +193,21 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) if ((err = grib_get_long_internal(h, s_numPoints, &numberOfPoints)) != GRIB_SUCCESS) return err; - if (numberOfPoints != dli) { - grib_context_log(h->context, GRIB_LOG_ERROR, "Geoiterator: %s != size(%s) (%ld!=%ld)", - s_numPoints, s_rawData, numberOfPoints, dli); - return GRIB_WRONG_GRID; + // See ECC-1792. If we don't want to decode the Data Section, we should not do a check + // to see if it is consistent with the Grid Section + if (iter->flags & GRIB_GEOITERATOR_NO_VALUES) { + // Iterator's number of values taken from the Grid Section + iter->nv = numberOfPoints; + } else { + // Check for consistency between the Grid and Data Sections + if (numberOfPoints != dli) { + grib_context_log(h->context, GRIB_LOG_ERROR, "Geoiterator: %s != size(%s) (%ld!=%ld)", + s_numPoints, s_rawData, numberOfPoints, dli); + return GRIB_WRONG_GRID; + } + iter->nv = dli; } - iter->nv = dli; + if (iter->nv == 0) { grib_context_log(h->context, GRIB_LOG_ERROR, "Geoiterator: size(%s) is %ld", s_rawData, dli); return GRIB_WRONG_GRID; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e1f11445c..ff56770f8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -266,6 +266,7 @@ if( HAVE_BUILD_TOOLS ) grib_ecc-1425 grib_ecc-1467 grib_ecc-1764 + grib_ecc-1792 grib_sub_hourly grib_set_bytes grib_set_force diff --git a/tests/grib_ecc-1792.sh b/tests/grib_ecc-1792.sh new file mode 100755 index 000000000..960da284d --- /dev/null +++ b/tests/grib_ecc-1792.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# (C) Copyright 2005- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by +# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. +# + +. ./include.ctest.sh + +REDIRECT=/dev/null + +label="grib_ecc-1792_test" +tempGrib=temp.$label.grib +tempFilt=temp.$label.filt +tempLog=temp.$label.log +tempRef=temp.$label.ref + +sample_grib2=$ECCODES_SAMPLES_PATH/GRIB2.tmpl + +# Create a message with its Data Section out-of-sync with its Grid +${tools_dir}/grib_set -s numberOfValues=2 $sample_grib2 $tempGrib +grib_check_key_equals $tempGrib numberOfDataPoints 496 + +# grib_get_data should fail +set +e +${tools_dir}/grib_get_data $tempGrib > $tempLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep "Grid description is wrong" $tempLog + +# Just getting lats and lons; no need for Data Section to be in-sync +cat >$tempFilt<$tempFilt< $tempLog 2>&1 +status=$? +set -e +[ $status -ne 0 ] +grep "Grid description is wrong" $tempLog + + +# Clean up +rm -f $tempGrib $tempFilt $tempLog $tempRef From 1eefe7c5afd5c8777903a632673d64f17fef1776 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 4 Apr 2024 13:36:34 +0100 Subject: [PATCH 223/244] ECC-1794: GRIB2: DestinE data does not have the MARS domain key --- .../grib2/post_meta_data.hook.products_12.def | 2 +- tests/grib_multi.sh | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/definitions/grib2/post_meta_data.hook.products_12.def b/definitions/grib2/post_meta_data.hook.products_12.def index e22d01852..c344f6774 100644 --- a/definitions/grib2/post_meta_data.hook.products_12.def +++ b/definitions/grib2/post_meta_data.hook.products_12.def @@ -5,5 +5,5 @@ concept gridSpecification(unknown, "gridSpecificationConcept.def", conceptsDir2, conceptsDir1): no_copy, read_only, dump; concept destineOrigin(unknown, "destineOriginConcept.def", conceptsDir2, conceptsDir1): no_copy, dump; -# DestinE data does not have the domain key +# ECC-1794: DestinE data does not have the domain key unalias mars.domain; diff --git a/tests/grib_multi.sh b/tests/grib_multi.sh index f8e2d94d8..028591264 100755 --- a/tests/grib_multi.sh +++ b/tests/grib_multi.sh @@ -11,7 +11,7 @@ . ./include.ctest.sh label="grib_multi_test" -tmpdata=temp.$label.$$.grib +tmpdata=temp.$label.grib rm -f $tmpdata parameterNumber=`${tools_dir}/grib_get -p parameterNumber -w parameterCategory=2,parameterNumber=3 ${data_dir}/multi.grib2` @@ -35,4 +35,16 @@ if [ -z "$parameterNumber" ]; then exit 1 fi +# Convert to single-field +# ----------------------- +infile=${data_dir}/multi.grib2 +${tools_dir}/grib_copy $infile $tmpdata +c1=$(${tools_dir}/grib_count $infile) +c2=$(${tools_dir}/grib_count $tmpdata) +[ $c1 -eq 30 ] +[ $c2 -eq 56 ] + + +# Clean up +rm -f $tmpdata rm -f $tmpdata.1 $tmpdata.rules From 637f8aaae8a6edcf5e15bf7e3b298279196ed63b Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 4 Apr 2024 13:37:46 +0100 Subject: [PATCH 224/244] Cleanup --- definitions/grib2/section.0.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/definitions/grib2/section.0.def b/definitions/grib2/section.0.def index 6cf6abd60..43be85191 100644 --- a/definitions/grib2/section.0.def +++ b/definitions/grib2/section.0.def @@ -1,6 +1,6 @@ # (C) Copyright 2005- ECMWF. -position offsetSection0; +position offsetSection0; constant section0Length=16; ascii[4] identifier = "GRIB" : read_only; unsigned[2] reserved = missing() : can_be_missing,hidden,read_only,edition_specific; @@ -8,7 +8,7 @@ codetable[1] discipline ('0.0.table',masterDir,localDir) : dump; unsigned[1] editionNumber = 2 : edition_specific,dump; alias ls.edition = editionNumber; -section_length[8] totalLength; +section_length[8] totalLength; position startOfHeaders; meta section0Pointer section_pointer(offsetSection0,section0Length,0); From ebc396fa8751cfd9d7985bca55f122b11a7bda56 Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 4 Apr 2024 14:02:50 +0100 Subject: [PATCH 225/244] Cleanup --- src/eccodes_prototypes.h | 656 +++++++-------------------------------- 1 file changed, 114 insertions(+), 542 deletions(-) diff --git a/src/eccodes_prototypes.h b/src/eccodes_prototypes.h index 7905f7978..e98ae83c2 100644 --- a/src/eccodes_prototypes.h +++ b/src/eccodes_prototypes.h @@ -36,86 +36,78 @@ grib_action* grib_action_create_if(grib_context* context, grib_expression* expre grib_action* grib_action_create_switch(grib_context* context, grib_arguments* args, grib_case* Case, grib_action* Default); grib_case* grib_case_new(grib_context* c, grib_arguments* values, grib_action* action); -/* grib_accessor_class_g1fcperiod.cc */ - -/* grib_accessor_class_g1end_of_interval_monthly.cc */ - -/* grib_accessor_class_mars_param.cc */ - -/* action_class_section.cc */ - -/* action_class_list.cc*/ +/* action_class_list.cc */ grib_action* grib_action_create_list(grib_context* context, const char* name, grib_expression* expression, grib_action* block); -/* action_class_while.cc*/ +/* action_class_while.cc */ grib_action* grib_action_create_while(grib_context* context, grib_expression* expression, grib_action* block); -/* action_class_put.cc*/ +/* action_class_put.cc */ grib_action* grib_action_create_put(grib_context* context, const char* name, grib_arguments* args); -/* action_class_meta.cc*/ +/* action_class_meta.cc */ grib_action* grib_action_create_meta(grib_context* context, const char* name, const char* op, grib_arguments* params, grib_arguments* default_value, unsigned long flags, const char* name_space); -/* action_class_remove.cc*/ +/* action_class_remove.cc */ grib_action* grib_action_create_remove(grib_context* context, grib_arguments* args); -/* action_class_rename.cc*/ +/* action_class_rename.cc */ grib_action* grib_action_create_rename(grib_context* context, char* the_old, char* the_new); -/* action_class_assert.cc*/ +/* action_class_assert.cc */ grib_action* grib_action_create_assert(grib_context* context, grib_expression* expression); -/* action_class_template.cc*/ +/* action_class_template.cc */ grib_action* grib_action_create_template(grib_context* context, int nofail, const char* name, const char* arg1); -/* action_class_trigger.cc*/ +/* action_class_trigger.cc */ grib_action* grib_action_create_trigger(grib_context* context, grib_arguments* args, grib_action* block); -/* action_class_when.cc*/ +/* action_class_when.cc */ grib_action* grib_action_create_when(grib_context* context, grib_expression* expression, grib_action* block_true, grib_action* block_false); -/* action_class_concept.cc*/ +/* action_class_concept.cc */ grib_concept_value* action_concept_get_concept(grib_accessor* a); int action_concept_get_nofail(grib_accessor* a); grib_action* grib_action_create_concept(grib_context* context, const char* name, grib_concept_value* concept_value, const char* basename, const char* name_space, const char* defaultkey, const char* masterDir, const char* localDir, const char* ecmfDir, int flags, int nofail); int get_concept_condition_string(grib_handle* h, const char* key, const char* value, char* result); -/* action_class_hash_array.cc*/ +/* action_class_hash_array.cc */ grib_action* grib_action_create_hash_array(grib_context* context, const char* name, grib_hash_array_value* hash_array, const char* basename, const char* name_space, const char* defaultkey, const char* masterDir, const char* localDir, const char* ecmfDir, int flags, int nofail); grib_hash_array_value* get_hash_array(grib_handle* h, grib_action* a); const char* get_hash_array_full_path(grib_action* a); -/* action_class_set.cc*/ +/* action_class_set.cc */ grib_action* grib_action_create_set(grib_context* context, const char* name, grib_expression* expression, int nofail); -/* action_class_set_darray.cc*/ +/* action_class_set_darray.cc */ grib_action* grib_action_create_set_darray(grib_context* context, const char* name, grib_darray* darray); -/* action_class_set_sarray.cc*/ +/* action_class_set_sarray.cc */ grib_action* grib_action_create_set_sarray(grib_context* context, const char* name, grib_sarray* sarray); -/* action_class_noop.cc*/ +/* action_class_noop.cc */ grib_action* grib_action_create_noop(grib_context* context, const char* fname); -/* action_class_write.cc*/ +/* action_class_write.cc */ grib_action* grib_action_create_write(grib_context* context, const char* name, int append, int padtomultiple); -/* action_class_print.cc*/ +/* action_class_print.cc */ grib_action* grib_action_create_print(grib_context* context, const char* name, char* outname); -/* action_class_close.cc*/ +/* action_class_close.cc */ grib_action* grib_action_create_close(grib_context* context, char* filename); -/* action_class_variable.cc*/ +/* action_class_variable.cc */ grib_action* grib_action_create_variable(grib_context* context, const char* name, const char* op, const long len, grib_arguments* params, grib_arguments* default_value, int flags, const char* name_space); -/* action_class_modify.cc*/ +/* action_class_modify.cc */ grib_action* grib_action_create_modify(grib_context* context, const char* name, long flags); -/* action_class_transient_darray.cc*/ +/* action_class_transient_darray.cc */ grib_action* grib_action_create_transient_darray(grib_context* context, const char* name, grib_darray* darray, int flags); -/* grib_accessor.cc*/ +/* grib_accessor.cc */ void grib_accessor_dump(grib_accessor* a, grib_dumper* f); int grib_pack_missing(grib_accessor* a); int grib_is_missing_internal(grib_accessor* a); @@ -167,16 +159,16 @@ void grib_accessors_list_push(grib_accessors_list* al, grib_accessor* a, int ran grib_accessors_list* grib_accessors_list_last(grib_accessors_list* al); void grib_accessors_list_delete(grib_context* c, grib_accessors_list* al); -/* grib_concept.cc*/ +/* grib_concept.cc */ grib_concept_value* grib_concept_value_new(grib_context* c, const char* name, grib_concept_condition* conditions); void grib_concept_value_delete(grib_context* c, grib_concept_value* v); grib_concept_condition* grib_concept_condition_new(grib_context* c, const char* name, grib_expression* expression, grib_iarray* iarray); void grib_concept_condition_delete(grib_context* c, grib_concept_condition* v); -/* grib_hash_array.cc*/ +/* grib_hash_array.cc */ grib_hash_array_value* grib_integer_hash_array_value_new(grib_context* c, const char* name, grib_iarray* array); -/* grib_bufr_descriptor.cc*/ +/* grib_bufr_descriptor.cc */ bufr_descriptor* grib_bufr_descriptor_new(grib_accessor* tables_accessor, int code, int silent, int* err); bufr_descriptor* grib_bufr_descriptor_clone(bufr_descriptor* d); int grib_bufr_descriptor_set_code(bufr_descriptor* v, int code); @@ -184,7 +176,7 @@ void grib_bufr_descriptor_set_scale(bufr_descriptor* v, long scale); int grib_bufr_descriptor_can_be_missing(const bufr_descriptor* v); void grib_bufr_descriptor_delete(bufr_descriptor* v); -/* grib_bufr_descriptors_array.cc*/ +/* grib_bufr_descriptors_array.cc */ bufr_descriptors_array* grib_bufr_descriptors_array_new(grib_context* c, size_t size, size_t incsize); bufr_descriptor* grib_bufr_descriptors_array_pop_front(bufr_descriptors_array* a); bufr_descriptors_array* grib_bufr_descriptors_array_push(bufr_descriptors_array* v, bufr_descriptor* val); @@ -194,7 +186,7 @@ void grib_bufr_descriptors_array_delete(bufr_descriptors_array* v); void grib_bufr_descriptors_array_delete_array(bufr_descriptors_array* v); size_t grib_bufr_descriptors_array_used_size(bufr_descriptors_array* v); -/* grib_darray.cc*/ +/* grib_darray.cc */ void grib_darray_print(const char* title, const grib_darray* darray); grib_darray* grib_darray_new(grib_context* c, size_t size, size_t incsize); grib_darray* grib_darray_push(grib_context* c, grib_darray* v, double val); @@ -202,7 +194,7 @@ void grib_darray_delete(grib_context* c, grib_darray* v); int grib_darray_is_constant(grib_darray* v, double epsilon); size_t grib_darray_used_size(grib_darray* v); -/* grib_sarray.cc*/ +/* grib_sarray.cc */ void grib_sarray_print(const char* title, const grib_sarray* sarray); grib_sarray* grib_sarray_new(grib_context* c, size_t size, size_t incsize); grib_sarray* grib_sarray_push(grib_context* c, grib_sarray* v, char* val); @@ -211,13 +203,13 @@ void grib_sarray_delete_content(grib_context* c, grib_sarray* v); char** grib_sarray_get_array(grib_context* c, grib_sarray* v); size_t grib_sarray_used_size(grib_sarray* v); -/* grib_oarray.cc*/ +/* grib_oarray.cc */ grib_oarray* grib_oarray_new(grib_context* c, size_t size, size_t incsize); grib_oarray* grib_oarray_push(grib_context* c, grib_oarray* v, void* val); void grib_oarray_delete(grib_context* c, grib_oarray* v); void* grib_oarray_get(grib_oarray* v, int i); -/* grib_iarray.cc*/ +/* grib_iarray.cc */ void grib_iarray_print(const char* title, const grib_iarray* iarray); grib_iarray* grib_iarray_new(grib_context* c, size_t size, size_t incsize); long grib_iarray_pop(grib_iarray* a); @@ -228,7 +220,7 @@ void grib_iarray_delete_array(grib_iarray* v); long* grib_iarray_get_array(grib_iarray* v); size_t grib_iarray_used_size(grib_iarray* v); -/* grib_vdarray.cc*/ +/* grib_vdarray.cc */ void grib_vdarray_print(const char* title, const grib_vdarray* vdarray); grib_vdarray* grib_vdarray_new(grib_context* c, size_t size, size_t incsize); grib_vdarray* grib_vdarray_push(grib_context* c, grib_vdarray* v, grib_darray* val); @@ -236,7 +228,7 @@ void grib_vdarray_delete(grib_context* c, grib_vdarray* v); void grib_vdarray_delete_content(grib_context* c, grib_vdarray* v); size_t grib_vdarray_used_size(grib_vdarray* v); -/* grib_vsarray.cc*/ +/* grib_vsarray.cc */ void grib_vsarray_print(const char* title, const grib_vsarray* vdarray); grib_vsarray* grib_vsarray_new(grib_context* c, size_t size, size_t incsize); grib_vsarray* grib_vsarray_push(grib_context* c, grib_vsarray* v, grib_sarray* val); @@ -244,30 +236,20 @@ void grib_vsarray_delete(grib_context* c, grib_vsarray* v); void grib_vsarray_delete_content(grib_context* c, grib_vsarray* v); size_t grib_vsarray_used_size(grib_vsarray* v); -/* grib_viarray.cc*/ +/* grib_viarray.cc */ void grib_viarray_print(const char* title, const grib_viarray* viarray); grib_viarray* grib_viarray_new(grib_context* c, size_t size, size_t incsize); grib_viarray* grib_viarray_push(grib_context* c, grib_viarray* v, grib_iarray* val); void grib_viarray_delete(grib_context* c, grib_viarray* v); void grib_viarray_delete_content(grib_context* c, grib_viarray* v); -/* grib_accessor_class_ascii.cc*/ - -/* grib_accessor_class_bit.cc*/ - -/* grib_accessor_class_bitmap.cc*/ - -/* grib_accessor_class_bits.cc*/ - -/* grib_accessor_class_bits_per_value.cc*/ - -/* grib_accessor_class_bufr_data_array.cc*/ +/* grib_accessor_class_bufr_data_array.cc */ grib_vsarray* accessor_bufr_data_array_get_stringValues(grib_accessor* a); grib_accessors_list* accessor_bufr_data_array_get_dataAccessors(grib_accessor* a); grib_trie_with_rank* accessor_bufr_data_array_get_dataAccessorsTrie(grib_accessor* a); void accessor_bufr_data_array_set_unpackMode(grib_accessor* a, int unpackMode); -/* grib_accessor_class_bufr_data_element.cc*/ +/* grib_accessor_class_bufr_data_element.cc */ void accessor_bufr_data_element_set_index(grib_accessor* a, long index); void accessor_bufr_data_element_set_type(grib_accessor* a, int type); void accessor_bufr_data_element_set_numberOfSubsets(grib_accessor* a, long numberOfSubsets); @@ -278,47 +260,11 @@ void accessor_bufr_data_element_set_numericValues(grib_accessor* a, grib_vdarray void accessor_bufr_data_element_set_stringValues(grib_accessor* a, grib_vsarray* stringValues); void accessor_bufr_data_element_set_elementsDescriptorsIndex(grib_accessor* a, grib_viarray* elementsDescriptorsIndex); -/* grib_accessor_class_bufr_elements_table.cc*/ +/* grib_accessor_class_bufr_elements_table.cc */ int bufr_descriptor_is_marker(bufr_descriptor* d); bufr_descriptor* accessor_bufr_elements_table_get_descriptor(grib_accessor* a, int code, int* err); -/* grib_accessor_class_bufr_group.cc*/ - -/* grib_accessor_class_bufr_string_values.cc*/ - -/* grib_accessor_class_pack_bufr_values.cc*/ - -/* grib_accessor_class_bufr_extract_area_subsets.cc*/ - -/* grib_accessor_class_bufr_extract_datetime_subsets.cc*/ - -/* grib_accessor_class_group.cc*/ - -/* grib_accessor_class_unpack_bufr_values.cc*/ - -/* grib_accessor_class_non_alpha.cc*/ - -/* grib_accessor_class_g1bitmap.cc*/ - -/* grib_accessor_class_g2bitmap.cc*/ - -/* grib_accessor_class_concept.cc*/ - -/* grib_accessor_class_hash_array.cc*/ - -/* grib_accessor_class_decimal_precision.cc*/ - -/* grib_accessor_class_divdouble.cc*/ - -/* grib_accessor_class_budgdate.cc*/ - -/* grib_accessor_class_validity_date.cc*/ - -/* grib_accessor_class_validity_time.cc*/ - -/* grib_accessor_class_bytes.cc*/ - -/* grib_accessor_class.cc*/ +/* grib_accessor_class.cc */ grib_section* grib_create_root_section(const grib_context* context, grib_handle* h); grib_accessor* grib_accessor_factory(grib_section* p, grib_action* creator, const long len, grib_arguments* params); void grib_push_accessor(grib_accessor* a, grib_block_of_accessors* l); @@ -328,314 +274,46 @@ int grib_get_block_length(grib_section* s, size_t* l); grib_accessor* find_paddings(grib_section* s); void grib_update_paddings(grib_section* s); -/* grib_accessor_class_change_scanning_direction.cc*/ - -/* grib_accessor_class_change_scanning_direction.cc*/ - -/* grib_accessor_class_check_internal_version.cc*/ - -/* grib_accessor_class_codeflag.cc*/ - -/* grib_accessor_class_smart_table.cc*/ +/* grib_accessor_class_smart_table.cc */ void grib_smart_table_delete(grib_context* c); -/* grib_accessor_class_smart_table_column.cc*/ - -/* grib_accessor_class_codetable.cc*/ +/* grib_accessor_class_codetable.cc */ void grib_codetable_delete(grib_context* c); int codes_codetable_get_contents_malloc(const grib_handle* h, const char* key, code_table_entry** entries, size_t* num_entries); int codes_codetable_check_code_figure(const grib_handle* h, const char* key, long code_figure); int codes_codetable_check_abbreviation(const grib_handle* h, const char* key, const char* abbreviation); -/* grib_accessor_class_codetable_units.cc*/ - -/* grib_accessor_class_codetable_title.cc*/ - -/* grib_accessor_class_count_file.cc*/ - -/* grib_accessor_class_count_total.cc*/ - -/* grib_accessor_class_double.cc*/ - -/* grib_accessor_class_element.cc*/ - -/* grib_accessor_class_evaluate.cc*/ - -/* grib_accessor_class_g1date.cc*/ - -/* grib_accessor_class_g1monthlydate.cc*/ - -/* grib_accessor_class_library_version.cc*/ - -/* grib_accessor_class_when.cc*/ - -/* grib_accessor_class_g1verificationdate.cc*/ - -/* grib_accessor_class_g1day_of_the_year_date.cc*/ - -/* grib_accessor_class_g1_half_byte_codeflag.cc*/ - -/* grib_accessor_class_g1forecastmonth.cc*/ - -/* grib_accessor_class_g1step_range.cc*/ +/* grib_accessor_class_g1step_range.cc */ int grib_g1_step_get_steps(grib_accessor* a, long* start, long* theEnd); -/* grib_accessor_class_g2step_range.cc*/ - -/* grib_accessor_class_data_g22order_packing.cc*/ - -/* grib_accessor_class_mars_step.cc*/ - -/* grib_accessor_class_message_copy.cc*/ - -/* grib_accessor_class_dictionary.cc*/ - -/* grib_accessor_class_latlon_increment.cc*/ - -/* grib_accessor_class_g2date.cc*/ - -/* grib_accessor_class_g2level.cc*/ - -/* grib_accessor_class_g2end_step.cc*/ - -/* grib_accessor_class_g2latlon.cc*/ - -/* grib_accessor_class_g2lon.cc*/ - -/* grib_accessor_class_global_gaussian.cc*/ - -/* grib_accessor_class_gaussian_grid_name.cc*/ - -/* grib_accessor_class_gen.cc*/ - -/* grib_accessor_class_gts_header.cc*/ - -/* grib_accessor_class_ifs_param.cc*/ - -/* grib_accessor_class_uint16.cc*/ - -/* grib_accessor_class_uint32.cc*/ - -/* grib_accessor_class_uint32_little_endian.cc*/ - -/* grib_accessor_class_uint64.cc*/ - -/* grib_accessor_class_uint64_little_endian.cc*/ - -/* grib_accessor_class_uint8.cc*/ - -/* grib_accessor_class_blob.cc*/ - -/* grib_accessor_class_julian_day.cc*/ - -/* grib_accessor_class_julian_date.cc*/ - -/* grib_accessor_class_latlonvalues.cc*/ - -/* grib_accessor_class_latitudes.cc*/ - -/* grib_accessor_class_longitudes.cc*/ - -/* grib_accessor_class_octahedral_gaussian.cc*/ - -/* grib_accessor_class_offset_file.cc*/ - -/* grib_accessor_class_scale.cc*/ - -/* grib_accessor_class_rdbtime_guess_date.cc*/ - -/* grib_accessor_class_from_scale_factor_scaled_value.cc*/ - -/* grib_accessor_class_g2bitmap_present.cc*/ - -/* grib_accessor_class_ibmfloat.cc*/ - -/* grib_accessor_class_ieeefloat.cc*/ - -/* grib_accessor_class_constant.cc*/ - -/* grib_accessor_class_iterator.cc*/ +/* grib_accessor_class_iterator.cc */ grib_iterator* grib_iterator_new(const grib_handle* h, unsigned long flags, int* error); -/* grib_accessor_class_message.cc*/ - -/* grib_accessor_class_nearest.cc*/ +/* grib_accessor_class_nearest.cc */ grib_nearest* grib_nearest_new(const grib_handle* h, int* error); -/* grib_accessor_class_ksec1expver.cc*/ - -/* grib_accessor_class_label.cc*/ - -/* grib_accessor_class_long.cc*/ - -/* grib_accessor_class_lookup.cc*/ - -/* grib_accessor_class_octet_number.cc*/ - -/* grib_accessor_class_headers_only.cc*/ - -/* grib_accessor_class_padding.cc*/ - -/* grib_accessor_class_pad.cc*/ - -/* grib_accessor_class_padto.cc*/ - -/* grib_accessor_class_padtoeven.cc*/ - -/* grib_accessor_class_padtomultiple.cc*/ - -/* grib_accessor_class_section_padding.cc*/ - -/* grib_accessor_class_section_pointer.cc*/ - -/* grib_accessor_class_position.cc*/ - -/* grib_accessor_class_signed.cc*/ - -/* grib_accessor_class_signed_bits.cc*/ - -/* grib_accessor_class_section.cc*/ - -/* grib_accessor_class_step_in_units.cc*/ - -/* grib_accessor_class_section_length.cc*/ - -/* grib_accessor_class_g1_message_length.cc*/ +/* grib_accessor_class_g1_message_length.cc */ int grib_get_g1_message_size(grib_handle* h, grib_accessor* tl, grib_accessor* s4, long* total_length, long* sec4_len); -/* grib_accessor_class_g1_section4_length.cc*/ - -/* grib_accessor_class_size.cc*/ - -/* grib_accessor_class_scale_values.cc*/ - -/* grib_accessor_class_offset_values.cc*/ - -/* grib_accessor_class_sprintf.cc*/ - -/* grib_accessor_class_getenv.cc*/ - -/* grib_accessor_class_round.cc*/ - -/* grib_accessor_class_spectral_truncation.cc*/ - -/* grib_accessor_class_time.cc*/ - -/* grib_accessor_class_transient.cc*/ - -/* grib_accessor_class_values.cc*/ - -/* grib_accessor_class_simple_packing_error.cc*/ - -/* grib_accessor_class_data_simple_packing.cc*/ - -/* grib_accessor_class_data_ccsds_packing.cc*/ - -/* grib_accessor_class_count_missing.cc*/ - -/* grib_accessor_class_data_sh_packed.cc*/ - -/* grib_accessor_class_data_sh_unpacked.cc*/ - -/* grib_accessor_class_number_of_values_data_raw_packing.cc*/ - -/* grib_accessor_class_data_g1simple_packing.cc*/ - -/* grib_accessor_class_data_g1shsimple_packing.cc*/ - -/* grib_accessor_class_data_shsimple_packing.cc*/ - -/* grib_accessor_class_data_dummy_field.cc*/ - -/* grib_accessor_class_variable.cc*/ +/* grib_accessor_class_variable.cc */ void accessor_variable_set_type(grib_accessor* a, int type); -/* grib_accessor_class_second_order_bits_per_value.cc*/ - -/* grib_accessor_class_data_g2simple_packing.cc*/ - -/* grib_accessor_class_data_g2simple_packing_with_preprocessing.cc*/ - -/* grib_accessor_class_data_g2shsimple_packing.cc*/ - -/* grib_accessor_class_data_g2complex_packing.cc*/ - -/* grib_accessor_class_data_g1second_order_row_by_row_packing.cc*/ - -/* grib_accessor_class_data_g1second_order_constant_width_packing.cc*/ - -/* grib_accessor_class_data_g1second_order_general_packing.cc*/ - -/* grib_accessor_class_data_g1second_order_general_extended_packing.cc*/ - -/* grib_accessor_class_g2grid.cc*/ - -/* grib_accessor_class_unexpanded_descriptors.cc*/ - -/* grib_accessor_class_expanded_descriptors.cc*/ +/* grib_accessor_class_expanded_descriptors.cc */ int grib_accessor_class_expanded_descriptors_set_do_expand(grib_accessor* a, long do_expand); bufr_descriptors_array* grib_accessor_class_expanded_descriptors_get_expanded(grib_accessor* a, int* err); -/* grib_accessor_class_bufrdc_expanded_descriptors.cc*/ - -/* grib_accessor_class_data_apply_bitmap.cc*/ - -/* grib_accessor_class_data_apply_boustrophedonic.cc*/ - -/* grib_accessor_class_data_apply_boustrophedonic_bitmap.cc*/ - -/* grib_accessor_class_data_secondary_bitmap.cc*/ - -/* grib_accessor_class_data_g1secondary_bitmap.cc*/ - -/* grib_accessor_class_data_g2secondary_bitmap.cc*/ - -/* grib_accessor_class_data_jpeg2000_packing.cc*/ - -/* grib_accessor_class_data_png_packing.cc*/ - -/* grib_accessor_class_data_raw_packing.cc*/ - -/* grib_accessor_class_data_complex_packing.cc*/ - -/* grib_accessor_class_data_g1complex_packing.cc*/ - -/* grib_accessor_class_gds_not_present_bitmap.cc*/ - -/* grib_accessor_class_gds_is_present.cc*/ - -/* grib_accessor_class_select_step_template.cc*/ - -/* grib_accessor_class_local_definition.cc*/ - -/* grib_accessor_class_g2_eps.cc*/ - -/* grib_accessor_class_g2_aerosol.cc*/ - -/* grib_accessor_class_g2_chemical.cc*/ - -/* grib_accessor_class_g2_mars_labeling.cc*/ - -/* grib_accessor_class_transient_darray.cc*/ - -/* grib_accessor_class_md5.cc*/ - -/* grib_jasper_encoding.cc*/ +/* grib_jasper_encoding.cc */ int grib_jasper_decode(grib_context* c, unsigned char* buf, const size_t* buflen, double* values, const size_t* n_vals); int grib_jasper_encode(grib_context* c, j2k_encode_helper* helper); -/* grib_openjpeg_encoding.cc*/ +/* grib_openjpeg_encoding.cc */ int grib_openjpeg_decode(grib_context* c, unsigned char* buf, const size_t* buflen, double* values, const size_t* n_vals); int grib_openjpeg_encode(grib_context* c, j2k_encode_helper* helper); -/* action_class_set_missing.cc*/ +/* action_class_set_missing.cc */ grib_action* grib_action_create_set_missing(grib_context* context, const char* name); -/* grib_accessor_class_number_of_points.cc*/ - -/* grib_accessor_class_suppressed.cc*/ - -/* grib_index.cc*/ +/* grib_index.cc */ int grib_index_compress(grib_index* index); grib_field_tree* grib_read_field_tree(grib_context* c, FILE* fh, grib_file** files, int* err); grib_index* grib_index_new(grib_context* c, const char* key, int* err); @@ -662,66 +340,24 @@ int codes_index_set_product_kind(grib_index* index, ProductKind product_kind); int codes_index_set_unpack_bufr(grib_index* index, int unpack); int is_index_file(const char* filename); -/* grib_accessor_class_number_of_points_gaussian.cc*/ - -/* grib_accessor_class_number_of_values.cc*/ - -/* grib_accessor_class_number_of_coded_values.cc*/ - -/* grib_accessor_class_g1number_of_coded_values_sh_complex.cc*/ - -/* grib_accessor_class_g1number_of_coded_values_sh_simple.cc*/ - -/* grib_accessor_class_dirty.cc*/ - -/* grib_accessor_class_statistics.cc*/ - -/* grib_accessor_class_statistics_spectral.cc*/ - -/* grib_accessor_class_unsigned.cc*/ +/* grib_accessor_class_unsigned.cc */ int pack_long_unsigned_helper(grib_accessor* a, const long* val, size_t* len, int check); -/* grib_accessor_class_unsigned_bits.cc*/ - -/* grib_accessor_class_raw.cc*/ +/* grib_accessor_class_raw.cc */ void accessor_raw_set_length(grib_accessor* a, size_t len); long accessor_raw_get_offset(grib_accessor* a); -/* grib_accessor_class_bufr_extract_subsets.cc*/ - -/* grib_accessor_class_bufr_simple_thinning.cc*/ - -/* grib_accessor_class_spd.cc*/ - -/* grib_accessor_class_sum.cc*/ - -/* grib_accessor_class_to_integer.cc*/ - -/* grib_accessor_class_to_double.cc*/ - -/* grib_accessor_class_to_string.cc*/ - -/* grib_accessor_class_sexagesimal2decimal.cc*/ - -/* grib_accessor_class_vector.cc*/ - -/* grib_accessor_class_long_vector.cc*/ - -/* grib_gaussian_reduced.cc*/ +/* grib_gaussian_reduced.cc */ void grib_get_reduced_row_wrapper(grib_handle* h, long pl, double lon_first, double lon_last, long* npoints, long* ilon_first, long* ilon_last); void grib_get_reduced_row_legacy(long pl, double lon_first, double lon_last, long* npoints, long* ilon_first, long* ilon_last); void grib_get_reduced_row(long pl, double lon_first, double lon_last, long* npoints, long* ilon_first, long* ilon_last); void grib_get_reduced_row_p(long pl, double lon_first, double lon_last, long* npoints, double* olon_first, double* olon_last); -/* grib_accessor_class_abstract_vector.cc*/ - -/* grib_accessor_class_abstract_long_vector.cc*/ - -/* grib_loader_from_handle.cc*/ +/* grib_loader_from_handle.cc */ int grib_lookup_long_from_handle(grib_context* gc, grib_loader* loader, const char* name, long* value); int grib_init_accessor_from_handle(grib_loader* loader, grib_accessor* ga, grib_arguments* default_value); -/* grib_bits.cc*/ +/* grib_bits.cc */ unsigned long grib_decode_unsigned_byte_long(const unsigned char* p, long o, int l); long grib_decode_signed_long(const unsigned char* p, long o, int l); int grib_encode_signed_long(unsigned char* p, long val, long o, int l); @@ -731,7 +367,7 @@ void grib_set_bit(unsigned char* p, long bitp, int val); long grib_decode_signed_longb(const unsigned char* p, long* bitp, long nbits); int grib_encode_signed_longb(unsigned char* p, long val, long* bitp, long nb); -/* grib_timer.cc*/ +/* grib_timer.cc */ double proc_cpu(void); char* timename(double t); grib_timer* grib_get_timer(grib_context* c, const char* name, const char* statname, int elapsed); @@ -744,7 +380,7 @@ void grib_timer_partial_rate(grib_timer* t, double start, long total); void grib_print_all_timers(void); void grib_reset_all_timers(void); -/* grib_ibmfloat.cc*/ +/* grib_ibmfloat.cc */ unsigned long grib_ibm_to_long(double x); double grib_ibmfloat_error(double x); double grib_long_to_ibm(unsigned long x); @@ -753,7 +389,7 @@ double grib_ibm_table_v(unsigned long e); unsigned long grib_ibm_nearest_smaller_to_long(double x); int grib_nearest_smaller_ibm_float(double a, double* ret); -/* grib_ieeefloat.cc*/ +/* grib_ieeefloat.cc */ unsigned long grib_ieee_to_long(double x); double grib_ieeefloat_error(double x); double grib_long_to_ieee(unsigned long x); @@ -767,9 +403,7 @@ double grib_long_to_ieee64(unsigned long x); //int grib_ieee_decode_array_float(grib_context* c, unsigned char* buf, size_t nvals, int bytes, float* val); int grib_ieee_encode_array(grib_context* c, double* val, size_t nvals, int bytes, unsigned char* buf); -/* grib_accessor_class_reference_value_error.cc*/ - -/* grib_memory.cc*/ +/* grib_memory.cc */ void* grib_transient_malloc(const grib_context* c, size_t s); void* grib_transient_realloc(const grib_context* c, void* p, size_t s); void grib_transient_free(const grib_context* c, void* p); @@ -780,7 +414,7 @@ void* grib_buffer_malloc(const grib_context* c, size_t s); void grib_buffer_free(const grib_context* c, void* p); void* grib_buffer_realloc(const grib_context* c, void* p, size_t s); -/* grib_buffer.cc*/ +/* grib_buffer.cc */ grib_buffer* grib_create_growable_buffer(const grib_context* c); grib_buffer* grib_new_buffer(const grib_context* c, const unsigned char* data, size_t buflen); void grib_buffer_delete(const grib_context* c, grib_buffer* b); @@ -791,7 +425,7 @@ void grib_recompute_sections_lengths(grib_section* s); int grib_buffer_replace(grib_accessor* a, const unsigned char* data, size_t newsize, int update_lengths, int update_paddings); void grib_update_sections_lengths(grib_handle* h); -/* grib_dumper.cc*/ +/* grib_dumper.cc */ void grib_init_dumper(grib_dumper* d); void grib_dumper_delete(grib_dumper* d); void grib_dump_long(grib_dumper* d, grib_accessor* a, const char* comment); @@ -806,37 +440,7 @@ void grib_dump_values(grib_dumper* d, grib_accessor* a); void grib_dump_header(grib_dumper* d, const grib_handle* h); void grib_dump_footer(grib_dumper* d, const grib_handle* h); -/* grib_dumper_class_serialize.cc*/ - -/* grib_dumper_class_debug.cc*/ - -/* grib_dumper_class_default.cc*/ - -/* grib_dumper_class_bufr_encode_C.cc*/ - -/* grib_dumper_class_bufr_encode_filter.cc*/ - -/* grib_dumper_class_bufr_encode_fortran.cc*/ - -/* grib_dumper_class_bufr_encode_python.cc*/ - -/* grib_dumper_class_bufr_decode_C.cc*/ - -/* grib_dumper_class_bufr_decode_filter.cc*/ - -/* grib_dumper_class_bufr_decode_fortran.cc*/ - -/* grib_dumper_class_bufr_decode_python.cc*/ - -/* grib_dumper_class_bufr_simple.cc*/ - -/* grib_dumper_class_json.cc*/ - -/* grib_dumper_class_grib_encode_C.cc*/ - -/* grib_dumper_class_wmo.cc*/ - -/* grib_dumper_class.cc*/ +/* grib_dumper_class.cc */ grib_dumper* grib_dumper_factory(const char* op, const grib_handle* h, FILE* out, unsigned long option_flags, void* arg); void grib_dump_accessors_block(grib_dumper* dumper, grib_block_of_accessors* block); void grib_dump_accessors_list(grib_dumper* dumper, grib_accessors_list* al); @@ -846,7 +450,7 @@ void grib_dump_keys(grib_handle* h, FILE* f, const char* mode, unsigned long fla grib_dumper* grib_dump_content_with_dumper(grib_handle* h, grib_dumper* dumper, FILE* f, const char* mode, unsigned long flags, void* data); void codes_dump_bufr_flat(grib_accessors_list* al, grib_handle* h, FILE* f, const char* mode, unsigned long flags, void* data); -/* grib_context.cc*/ +/* grib_context.cc */ size_t grib_context_read(const grib_context* c, void* ptr, size_t size, void* stream); off_t grib_context_tell(const grib_context* c, void* stream); int grib_context_seek(const grib_context* c, off_t offset, int whence, void* stream); @@ -906,14 +510,14 @@ void grib_gts_header_off(grib_context* c); void grib_multi_support_on(grib_context* c); void grib_multi_support_off(grib_context* c); -/* grib_date.cc*/ +/* grib_date.cc */ int grib_julian_to_datetime(double jd, long* year, long* month, long* day, long* hour, long* minute, long* second); int grib_datetime_to_julian(long year, long month, long day, long hour, long minute, long second, double* jd); int grib_datetime_to_julian_d(long year, long month, long day, long hour, long minute, double second, double* jd); long grib_julian_to_date(long jdate); long grib_date_to_julian(long ddate); -/* grib_fieldset.cc*/ +/* grib_fieldset.cc */ int grib_fieldset_new_column(grib_fieldset* set, int id, char* key, int type); grib_fieldset* grib_fieldset_new_from_files(grib_context* c, const char* filenames[], int nfiles, const char** keys, int nkeys, const char* where_string, const char* order_by_string, int* err); int grib_fieldset_apply_where(grib_fieldset* set, const char* where_string); @@ -926,7 +530,7 @@ grib_handle* grib_fieldset_next_handle(grib_fieldset* set, int* err); int grib_fieldset_count(const grib_fieldset* set); grib_handle* grib_fieldset_retrieve(grib_fieldset* set, int i, int* err); -/* grib_filepool.cc*/ +/* grib_filepool.cc */ void grib_file_pool_clean(void); grib_file* grib_file_open(const char* filename, const char* mode, int* err); void grib_file_pool_delete_file(grib_file* file); @@ -935,14 +539,14 @@ void grib_file_close_all(int* err); grib_file* grib_get_file(const char* filename, int* err); void grib_file_delete(grib_file* file); -/* grib_geography.cc*/ +/* grib_geography.cc */ int grib_get_gaussian_latitudes(long trunc, double* lats); int is_gaussian_global(double lat1, double lat2, double lon1, double lon2, long num_points_equator, const double* latitudes, double angular_precision); void rotate(const double inlat, const double inlon, const double angleOfRot, const double southPoleLat, const double southPoleLon, double* outlat, double* outlon); void unrotate(const double inlat, const double inlon, const double angleOfRot, const double southPoleLat, const double southPoleLon, double* outlat, double* outlon); double geographic_distance_spherical(double radius, double lon1, double lat1, double lon2, double lat2); -/* grib_handle.cc*/ +/* grib_handle.cc */ grib_section* grib_section_create(grib_handle* h, grib_accessor* owner); void grib_swap_sections(grib_section* the_old, grib_section* the_new); void grib_empty_section(grib_context* c, grib_section* b); @@ -990,14 +594,14 @@ int grib_handle_apply_action(grib_handle* h, grib_action* a); void grib_multi_support_reset_file(grib_context* c, FILE* f); void grib_multi_support_reset(grib_context* c); -/* grib_hash_keys.cc*/ +/* grib_hash_keys.cc */ const struct grib_keys_hash* grib_keys_hash_get(const char* str, size_t len); grib_itrie* grib_hash_keys_new(grib_context* c, int* count); void grib_hash_keys_delete(grib_itrie* t); int grib_hash_keys_get_id(grib_itrie* t, const char* key); int grib_hash_keys_get_size(grib_itrie* t); -/* grib_io.cc*/ +/* grib_io.cc */ off_t stdio_tell(void* data); int stdio_seek(void* data, off_t len); int stdio_seek_from_start(void* data, off_t len); @@ -1029,7 +633,7 @@ int codes_extract_offsets_sizes_malloc(grib_context* c, const char* filename, Pr off_t** offsets, size_t** sizes, int* num_messages, int strict_mode); -/* grib_trie.cc*/ +/* grib_trie.cc */ grib_trie* grib_trie_new(grib_context* c); void grib_trie_delete_container(grib_trie* t); void grib_trie_delete(grib_trie* t); @@ -1038,24 +642,24 @@ void* grib_trie_insert(grib_trie* t, const char* key, void* data); void* grib_trie_insert_no_replace(grib_trie* t, const char* key, void* data); void* grib_trie_get(grib_trie* t, const char* key); -/* grib_trie_with_rank.cc*/ +/* grib_trie_with_rank.cc */ grib_trie_with_rank* grib_trie_with_rank_new(grib_context* c); void grib_trie_with_rank_delete_container(grib_trie_with_rank* t); int grib_trie_with_rank_insert(grib_trie_with_rank* t, const char* key, void* data); void* grib_trie_with_rank_get(grib_trie_with_rank* t, const char* key, int rank); -/* grib_itrie.cc*/ +/* grib_itrie.cc */ grib_itrie* grib_itrie_new(grib_context* c, int* count); void grib_itrie_delete(grib_itrie* t); int grib_itrie_get_id(grib_itrie* t, const char* key); int grib_itrie_insert(grib_itrie* t, const char* key); int grib_itrie_get_size(grib_itrie* t); -/* grib_rules.cc*/ +/* grib_rules.cc */ grib_rule_entry* grib_new_rule_entry(grib_context* c, const char* name, grib_expression* expression); grib_rule* grib_new_rule(grib_context* c, grib_expression* condition, grib_rule_entry* entries); -/* grib_keys_iterator.cc*/ +/* grib_keys_iterator.cc */ grib_keys_iterator* grib_keys_iterator_new(grib_handle* h, unsigned long filter_flags, const char* name_space); int grib_keys_iterator_set_flags(grib_keys_iterator* ki, unsigned long flags); int grib_keys_iterator_rewind(grib_keys_iterator* ki); @@ -1070,7 +674,7 @@ int grib_keys_iterator_get_string(const grib_keys_iterator* kiter, char* v, size int grib_keys_iterator_get_bytes(const grib_keys_iterator* kiter, unsigned char* v, size_t* len); int grib_keys_iterator_get_native_type(const grib_keys_iterator* kiter); -/* bufr_keys_iterator.cc*/ +/* bufr_keys_iterator.cc */ bufr_keys_iterator* codes_bufr_keys_iterator_new(grib_handle* h, unsigned long filter_flags); bufr_keys_iterator* codes_bufr_data_section_keys_iterator_new(grib_handle* h); int codes_bufr_keys_iterator_rewind(bufr_keys_iterator* ki); @@ -1079,7 +683,7 @@ char* codes_bufr_keys_iterator_get_name(const bufr_keys_iterator* kiter); grib_accessor* codes_bufr_keys_iterator_get_accessor(bufr_keys_iterator* kiter); int codes_bufr_keys_iterator_delete(bufr_keys_iterator* kiter); -/* grib_parse_utils.cc*/ +/* grib_parse_utils.cc */ int grib_recompose_name(grib_handle* h, grib_accessor* observer, const char* uname, char* fname, int fail); int grib_accessors_list_print(grib_handle* h, grib_accessors_list* al, const char* name, int type, const char* format, const char* separator, int maxcols, int* newline, FILE* out); int grib_recompose_print(grib_handle* h, grib_accessor* observer, const char* uname, int fail, FILE* out); @@ -1093,17 +697,17 @@ grib_hash_array_value* grib_parse_hash_array_file(grib_context* gc, const char* grib_action* grib_parse_file(grib_context* gc, const char* filename); int grib_type_to_int(char id); -/* grib_query.cc*/ +/* grib_query.cc */ grib_accessors_list* grib_find_accessors_list(const grib_handle* h, const char* name); char* grib_split_name_attribute(grib_context* c, const char* name, char* attribute_name); grib_accessor* grib_find_accessor(const grib_handle* h, const char* name); grib_accessor* grib_find_accessor_fast(grib_handle* h, const char* name); -/* grib_scaling.cc*/ +/* grib_scaling.cc */ double grib_power(long s, long n); long grib_get_binary_scale_fact(double max, double min, long bpval, int* error); -/* grib_templates.cc*/ +/* grib_templates.cc */ grib_handle* codes_external_sample(grib_context* c, ProductKind product_kind, const char* name); char* get_external_sample_path(grib_context* c, const char* name); @@ -1117,7 +721,7 @@ void grib_dependency_remove_observer(grib_accessor* observer); void grib_dependency_observe_expression(grib_accessor* observer, grib_expression* e); void grib_dependency_observe_arguments(grib_accessor* observer, grib_arguments* a); -/* grib_value.cc*/ +/* grib_value.cc */ int grib_set_expression(grib_handle* h, const char* name, grib_expression* e); int grib_set_long_internal(grib_handle* h, const char* name, long val); int grib_set_long(grib_handle* h, const char* name, long val); @@ -1186,59 +790,59 @@ int grib_values_check(grib_handle* h, grib_values* values, int count); int codes_copy_key(grib_handle* h1, grib_handle* h2, const char* key, int type); int codes_compare_key(grib_handle* h1, grib_handle* h2, const char* key, int compare_flags); -/* grib_errors.cc*/ +/* grib_errors.cc */ const char* grib_get_error_message(int code); void grib_check(const char* call, const char* file, int line, int e, const char* msg); -/* grib_expression_class_binop.cc*/ +/* grib_expression_class_binop.cc */ grib_expression* new_binop_expression(grib_context* c, grib_binop_long_proc long_func, grib_binop_double_proc double_func, grib_expression* left, grib_expression* right); -/* grib_expression_class_logical_and.cc*/ +/* grib_expression_class_logical_and.cc */ grib_expression* new_logical_and_expression(grib_context* c, grib_expression* left, grib_expression* right); -/* grib_expression_class_logical_or.cc*/ +/* grib_expression_class_logical_or.cc */ grib_expression* new_logical_or_expression(grib_context* c, grib_expression* left, grib_expression* right); -/* grib_expression_class_is_in_dict.cc*/ +/* grib_expression_class_is_in_dict.cc */ grib_expression* new_is_in_dict_expression(grib_context* c, const char* name, const char* list); -/* grib_expression_class_true.cc*/ +/* grib_expression_class_true.cc */ grib_expression* new_true_expression(grib_context* c); -/* grib_expression_class_string_compare.cc*/ +/* grib_expression_class_string_compare.cc */ grib_expression* new_string_compare_expression(grib_context* c, grib_expression* left, grib_expression* right); -/* grib_expression_class_unop.cc*/ +/* grib_expression_class_unop.cc */ grib_expression* new_unop_expression(grib_context* c, grib_unop_long_proc long_func, grib_unop_double_proc double_func, grib_expression* exp); -/* grib_expression_class_functor.cc*/ +/* grib_expression_class_functor.cc */ grib_expression* new_func_expression(grib_context* c, const char* name, grib_arguments* args); -/* grib_expression_class_accessor.cc*/ +/* grib_expression_class_accessor.cc */ grib_expression* new_accessor_expression(grib_context* c, const char* name, long start, size_t length); -/* grib_expression_class_is_in_list.cc*/ +/* grib_expression_class_is_in_list.cc */ grib_expression* new_is_in_list_expression(grib_context* c, const char* name, const char* list); -/* grib_expression_class_is_integer.cc*/ +/* grib_expression_class_is_integer.cc */ grib_expression* new_is_integer_expression(grib_context* c, const char* name, int start, int length); -/* grib_expression_class_length.cc*/ +/* grib_expression_class_length.cc */ grib_expression* new_length_expression(grib_context* c, const char* name); -/* grib_expression_class_long.cc*/ +/* grib_expression_class_long.cc */ grib_expression* new_long_expression(grib_context* c, long value); -/* grib_expression_class_double.cc*/ +/* grib_expression_class_double.cc */ grib_expression* new_double_expression(grib_context* c, double value); -/* grib_expression_class_string.cc*/ +/* grib_expression_class_string.cc */ grib_expression* new_string_expression(grib_context* c, const char* value); -/* grib_expression_class_sub_string.cc*/ +/* grib_expression_class_sub_string.cc */ grib_expression* new_sub_string_expression(grib_context* c, const char* value, size_t start, size_t length); -/* grib_nearest.cc*/ +/* grib_nearest.cc */ int grib_nearest_find(grib_nearest* nearest, const grib_handle* h, double inlat, double inlon, unsigned long flags, double* outlats, double* outlons, double* values, double* distances, int* indexes, size_t* len); int grib_nearest_init(grib_nearest* i, grib_handle* h, grib_arguments* args); int grib_nearest_delete(grib_nearest* i); @@ -1254,28 +858,10 @@ int grib_nearest_find_generic(grib_nearest* nearest, grib_handle* h, double inla double** out_distances, double* outlats, double* outlons, double* values, double* distances, int* indexes, size_t* len); -/* grib_nearest_class.cc*/ +/* grib_nearest_class.cc */ grib_nearest* grib_nearest_factory(grib_handle* h, grib_arguments* args, int* error); -/* grib_nearest_class_gen.cc*/ - -/* grib_nearest_class_regular.cc*/ - -/* grib_nearest_class_reduced.cc*/ - -/* grib_nearest_class_latlon_reduced.cc*/ - -/* grib_nearest_class_lambert_conformal.cc*/ - -/* grib_nearest_class_polar_stereographic.cc*/ - -/* grib_iterator_class_polar_stereographic.cc*/ - -/* grib_iterator_class_lambert_azimuthal_equal_area.cc*/ - -/* grib_iterator_class_lambert_conformal.cc*/ - -/* grib_iterator.cc*/ +/* grib_iterator.cc */ int grib_get_data(const grib_handle* h, double* lats, double* lons, double* values); int grib_iterator_next(grib_iterator* i, double* lat, double* lon, double* value); int grib_iterator_has_next(grib_iterator* i); @@ -1284,25 +870,13 @@ int grib_iterator_reset(grib_iterator* i); int grib_iterator_init(grib_iterator* i, grib_handle* h, grib_arguments* args); int grib_iterator_delete(grib_iterator* i); -/* grib_iterator_class.cc*/ +/* grib_iterator_class.cc */ grib_iterator* grib_iterator_factory(grib_handle* h, grib_arguments* args, unsigned long flags, int* error); -/* grib_iterator_class_gaussian.cc*/ - -/* grib_iterator_class_gaussian_reduced.cc*/ - -/* grib_iterator_class_latlon_reduced.cc*/ - -/* grib_iterator_class_gen.cc*/ +/* grib_iterator_class_gen.cc */ int transform_iterator_data(grib_context* c, double* data, long iScansNegatively, long jScansPositively, long jPointsAreConsecutive, long alternativeRowScanning, size_t numPoints, long nx, long ny); -/* grib_iterator_class_latlon.cc*/ - -/* grib_iterator_class_regular.cc*/ - -/* grib_iterator_class_space_view.cc*/ - -/* grib_expression.cc*/ +/* grib_expression.cc */ int grib_expression_native_type(grib_handle* h, grib_expression* g); int grib_expression_evaluate_long(grib_handle* h, grib_expression* g, long* result); int grib_expression_evaluate_double(grib_handle* h, grib_expression* g, double* result); @@ -1321,7 +895,7 @@ double grib_arguments_get_double(grib_handle* h, grib_arguments* args, int n); grib_expression* grib_arguments_get_expression(grib_handle* h, grib_arguments* args, int n); int grib_arguments_get_count(grib_arguments* args); -/* codes_util.cc*/ +/* codes_util.cc */ double normalise_longitude_in_degrees(double lon); char get_dir_separator_char(void); int path_is_regular_file(const char* path); @@ -1333,7 +907,7 @@ int is_date_valid(long year, long month, long day, long hour, long minute, doubl int is_time_valid(long number); // number is HHMM int compute_scaled_value_and_scale_factor(double input, int64_t scaled_value_max, int64_t scale_factor_max, int64_t* ret_value, int64_t* ret_factor); -/* grib_util.cc*/ +/* grib_util.cc */ grib_handle* grib_util_sections_copy(grib_handle* hfrom, grib_handle* hto, int what, int* err); grib_string_list* grib_util_get_param_id(const char* mars_param); grib_string_list* grib_util_get_mars_param(const char* param_id); @@ -1352,7 +926,7 @@ int grib_check_data_values_minmax(grib_handle* h, const double min_val, const do int grib_producing_large_constant_fields(const grib_handle* h, int edition); int grib_util_grib_data_quality_check(grib_handle* h, double min_val, double max_val); -/* bufr_util.cc*/ +/* bufr_util.cc */ int compute_bufr_key_rank(grib_handle* h, grib_string_list* keys, const char* key); char** codes_bufr_copy_data_return_copied_keys(grib_handle* hin, grib_handle* hout, size_t* nkeys, int* err); int codes_bufr_copy_data(grib_handle* hin, grib_handle* hout); @@ -1362,7 +936,7 @@ int codes_bufr_key_is_header(const grib_handle* h, const char* key, int* err); int codes_bufr_key_is_coordinate(const grib_handle* h, const char* key, int* err); int codes_bufr_key_exclude_from_dump(const char* key); -/* string_util.cc*/ +/* string_util.cc */ int strcmp_nocase(const char* s1, const char* s2); void string_rtrim(char* s); void string_lrtrim(char** x, int do_left, int do_right); @@ -1376,7 +950,7 @@ const char* grib_get_type_name(int type); char* string_replace_char(char* str, char oldc, char newc); void string_remove_char(char* str, char c); -/* functions.cc*/ +/* functions.cc */ long grib_op_eq(long a, long b); long grib_op_ne(long a, long b); long grib_op_lt(long a, long b); @@ -1405,20 +979,18 @@ double grib_op_gt_d(double a, double b); double grib_op_ge_d(double a, double b); double grib_op_le_d(double a, double b); -/* codes_memfs.cc*/ +/* codes_memfs.cc */ FILE* codes_fopen(const char* name, const char* mode); int codes_access(const char* name, int mode); -/* grib_accessor_class_data_g2bifourier_packing.cc*/ - -/* grib_optimize_decimal_factor.cc*/ +/* grib_optimize_decimal_factor.cc */ int grib_optimize_decimal_factor(grib_accessor* a, const char* reference_value, const double pmax, const double pmin, const int knbit, const int compat_gribex, const int compat_32bit, long* kdec, long* kbin, double* ref); -/* grib_api_version.cc*/ +/* grib_api_version.cc */ const char* grib_get_git_sha1(void); const char* codes_get_build_date(void); -/* grib_bits_any_endian.cc*/ +/* grib_bits_any_endian.cc */ int grib_is_all_bits_one(int64_t val, long nbits); int grib_encode_string(unsigned char* bitStream, long* bitOffset, size_t numberOfCharacters, const char* string); char* grib_decode_string(const unsigned char* bitStream, long* bitOffset, size_t numberOfCharacters, char* string); @@ -1429,7 +1001,7 @@ int grib_encode_unsigned_longb(unsigned char* p, unsigned long val, long* bitp, int grib_encode_size_tb(unsigned char* p, size_t val, long* bitp, long nb); -/* grib_bits_any_endian_simple.cc*/ +/* grib_bits_any_endian_simple.cc */ int grib_decode_long_array(const unsigned char* p, long* bitp, long bitsPerValue, size_t n_vals, long* val); //int grib_decode_double_array(const unsigned char* p, long* bitp, long bitsPerValue, double reference_value, double s, double d, size_t n_vals, double* val); //int grib_decode_float_array(const unsigned char* p, long* bitp, long bitsPerValue, double reference_value, double s, double d, size_t n_vals, float* val); From cefa5b48853c7ca364c675adc8c4efce7e53f1bc Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 4 Apr 2024 15:21:42 +0100 Subject: [PATCH 226/244] Dead code removal: Unused data members --- src/grib_api_internal.h | 1 - tools/grib_tools.cc | 1 - tools/grib_tools.h | 1 - 3 files changed, 3 deletions(-) diff --git a/src/grib_api_internal.h b/src/grib_api_internal.h index e54b76615..9ceb25711 100644 --- a/src/grib_api_internal.h +++ b/src/grib_api_internal.h @@ -823,7 +823,6 @@ struct grib_handle grib_context* context; /** < context attached to this handle */ grib_buffer* buffer; /** < buffer attached to the handle */ grib_section* root; /** the root section*/ - grib_section* rules; /** the rules section*/ grib_dependency* dependencies; /** List of dependencies */ grib_handle* main; /** Used during reparsing */ grib_handle* kid; /** Used during reparsing */ diff --git a/tools/grib_tools.cc b/tools/grib_tools.cc index 13ce07eaa..2fe949a4a 100644 --- a/tools/grib_tools.cc +++ b/tools/grib_tools.cc @@ -77,7 +77,6 @@ static grib_runtime_options global_options = { 0, /* grib_tools_file* infile */ 0, /* grib_tools_file* outfile */ 0, /* grib_action* action */ - 0, /* grib_rule* rules */ 0, /* int dump_flags; */ 0, /* char* dump_mode; */ 0, /* repack */ diff --git a/tools/grib_tools.h b/tools/grib_tools.h index 6f54074e1..700d91027 100644 --- a/tools/grib_tools.h +++ b/tools/grib_tools.h @@ -137,7 +137,6 @@ typedef struct grib_runtime_options grib_tools_file* infile; grib_tools_file* outfile; grib_action* action; - grib_rule* rules; int dump_flags; char* dump_mode; int repack; From 157dbfb19242971a4c29b205d561db11e2a8e1eb Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 4 Apr 2024 15:42:46 +0100 Subject: [PATCH 227/244] Dead code removal: Unused members/structs --- src/grib_api_internal.h | 62 ++++++++++++----------------------------- 1 file changed, 18 insertions(+), 44 deletions(-) diff --git a/src/grib_api_internal.h b/src/grib_api_internal.h index 9ceb25711..d13edbc46 100644 --- a/src/grib_api_internal.h +++ b/src/grib_api_internal.h @@ -244,7 +244,6 @@ typedef struct grib_accessor_class grib_accessor_class; typedef struct grib_action grib_action; typedef struct grib_action_class grib_action_class; typedef struct grib_section grib_section; -typedef struct grib_packer grib_packer; typedef struct grib_codetable grib_codetable; typedef struct grib_smart_table grib_smart_table; @@ -254,7 +253,6 @@ typedef struct grib_nearest_class grib_nearest_class; typedef struct grib_dumper grib_dumper; typedef struct grib_dumper_class grib_dumper_class; typedef struct grib_dependency grib_dependency; -typedef struct string_feed string_feed; typedef struct codes_condition codes_condition; @@ -337,9 +335,6 @@ typedef double (*grib_unop_double_proc)(double); typedef int (*grib_binop_string_proc)(char*, char*); -typedef struct second_order_packed second_order_packed; -typedef void grib_expression_visit_proc(void* udata, grib_expression* e); - struct grib_key_value_list { const char* name; @@ -354,7 +349,7 @@ struct grib_key_value_list grib_key_value_list* next; }; -struct second_order_packed +/* struct second_order_packed { unsigned long nbits_per_widths; unsigned long nbits_per_group_size; @@ -363,18 +358,7 @@ struct second_order_packed unsigned long* array_of_group_size; unsigned long* array_of_group_width; long* array_of_group_refs; -}; - -/** -* an grib_compression -* Structure supporting the packing and unpacking procedures -*/ -struct grib_packer -{ - const char* name; - grib_pack_proc pack; /** < packing procedure */ - grib_unpack_proc unpack; /** < unpacking procedure */ -}; +}; */ /* --------------- */ typedef struct grib_loader grib_loader; @@ -564,17 +548,14 @@ struct grib_iterator_class grib_iterator_class** super; const char* name; size_t size; - int inited; iterator_init_class_proc init_class; - - iterator_init_proc init; - iterator_destroy_proc destroy; - - iterator_next_proc next; - iterator_previous_proc previous; - iterator_reset_proc reset; - iterator_has_next_proc has_next; + iterator_init_proc init; + iterator_destroy_proc destroy; + iterator_next_proc next; + iterator_previous_proc previous; + iterator_reset_proc reset; + iterator_has_next_proc has_next; }; struct grib_nearest_class @@ -582,14 +563,11 @@ struct grib_nearest_class grib_nearest_class** super; const char* name; size_t size; - int inited; nearest_init_class_proc init_class; - - nearest_init_proc init; - nearest_destroy_proc destroy; - - nearest_find_proc find; + nearest_init_proc init; + nearest_destroy_proc destroy; + nearest_find_proc find; }; /* --------------- */ @@ -1084,17 +1062,13 @@ struct grib_expression_class const char* name; size_t size; int inited; - - expression_init_proc init; - expression_destroy_proc destroy; - - expression_print_proc print; - expression_add_dependency_proc add_dependency; - - expression_native_type_proc native_type; - expression_get_name_proc get_name; - - expression_evaluate_long_proc evaluate_long; + expression_init_proc init; + expression_destroy_proc destroy; + expression_print_proc print; + expression_add_dependency_proc add_dependency; + expression_native_type_proc native_type; + expression_get_name_proc get_name; + expression_evaluate_long_proc evaluate_long; expression_evaluate_double_proc evaluate_double; expression_evaluate_string_proc evaluate_string; }; From 49c4ca3cbffacb4e34f26c2cb2dd6c8414cebe8c Mon Sep 17 00:00:00 2001 From: shahramn Date: Thu, 4 Apr 2024 17:00:05 +0100 Subject: [PATCH 228/244] ECC-1795: Geoiterator for polar stereographic: Keys orientationOfTheGridInDegrees and LaDInDegrees decoded as integers --- src/grib_iterator_class_polar_stereographic.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/grib_iterator_class_polar_stereographic.cc b/src/grib_iterator_class_polar_stereographic.cc index b9c0314a3..1f0c59d69 100644 --- a/src/grib_iterator_class_polar_stereographic.cc +++ b/src/grib_iterator_class_polar_stereographic.cc @@ -123,7 +123,8 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) double *lats, *lons; /* arrays for latitudes and longitudes */ double lonFirstInDegrees, latFirstInDegrees, radius; double x, y, Dx, Dy; - long nx, ny, centralLongitudeInDegrees, centralLatitudeInDegrees; + long nx, ny; + double centralLongitudeInDegrees, centralLatitudeInDegrees; long alternativeRowScanning, iScansNegatively, i, j; long jScansPositively, jPointsAreConsecutive, southPoleOnPlane; double centralLongitude, centralLatitude; /* in radians */ @@ -173,9 +174,9 @@ static int init(grib_iterator* iter, grib_handle* h, grib_arguments* args) return ret; if ((ret = grib_get_long_internal(h, s_southPoleOnPlane, &southPoleOnPlane)) != GRIB_SUCCESS) return ret; - if ((ret = grib_get_long_internal(h, s_centralLongitude, ¢ralLongitudeInDegrees)) != GRIB_SUCCESS) + if ((ret = grib_get_double_internal(h, s_centralLongitude, ¢ralLongitudeInDegrees)) != GRIB_SUCCESS) return ret; - if ((ret = grib_get_long_internal(h, s_centralLatitude, ¢ralLatitudeInDegrees)) != GRIB_SUCCESS) + if ((ret = grib_get_double_internal(h, s_centralLatitude, ¢ralLatitudeInDegrees)) != GRIB_SUCCESS) return ret; if ((ret = grib_get_double_internal(h, s_Dx, &Dx)) != GRIB_SUCCESS) return ret; From 698d81177644f5fe370812c8b3b37600d800b201 Mon Sep 17 00:00:00 2001 From: Matthew Griffith Date: Fri, 5 Apr 2024 10:31:43 +0000 Subject: [PATCH 229/244] ECC-1796: mars step aliased to stepRange for all datasets except climate-dt where step is not used. --- definitions/grib2/post_meta_data.hook.products_12.def | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/definitions/grib2/post_meta_data.hook.products_12.def b/definitions/grib2/post_meta_data.hook.products_12.def index c344f6774..d7ad4e586 100644 --- a/definitions/grib2/post_meta_data.hook.products_12.def +++ b/definitions/grib2/post_meta_data.hook.products_12.def @@ -7,3 +7,8 @@ concept destineOrigin(unknown, "destineOriginConcept.def", conceptsDir2, concept # ECC-1794: DestinE data does not have the domain key unalias mars.domain; + +# ECC-1796: stepRange indexing for DestinE ExtremesDT and On-Demand ExtremesDT data +if (!(dataset is "climate-dt")) { + alias mars.step=stepRange; +} From d9157db3d7d7f78e43682ab2f6e78ba3558bb9f5 Mon Sep 17 00:00:00 2001 From: Matthew Griffith Date: Fri, 5 Apr 2024 10:59:18 +0000 Subject: [PATCH 230/244] ECC-1796: Modified test as now we must also set dataset=climate-dt, since in other datasets mars.step is set to stepRange --- tests/grib_ecc-1691.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/grib_ecc-1691.sh b/tests/grib_ecc-1691.sh index 97c38108d..bb0cb6d62 100755 --- a/tests/grib_ecc-1691.sh +++ b/tests/grib_ecc-1691.sh @@ -64,11 +64,12 @@ ${tools_dir}/grib_set -s numberOfDataPoints=12582912,gridDefinitionTemplateNumbe grib_check_key_equals $temp_grib_a "gridSpecification" "H1024" -# Now check streams. +# Now check streams for use in climate-dt. # Setting stream clte and type fc should set mars.date and mars.time to dataDate and dataTime, # and mars.step should be unaliased +# We must also set dataset=climate-dt, since in other datasets mars.step is set to stepRange -${tools_dir}/grib_set -s stream=clte,type=fc $destine_sample $temp_grib_a +${tools_dir}/grib_set -s dataset=climate-dt,stream=clte,type=fc $destine_sample $temp_grib_a result1=$( ${tools_dir}/grib_get -p mars.date,mars.time $temp_grib_a ) result2=$( ${tools_dir}/grib_get -p dataDate,dataTime $temp_grib_a ) @@ -79,8 +80,9 @@ ${tools_dir}/grib_ls -jm $temp_grib_a # Setting stream clmn and type fc should set mars.year and mars.month to year and month, # and mars.date, mars.time, mars.step should be unaliased +# We must also set dataset=climate-dt, since in other datasets mars.step is set to stepRange -${tools_dir}/grib_set -s stream=clmn,type=fc $destine_sample $temp_grib_a +${tools_dir}/grib_set -s dataset=climate-dt,stream=clmn,type=fc $destine_sample $temp_grib_a result1=$( ${tools_dir}/grib_get -p mars.year,mars.month $temp_grib_a ) result2=$( ${tools_dir}/grib_get -p year,month $temp_grib_a ) From fab9f0ec6bc503ba39efbb66494b9cd688f98ada Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 5 Apr 2024 14:54:20 +0100 Subject: [PATCH 231/244] ECC-1797: GRIB2: Correct order of keys in templates 4.51 and 4.91 regarding the WMO Manual on Codes --- definitions/grib2/template.4.categorical.def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/definitions/grib2/template.4.categorical.def b/definitions/grib2/template.4.categorical.def index 102d50e51..6d0393f94 100644 --- a/definitions/grib2/template.4.categorical.def +++ b/definitions/grib2/template.4.categorical.def @@ -5,8 +5,8 @@ unsigned[1] numberOfCategories : dump; # Categories categories list(numberOfCategories) { - codetable[1] categoryType ('4.91.table',masterDir,localDir): dump; unsigned[1] codeFigure : dump; + codetable[1] categoryType ('4.91.table',masterDir,localDir): dump; unsigned[1] scaleFactorOfLowerLimit : can_be_missing,dump ; unsigned[4] scaledValueOfLowerLimit : can_be_missing,dump ; unsigned[1] scaleFactorOfUpperLimit : can_be_missing,dump; From c63a9f621b566d7b199e7eef37649f4c1727f813 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 5 Apr 2024 14:54:41 +0100 Subject: [PATCH 232/244] Testing: logical OR for doubles --- tests/grib_filter.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/grib_filter.sh b/tests/grib_filter.sh index 660d568b3..42e4eccdf 100755 --- a/tests/grib_filter.sh +++ b/tests/grib_filter.sh @@ -366,6 +366,14 @@ cat >$tempFilt < $tempOut + +# Logical OR with doubles +cat >$tempFilt < 45.01 || referenceValue < 1.1) { print "yes"; } +EOF +${tools_dir}/grib_filter $tempFilt $ECCODES_SAMPLES_PATH/GRIB2.tmpl #> $tempOut + + # Decode an integer key as string cat >$tempFilt < Date: Fri, 5 Apr 2024 17:32:34 +0100 Subject: [PATCH 233/244] Expressions: Fix the print function --- src/grib_expression_class_logical_and.cc | 6 +----- src/grib_expression_class_logical_or.cc | 4 +--- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/grib_expression_class_logical_and.cc b/src/grib_expression_class_logical_and.cc index 9a25e54c1..902119a5e 100644 --- a/src/grib_expression_class_logical_and.cc +++ b/src/grib_expression_class_logical_and.cc @@ -82,7 +82,6 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) int ret; grib_expression_logical_and* e = (grib_expression_logical_and*)g; - switch (grib_expression_native_type(h, e->left)) { case GRIB_TYPE_LONG: ret = grib_expression_evaluate_long(h, e->left, &v1); @@ -129,11 +128,8 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) static int evaluate_double(grib_expression* g, grib_handle* h, double* dres) { long lres = 0; - int ret = 0; - - ret = evaluate_long(g, h, &lres); + int ret = evaluate_long(g, h, &lres); *dres = (double)lres; - return ret; } diff --git a/src/grib_expression_class_logical_or.cc b/src/grib_expression_class_logical_or.cc index ce5e4d765..772a73d8a 100644 --- a/src/grib_expression_class_logical_or.cc +++ b/src/grib_expression_class_logical_or.cc @@ -129,10 +129,8 @@ static int evaluate_long(grib_expression* g, grib_handle* h, long* lres) static int evaluate_double(grib_expression* g, grib_handle* h, double* dres) { long lres = 0; - int ret = evaluate_long(g, h, &lres); *dres = (double)lres; - return ret; } @@ -141,7 +139,7 @@ static void print(grib_context* c, grib_expression* g, grib_handle* f) grib_expression_logical_or* e = (grib_expression_logical_or*)g; printf("("); grib_expression_print(c, e->left, f); - printf(" && "); + printf(" || "); grib_expression_print(c, e->right, f); printf(")"); } From 8ae55cbf0cdfba8e62e69815fd943f2ef7057214 Mon Sep 17 00:00:00 2001 From: shahramn Date: Fri, 5 Apr 2024 17:32:52 +0100 Subject: [PATCH 234/244] Tools: Where clause with doubles --- tests/grib_ls.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/grib_ls.sh b/tests/grib_ls.sh index 8e895b48a..be4f7a38b 100755 --- a/tests/grib_ls.sh +++ b/tests/grib_ls.sh @@ -195,8 +195,8 @@ grep -q "36 of 38 messages" $tempText ${tools_dir}/grib_ls -w scaleFactorOfSecondFixedSurface!=missing $file > $tempText grep -q "2 of 38 messages" $tempText -${tools_dir}/grib_ls -w referenceValue=0 $file > $tempText -grep -q "11 of 38 messages" $tempText +${tools_dir}/grib_ls -w referenceValue:d=0 $file > $tempText +grep -q "5 of 38 messages" $tempText file=mixed.grib # Has 14 messages ${tools_dir}/grib_ls -w packingType=grid_simple,gridType=regular_ll/regular_gg $file > $tempText From 69ec58ed14e9156cf3ed4b50b3b4b4f3679ea5b2 Mon Sep 17 00:00:00 2001 From: shahramn Date: Sun, 7 Apr 2024 14:28:29 +0100 Subject: [PATCH 235/244] Error handling --- ...ib_accessor_class_g1_half_byte_codeflag.cc | 17 ++++++-------- src/grib_accessor_class_smart_table.cc | 22 ++++++++----------- src/grib_accessor_class_transient_darray.cc | 6 +++-- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/grib_accessor_class_g1_half_byte_codeflag.cc b/src/grib_accessor_class_g1_half_byte_codeflag.cc index c275253e5..c7d9828e0 100644 --- a/src/grib_accessor_class_g1_half_byte_codeflag.cc +++ b/src/grib_accessor_class_g1_half_byte_codeflag.cc @@ -115,13 +115,11 @@ static void dump(grib_accessor* a, grib_dumper* dumper) static int unpack_long(grib_accessor* a, long* val, size_t* len) { - unsigned char dat = 0; if (*len < 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s it contains %d values ", a->name, 1); - *len = 0; + *len = 1; return GRIB_ARRAY_TOO_SMALL; } - dat = grib_handle_of_accessor(a)->buffer->data[a->offset] & 0x0f; + unsigned char dat = grib_handle_of_accessor(a)->buffer->data[a->offset] & 0x0f; *val = dat; *len = 1; @@ -130,18 +128,17 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) static int pack_long(grib_accessor* a, const long* val, size_t* len) { - int ret = 0; if (*len < 1) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s it contains %d values ", a->name, 1); - *len = 0; + *len = 1; return GRIB_ARRAY_TOO_SMALL; } - /* printf("HALF BYTE pack long %ld %02x\n",*val,grib_handle_of_accessor(a)->buffer->data[a->offset]);*/ + + // printf("HALF BYTE pack long %ld %02x\n",*val,grib_handle_of_accessor(a)->buffer->data[a->offset]); grib_handle_of_accessor(a)->buffer->data[a->offset] = (a->parent->h->buffer->data[a->offset] & 0xf0) | (*val & 0x0f); - /* printf("HALF BYTE pack long %ld %02x\n",*val,grib_handle_of_accessor(a)->buffer->data[a->offset]);*/ + // printf("HALF BYTE pack long %ld %02x\n",*val,grib_handle_of_accessor(a)->buffer->data[a->offset]); *len = 1; - return ret; + return GRIB_SUCCESS; } static int get_native_type(grib_accessor* a) diff --git a/src/grib_accessor_class_smart_table.cc b/src/grib_accessor_class_smart_table.cc index 70f964c7d..a3f257312 100644 --- a/src/grib_accessor_class_smart_table.cc +++ b/src/grib_accessor_class_smart_table.cc @@ -8,10 +8,6 @@ * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction. */ -/***************************************** - * Enrico Fucile - ****************************************/ - #include "grib_api_internal.h" #include @@ -253,10 +249,10 @@ static grib_smart_table* load_table(grib_accessor* a) next = next->next; } - /* Note: self->widthOfCode is chosen so that 2^width is bigger than the maximum descriptor code, - * which for BUFR4 is the Table C operator 243255 - */ - size = (1ULL << self->widthOfCode); /* = 2^self->widthOfCode (as a 64 bit number) */ + // Note: self->widthOfCode is chosen so that 2^width is bigger than the maximum descriptor code, + // which for BUFR4 is the Table C operator 243255 + // + size = (1ULL << self->widthOfCode); // = 2^self->widthOfCode (as a 64 bit number) t = (grib_smart_table*)grib_context_malloc_clear_persistent(c, sizeof(grib_smart_table)); t->entries = (grib_smart_table_entry*)grib_context_malloc_clear_persistent(c, size * sizeof(grib_smart_table_entry)); @@ -344,7 +340,7 @@ static int grib_load_smart_table(grib_context* c, const char* filename, *p = 0; numberOfColumns = 0; - /* The highest possible descriptor code must fit into t->numberOfEntries */ + // The highest possible descriptor code must fit into t->numberOfEntries DEBUG_ASSERT(code < t->numberOfEntries); while (*s) { char* tcol = t->entries[code].column[numberOfColumns]; @@ -455,7 +451,7 @@ static int get_table_codes(grib_accessor* a) if (!self->dirty) return 0; - table_size = (1 << self->widthOfCode); /* 2 ^ self->widthOfCode */ + table_size = (1 << self->widthOfCode); // 2 ^ self->widthOfCode if (!self->table) self->table = load_table(a); @@ -523,8 +519,8 @@ static void destroy(grib_context* context, grib_accessor* a) static int get_native_type(grib_accessor* a) { int type = GRIB_TYPE_LONG; - /*printf("---------- %s flags=%ld GRIB_ACCESSOR_FLAG_STRING_TYPE=%d\n", - a->name,a->flags,GRIB_ACCESSOR_FLAG_STRING_TYPE);*/ + //printf("---------- %s flags=%ld GRIB_ACCESSOR_FLAG_STRING_TYPE=%d\n", + // a->name,a->flags,GRIB_ACCESSOR_FLAG_STRING_TYPE); if (a->flags & GRIB_ACCESSOR_FLAG_STRING_TYPE) type = GRIB_TYPE_STRING; return type; @@ -546,7 +542,7 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) if (*len < self->tableCodesSize) { grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size (%zu) for %s, it contains %zu values", *len, a->name, self->tableCodesSize); - *len = 0; + *len = self->tableCodesSize; return GRIB_ARRAY_TOO_SMALL; } diff --git a/src/grib_accessor_class_transient_darray.cc b/src/grib_accessor_class_transient_darray.cc index ba830849a..51dbc2433 100644 --- a/src/grib_accessor_class_transient_darray.cc +++ b/src/grib_accessor_class_transient_darray.cc @@ -159,7 +159,8 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len) value_count(a, &count); if (*len < count) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %ld, required %ld) ", a->name, *len, count); + grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %zu, required %ld)", a->name, *len, count); + *len = count; return GRIB_ARRAY_TOO_SMALL; } @@ -178,7 +179,8 @@ static int unpack_long(grib_accessor* a, long* val, size_t* len) value_count(a, &count); if (*len < count) { - grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %ld, required %ld) ", a->name, *len, count); + grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %zu, required %ld)", a->name, *len, count); + *len = count; return GRIB_ARRAY_TOO_SMALL; } From c7e802b850d5b5a0bfc06bdf8145f9e4f8c1dab6 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 8 Apr 2024 09:12:33 +0000 Subject: [PATCH 236/244] ECC-1789: GRIB2: Add parameters 51/52 to pseudo-centre CERISE --- .../grib2/localConcepts/cerise/cfVarName.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/name.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/paramId.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/shortName.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/units.def | 24 +++++++++++++++++++ 5 files changed, 120 insertions(+) diff --git a/definitions/grib2/localConcepts/cerise/cfVarName.def b/definitions/grib2/localConcepts/cerise/cfVarName.def index 6810066ae..a6e50239e 100644 --- a/definitions/grib2/localConcepts/cerise/cfVarName.def +++ b/definitions/grib2/localConcepts/cerise/cfVarName.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'mx2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'mn2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'sd' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/name.def b/definitions/grib2/localConcepts/cerise/name.def index d028b2155..991287cf7 100644 --- a/definitions/grib2/localConcepts/cerise/name.def +++ b/definitions/grib2/localConcepts/cerise/name.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'Maximum temperature at 2 metres in the last 24 hours' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'Minimum temperature at 2 metres in the last 24 hours' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'Snow depth' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/paramId.def b/definitions/grib2/localConcepts/cerise/paramId.def index 96ac8ad97..447a8f766 100644 --- a/definitions/grib2/localConcepts/cerise/paramId.def +++ b/definitions/grib2/localConcepts/cerise/paramId.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'51' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'52' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth '141' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/shortName.def b/definitions/grib2/localConcepts/cerise/shortName.def index 6810066ae..a6e50239e 100644 --- a/definitions/grib2/localConcepts/cerise/shortName.def +++ b/definitions/grib2/localConcepts/cerise/shortName.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'mx2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'mn2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'sd' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/units.def b/definitions/grib2/localConcepts/cerise/units.def index d02b75b94..8ac3cae5b 100644 --- a/definitions/grib2/localConcepts/cerise/units.def +++ b/definitions/grib2/localConcepts/cerise/units.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'm of water equivalent' = { localTablesVersion = 1 ; From 1e077b92796eda8288407b130b6ef29592081108 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 8 Apr 2024 10:23:36 +0100 Subject: [PATCH 237/244] ECC-1789: GRIB2: Add parameters 51/52 to pseudo-centre CERISE --- .../grib2/localConcepts/cerise/cfVarName.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/name.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/paramId.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/shortName.def | 24 +++++++++++++++++++ .../grib2/localConcepts/cerise/units.def | 24 +++++++++++++++++++ 5 files changed, 120 insertions(+) diff --git a/definitions/grib2/localConcepts/cerise/cfVarName.def b/definitions/grib2/localConcepts/cerise/cfVarName.def index 6810066ae..a6e50239e 100644 --- a/definitions/grib2/localConcepts/cerise/cfVarName.def +++ b/definitions/grib2/localConcepts/cerise/cfVarName.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'mx2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'mn2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'sd' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/name.def b/definitions/grib2/localConcepts/cerise/name.def index d028b2155..991287cf7 100644 --- a/definitions/grib2/localConcepts/cerise/name.def +++ b/definitions/grib2/localConcepts/cerise/name.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'Maximum temperature at 2 metres in the last 24 hours' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'Minimum temperature at 2 metres in the last 24 hours' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'Snow depth' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/paramId.def b/definitions/grib2/localConcepts/cerise/paramId.def index 96ac8ad97..447a8f766 100644 --- a/definitions/grib2/localConcepts/cerise/paramId.def +++ b/definitions/grib2/localConcepts/cerise/paramId.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'51' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'52' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth '141' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/shortName.def b/definitions/grib2/localConcepts/cerise/shortName.def index 6810066ae..a6e50239e 100644 --- a/definitions/grib2/localConcepts/cerise/shortName.def +++ b/definitions/grib2/localConcepts/cerise/shortName.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'mx2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'mn2t24' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'sd' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/cerise/units.def b/definitions/grib2/localConcepts/cerise/units.def index d02b75b94..8ac3cae5b 100644 --- a/definitions/grib2/localConcepts/cerise/units.def +++ b/definitions/grib2/localConcepts/cerise/units.def @@ -17,6 +17,30 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Maximum temperature at 2 metres in the last 24 hours +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 2 ; + lengthOfTimeRange = 24 ; + } +#Minimum temperature at 2 metres in the last 24 hours +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + indicatorOfUnitForTimeRange = 1 ; + typeOfStatisticalProcessing = 3 ; + lengthOfTimeRange = 24 ; + } #Snow depth 'm of water equivalent' = { localTablesVersion = 1 ; From 0945dec141c7ef0ebccf8ab3deb6618b595bbcde Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 8 Apr 2024 12:43:34 +0000 Subject: [PATCH 238/244] ECC-1788: GRIB2: Add mean parameters for ECMWF and CERISE (Part 1) --- .../grib2/localConcepts/cerise/cfVarName.def | 77 +++++++++++ .../grib2/localConcepts/cerise/name.def | 77 +++++++++++ .../grib2/localConcepts/cerise/paramId.def | 77 +++++++++++ .../grib2/localConcepts/cerise/shortName.def | 77 +++++++++++ .../grib2/localConcepts/cerise/units.def | 77 +++++++++++ .../grib2/localConcepts/ecmf/cfVarName.def | 122 +++++++++++++++--- .../localConcepts/ecmf/cfVarName.legacy.def | 24 ++++ definitions/grib2/localConcepts/ecmf/name.def | 122 +++++++++++++++--- .../grib2/localConcepts/ecmf/name.legacy.def | 24 ++++ .../grib2/localConcepts/ecmf/paramId.def | 122 +++++++++++++++--- .../localConcepts/ecmf/paramId.legacy.def | 24 ++++ .../grib2/localConcepts/ecmf/shortName.def | 122 +++++++++++++++--- .../localConcepts/ecmf/shortName.legacy.def | 24 ++++ .../grib2/localConcepts/ecmf/units.def | 122 +++++++++++++++--- .../grib2/localConcepts/ecmf/units.legacy.def | 24 ++++ 15 files changed, 1010 insertions(+), 105 deletions(-) diff --git a/definitions/grib2/localConcepts/cerise/cfVarName.def b/definitions/grib2/localConcepts/cerise/cfVarName.def index a6e50239e..0ccc6c90f 100644 --- a/definitions/grib2/localConcepts/cerise/cfVarName.def +++ b/definitions/grib2/localConcepts/cerise/cfVarName.def @@ -152,6 +152,64 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'msd_m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'mlcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'mmcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'mhcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'mfal_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean large-scale precipitation rate +'mlsprt' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean convective precipitation rate +'cprate' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total snowfall rate 'mtsfr' = { localTablesVersion = 1 ; @@ -170,6 +228,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Mean runoff rate +'mrort' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total precipitation rate 'tprate' = { localTablesVersion = 1 ; @@ -178,4 +245,14 @@ parameterNumber = 193 ; typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; + } +#Mean total cloud cover +'meantcc' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/cerise/name.def b/definitions/grib2/localConcepts/cerise/name.def index 991287cf7..cac36cdea 100644 --- a/definitions/grib2/localConcepts/cerise/name.def +++ b/definitions/grib2/localConcepts/cerise/name.def @@ -152,6 +152,64 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'Time-mean snow depth' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'Time-mean low cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'Time-mean medium cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'Time-mean high cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'Time-mean forecast albedo' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean large-scale precipitation rate +'Mean large-scale precipitation rate' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean convective precipitation rate +'Mean convective precipitation rate' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total snowfall rate 'Mean total snowfall rate' = { localTablesVersion = 1 ; @@ -170,6 +228,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Mean runoff rate +'Mean runoff rate' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total precipitation rate 'Mean total precipitation rate' = { localTablesVersion = 1 ; @@ -178,4 +245,14 @@ parameterNumber = 193 ; typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; + } +#Mean total cloud cover +'Mean total cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/cerise/paramId.def b/definitions/grib2/localConcepts/cerise/paramId.def index 447a8f766..c4af1e971 100644 --- a/definitions/grib2/localConcepts/cerise/paramId.def +++ b/definitions/grib2/localConcepts/cerise/paramId.def @@ -152,6 +152,64 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'235141' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'235186' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'235187' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'235188' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'235243' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean large-scale precipitation rate +'172142' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean convective precipitation rate +'172143' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total snowfall rate '172144' = { localTablesVersion = 1 ; @@ -170,6 +228,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Mean runoff rate +'172205' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total precipitation rate '172228' = { localTablesVersion = 1 ; @@ -178,4 +245,14 @@ parameterNumber = 193 ; typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; + } +#Mean total cloud cover +'228006' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/cerise/shortName.def b/definitions/grib2/localConcepts/cerise/shortName.def index a6e50239e..0ccc6c90f 100644 --- a/definitions/grib2/localConcepts/cerise/shortName.def +++ b/definitions/grib2/localConcepts/cerise/shortName.def @@ -152,6 +152,64 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'msd_m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'mlcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'mmcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'mhcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'mfal_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean large-scale precipitation rate +'mlsprt' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean convective precipitation rate +'cprate' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total snowfall rate 'mtsfr' = { localTablesVersion = 1 ; @@ -170,6 +228,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Mean runoff rate +'mrort' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total precipitation rate 'tprate' = { localTablesVersion = 1 ; @@ -178,4 +245,14 @@ parameterNumber = 193 ; typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; + } +#Mean total cloud cover +'meantcc' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/cerise/units.def b/definitions/grib2/localConcepts/cerise/units.def index 8ac3cae5b..afc663307 100644 --- a/definitions/grib2/localConcepts/cerise/units.def +++ b/definitions/grib2/localConcepts/cerise/units.def @@ -152,6 +152,64 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'m of water equivalent' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean large-scale precipitation rate +'m s**-1' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean convective precipitation rate +'m s**-1' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total snowfall rate 'm of water equivalent s**-1' = { localTablesVersion = 1 ; @@ -170,6 +228,15 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Mean runoff rate +'m s**-1' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Mean total precipitation rate 'm s**-1' = { localTablesVersion = 1 ; @@ -178,4 +245,14 @@ parameterNumber = 193 ; typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; + } +#Mean total cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } diff --git a/definitions/grib2/localConcepts/ecmf/cfVarName.def b/definitions/grib2/localConcepts/ecmf/cfVarName.def index 9e62226b7..0387acf1f 100644 --- a/definitions/grib2/localConcepts/ecmf/cfVarName.def +++ b/definitions/grib2/localConcepts/ecmf/cfVarName.def @@ -2579,6 +2579,24 @@ parameterCategory = 171 ; parameterNumber = 122 ; } +#Mean surface runoff rate +'msror' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sub-surface runoff rate +'mssror' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Volcanic ash aerosol mixing ratio 'aermr13' = { discipline = 192 ; @@ -13825,6 +13843,46 @@ typeOfSecondFixedSurface = 255 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'msd_m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'mlcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'mmcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'mhcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'mfal_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } #Covariance between 2-metre temperature and volumetric soil water layer 1 'covar_t2m_swvl1' = { localTablesVersion = 1 ; @@ -18987,21 +19045,30 @@ } #Mean large-scale precipitation rate 'mlsprt' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 142 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean convective precipitation rate 'cprate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 143 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean total snowfall rate 'mtsfr' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 144 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Boundary layer dissipation 'bldrate' = { @@ -19083,9 +19150,12 @@ } #Evaporation 'erate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 182 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean sunshine duration rate 'msdr' = { @@ -19113,9 +19183,12 @@ } #Mean runoff rate 'mrort' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 205 ; + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Top net solar radiation, clear sky 'p208.172' = { @@ -19149,9 +19222,12 @@ } #Mean total precipitation rate 'tprate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 228 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Convective snowfall 'p239.172' = { @@ -21849,9 +21925,13 @@ } #Mean total cloud cover 'meantcc' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 6 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } #Surface temperature significance 'sts' = { diff --git a/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def b/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def index ab4af4326..968598eff 100644 --- a/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def @@ -1369,3 +1369,27 @@ parameterCategory = 172 ; parameterNumber = 228 ; } +#Mean large-scale precipitation rate +'mlsprt' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 142 ; +} +#Mean convective precipitation rate +'cprate' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 143 ; +} +#Mean runoff rate +'mrort' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 205 ; +} +#Mean total cloud cover +'meantcc' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 6 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/name.def b/definitions/grib2/localConcepts/ecmf/name.def index 30466e4c5..a5874c159 100644 --- a/definitions/grib2/localConcepts/ecmf/name.def +++ b/definitions/grib2/localConcepts/ecmf/name.def @@ -2579,6 +2579,24 @@ parameterCategory = 171 ; parameterNumber = 122 ; } +#Mean surface runoff rate +'Mean surface runoff rate' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sub-surface runoff rate +'Mean sub-surface runoff rate' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Volcanic ash aerosol mixing ratio 'Volcanic ash aerosol mixing ratio' = { discipline = 192 ; @@ -13825,6 +13843,46 @@ typeOfSecondFixedSurface = 255 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'Time-mean snow depth' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'Time-mean low cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'Time-mean medium cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'Time-mean high cloud cover' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'Time-mean forecast albedo' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } #Covariance between 2-metre temperature and volumetric soil water layer 1 'Covariance between 2-metre temperature and volumetric soil water layer 1' = { localTablesVersion = 1 ; @@ -18987,21 +19045,30 @@ } #Mean large-scale precipitation rate 'Mean large-scale precipitation rate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 142 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean convective precipitation rate 'Mean convective precipitation rate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 143 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean total snowfall rate 'Mean total snowfall rate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 144 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Boundary layer dissipation 'Boundary layer dissipation' = { @@ -19083,9 +19150,12 @@ } #Evaporation 'Evaporation' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 182 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean sunshine duration rate 'Mean sunshine duration rate' = { @@ -19113,9 +19183,12 @@ } #Mean runoff rate 'Mean runoff rate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 205 ; + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Top net solar radiation, clear sky 'Top net solar radiation, clear sky' = { @@ -19149,9 +19222,12 @@ } #Mean total precipitation rate 'Mean total precipitation rate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 228 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Convective snowfall 'Convective snowfall' = { @@ -21849,9 +21925,13 @@ } #Mean total cloud cover 'Mean total cloud cover' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 6 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } #Surface temperature significance 'Surface temperature significance' = { diff --git a/definitions/grib2/localConcepts/ecmf/name.legacy.def b/definitions/grib2/localConcepts/ecmf/name.legacy.def index c3e229a57..56a43ad19 100644 --- a/definitions/grib2/localConcepts/ecmf/name.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/name.legacy.def @@ -1369,3 +1369,27 @@ parameterCategory = 172 ; parameterNumber = 228 ; } +#Mean large-scale precipitation rate +'Mean large-scale precipitation rate' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 142 ; +} +#Mean convective precipitation rate +'Mean convective precipitation rate' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 143 ; +} +#Mean runoff rate +'Mean runoff rate' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 205 ; +} +#Mean total cloud cover +'Mean total cloud cover' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 6 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/paramId.def b/definitions/grib2/localConcepts/ecmf/paramId.def index 6ba1493c0..4b6e89a60 100644 --- a/definitions/grib2/localConcepts/ecmf/paramId.def +++ b/definitions/grib2/localConcepts/ecmf/paramId.def @@ -2579,6 +2579,24 @@ parameterCategory = 171 ; parameterNumber = 122 ; } +#Mean surface runoff rate +'172008' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sub-surface runoff rate +'172009' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Volcanic ash aerosol mixing ratio '210013' = { discipline = 192 ; @@ -13825,6 +13843,46 @@ typeOfSecondFixedSurface = 255 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'235141' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'235186' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'235187' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'235188' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'235243' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } #Covariance between 2-metre temperature and volumetric soil water layer 1 '254001' = { localTablesVersion = 1 ; @@ -18987,21 +19045,30 @@ } #Mean large-scale precipitation rate '172142' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 142 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean convective precipitation rate '172143' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 143 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean total snowfall rate '172144' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 144 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Boundary layer dissipation '172145' = { @@ -19083,9 +19150,12 @@ } #Evaporation '172182' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 182 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean sunshine duration rate '172189' = { @@ -19113,9 +19183,12 @@ } #Mean runoff rate '172205' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 205 ; + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Top net solar radiation, clear sky '172208' = { @@ -19149,9 +19222,12 @@ } #Mean total precipitation rate '172228' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 228 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Convective snowfall '172239' = { @@ -21849,9 +21925,13 @@ } #Mean total cloud cover '228006' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 6 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } #Surface temperature significance '234139' = { diff --git a/definitions/grib2/localConcepts/ecmf/paramId.legacy.def b/definitions/grib2/localConcepts/ecmf/paramId.legacy.def index aaf6da765..95fe9045d 100644 --- a/definitions/grib2/localConcepts/ecmf/paramId.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/paramId.legacy.def @@ -1369,3 +1369,27 @@ parameterCategory = 172 ; parameterNumber = 228 ; } +#Mean large-scale precipitation rate +'172142' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 142 ; +} +#Mean convective precipitation rate +'172143' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 143 ; +} +#Mean runoff rate +'172205' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 205 ; +} +#Mean total cloud cover +'228006' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 6 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/shortName.def b/definitions/grib2/localConcepts/ecmf/shortName.def index 1ec2bca2e..0a34950d3 100644 --- a/definitions/grib2/localConcepts/ecmf/shortName.def +++ b/definitions/grib2/localConcepts/ecmf/shortName.def @@ -2579,6 +2579,24 @@ parameterCategory = 171 ; parameterNumber = 122 ; } +#Mean surface runoff rate +'msror' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sub-surface runoff rate +'mssror' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Volcanic ash aerosol mixing ratio 'aermr13' = { discipline = 192 ; @@ -13825,6 +13843,46 @@ typeOfSecondFixedSurface = 255 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'msd_m' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'mlcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'mmcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'mhcc_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'mfal_frac' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } #Covariance between 2-metre temperature and volumetric soil water layer 1 'covar_t2m_swvl1' = { localTablesVersion = 1 ; @@ -18987,21 +19045,30 @@ } #Mean large-scale precipitation rate 'mlsprt' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 142 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean convective precipitation rate 'cprate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 143 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean total snowfall rate 'mtsfr' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 144 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Boundary layer dissipation 'bldrate' = { @@ -19083,9 +19150,12 @@ } #Evaporation 'erate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 182 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean sunshine duration rate 'msdr' = { @@ -19113,9 +19183,12 @@ } #Mean runoff rate 'mrort' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 205 ; + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Top net solar radiation, clear sky '~' = { @@ -19149,9 +19222,12 @@ } #Mean total precipitation rate 'tprate' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 228 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Convective snowfall '~' = { @@ -21849,9 +21925,13 @@ } #Mean total cloud cover 'meantcc' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 6 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } #Surface temperature significance 'sts' = { diff --git a/definitions/grib2/localConcepts/ecmf/shortName.legacy.def b/definitions/grib2/localConcepts/ecmf/shortName.legacy.def index ec7ef430b..dc09fa250 100644 --- a/definitions/grib2/localConcepts/ecmf/shortName.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/shortName.legacy.def @@ -1369,3 +1369,27 @@ parameterCategory = 172 ; parameterNumber = 228 ; } +#Mean large-scale precipitation rate +'mlsprt' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 142 ; +} +#Mean convective precipitation rate +'cprate' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 143 ; +} +#Mean runoff rate +'mrort' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 205 ; +} +#Mean total cloud cover +'meantcc' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 6 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/units.def b/definitions/grib2/localConcepts/ecmf/units.def index 506f9c365..ffdd24df0 100644 --- a/definitions/grib2/localConcepts/ecmf/units.def +++ b/definitions/grib2/localConcepts/ecmf/units.def @@ -2579,6 +2579,24 @@ parameterCategory = 171 ; parameterNumber = 122 ; } +#Mean surface runoff rate +'m s**-1' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sub-surface runoff rate +'m s**-1' = { + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Volcanic ash aerosol mixing ratio 'kg kg**-1' = { discipline = 192 ; @@ -13825,6 +13843,46 @@ typeOfSecondFixedSurface = 255 ; typeOfStatisticalProcessing = 1 ; } +#Time-mean snow depth +'m of water equivalent' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 254 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean medium cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high cloud cover +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast albedo +'(0 - 1)' = { + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + typeOfStatisticalProcessing = 0 ; + } #Covariance between 2-metre temperature and volumetric soil water layer 1 'K m**3 m**-3' = { localTablesVersion = 1 ; @@ -18987,21 +19045,30 @@ } #Mean large-scale precipitation rate 'm s**-1' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 142 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean convective precipitation rate 'm s**-1' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 143 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean total snowfall rate 'm of water equivalent s**-1' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 144 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Boundary layer dissipation 'W m**-2' = { @@ -19083,9 +19150,12 @@ } #Evaporation 'm of water equivalent s**-1' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 182 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Mean sunshine duration rate 's s**-1' = { @@ -19113,9 +19183,12 @@ } #Mean runoff rate 'm s**-1' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 205 ; + localTablesVersion = 1 ; + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Top net solar radiation, clear sky 'W m**-2' = { @@ -19149,9 +19222,12 @@ } #Mean total precipitation rate 'm s**-1' = { - discipline = 192 ; - parameterCategory = 172 ; - parameterNumber = 228 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; } #Convective snowfall 'm of water equivalent s**-1' = { @@ -21849,9 +21925,13 @@ } #Mean total cloud cover '(0 - 1)' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 6 ; + localTablesVersion = 1 ; + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; } #Surface temperature significance '%' = { diff --git a/definitions/grib2/localConcepts/ecmf/units.legacy.def b/definitions/grib2/localConcepts/ecmf/units.legacy.def index ca9926f81..c09039dab 100644 --- a/definitions/grib2/localConcepts/ecmf/units.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/units.legacy.def @@ -1369,3 +1369,27 @@ parameterCategory = 172 ; parameterNumber = 228 ; } +#Mean large-scale precipitation rate +'m s**-1' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 142 ; +} +#Mean convective precipitation rate +'m s**-1' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 143 ; +} +#Mean runoff rate +'m s**-1' = { + discipline = 192 ; + parameterCategory = 172 ; + parameterNumber = 205 ; +} +#Mean total cloud cover +'(0 - 1)' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 6 ; +} From 2158a5ef831ede6fbcddbac1aec65b248747f452 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 8 Apr 2024 14:33:15 +0000 Subject: [PATCH 239/244] ECC-1787: GRIB2: Add time-mean versions of existing parameters --- definitions/grib2/cfVarName.def | 268 ++++++++++++++++++ .../grib2/localConcepts/ecmf/cfVarName.def | 6 - .../localConcepts/ecmf/cfVarName.legacy.def | 6 + definitions/grib2/localConcepts/ecmf/name.def | 6 - .../grib2/localConcepts/ecmf/name.legacy.def | 6 + .../grib2/localConcepts/ecmf/paramId.def | 6 - .../localConcepts/ecmf/paramId.legacy.def | 6 + .../grib2/localConcepts/ecmf/shortName.def | 6 - .../localConcepts/ecmf/shortName.legacy.def | 6 + .../grib2/localConcepts/ecmf/units.def | 6 - .../grib2/localConcepts/ecmf/units.legacy.def | 6 + .../grib2/localConcepts/s2s/cfName.def | 8 + .../grib2/localConcepts/s2s/cfVarName.def | 42 +++ definitions/grib2/localConcepts/s2s/name.def | 42 +++ .../grib2/localConcepts/s2s/paramId.def | 42 +++ .../grib2/localConcepts/s2s/shortName.def | 42 +++ definitions/grib2/localConcepts/s2s/units.def | 42 +++ .../grib2/localConcepts/uerra/cfName.def | 45 +++ .../grib2/localConcepts/uerra/cfVarName.def | 136 +++++++++ .../grib2/localConcepts/uerra/name.def | 136 +++++++++ .../grib2/localConcepts/uerra/paramId.def | 136 +++++++++ .../grib2/localConcepts/uerra/shortName.def | 136 +++++++++ .../grib2/localConcepts/uerra/units.def | 136 +++++++++ definitions/grib2/name.def | 268 ++++++++++++++++++ definitions/grib2/paramId.def | 268 ++++++++++++++++++ definitions/grib2/shortName.def | 268 ++++++++++++++++++ definitions/grib2/units.def | 268 ++++++++++++++++++ 27 files changed, 2313 insertions(+), 30 deletions(-) diff --git a/definitions/grib2/cfVarName.def b/definitions/grib2/cfVarName.def index 5c02b0dad..8f4a8ea79 100644 --- a/definitions/grib2/cfVarName.def +++ b/definitions/grib2/cfVarName.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'avg_mp2' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'avg_swh' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'avg_pp1d' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'avg_mwp' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'mswt300m' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'mrsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'mcvl' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'mcvh' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'mci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'msst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'mlai_lv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'mlai_hv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'mtclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'mtciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'m2sh' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'mlmlt' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'mlmld' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'m2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'mfscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'msot' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'mu' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'mv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'msp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'mtcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'mtcwv' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'mmsl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'mr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'m10u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'m10v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'m2d' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'mtsn' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'mfsr' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'mflsr' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'chcross' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'dl' = { discipline = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/cfVarName.def b/definitions/grib2/localConcepts/ecmf/cfVarName.def index 0387acf1f..da85ede9c 100644 --- a/definitions/grib2/localConcepts/ecmf/cfVarName.def +++ b/definitions/grib2/localConcepts/ecmf/cfVarName.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'mean10ws' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover 'meantcc' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def b/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def index 968598eff..93fff7f80 100644 --- a/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/name.def b/definitions/grib2/localConcepts/ecmf/name.def index a5874c159..3fd5fdf95 100644 --- a/definitions/grib2/localConcepts/ecmf/name.def +++ b/definitions/grib2/localConcepts/ecmf/name.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'Mean of 10 metre wind speed' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover 'Mean total cloud cover' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/name.legacy.def b/definitions/grib2/localConcepts/ecmf/name.legacy.def index 56a43ad19..5881e995d 100644 --- a/definitions/grib2/localConcepts/ecmf/name.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/name.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'Mean of 10 metre wind speed' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/paramId.def b/definitions/grib2/localConcepts/ecmf/paramId.def index 4b6e89a60..4f9498d96 100644 --- a/definitions/grib2/localConcepts/ecmf/paramId.def +++ b/definitions/grib2/localConcepts/ecmf/paramId.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'228005' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover '228006' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/paramId.legacy.def b/definitions/grib2/localConcepts/ecmf/paramId.legacy.def index 95fe9045d..2326cf7b7 100644 --- a/definitions/grib2/localConcepts/ecmf/paramId.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/paramId.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'228005' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/shortName.def b/definitions/grib2/localConcepts/ecmf/shortName.def index 0a34950d3..945244df8 100644 --- a/definitions/grib2/localConcepts/ecmf/shortName.def +++ b/definitions/grib2/localConcepts/ecmf/shortName.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'mean10ws' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover 'meantcc' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/shortName.legacy.def b/definitions/grib2/localConcepts/ecmf/shortName.legacy.def index dc09fa250..69ef9ec96 100644 --- a/definitions/grib2/localConcepts/ecmf/shortName.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/shortName.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/units.def b/definitions/grib2/localConcepts/ecmf/units.def index ffdd24df0..d6286a028 100644 --- a/definitions/grib2/localConcepts/ecmf/units.def +++ b/definitions/grib2/localConcepts/ecmf/units.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'m s**-1' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover '(0 - 1)' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/units.legacy.def b/definitions/grib2/localConcepts/ecmf/units.legacy.def index c09039dab..36fe4bb79 100644 --- a/definitions/grib2/localConcepts/ecmf/units.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/units.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'m s**-1' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/s2s/cfName.def b/definitions/grib2/localConcepts/s2s/cfName.def index ae98cc52f..bcf3dbc72 100644 --- a/definitions/grib2/localConcepts/s2s/cfName.def +++ b/definitions/grib2/localConcepts/s2s/cfName.def @@ -6,6 +6,14 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'sea_ice_area_fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'surface_downward_eastward_stress' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/cfVarName.def b/definitions/grib2/localConcepts/s2s/cfVarName.def index 156261d3c..7b1815490 100644 --- a/definitions/grib2/localConcepts/s2s/cfVarName.def +++ b/definitions/grib2/localConcepts/s2s/cfVarName.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'mx2t6' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'tcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 't2m' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'d2' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'ewss' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/name.def b/definitions/grib2/localConcepts/s2s/name.def index cc091e047..8f16d165e 100644 --- a/definitions/grib2/localConcepts/s2s/name.def +++ b/definitions/grib2/localConcepts/s2s/name.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'Sea ice area fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'Snow density' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'Sea surface temperature' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'Maximum temperature at 2 metres in the last 6 hours' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'Total column water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2 metre temperature' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'2 metre dewpoint temperature' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'Time-integrated eastward turbulent surface stress' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/paramId.def b/definitions/grib2/localConcepts/s2s/paramId.def index 8db27e06d..9443ada3a 100644 --- a/definitions/grib2/localConcepts/s2s/paramId.def +++ b/definitions/grib2/localConcepts/s2s/paramId.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'31' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'33' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'34' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours '121' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'136' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '167' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'168' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress '180' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/shortName.def b/definitions/grib2/localConcepts/s2s/shortName.def index 025f7fe6f..4722e59a4 100644 --- a/definitions/grib2/localConcepts/s2s/shortName.def +++ b/definitions/grib2/localConcepts/s2s/shortName.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'mx2t6' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'tcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2t' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'2d' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'ewss' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/units.def b/definitions/grib2/localConcepts/s2s/units.def index 17ff29efa..a2bd46e5d 100644 --- a/definitions/grib2/localConcepts/s2s/units.def +++ b/definitions/grib2/localConcepts/s2s/units.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'(0 - 1)' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'kg m**-3' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'K' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'K' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 'K' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'N m**-2 s' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/cfName.def b/definitions/grib2/localConcepts/uerra/cfName.def index af74be9c9..4d9bdee78 100644 --- a/definitions/grib2/localConcepts/uerra/cfName.def +++ b/definitions/grib2/localConcepts/uerra/cfName.def @@ -1,4 +1,49 @@ # Automatically generated by ./create_def.pl, do not edit +#Sea ice area fraction +'sea_ice_area_fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'eastward_wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'northward_wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'surface_air_pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'air_pressure_at_mean_sea_level' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'relative_humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Surface roughness (climatological) 'surface_roughness_length' = { discipline = 2 ; diff --git a/definitions/grib2/localConcepts/uerra/cfVarName.def b/definitions/grib2/localConcepts/uerra/cfVarName.def index 30e719795..ea428109e 100644 --- a/definitions/grib2/localConcepts/uerra/cfVarName.def +++ b/definitions/grib2/localConcepts/uerra/cfVarName.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing 'fg10' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'tclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'tciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'sp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'msl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'u10' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'v10' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 't2m' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'si10' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'skt' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'sh2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'tciwv' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'r2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'eva' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'fscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'adswrf_cs' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/name.def b/definitions/grib2/localConcepts/uerra/name.def index c1a909c5f..73c57d30c 100644 --- a/definitions/grib2/localConcepts/uerra/name.def +++ b/definitions/grib2/localConcepts/uerra/name.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'Sea ice area fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'Snow density' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'Sea surface temperature' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing 'Maximum 10 metre wind gust since previous post-processing' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'Total column cloud liquid water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'Total column cloud ice water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'U component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'V component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'Surface pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'Mean sea level pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'Relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'10 metre U wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'10 metre V wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2 metre temperature' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'10 metre wind speed' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'Skin temperature' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'2 metre specific humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'Total column integrated water vapour' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'2 metre relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'Evaporation' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'Fraction of snow cover' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'Accumulated surface downward short-wave radiation flux, clear sky' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/paramId.def b/definitions/grib2/localConcepts/uerra/paramId.def index e572aa115..750253b93 100644 --- a/definitions/grib2/localConcepts/uerra/paramId.def +++ b/definitions/grib2/localConcepts/uerra/paramId.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'31' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'33' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'34' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing '49' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'78' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'79' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'131' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'132' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'134' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'151' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'157' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'165' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'166' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '167' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'207' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature '235' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'174096' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour '260057' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'260242' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation '260259' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'260289' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky '260423' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/shortName.def b/definitions/grib2/localConcepts/uerra/shortName.def index ee52342c2..b67a0218a 100644 --- a/definitions/grib2/localConcepts/uerra/shortName.def +++ b/definitions/grib2/localConcepts/uerra/shortName.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing '10fg' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'tclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'tciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'sp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'msl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'10u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'10v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2t' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'10si' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'skt' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'2sh' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'tciwv' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'eva' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'fscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'adswrf_cs' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/units.def b/definitions/grib2/localConcepts/uerra/units.def index b8d037b96..0ae46ceda 100644 --- a/definitions/grib2/localConcepts/uerra/units.def +++ b/definitions/grib2/localConcepts/uerra/units.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'(0 - 1)' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'kg m**-3' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'K' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing 'm s**-1' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 'K' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'K' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'kg kg**-1' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'kg m**-2' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'kg m**-2' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'Proportion' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'J m**-2' = { discipline = 0 ; diff --git a/definitions/grib2/name.def b/definitions/grib2/name.def index 1f92dae00..b996d38e6 100644 --- a/definitions/grib2/name.def +++ b/definitions/grib2/name.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'Time-mean mean zero-crossing wave period' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'Time-mean significant height of combined wind waves and swell' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'Time-mean peak wave period' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'Time-mean mean wave period' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'Mean sea water temperature in the upper 300 m' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'Time-mean snow density' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'Time-mean low vegetation cover' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'Time-mean high vegetation cover' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'Time-mean sea ice area fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'Time-mean sea surface temperature' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'Time-mean leaf area index, low vegetation' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'Time-mean leaf area index, high vegetation' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'Time-mean total column liquid water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'Time-mean total column cloud ice water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'Time-mean 2 metre specific humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'Time-mean lake mix-layer temperature' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'Time-mean lake mix-layer depth' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'Time-mean 2 metre relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'Time-mean fraction of snow cover' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'Time-mean soil temperature' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'Time-mean U component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'Time-mean V component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'Time-mean surface pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'Time-mean total column water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'Time-mean total column vertically-integrated water vapour' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'Time-mean mean sea level pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'Time-mean relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'Time-mean 10 metre U wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'Time-mean 10 metre V wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'Time-mean 2 metre dewpoint temperature' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'Time-mean temperature of snow layer' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'Time-mean forecast surface roughness' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'Time-mean forecast logarithm of surface roughness for heat' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'Cross sectional area of flow in channel' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'Mean of 10 metre wind speed' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'Lake total depth' = { discipline = 1 ; diff --git a/definitions/grib2/paramId.def b/definitions/grib2/paramId.def index 2c12b17ad..a88c71c56 100644 --- a/definitions/grib2/paramId.def +++ b/definitions/grib2/paramId.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'141221' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'141229' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'141231' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'141232' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m '151127' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'235080' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'235081' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'235082' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'235083' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'235084' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'235085' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'235086' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'235087' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'235088' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'235089' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'235090' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'235091' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'235092' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'235093' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'235094' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'235131' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'235132' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'235134' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'235136' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'235137' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'235151' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'235157' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'235165' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'235166' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'235168' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'235238' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'235244' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'235245' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel '240011' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'228005' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth '228007' = { discipline = 1 ; diff --git a/definitions/grib2/shortName.def b/definitions/grib2/shortName.def index f33047c40..7d834b0e4 100644 --- a/definitions/grib2/shortName.def +++ b/definitions/grib2/shortName.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'avg_mp2' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'avg_swh' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'avg_pp1d' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'avg_mwp' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'mswt300m' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'mrsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'mcvl' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'mcvh' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'mci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'msst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'mlai_lv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'mlai_hv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'mtclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'mtciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'m2sh' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'mlmlt' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'mlmld' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'m2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'mfscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'msot' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'mu' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'mv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'msp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'mtcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'mtcwv' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'mmsl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'mr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'m10u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'m10v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'m2d' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'mtsn' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'mfsr' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'mflsr' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'chcross' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'dl' = { discipline = 1 ; diff --git a/definitions/grib2/units.def b/definitions/grib2/units.def index 0a396c1bb..0ab97ac1d 100644 --- a/definitions/grib2/units.def +++ b/definitions/grib2/units.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'s' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'m' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'s' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'s' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'K' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'kg m**-3' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'(0 - 1)' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'(0 - 1)' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'(0 - 1)' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'K' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'m**2 m**-2' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'m**2 m**-2' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'kg kg**-1' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'K' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'m' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'Proportion' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'K' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'K' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'m' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'Numeric' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'm**2' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'm' = { discipline = 1 ; From 90eef9c31fec67e1a067be7db03c37809d7b4e73 Mon Sep 17 00:00:00 2001 From: shahramn Date: Mon, 8 Apr 2024 15:34:43 +0100 Subject: [PATCH 240/244] ECC-1787: GRIB2: Add time-mean versions of existing parameters --- definitions/grib2/cfVarName.def | 268 ++++++++++++++++++ .../grib2/localConcepts/ecmf/cfVarName.def | 6 - .../localConcepts/ecmf/cfVarName.legacy.def | 6 + definitions/grib2/localConcepts/ecmf/name.def | 6 - .../grib2/localConcepts/ecmf/name.legacy.def | 6 + .../grib2/localConcepts/ecmf/paramId.def | 6 - .../localConcepts/ecmf/paramId.legacy.def | 6 + .../grib2/localConcepts/ecmf/shortName.def | 6 - .../localConcepts/ecmf/shortName.legacy.def | 6 + .../grib2/localConcepts/ecmf/units.def | 6 - .../grib2/localConcepts/ecmf/units.legacy.def | 6 + .../grib2/localConcepts/s2s/cfName.def | 8 + .../grib2/localConcepts/s2s/cfVarName.def | 42 +++ definitions/grib2/localConcepts/s2s/name.def | 42 +++ .../grib2/localConcepts/s2s/paramId.def | 42 +++ .../grib2/localConcepts/s2s/shortName.def | 42 +++ definitions/grib2/localConcepts/s2s/units.def | 42 +++ .../grib2/localConcepts/uerra/cfName.def | 45 +++ .../grib2/localConcepts/uerra/cfVarName.def | 136 +++++++++ .../grib2/localConcepts/uerra/name.def | 136 +++++++++ .../grib2/localConcepts/uerra/paramId.def | 136 +++++++++ .../grib2/localConcepts/uerra/shortName.def | 136 +++++++++ .../grib2/localConcepts/uerra/units.def | 136 +++++++++ definitions/grib2/name.def | 268 ++++++++++++++++++ definitions/grib2/paramId.def | 268 ++++++++++++++++++ definitions/grib2/shortName.def | 268 ++++++++++++++++++ definitions/grib2/units.def | 268 ++++++++++++++++++ 27 files changed, 2313 insertions(+), 30 deletions(-) diff --git a/definitions/grib2/cfVarName.def b/definitions/grib2/cfVarName.def index 5c02b0dad..8f4a8ea79 100644 --- a/definitions/grib2/cfVarName.def +++ b/definitions/grib2/cfVarName.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'avg_mp2' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'avg_swh' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'avg_pp1d' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'avg_mwp' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'mswt300m' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'mrsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'mcvl' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'mcvh' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'mci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'msst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'mlai_lv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'mlai_hv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'mtclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'mtciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'m2sh' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'mlmlt' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'mlmld' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'m2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'mfscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'msot' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'mu' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'mv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'msp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'mtcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'mtcwv' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'mmsl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'mr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'m10u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'m10v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'m2d' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'mtsn' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'mfsr' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'mflsr' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'chcross' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'dl' = { discipline = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/cfVarName.def b/definitions/grib2/localConcepts/ecmf/cfVarName.def index 0387acf1f..da85ede9c 100644 --- a/definitions/grib2/localConcepts/ecmf/cfVarName.def +++ b/definitions/grib2/localConcepts/ecmf/cfVarName.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'mean10ws' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover 'meantcc' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def b/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def index 968598eff..93fff7f80 100644 --- a/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/cfVarName.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/name.def b/definitions/grib2/localConcepts/ecmf/name.def index a5874c159..3fd5fdf95 100644 --- a/definitions/grib2/localConcepts/ecmf/name.def +++ b/definitions/grib2/localConcepts/ecmf/name.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'Mean of 10 metre wind speed' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover 'Mean total cloud cover' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/name.legacy.def b/definitions/grib2/localConcepts/ecmf/name.legacy.def index 56a43ad19..5881e995d 100644 --- a/definitions/grib2/localConcepts/ecmf/name.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/name.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'Mean of 10 metre wind speed' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/paramId.def b/definitions/grib2/localConcepts/ecmf/paramId.def index 4b6e89a60..4f9498d96 100644 --- a/definitions/grib2/localConcepts/ecmf/paramId.def +++ b/definitions/grib2/localConcepts/ecmf/paramId.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'228005' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover '228006' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/paramId.legacy.def b/definitions/grib2/localConcepts/ecmf/paramId.legacy.def index 95fe9045d..2326cf7b7 100644 --- a/definitions/grib2/localConcepts/ecmf/paramId.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/paramId.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'228005' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/shortName.def b/definitions/grib2/localConcepts/ecmf/shortName.def index 0a34950d3..945244df8 100644 --- a/definitions/grib2/localConcepts/ecmf/shortName.def +++ b/definitions/grib2/localConcepts/ecmf/shortName.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'mean10ws' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover 'meantcc' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/shortName.legacy.def b/definitions/grib2/localConcepts/ecmf/shortName.legacy.def index dc09fa250..69ef9ec96 100644 --- a/definitions/grib2/localConcepts/ecmf/shortName.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/shortName.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/ecmf/units.def b/definitions/grib2/localConcepts/ecmf/units.def index ffdd24df0..d6286a028 100644 --- a/definitions/grib2/localConcepts/ecmf/units.def +++ b/definitions/grib2/localConcepts/ecmf/units.def @@ -21917,12 +21917,6 @@ parameterCategory = 220 ; parameterNumber = 228 ; } -#Mean of 10 metre wind speed -'m s**-1' = { - discipline = 192 ; - parameterCategory = 228 ; - parameterNumber = 5 ; - } #Mean total cloud cover '(0 - 1)' = { localTablesVersion = 1 ; diff --git a/definitions/grib2/localConcepts/ecmf/units.legacy.def b/definitions/grib2/localConcepts/ecmf/units.legacy.def index c09039dab..36fe4bb79 100644 --- a/definitions/grib2/localConcepts/ecmf/units.legacy.def +++ b/definitions/grib2/localConcepts/ecmf/units.legacy.def @@ -1393,3 +1393,9 @@ parameterCategory = 228 ; parameterNumber = 6 ; } +#Mean of 10 metre wind speed +'m s**-1' = { + discipline = 192 ; + parameterCategory = 228 ; + parameterNumber = 5 ; +} diff --git a/definitions/grib2/localConcepts/s2s/cfName.def b/definitions/grib2/localConcepts/s2s/cfName.def index ae98cc52f..bcf3dbc72 100644 --- a/definitions/grib2/localConcepts/s2s/cfName.def +++ b/definitions/grib2/localConcepts/s2s/cfName.def @@ -6,6 +6,14 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'sea_ice_area_fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'surface_downward_eastward_stress' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/cfVarName.def b/definitions/grib2/localConcepts/s2s/cfVarName.def index 156261d3c..7b1815490 100644 --- a/definitions/grib2/localConcepts/s2s/cfVarName.def +++ b/definitions/grib2/localConcepts/s2s/cfVarName.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'mx2t6' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'tcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 't2m' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'d2' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'ewss' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/name.def b/definitions/grib2/localConcepts/s2s/name.def index cc091e047..8f16d165e 100644 --- a/definitions/grib2/localConcepts/s2s/name.def +++ b/definitions/grib2/localConcepts/s2s/name.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'Sea ice area fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'Snow density' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'Sea surface temperature' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'Maximum temperature at 2 metres in the last 6 hours' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'Total column water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2 metre temperature' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'2 metre dewpoint temperature' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'Time-integrated eastward turbulent surface stress' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/paramId.def b/definitions/grib2/localConcepts/s2s/paramId.def index 8db27e06d..9443ada3a 100644 --- a/definitions/grib2/localConcepts/s2s/paramId.def +++ b/definitions/grib2/localConcepts/s2s/paramId.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'31' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'33' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'34' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours '121' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'136' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '167' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'168' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress '180' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/shortName.def b/definitions/grib2/localConcepts/s2s/shortName.def index 025f7fe6f..4722e59a4 100644 --- a/definitions/grib2/localConcepts/s2s/shortName.def +++ b/definitions/grib2/localConcepts/s2s/shortName.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'mx2t6' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'tcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2t' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'2d' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'ewss' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/s2s/units.def b/definitions/grib2/localConcepts/s2s/units.def index 17ff29efa..a2bd46e5d 100644 --- a/definitions/grib2/localConcepts/s2s/units.def +++ b/definitions/grib2/localConcepts/s2s/units.def @@ -6,6 +6,29 @@ parameterNumber = 0 ; typeOfFirstFixedSurface = 1 ; } +#Sea ice area fraction +'(0 - 1)' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'kg m**-3' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'K' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum temperature at 2 metres in the last 6 hours 'K' = { discipline = 0 ; @@ -30,6 +53,15 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#Total column water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 'K' = { discipline = 0 ; @@ -68,6 +100,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre dewpoint temperature +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Time-integrated eastward turbulent surface stress 'N m**-2 s' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/cfName.def b/definitions/grib2/localConcepts/uerra/cfName.def index af74be9c9..4d9bdee78 100644 --- a/definitions/grib2/localConcepts/uerra/cfName.def +++ b/definitions/grib2/localConcepts/uerra/cfName.def @@ -1,4 +1,49 @@ # Automatically generated by ./create_def.pl, do not edit +#Sea ice area fraction +'sea_ice_area_fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'eastward_wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'northward_wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'surface_air_pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'air_pressure_at_mean_sea_level' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'relative_humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Surface roughness (climatological) 'surface_roughness_length' = { discipline = 2 ; diff --git a/definitions/grib2/localConcepts/uerra/cfVarName.def b/definitions/grib2/localConcepts/uerra/cfVarName.def index 30e719795..ea428109e 100644 --- a/definitions/grib2/localConcepts/uerra/cfVarName.def +++ b/definitions/grib2/localConcepts/uerra/cfVarName.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing 'fg10' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'tclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'tciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'sp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'msl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'u10' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'v10' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 't2m' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'si10' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'skt' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'sh2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'tciwv' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'r2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'eva' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'fscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'adswrf_cs' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/name.def b/definitions/grib2/localConcepts/uerra/name.def index c1a909c5f..73c57d30c 100644 --- a/definitions/grib2/localConcepts/uerra/name.def +++ b/definitions/grib2/localConcepts/uerra/name.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'Sea ice area fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'Snow density' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'Sea surface temperature' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing 'Maximum 10 metre wind gust since previous post-processing' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'Total column cloud liquid water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'Total column cloud ice water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'U component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'V component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'Surface pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'Mean sea level pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'Relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'10 metre U wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'10 metre V wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2 metre temperature' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'10 metre wind speed' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'Skin temperature' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'2 metre specific humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'Total column integrated water vapour' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'2 metre relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'Evaporation' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'Fraction of snow cover' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'Accumulated surface downward short-wave radiation flux, clear sky' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/paramId.def b/definitions/grib2/localConcepts/uerra/paramId.def index e572aa115..750253b93 100644 --- a/definitions/grib2/localConcepts/uerra/paramId.def +++ b/definitions/grib2/localConcepts/uerra/paramId.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'31' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'33' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'34' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing '49' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'78' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'79' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'131' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'132' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'134' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'151' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'157' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'165' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'166' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '167' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'207' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature '235' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'174096' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour '260057' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'260242' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation '260259' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'260289' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky '260423' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/shortName.def b/definitions/grib2/localConcepts/uerra/shortName.def index ee52342c2..b67a0218a 100644 --- a/definitions/grib2/localConcepts/uerra/shortName.def +++ b/definitions/grib2/localConcepts/uerra/shortName.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'ci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'rsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'sst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing '10fg' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'tclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'tciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'sp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'msl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'10u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'10v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature '2t' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'10si' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'skt' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'2sh' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'tciwv' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'eva' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'fscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'adswrf_cs' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/units.def b/definitions/grib2/localConcepts/uerra/units.def index b8d037b96..0ae46ceda 100644 --- a/definitions/grib2/localConcepts/uerra/units.def +++ b/definitions/grib2/localConcepts/uerra/units.def @@ -17,6 +17,29 @@ scaledValueOfFirstFixedSurface = 200 ; scaleFactorOfFirstFixedSurface = 0 ; } +#Sea ice area fraction +'(0 - 1)' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Snow density +'kg m**-3' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Sea surface temperature +'K' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Maximum 10 metre wind gust since previous post-processing 'm s**-1' = { discipline = 0 ; @@ -52,6 +75,81 @@ indicatorOfUnitForTimeRange = 1 ; typeOfStatisticalProcessing = 2 ; } +#Total column cloud liquid water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Total column cloud ice water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#U component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#V component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Surface pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Mean sea level pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre U wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#10 metre V wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #2 metre temperature 'K' = { discipline = 0 ; @@ -150,6 +248,16 @@ typeOfStatisticalProcessing = 3 ; lengthOfTimeRange = 6 ; } +#10 metre wind speed +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Skin temperature 'K' = { discipline = 0 ; @@ -158,6 +266,17 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#2 metre specific humidity +'kg kg**-1' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Total column integrated water vapour 'kg m**-2' = { discipline = 0 ; @@ -206,6 +325,16 @@ scaledValueOfFirstFixedSurface = 15 ; scaleFactorOfFirstFixedSurface = 1 ; } +#2 metre relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Evaporation 'kg m**-2' = { discipline = 0 ; @@ -234,6 +363,13 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Fraction of snow cover +'Proportion' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } #Accumulated surface downward short-wave radiation flux, clear sky 'J m**-2' = { discipline = 0 ; diff --git a/definitions/grib2/name.def b/definitions/grib2/name.def index 1f92dae00..b996d38e6 100644 --- a/definitions/grib2/name.def +++ b/definitions/grib2/name.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'Time-mean mean zero-crossing wave period' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'Time-mean significant height of combined wind waves and swell' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'Time-mean peak wave period' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'Time-mean mean wave period' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'Mean sea water temperature in the upper 300 m' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'Time-mean snow density' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'Time-mean low vegetation cover' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'Time-mean high vegetation cover' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'Time-mean sea ice area fraction' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'Time-mean sea surface temperature' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'Time-mean leaf area index, low vegetation' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'Time-mean leaf area index, high vegetation' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'Time-mean total column liquid water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'Time-mean total column cloud ice water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'Time-mean 2 metre specific humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'Time-mean lake mix-layer temperature' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'Time-mean lake mix-layer depth' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'Time-mean 2 metre relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'Time-mean fraction of snow cover' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'Time-mean soil temperature' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'Time-mean U component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'Time-mean V component of wind' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'Time-mean surface pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'Time-mean total column water' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'Time-mean total column vertically-integrated water vapour' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'Time-mean mean sea level pressure' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'Time-mean relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'Time-mean 10 metre U wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'Time-mean 10 metre V wind component' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'Time-mean 2 metre dewpoint temperature' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'Time-mean temperature of snow layer' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'Time-mean forecast surface roughness' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'Time-mean forecast logarithm of surface roughness for heat' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'Cross sectional area of flow in channel' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'Mean of 10 metre wind speed' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'Lake total depth' = { discipline = 1 ; diff --git a/definitions/grib2/paramId.def b/definitions/grib2/paramId.def index 2c12b17ad..a88c71c56 100644 --- a/definitions/grib2/paramId.def +++ b/definitions/grib2/paramId.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'141221' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'141229' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'141231' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'141232' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m '151127' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'235080' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'235081' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'235082' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'235083' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'235084' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'235085' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'235086' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'235087' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'235088' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'235089' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'235090' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'235091' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'235092' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'235093' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'235094' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'235131' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'235132' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'235134' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'235136' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'235137' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'235151' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'235157' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'235165' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'235166' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'235168' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'235238' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'235244' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'235245' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel '240011' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'228005' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth '228007' = { discipline = 1 ; diff --git a/definitions/grib2/shortName.def b/definitions/grib2/shortName.def index f33047c40..7d834b0e4 100644 --- a/definitions/grib2/shortName.def +++ b/definitions/grib2/shortName.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'avg_mp2' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'avg_swh' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'avg_pp1d' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'avg_mwp' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'mswt300m' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'mrsn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'mcvl' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'mcvh' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'mci' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'msst' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'mlai_lv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'mlai_hv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'mtclw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'mtciw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'m2sh' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'mlmlt' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'mlmld' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'m2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'mfscov' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'msot' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'mu' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'mv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'msp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'mtcw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'mtcwv' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'mmsl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'mr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'m10u' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'m10v' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'m2d' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'mtsn' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'mfsr' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'mflsr' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'chcross' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'mean10ws' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'dl' = { discipline = 1 ; diff --git a/definitions/grib2/units.def b/definitions/grib2/units.def index 0a396c1bb..0ab97ac1d 100644 --- a/definitions/grib2/units.def +++ b/definitions/grib2/units.def @@ -1299,6 +1299,34 @@ parameterCategory = 0 ; parameterNumber = 84 ; } +#Time-mean mean zero-crossing wave period +'s' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean significant height of combined wind waves and swell +'m' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean peak wave period +'s' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 34 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean wave period +'s' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 15 ; + typeOfStatisticalProcessing = 0 ; + } #Mean sea water temperature in the upper 300 m 'K' = { discipline = 10 ; @@ -4717,6 +4745,236 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 0 ; } +#Time-mean snow density +'kg m**-3' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 61 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean low vegetation cover +'(0 - 1)' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 53 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean high vegetation cover +'(0 - 1)' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 54 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea ice area fraction +'(0 - 1)' = { + discipline = 10 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean sea surface temperature +'K' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, low vegetation +'m**2 m**-2' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 55 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean leaf area index, high vegetation +'m**2 m**-2' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 56 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column liquid water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 69 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column cloud ice water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 70 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre specific humidity +'kg kg**-1' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 103 ; + typeOfSecondFixedSurface = 255 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer temperature +'K' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean lake mix-layer depth +'m' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 166 ; + typeOfSecondFixedSurface = 255 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean fraction of snow cover +'Proportion' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 121 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean soil temperature +'K' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 18 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean U component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean V component of wind +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean surface pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column water +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 51 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean total column vertically-integrated water vapour +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean mean sea level pressure +'Pa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 0 ; + typeOfFirstFixedSurface = 101 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre U wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 2 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 10 metre V wind component +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 3 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean 2 metre dewpoint temperature +'K' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 6 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean temperature of snow layer +'K' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 28 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast surface roughness +'m' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } +#Time-mean forecast logarithm of surface roughness for heat +'Numeric' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 54 ; + typeOfFirstFixedSurface = 1 ; + typeOfStatisticalProcessing = 0 ; + } #Cross sectional area of flow in channel 'm**2' = { discipline = 1 ; @@ -10528,6 +10786,16 @@ scaleFactorOfFirstFixedSurface = 0 ; typeOfStatisticalProcessing = 0 ; } +#Mean of 10 metre wind speed +'m s**-1' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 10 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 0 ; + } #Lake total depth 'm' = { discipline = 1 ; From f5c4b5d713702e1f712a78e39810f384fb5d9b94 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Mon, 8 Apr 2024 15:06:08 +0000 Subject: [PATCH 241/244] ECC-1787: GRIB2: Add time-mean versions of existing parameters --- definitions/grib2/localConcepts/uerra/cfVarName.def | 9 +++++++++ definitions/grib2/localConcepts/uerra/name.def | 9 +++++++++ definitions/grib2/localConcepts/uerra/paramId.def | 9 +++++++++ definitions/grib2/localConcepts/uerra/shortName.def | 9 +++++++++ definitions/grib2/localConcepts/uerra/units.def | 9 +++++++++ 5 files changed, 45 insertions(+) diff --git a/definitions/grib2/localConcepts/uerra/cfVarName.def b/definitions/grib2/localConcepts/uerra/cfVarName.def index ea428109e..342088a14 100644 --- a/definitions/grib2/localConcepts/uerra/cfVarName.def +++ b/definitions/grib2/localConcepts/uerra/cfVarName.def @@ -285,6 +285,15 @@ typeOfFirstFixedSurface = 1 ; typeOfSecondFixedSurface = 8 ; } +#Total column integrated water vapour +'tciwv' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #Momentum flux, u component 'uflx' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/name.def b/definitions/grib2/localConcepts/uerra/name.def index 73c57d30c..05e8b9e58 100644 --- a/definitions/grib2/localConcepts/uerra/name.def +++ b/definitions/grib2/localConcepts/uerra/name.def @@ -285,6 +285,15 @@ typeOfFirstFixedSurface = 1 ; typeOfSecondFixedSurface = 8 ; } +#Total column integrated water vapour +'Total column integrated water vapour' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #Momentum flux, u component 'Momentum flux, u component' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/paramId.def b/definitions/grib2/localConcepts/uerra/paramId.def index 750253b93..1138be8da 100644 --- a/definitions/grib2/localConcepts/uerra/paramId.def +++ b/definitions/grib2/localConcepts/uerra/paramId.def @@ -285,6 +285,15 @@ typeOfFirstFixedSurface = 1 ; typeOfSecondFixedSurface = 8 ; } +#Total column integrated water vapour +'260057' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #Momentum flux, u component '260062' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/shortName.def b/definitions/grib2/localConcepts/uerra/shortName.def index b67a0218a..63499bec2 100644 --- a/definitions/grib2/localConcepts/uerra/shortName.def +++ b/definitions/grib2/localConcepts/uerra/shortName.def @@ -285,6 +285,15 @@ typeOfFirstFixedSurface = 1 ; typeOfSecondFixedSurface = 8 ; } +#Total column integrated water vapour +'tciwv' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #Momentum flux, u component 'uflx' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/uerra/units.def b/definitions/grib2/localConcepts/uerra/units.def index 0ae46ceda..353070afd 100644 --- a/definitions/grib2/localConcepts/uerra/units.def +++ b/definitions/grib2/localConcepts/uerra/units.def @@ -285,6 +285,15 @@ typeOfFirstFixedSurface = 1 ; typeOfSecondFixedSurface = 8 ; } +#Total column integrated water vapour +'kg m**-2' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 64 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 8 ; + typeOfStatisticalProcessing = 0 ; + } #Momentum flux, u component 'N m**-2' = { discipline = 0 ; From 7ff5e2eaf397f5e869922852f7af3253b315eb13 Mon Sep 17 00:00:00 2001 From: shahramn Date: Tue, 9 Apr 2024 12:03:22 +0100 Subject: [PATCH 242/244] Tools: Dead code removal and cppcheck warnings --- tools/grib_tools.cc | 21 ++++++++++----------- tools/gts_compare.cc | 33 +++------------------------------ tools/metar_compare.cc | 36 ++++-------------------------------- 3 files changed, 17 insertions(+), 73 deletions(-) diff --git a/tools/grib_tools.cc b/tools/grib_tools.cc index 2fe949a4a..976f712be 100644 --- a/tools/grib_tools.cc +++ b/tools/grib_tools.cc @@ -1339,16 +1339,15 @@ void grib_print_file_statistics(grib_runtime_options* options, grib_tools_file* file->name); if (!failed) return; - /* - fprintf(dump_file,"Following bad messages found in %s\n", file->name); - fprintf(dump_file,"N Error\n"); - while (failed){ - fprintf(dump_file,"%-*d %s\n", 7,failed->count, - grib_get_error_message(failed->error)); - failed=failed->next; - } - fprintf(dump_file,"\n"); - */ + + // fprintf(dump_file,"Following bad messages found in %s\n", file->name); + // fprintf(dump_file,"N Error\n"); + // while (failed){ + // fprintf(dump_file,"%-*d %s\n", 7,failed->count, + // grib_get_error_message(failed->error)); + // failed=failed->next; + // } + // fprintf(dump_file,"\n"); } void grib_print_full_statistics(grib_runtime_options* options) @@ -1422,7 +1421,7 @@ void grib_tools_write_message(grib_runtime_options* options, grib_handle* h) } if (options->gts && h->gts_header) { - char gts_trailer[4] = { '\x0D', '\x0D', '\x0A', '\x03' }; + const char gts_trailer[4] = { '\x0D', '\x0D', '\x0A', '\x03' }; if (fwrite(gts_trailer, 1, 4, of->handle) != 4) { grib_context_log(h->context, (GRIB_LOG_ERROR) | (GRIB_LOG_PERROR), "Error writing GTS trailer to %s", filename); diff --git a/tools/gts_compare.cc b/tools/gts_compare.cc index d506dfc66..1dc362059 100644 --- a/tools/gts_compare.cc +++ b/tools/gts_compare.cc @@ -373,14 +373,11 @@ static void save_error(grib_context* c, const char* key) static int compare_values(const grib_runtime_options* options, grib_handle* h1, grib_handle* h2, const char* name, int type) { - size_t len1 = 0; - size_t len2 = 0; - int err = 0; - int err1; - int err2; + size_t len1 = 0, len2 = 0; + int err = 0, err1 = 0, err2 = 0; int type1, type2; int countdiff; - int isMissing1 = 0, isMissing2 = 0; + // int isMissing1 = 0, isMissing2 = 0; char *sval1 = NULL, *sval2 = NULL; long *lval1 = NULL, *lval2 = NULL; @@ -442,30 +439,6 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, //isMissing1 = ((grib_is_missing(h1, name, &err1) == 1) && (err1 == 0)) ? 1 : 0; //isMissing2 = ((grib_is_missing(h2, name, &err2) == 1) && (err2 == 0)) ? 1 : 0; - if ((isMissing1 == 1) && (isMissing2 == 1)) { - if (verbose) - printf(" is set to missing in both fields\n"); - return GRIB_SUCCESS; - } - - if (isMissing1 == 1) { - if (verbose) printf(" is set to missing in 1st field\n"); - printInfo(h1); - printf("%s is set to missing in 1st field but is not missing in 2nd field\n", name); - err1 = GRIB_VALUE_MISMATCH; - save_error(c, name); - return GRIB_VALUE_MISMATCH; - } - - if (isMissing2 == 1) { - if (verbose) printf(" is set to missing in 1st field\n"); - printInfo(h1); - printf("%s is set to missing in 2nd field but is not missing in 1st field\n", name); - err1 = GRIB_VALUE_MISMATCH; - save_error(c, name); - return GRIB_VALUE_MISMATCH; - } - switch (type1) { case GRIB_TYPE_STRING: if (verbose) printf(" as string\n"); diff --git a/tools/metar_compare.cc b/tools/metar_compare.cc index 9ede65a4b..a86cafd0d 100644 --- a/tools/metar_compare.cc +++ b/tools/metar_compare.cc @@ -426,19 +426,17 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, { size_t len1 = 0; size_t len2 = 0; - int err = 0, i = 0; - int err1; - int err2; + int err = 0, i = 0, err1 = 0, err2 = 0; int type1, type2; int countdiff; - int isMissing1 = 0, isMissing2 = 0; + //int isMissing1 = 0, isMissing2 = 0; char *sval1 = NULL, *sval2 = NULL; double *dval1 = NULL, *dval2 = NULL; long *lval1 = NULL, *lval2 = NULL; - double maxdiff = 0; + double maxdiff = 0; double value_tolerance = 0; - grib_context* c = h1->context; + grib_context* c = h1->context; type1 = type; type2 = type; @@ -498,32 +496,6 @@ static int compare_values(const grib_runtime_options* options, grib_handle* h1, // isMissing1 = ((grib_is_missing(h1, name, &err1) == 1) && (err1 == 0)) ? 1 : 0; // isMissing2 = ((grib_is_missing(h2, name, &err2) == 1) && (err2 == 0)) ? 1 : 0; - if ((isMissing1 == 1) && (isMissing2 == 1)) { - if (verbose) - printf(" is set to missing in both fields\n"); - return GRIB_SUCCESS; - } - - if (isMissing1 == 1) { - if (verbose) - printf(" is set to missing in 1st field\n"); - printInfo(h1); - printf("%s is set to missing in 1st field but is not missing in 2nd field\n", name); - err1 = GRIB_VALUE_MISMATCH; - save_error(c, name); - return GRIB_VALUE_MISMATCH; - } - - if (isMissing2 == 1) { - if (verbose) - printf(" is set to missing in 1st field\n"); - printInfo(h1); - printf("%s is set to missing in 2nd field but is not missing in 1st field\n", name); - err1 = GRIB_VALUE_MISMATCH; - save_error(c, name); - return GRIB_VALUE_MISMATCH; - } - switch (type1) { case GRIB_TYPE_STRING: if (verbose) From d4655ac36616274acf696c6e20b11998e257624a Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 9 Apr 2024 12:41:00 +0000 Subject: [PATCH 243/244] ECC-1798: GRIB2: New parameter encodings for DestinationEarth --- definitions/grib2/cfVarName.def | 56 +++++++++++++++++++ .../grib2/localConcepts/kwbc/units.def | 2 +- definitions/grib2/name.def | 56 +++++++++++++++++++ definitions/grib2/paramId.def | 56 +++++++++++++++++++ definitions/grib2/shortName.def | 56 +++++++++++++++++++ definitions/grib2/units.def | 56 +++++++++++++++++++ 6 files changed, 281 insertions(+), 1 deletion(-) diff --git a/definitions/grib2/cfVarName.def b/definitions/grib2/cfVarName.def index 8f4a8ea79..494c41ada 100644 --- a/definitions/grib2/cfVarName.def +++ b/definitions/grib2/cfVarName.def @@ -3824,6 +3824,55 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Lake surface temperature +'lslt' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + } +#Surface bulk Richardson number +'sbrn' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 16 ; + typeOfFirstFixedSurface = 1 ; + } +#Time-maximum 2 metre relative humidity +'mx2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 2 ; + } +#Time-minimum 2 metre relative humidity +'mn2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 3 ; + } +#Surface roughness for heat +'srhe' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 47 ; + typeOfFirstFixedSurface = 1 ; + } +#Surface roughness for moisture +'srmo' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 48 ; + typeOfFirstFixedSurface = 1 ; + } #Burned area 'fba' = { discipline = 2 ; @@ -6710,6 +6759,13 @@ parameterCategory = 3 ; parameterNumber = 19 ; } +#Leaf Area Index +'lai' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfFirstFixedSurface = 1 ; + } #Accumulated surface upward short-wave radiation flux, clear sky 'auswrf_cs' = { discipline = 0 ; diff --git a/definitions/grib2/localConcepts/kwbc/units.def b/definitions/grib2/localConcepts/kwbc/units.def index fbfbcc739..37c4a287a 100644 --- a/definitions/grib2/localConcepts/kwbc/units.def +++ b/definitions/grib2/localConcepts/kwbc/units.def @@ -930,7 +930,7 @@ parameterNumber = 197 ; } #Leaf Area Index -'~' = { +'Numeric' = { discipline = 0 ; parameterCategory = 7 ; parameterNumber = 198 ; diff --git a/definitions/grib2/name.def b/definitions/grib2/name.def index b996d38e6..c246c157f 100644 --- a/definitions/grib2/name.def +++ b/definitions/grib2/name.def @@ -3824,6 +3824,55 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Lake surface temperature +'Lake surface temperature' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + } +#Surface bulk Richardson number +'Surface bulk Richardson number' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 16 ; + typeOfFirstFixedSurface = 1 ; + } +#Time-maximum 2 metre relative humidity +'Time-maximum 2 metre relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 2 ; + } +#Time-minimum 2 metre relative humidity +'Time-minimum 2 metre relative humidity' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 3 ; + } +#Surface roughness for heat +'Surface roughness for heat' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 47 ; + typeOfFirstFixedSurface = 1 ; + } +#Surface roughness for moisture +'Surface roughness for moisture' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 48 ; + typeOfFirstFixedSurface = 1 ; + } #Burned area 'Burned area' = { discipline = 2 ; @@ -6710,6 +6759,13 @@ parameterCategory = 3 ; parameterNumber = 19 ; } +#Leaf Area Index +'Leaf Area Index' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfFirstFixedSurface = 1 ; + } #Accumulated surface upward short-wave radiation flux, clear sky 'Accumulated surface upward short-wave radiation flux, clear sky' = { discipline = 0 ; diff --git a/definitions/grib2/paramId.def b/definitions/grib2/paramId.def index a88c71c56..eea7c712e 100644 --- a/definitions/grib2/paramId.def +++ b/definitions/grib2/paramId.def @@ -3824,6 +3824,55 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Lake surface temperature +'231059' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + } +#Surface bulk Richardson number +'231060' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 16 ; + typeOfFirstFixedSurface = 1 ; + } +#Time-maximum 2 metre relative humidity +'231061' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 2 ; + } +#Time-minimum 2 metre relative humidity +'231062' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 3 ; + } +#Surface roughness for heat +'231063' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 47 ; + typeOfFirstFixedSurface = 1 ; + } +#Surface roughness for moisture +'231064' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 48 ; + typeOfFirstFixedSurface = 1 ; + } #Burned area '232000' = { discipline = 2 ; @@ -6710,6 +6759,13 @@ parameterCategory = 3 ; parameterNumber = 19 ; } +#Leaf Area Index +'260373' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfFirstFixedSurface = 1 ; + } #Accumulated surface upward short-wave radiation flux, clear sky '260427' = { discipline = 0 ; diff --git a/definitions/grib2/shortName.def b/definitions/grib2/shortName.def index 7d834b0e4..b36df1705 100644 --- a/definitions/grib2/shortName.def +++ b/definitions/grib2/shortName.def @@ -3824,6 +3824,55 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Lake surface temperature +'lslt' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + } +#Surface bulk Richardson number +'sbrn' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 16 ; + typeOfFirstFixedSurface = 1 ; + } +#Time-maximum 2 metre relative humidity +'mx2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 2 ; + } +#Time-minimum 2 metre relative humidity +'mn2r' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 3 ; + } +#Surface roughness for heat +'srhe' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 47 ; + typeOfFirstFixedSurface = 1 ; + } +#Surface roughness for moisture +'srmo' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 48 ; + typeOfFirstFixedSurface = 1 ; + } #Burned area 'fba' = { discipline = 2 ; @@ -6710,6 +6759,13 @@ parameterCategory = 3 ; parameterNumber = 19 ; } +#Leaf Area Index +'lai' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfFirstFixedSurface = 1 ; + } #Accumulated surface upward short-wave radiation flux, clear sky 'auswrf_cs' = { discipline = 0 ; diff --git a/definitions/grib2/units.def b/definitions/grib2/units.def index 0ab97ac1d..4ba290e9b 100644 --- a/definitions/grib2/units.def +++ b/definitions/grib2/units.def @@ -3824,6 +3824,55 @@ typeOfFirstFixedSurface = 1 ; typeOfStatisticalProcessing = 1 ; } +#Lake surface temperature +'K' = { + discipline = 1 ; + parameterCategory = 2 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 1 ; + typeOfSecondFixedSurface = 255 ; + } +#Surface bulk Richardson number +'Numeric' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 16 ; + typeOfFirstFixedSurface = 1 ; + } +#Time-maximum 2 metre relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 2 ; + } +#Time-minimum 2 metre relative humidity +'%' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 1 ; + typeOfFirstFixedSurface = 103 ; + scaledValueOfFirstFixedSurface = 2 ; + scaleFactorOfFirstFixedSurface = 0 ; + typeOfStatisticalProcessing = 3 ; + } +#Surface roughness for heat +'m' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 47 ; + typeOfFirstFixedSurface = 1 ; + } +#Surface roughness for moisture +'m' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 48 ; + typeOfFirstFixedSurface = 1 ; + } #Burned area '%' = { discipline = 2 ; @@ -6710,6 +6759,13 @@ parameterCategory = 3 ; parameterNumber = 19 ; } +#Leaf Area Index +'Numeric' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 28 ; + typeOfFirstFixedSurface = 1 ; + } #Accumulated surface upward short-wave radiation flux, clear sky 'J m**-2' = { discipline = 0 ; From 80e9bb7e4f2f2d28a11bb123fc531f1ba7913f42 Mon Sep 17 00:00:00 2001 From: Shahram Najm Date: Tue, 9 Apr 2024 13:19:43 +0000 Subject: [PATCH 244/244] Definitions: Fix KWBC local parameter cfVarNames --- .../grib2/localConcepts/kwbc/cfVarName.def | 1915 +++++++++++++++++ 1 file changed, 1915 insertions(+) create mode 100644 definitions/grib2/localConcepts/kwbc/cfVarName.def diff --git a/definitions/grib2/localConcepts/kwbc/cfVarName.def b/definitions/grib2/localConcepts/kwbc/cfVarName.def new file mode 100644 index 000000000..06c621dd5 --- /dev/null +++ b/definitions/grib2/localConcepts/kwbc/cfVarName.def @@ -0,0 +1,1915 @@ +# Automatically generated by ./create_def.pl, do not edit +#Convective available potential energy +'cape' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 6 ; + } +#Snow phase change heat flux +'snohf' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 192 ; + } +#Condensate +'tcond' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 195 ; + } +#Horizontal moisture convergence +'mconv' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 197 ; + } +#Categorical rain +'crain' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 192 ; + } +#Categorical freezing rain +'cfrzr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + } +#Categorical ice pellets +'cicep' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 194 ; + } +#Categorical snow +'csnow' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + } +#Convective precipitation rate +'cprat' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 196 ; + } +#Percent frozen precipitation +'cpofp' = { + discipline = 1 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + } +#Potential evaporation +'pevap' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 199 ; + } +#Snow cover +'snowc' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 201 ; + } +#Rain fraction of total cloud water +'frain' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 202 ; + } +#Rime factor +'rime' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 203 ; + } +#Total column integrated rain +'tcolr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 204 ; + } +#Total column integrated snow +'tcols' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 205 ; + } +#Water equivalent of accumulated snow depth (deprecated) +'sdwe' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 11 ; + } +#Vertical speed shear +'vwsh' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 192 ; + } +#Horizontal momentum flux +'mflx' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 193 ; + } +#U-component storm motion +'ustm' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 194 ; + } +#V-component storm motion +'vstm' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 195 ; + } +#Drag coefficient +'cd' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 196 ; + } +#Frictional velocity +'fricv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 197 ; + } +#5-wave geopotential height +'wavh5' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 193 ; + } +#Zonal flux of gravity wave stress +'u-gwd' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 194 ; + } +#Meridional flux of gravity wave stress +'v-gwd' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 195 ; + } +#5-wave geopotential height anomaly +'wava5' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 197 ; + } +#Downward short-wave radiation flux +'dswrf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 192 ; + } +#Upward short-wave radiation flux +'uswrf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 193 ; + } +#UV index +'uvi' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 196 ; + } +#Downward long-wave radiation flux +'dlwrf' = { + discipline = 0 ; + parameterCategory = 5 ; + parameterNumber = 192 ; + } +#Upward long-wave radiation flux +'ulwrf' = { + discipline = 0 ; + parameterCategory = 5 ; + parameterNumber = 193 ; + } +#Non-convective cloud cover +'cdlyr' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 192 ; + } +#Cloud work function +'cwork' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 193 ; + } +#Convective cloud efficiency +'cuefi' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 194 ; + } +#Total column-integrated cloud water +'tcolw' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 196 ; + } +#Total column-integrated cloud ice +'tcoli' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 197 ; + } +#Total column-integrated condensate +'tcolc' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 198 ; + } +#Ice fraction of total condensate +'fice' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 199 ; + } +#Surface lifted index +'lftx' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 192 ; + } +#Best (4-layer) lifted index +'lftx4' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 193 ; + } +#Ozone mixing ratio +'o3mr' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 192 ; + } +#Maximum snow albedo +'mxsalb' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 192 ; + } +#Snow free albedo +'snfalb' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 193 ; + } +#Seconds prior to initial reference time (defined in Section 1) +'tsec' = { + discipline = 0 ; + parameterCategory = 191 ; + parameterNumber = 194 ; + } +#Baseflow-groundwater runoff +'bgrun' = { + discipline = 1 ; + parameterCategory = 0 ; + parameterNumber = 192 ; + } +#Storm surface runoff +'ssrun' = { + discipline = 1 ; + parameterCategory = 0 ; + parameterNumber = 193 ; + } +#Volumetric soil moisture content +'soilw' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 192 ; + } +#Ground heat flux +'gflux' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 193 ; + } +#Moisture availability +'mstav' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 194 ; + } +#Exchange coefficient +'sfexc' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 195 ; + } +#Plant canopy surface water +'cnwat' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 196 ; + } +#Blackadar mixing length scale +'bmixl' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 197 ; + } +#Canopy conductance +'ccond' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 199 ; + } +#Minimal stomatal resistance +'rsmin' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 200 ; + } +#Solar parameter in canopy conductance +'rcs' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + } +#Temperature parameter in canopy conductance +'rct' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 203 ; + } +#Soil moisture parameter in canopy conductance +'rcsol' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 205 ; + } +#Humidity parameter in canopy conductance +'rcq' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + } +#Liquid volumetric soil moisture (non-frozen) +'soill' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 192 ; + } +#Number of soil layers in root zone +'rlyrs' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 193 ; + } +#Transpiration stress-onset (soil moisture) +'smref' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 195 ; + } +#Direct evaporation cease (soil moisture) +'smdry' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 196 ; + } +#Soil porosity +'poros' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 197 ; + } +#Temperature tendency by all radiation +'ttrad' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 193 ; + } +#Relative Error Variance +'rev' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 194 ; + } +#Large Scale Condensate Heating rate +'lrghr' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 195 ; + } +#Deep Convective Heating rate +'cnvhr' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 196 ; + } +#Total Downward Heat Flux at Surface +'thflx' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 197 ; + } +#Temperature Tendency By All Physics +'ttdia' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 198 ; + } +#Temperature Tendency By Non-radiation Physics +'ttphy' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 199 ; + } +#Standard Dev. of IR Temp. over 1x1 deg. area +'tsd1d' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 200 ; + } +#Shallow Convective Heating rate +'shahr' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + } +#Vertical Diffusion Heating rate +'vdfhr' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 202 ; + } +#Potential temperature at top of viscous sublayer +'thz0' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 203 ; + } +#Tropical Cyclone Heat Potential +'tchp' = { + discipline = 0 ; + parameterCategory = 0 ; + parameterNumber = 204 ; + } +#Minimum Relative Humidity +'minrh' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 198 ; + } +#Total Icing Potential Diagnostic +'tipd' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 206 ; + } +#Number concentration for ice particles +'ncip' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 207 ; + } +#Snow temperature +'snot' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 208 ; + } +#Total column-integrated supercooled liquid water +'tclsw' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 209 ; + } +#Total column-integrated melting ice +'tcolm' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 210 ; + } +#Evaporation - Precipitation +'emnp' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 211 ; + } +#Sublimation (evaporation from snow) +'sbsno' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 212 ; + } +#Deep Convective Moistening Rate +'cnvmr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 213 ; + } +#Shallow Convective Moistening Rate +'shamr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 214 ; + } +#Vertical Diffusion Moistening Rate +'vdfmr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 215 ; + } +#Condensation Pressure of Parcali Lifted From Indicate Surface +'condp' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 216 ; + } +#Large scale moistening rate +'lrgmr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 217 ; + } +#Specific humidity at top of viscous sublayer +'qz0' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 218 ; + } +#Maximum specific humidity at 2m +'qmax' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 219 ; + } +#Minimum specific humidity at 2m +'qmin' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 220 ; + } +#Liquid precipitation (rainfall) +'arain' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 221 ; + } +#Snow temperature, depth-avg +'snowt' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 222 ; + } +#Total precipitation (nearest grid point) +'apcpn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 223 ; + } +#Convective precipitation (nearest grid point) +'acpcpn' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 224 ; + } +#Freezing Rain +'frzr' = { + discipline = 0 ; + parameterCategory = 1 ; + parameterNumber = 225 ; + } +#Latitude of U Wind Component of Velocity +'lauv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 198 ; + } +#Longitude of U Wind Component of Velocity +'louv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 199 ; + } +#Latitude of V Wind Component of Velocity +'lavv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 200 ; + } +#Longitude of V Wind Component of Velocity +'lovv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 201 ; + } +#Latitude of Pressure Point +'lapp' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 202 ; + } +#Longitude of Pressure Point +'lopp' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 203 ; + } +#Vertical Eddy Diffusivity Heat exchange +'vedh' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 204 ; + } +#Covariance between Meridional and Zonal Components of the wind. +'covmz' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 205 ; + } +#Covariance between Temperature and Zonal Components of the wind. +'covtz' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 206 ; + } +#Covariance between Temperature and Meridional Components of the wind. +'covtm' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 207 ; + } +#Vertical Diffusion Zonal Acceleration +'vdfua' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 208 ; + } +#Vertical Diffusion Meridional Acceleration +'vdfva' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 209 ; + } +#Gravity wave drag zonal acceleration +'gwdu' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 210 ; + } +#Gravity wave drag meridional acceleration +'gwdv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 211 ; + } +#Convective zonal momentum mixing acceleration +'cnvu' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 212 ; + } +#Convective meridional momentum mixing acceleration +'cnvv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 213 ; + } +#Tendency of vertical velocity +'wtend' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 214 ; + } +#Omega (Dp/Dt) divide by density +'omgalf' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 215 ; + } +#Convective Gravity wave drag zonal acceleration +'cngwdu' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 216 ; + } +#Convective Gravity wave drag meridional acceleration +'cngwdv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 217 ; + } +#Velocity Point Model Surface +'lmv' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 218 ; + } +#Potential Vorticity (Mass-Weighted) +'pvmww' = { + discipline = 0 ; + parameterCategory = 2 ; + parameterNumber = 219 ; + } +#MSLP (Eta model reduction) +'mslet' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 192 ; + } +#MSLP (MAPS System Reduction) +'mslma' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 198 ; + } +#3-hr pressure tendency (Std. Atmos. Reduction) +'tslsa' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 199 ; + } +#Pressure of level from which parcel was lifted +'plpl' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 200 ; + } +#X-gradient of Log Pressure +'lpsx' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 201 ; + } +#Y-gradient of Log Pressure +'lpsy' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 202 ; + } +#X-gradient of Height +'hgtx' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 203 ; + } +#Y-gradient of Height +'hgty' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 204 ; + } +#Layer Thickness +'layth' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 205 ; + } +#Natural Log of Surface Pressure +'nlgsp' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 206 ; + } +#Convective updraft mass flux +'cnvumf' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 207 ; + } +#Convective downdraft mass flux +'cnvdmf' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 208 ; + } +#Convective detrainment mass flux +'cnvdemf' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 209 ; + } +#Mass Point Model Surface +'lmh' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 210 ; + } +#Geopotential Height (nearest grid point) +'hgtn' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 211 ; + } +#Pressure (nearest grid point) +'presn' = { + discipline = 0 ; + parameterCategory = 3 ; + parameterNumber = 212 ; + } +#UV-B downward solar flux +'duvb' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 194 ; + } +#Clear sky UV-B downward solar flux +'cduvb' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 195 ; + } +#Clear Sky Downward Solar Flux +'csdsf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 196 ; + } +#Solar Radiative Heating Rate +'swhr' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 197 ; + } +#Clear Sky Upward Solar Flux +'csusf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 198 ; + } +#Cloud Forcing Net Solar Flux +'cfnsf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 199 ; + } +#Visible Beam Downward Solar Flux +'vbdsf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 200 ; + } +#Visible Diffuse Downward Solar Flux +'vddsf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 201 ; + } +#Near IR Beam Downward Solar Flux +'nbdsf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 202 ; + } +#Near IR Diffuse Downward Solar Flux +'nddsf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 203 ; + } +#Downward Total radiation Flux +'dtrf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 204 ; + } +#Upward Total radiation Flux +'utrf' = { + discipline = 0 ; + parameterCategory = 4 ; + parameterNumber = 205 ; + } +#Long-Wave Radiative Heating Rate +'lwhr' = { + discipline = 0 ; + parameterCategory = 5 ; + parameterNumber = 194 ; + } +#Clear Sky Upward Long Wave Flux +'csulf' = { + discipline = 0 ; + parameterCategory = 5 ; + parameterNumber = 195 ; + } +#Clear Sky Downward Long Wave Flux +'csdlf' = { + discipline = 0 ; + parameterCategory = 5 ; + parameterNumber = 196 ; + } +#Cloud Forcing Net Long Wave Flux +'cfnlf' = { + discipline = 0 ; + parameterCategory = 5 ; + parameterNumber = 197 ; + } +#Convective Cloud Mass Flux +'mflux' = { + discipline = 0 ; + parameterCategory = 6 ; + parameterNumber = 200 ; + } +#Richardson Number +'ri' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 194 ; + } +#Convective Weather Detection Index +'cwdi' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 195 ; + } +#Updraft Helicity +'uphl' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 197 ; + } +#Leaf Area Index +'lai' = { + discipline = 0 ; + parameterCategory = 7 ; + parameterNumber = 198 ; + } +#Particulate matter (coarse) +'pmtc' = { + discipline = 0 ; + parameterCategory = 13 ; + parameterNumber = 192 ; + } +#Particulate matter (fine) +'pmtf' = { + discipline = 0 ; + parameterCategory = 13 ; + parameterNumber = 193 ; + } +#Particulate matter (fine) +'lpmtf' = { + discipline = 0 ; + parameterCategory = 13 ; + parameterNumber = 194 ; + } +#Integrated column particulate matter (fine) +'lipmf' = { + discipline = 0 ; + parameterCategory = 13 ; + parameterNumber = 195 ; + } +#Ozone Concentration (PPB) +'ozcon' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 193 ; + } +#Categorical Ozone Concentration +'ozcat' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 194 ; + } +#Ozone vertical diffusion +'vdfoz' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 195 ; + } +#Ozone production +'poz' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 196 ; + } +#Ozone tendency +'toz' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 197 ; + } +#Ozone production from temperature term +'pozt' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 198 ; + } +#Ozone production from col ozone term +'pozo' = { + discipline = 0 ; + parameterCategory = 14 ; + parameterNumber = 199 ; + } +#Derived radar reflectivity backscatter from rain +'refzr' = { + discipline = 0 ; + parameterCategory = 16 ; + parameterNumber = 192 ; + } +#Derived radar reflectivity backscatter from ice +'refzi' = { + discipline = 0 ; + parameterCategory = 16 ; + parameterNumber = 193 ; + } +#Derived radar reflectivity backscatter from parameterized convection +'refzc' = { + discipline = 0 ; + parameterCategory = 16 ; + parameterNumber = 194 ; + } +#Derived radar reflectivity +'refd' = { + discipline = 0 ; + parameterCategory = 16 ; + parameterNumber = 195 ; + } +#Maximum/Composite radar reflectivity +'refc' = { + discipline = 0 ; + parameterCategory = 16 ; + parameterNumber = 196 ; + } +#Lightning +'ltng' = { + discipline = 0 ; + parameterCategory = 17 ; + parameterNumber = 192 ; + } +#Slight risk convective outlook +'srcono' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 194 ; + } +#Moderate risk convective outlook +'mrcono' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 195 ; + } +#High risk convective outlook +'hrcono' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 196 ; + } +#Tornado probability +'torprob' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 197 ; + } +#Hail probability +'hailprob' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 198 ; + } +#Wind probability +'windprob' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 199 ; + } +#Significant Tornado probability +'storprob' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 200 ; + } +#Significant Hail probability +'shailpro' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 201 ; + } +#Significant Wind probability +'swindpro' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 202 ; + } +#Categorical Thunderstorm (1-yes, 0-no) +'tstmc' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 203 ; + } +#Number of mixed layers next to surface +'mixly' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 204 ; + } +#Flight Category +'flght' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 205 ; + } +#Confidence - Ceiling +'cicel' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 206 ; + } +#Confidence - Visibility +'civis' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 207 ; + } +#Confidence - Flight Category +'ciflt' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 208 ; + } +#Low-Level aviation interest +'lavni' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 209 ; + } +#High-Level aviation interest +'havni' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 210 ; + } +#Visible, Black Sky Albedo +'sbsalb' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 211 ; + } +#Visible, White Sky Albedo +'swsalb' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 212 ; + } +#Near IR, Black Sky Albedo +'nbsalb' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 213 ; + } +#Near IR, White Sky Albedo +'nwsalb' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 214 ; + } +#Total Probability of Severe Thunderstorms (Days 2,3) +'prsvr' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 215 ; + } +#Total Probability of Extreme Severe Thunderstorms (Days 2,3) +'prsigsvr' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 216 ; + } +#Supercooled Large Droplet (SLD) Potential +'sipd' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 217 ; + } +#Radiative emissivity +'epsr' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 218 ; + } +#Turbulence Potential Forecast Index +'tpfi' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 219 ; + } +#Volcanic Ash Forecast Transport and Dispersion +'vaftd' = { + discipline = 0 ; + parameterCategory = 19 ; + parameterNumber = 232 ; + } +#Latitude (-90 to +90) +'nlat' = { + discipline = 0 ; + parameterCategory = 191 ; + parameterNumber = 192 ; + } +#East Longitude (0 - 360) +'elon' = { + discipline = 0 ; + parameterCategory = 191 ; + parameterNumber = 193 ; + } +#Model Layer number (From bottom up) +'mlyno' = { + discipline = 0 ; + parameterCategory = 191 ; + parameterNumber = 195 ; + } +#Latitude (nearest neighbor) (-90 to +90) +'nlatn' = { + discipline = 0 ; + parameterCategory = 191 ; + parameterNumber = 196 ; + } +#East Longitude (nearest neighbor) (0 - 360) +'elonn' = { + discipline = 0 ; + parameterCategory = 191 ; + parameterNumber = 197 ; + } +#Probability of Freezing Precipitation +'cpozp' = { + discipline = 1 ; + parameterCategory = 1 ; + parameterNumber = 192 ; + } +#Probability of precipitation exceeding flash flood guidance values +'ppffg' = { + discipline = 1 ; + parameterCategory = 1 ; + parameterNumber = 194 ; + } +#Probability of Wetting Rain, exceeding in 0.10 in a given time period +'cwr' = { + discipline = 1 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + } +#Vegetation Type +'vgtyp' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 198 ; + } +#Wilting Point +'wilt' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 201 ; + } +#Rate of water dropping from canopy to ground +'rdrip' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 206 ; + } +#Ice-free water surface +'icwat' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 207 ; + } +#Surface exchange coefficients for T and Q divided by delta z +'akhs' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 208 ; + } +#Surface exchange coefficients for U and V divided by delta z +'akms' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 209 ; + } +#Vegetation canopy temperature +'vegt' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 210 ; + } +#Surface water storage +'sstor' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 211 ; + } +#Liquid soil moisture content (non-frozen) +'lsoil' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 212 ; + } +#Open water evaporation (standing water) +'ewatr' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 213 ; + } +#Groundwater recharge +'gwrec' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 214 ; + } +#Flood plain recharge +'qrec' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 215 ; + } +#Roughness length for heat +'sfcrh' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 216 ; + } +#Normalized Difference Vegetation Index +'ndvi' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 217 ; + } +#Land-sea coverage (nearest neighbor) [land=1,sea=0] +'landn' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 218 ; + } +#Asymptotic mixing length scale +'amixl' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 219 ; + } +#Water vapor added by precip assimilation +'wvinc' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 220 ; + } +#Water condensate added by precip assimilation +'wcinc' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 221 ; + } +#Water Vapor Flux Convergence (Vertical Int) +'wvconv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 222 ; + } +#Water Condensate Flux Convergence (Vertical Int) +'wcconv' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 223 ; + } +#Water Vapor Zonal Flux (Vertical Int) +'wvuflx' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 224 ; + } +#Water Vapor Meridional Flux (Vertical Int) +'wvvflx' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 225 ; + } +#Water Condensate Zonal Flux (Vertical Int) +'wcuflx' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 226 ; + } +#Water Condensate Meridional Flux (Vertical Int) +'wcvflx' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 227 ; + } +#Aerodynamic conductance +'acond' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 228 ; + } +#Canopy water evaporation +'evcw' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 229 ; + } +#Transpiration +'trans' = { + discipline = 2 ; + parameterCategory = 0 ; + parameterNumber = 230 ; + } +#Surface Slope Type +'sltyp' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 194 ; + } +#Direct evaporation from bare soil +'evbs' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 198 ; + } +#Land Surface Precipitation Accumulation +'lspa' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 199 ; + } +#Bare soil surface skin temperature +'baret' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 200 ; + } +#Average surface skin temperature +'avsft' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 201 ; + } +#Effective radiative skin temperature +'radt' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 202 ; + } +#Field Capacity +'fldcp' = { + discipline = 2 ; + parameterCategory = 3 ; + parameterNumber = 203 ; + } +#Scatterometer Estimated U Wind Component +'usct' = { + discipline = 3 ; + parameterCategory = 1 ; + parameterNumber = 192 ; + } +#Scatterometer Estimated V Wind Component +'vsct' = { + discipline = 3 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + } +#Wave Steepness +'wstp' = { + discipline = 10 ; + parameterCategory = 0 ; + parameterNumber = 192 ; + } +#Ocean Mixed Layer U Velocity +'omlu' = { + discipline = 10 ; + parameterCategory = 1 ; + parameterNumber = 192 ; + } +#Ocean Mixed Layer V Velocity +'omlv' = { + discipline = 10 ; + parameterCategory = 1 ; + parameterNumber = 193 ; + } +#Barotropic U velocity +'ubaro' = { + discipline = 10 ; + parameterCategory = 1 ; + parameterNumber = 194 ; + } +#Barotropic V velocity +'vbaro' = { + discipline = 10 ; + parameterCategory = 1 ; + parameterNumber = 195 ; + } +#Storm Surge +'surge' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 192 ; + } +#Extra Tropical Storm Surge +'etsrg' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 193 ; + } +#Ocean Surface Elevation Relative to Geoid +'elevhtml' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 194 ; + } +#Sea Surface Height Relative to Geoid +'sshg' = { + discipline = 10 ; + parameterCategory = 3 ; + parameterNumber = 195 ; + } +#Ocean Mixed Layer Potential Density (Reference 2000m)