diff --git a/src/grib2.h.in b/src/grib2.h.in index 231ab726..4585bea1 100644 --- a/src/grib2.h.in +++ b/src/grib2.h.in @@ -291,7 +291,7 @@ g2int g2_gribend(unsigned char *cgrib); /* Constants to help with templates. */ #define G2C_MAX_GDS_TEMPLATE 31 /**< Maximum number of grid templates. */ #define G2C_MAX_GDS_TEMPLATE_MAPLEN 28 /**< Maximum grid template map length. */ -#define G2C_MAX_PDS_TEMPLATE 77 /**< Maximum number of PDS templates. */ +#define G2C_MAX_PDS_TEMPLATE 78 /**< Maximum number of PDS templates. */ #define G2C_MAX_PDS_TEMPLATE_MAPLEN 45 /**< Maximum template map length. */ #define G2C_MAX_DRS_TEMPLATE 10 /**< Maximum number of DRS templates. */ #define G2C_MAX_DRS_TEMPLATE_MAPLEN 18 /**< Maximum DRS template map length. */ diff --git a/src/pdstemplates.c b/src/pdstemplates.c index d23d18cd..30d36b7e 100644 --- a/src/pdstemplates.c +++ b/src/pdstemplates.c @@ -350,8 +350,12 @@ static const struct pdstemplate templatespds[G2C_MAX_PDS_TEMPLATE] = {93, 27, 1, {1, 1, 2, 2, 1, 1, 1, 1, 1, -1, -4, 1, -1, -4, 1, 1, 2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}}, /** PDT 4.94 (12/04/2024) 4.94: Post-processing individual ensemble forecast, control and perturbed, at a horizontal level - or in a horizontal layer at a specified local time*/ + or in a horizontal layer at a specified local time */ {94, 30, 1, {1, 1, 2, 2, 1, 1, 1, 1, 1, -1, -4, 1, -1, -4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}}, + /** PDT 4.95 (12/04/2024) + 4.95: Average, accumulation, extreme values or other statistically processed value + at a horizontal level or in a horizontal layer at a local time */ + {95, 28, 1, {1, 1, 1, 1, 1, 1, -1, -4, 1, -1, -4, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}}, }; /** @@ -1244,6 +1248,23 @@ extpdstemplate(g2int number, g2int *list) } } } + /* PDT 4.95 (12/04/2024) */ + else if (number == 95) + { + if (list[16] > 1) + { + new->extlen = (list[16] - 1) * 11; + new->ext = malloc(sizeof(g2int) * new->extlen); + for (j = 2; j <= list[16]; j++) + { + l = (j - 2) * 11; + for (k = 0; k < 11; k++) + { + new->ext[l + k] = new->map[17 + k]; + } + } + } + } return new; } diff --git a/tests/tst_pdstemplates.c b/tests/tst_pdstemplates.c index 25d5df96..6e2bd927 100644 --- a/tests/tst_pdstemplates.c +++ b/tests/tst_pdstemplates.c @@ -561,27 +561,39 @@ main() return G2C_ERROR; free(tmpl->ext); free(tmpl); + + /* Check for one that's there but does need an extension. */ + tmpl = extpdstemplate(95, list); + if (!tmpl) + return G2C_ERROR; + if (tmpl->num != 95 || tmpl->maplen != 28 || !tmpl->needext) + return G2C_ERROR; + if (!tmpl->ext) + return G2C_ERROR; + free(tmpl->ext); + free(tmpl); } printf("ok!\n"); printf("Testing all getpdstemplate() calls with extensions...\n"); { -#define NUM_TEST 77 +#define NUM_TEST 78 int number[NUM_TEST] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 30, 31, 40, 41, 42, 43, 254, 1000, 1001, 1002, 1100, 1101, 32, 44, 45, 46, 47, 48, 50, 52, 51, 91, 33, 34, 53, 54, 57, 60, 61, 35, 49, 55, 58, 59, 62, 63, 67, 68, 70, 71, 72, 73, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92, - 93, 94}; + 93, 94, 95}; int expected_maplen[NUM_TEST] = { 15, 18, 17, 31, 30, 22, 16, 15, 29, 36, 30, 32, 31, 45, 44, 18, 19, 5, 5, 16, 19, 30, 33, 3, 9, 16, 15, 15, 22, 10, 21, 24, 35, 38, 26, 21, 15, 16, 36, 18, 32, 19, 22, 7, 24, 38, 6, 29, 21, 7, 24, 35, 38, 7, 7, 19, 21, 32, - 34, 17, 20, 31, 34, 27, 30, 36, 40, 39, 38, 17, 31, 24, 20, 34, 27, 27, 30}; + 34, 17, 20, 31, 34, 27, 30, 36, 40, 39, 38, 17, 31, 24, 20, 34, 27, 27, 30, + 28}; int expected_needext[NUM_TEST] = { 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1}; + 1, 1, 1}; int expected_map[NUM_TEST][48] = { {1, 1, 1, 1, 1, 2, 1, 1, -4, 1, -1, -4, 1, -1, -4}, /* 0 */ {1, 1, 1, 1, 1, 2, 1, 1, -4, 1, -1, -4, 1, -1, -4, 1, 1, 1}, /* 1 */ @@ -660,6 +672,7 @@ main() {1, 1, 1, 1, 1, 1, -1, -4, 1, -1, -4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 92 */ {1, 1, 2, 2, 1, 1, 1, 1, 1, -1, -4, 1, -1, -4, 1, 1, 2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 93 */ {1, 1, 2, 2, 1, 1, 1, 1, 1, -1, -4, 1, -1, -4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 94 */ + {1, 1, 1, 1, 1, 1, -1, -4, 1, -1, -4, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 95 */ }; int t; int ext_t = 0; @@ -701,11 +714,11 @@ main() if (map[m] != expected_map[t][m]) return G2C_ERROR; -#define NUM_EXT_TEST 44 +#define NUM_EXT_TEST 45 int template[G2C_MAX_PDS_TEMPLATE_MAPLEN]; int expected_extlen[NUM_EXT_TEST] = { 2, 2, 6, 6, 6, 6, 6, 8, 8, 10, 10, 6, 6, 10, 6, 6, 12, 8, 2, 8, 2, 2, 30, 6, - 10, 20, 6, 6, 31, 34, 6, 6, 6, 6, 6, 6, 6, 6, 6, 11, 6, 11, 11, 11}; + 10, 20, 6, 6, 31, 34, 6, 6, 6, 6, 6, 6, 6, 6, 6, 11, 6, 11, 11, 11, 11}; int expected_ext[NUM_EXT_TEST][48] = { {1, 1}, /* 3 */ {1, 1}, /* 4 */ @@ -751,6 +764,7 @@ main() {2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 92 */ {2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 93 */ {2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 94 */ + {2, 1, 1, 1, 1, 1, 1, -4, 1, 1, 4}, /* 95 */ }; if (needext) @@ -899,6 +913,9 @@ main() case 94: template[18] = 2; break; + case 95: + template[16] = 2; + break; default: return G2C_ERROR; }