Commit 36560a71 authored by Uwe Schulzweida's avatar Uwe Schulzweida
Browse files

gribapiEncode: update additional keys defined with vlistDefVarXXXKey() [Feature #4720]

parent ad20cb3e
...@@ -3,9 +3,13 @@ ...@@ -3,9 +3,13 @@
* Version 1.7.0 released * Version 1.7.0 released
* using CGRIBEX library version 1.7.0 * using CGRIBEX library version 1.7.0
2014-07-24 Uwe Schulzweida
* gribapiEncode: update additional keys defined with vlistDefVarXXXKey() [Feature #4720]
2014-07-22 Uwe Schulzweida 2014-07-22 Uwe Schulzweida
* added vlistDefVarProductDefinitionTemplate() to define GRIB2 Product Definition Template Number * added vlistDefVarProductDefinitionTemplate() to define GRIB2 Product Definition Template Number [Feature #4694]
2014-07-21 Uwe Schulzweida 2014-07-21 Uwe Schulzweida
......
...@@ -3138,29 +3138,37 @@ size_t gribapiEncode(int varID, int levelID, int vlistID, int gridID, int zaxisI ...@@ -3138,29 +3138,37 @@ size_t gribapiEncode(int varID, int levelID, int vlistID, int gridID, int zaxisI
vlist_t *vlistptr; vlist_t *vlistptr;
vlistptr = vlist_to_pointer(vlistID); vlistptr = vlist_to_pointer(vlistID);
if (!gc->init) { //if (!gc->init)
int i; {
for (i=0; i<vlistptr->vars[varID].opt_grib_dbl_nentries; i++) for (int i=0; i<vlistptr->vars[varID].opt_grib_dbl_nentries; i++)
{ {
int ret = my_grib_set_double(gh, vlistptr->vars[varID].opt_grib_dbl_keyword[i], if ( vlistptr->vars[varID].opt_grib_dbl_update[i] )
vlistptr->vars[varID].opt_grib_dbl_val[i]); {
if (ret != 0) { vlistptr->vars[varID].opt_grib_dbl_update[i] = FALSE;
fprintf(stderr, "key \"%s\" : value = %g\n", int ret = my_grib_set_double(gh, vlistptr->vars[varID].opt_grib_dbl_keyword[i],
vlistptr->vars[varID].opt_grib_dbl_keyword[i], vlistptr->vars[varID].opt_grib_dbl_val[i]);
vlistptr->vars[varID].opt_grib_dbl_val[i]); if (ret != 0) {
} fprintf(stderr, "key \"%s\" : value = %g\n",
GRIB_CHECK(ret, 0); vlistptr->vars[varID].opt_grib_dbl_keyword[i],
vlistptr->vars[varID].opt_grib_dbl_val[i]);
}
GRIB_CHECK(ret, 0);
}
} }
for (i=0; i<vlistptr->vars[varID].opt_grib_int_nentries; i++) for (int i=0; i<vlistptr->vars[varID].opt_grib_int_nentries; i++)
{ {
int ret = my_grib_set_long(gh, vlistptr->vars[varID].opt_grib_int_keyword[i], if ( vlistptr->vars[varID].opt_grib_int_update[i] )
vlistptr->vars[varID].opt_grib_int_val[i]); {
if (ret != 0) { vlistptr->vars[varID].opt_grib_int_update[i] = FALSE;
fprintf(stderr, "key \"%s\" : value = %d\n", int ret = my_grib_set_long(gh, vlistptr->vars[varID].opt_grib_int_keyword[i],
vlistptr->vars[varID].opt_grib_int_keyword[i], vlistptr->vars[varID].opt_grib_int_val[i]);
vlistptr->vars[varID].opt_grib_int_val[i]); if (ret != 0) {
} fprintf(stderr, "key \"%s\" : value = %d\n",
GRIB_CHECK(ret, 0); vlistptr->vars[varID].opt_grib_int_keyword[i],
vlistptr->vars[varID].opt_grib_int_val[i]);
}
GRIB_CHECK(ret, 0);
}
} }
} }
......
...@@ -632,6 +632,7 @@ void cdi_generate_vars(stream_t *streamptr) ...@@ -632,6 +632,7 @@ void cdi_generate_vars(stream_t *streamptr)
int idx = vlistptr->vars[varID].opt_grib_int_nentries; int idx = vlistptr->vars[varID].opt_grib_int_nentries;
vlistptr->vars[varID].opt_grib_int_nentries++; vlistptr->vars[varID].opt_grib_int_nentries++;
if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/integer value pairs!"); if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/integer value pairs!");
vlistptr->vars[varID].opt_grib_int_update[idx] = TRUE;
vlistptr->vars[varID].opt_grib_int_val[idx] = vartable[varid].opt_grib_int_val[idx]; vlistptr->vars[varID].opt_grib_int_val[idx] = vartable[varid].opt_grib_int_val[idx];
vlistptr->vars[varID].opt_grib_int_keyword[idx] = strdupx(vartable[varid].opt_grib_int_keyword[idx]); vlistptr->vars[varID].opt_grib_int_keyword[idx] = strdupx(vartable[varid].opt_grib_int_keyword[idx]);
} }
...@@ -640,6 +641,7 @@ void cdi_generate_vars(stream_t *streamptr) ...@@ -640,6 +641,7 @@ void cdi_generate_vars(stream_t *streamptr)
int idx = vlistptr->vars[varID].opt_grib_dbl_nentries; int idx = vlistptr->vars[varID].opt_grib_dbl_nentries;
vlistptr->vars[varID].opt_grib_dbl_nentries++; vlistptr->vars[varID].opt_grib_dbl_nentries++;
if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/double value pairs!"); if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/double value pairs!");
vlistptr->vars[varID].opt_grib_dbl_update[idx] = TRUE;
vlistptr->vars[varID].opt_grib_dbl_val[idx] = vartable[varid].opt_grib_dbl_val[idx]; vlistptr->vars[varID].opt_grib_dbl_val[idx] = vartable[varid].opt_grib_dbl_val[idx];
vlistptr->vars[varID].opt_grib_dbl_keyword[idx] = strdupx(vartable[varid].opt_grib_dbl_keyword[idx]); vlistptr->vars[varID].opt_grib_dbl_keyword[idx] = strdupx(vartable[varid].opt_grib_dbl_keyword[idx]);
} }
......
...@@ -340,6 +340,7 @@ void vlistCopy(int vlistID2, int vlistID1) ...@@ -340,6 +340,7 @@ void vlistCopy(int vlistID2, int vlistID1)
if ( vlistptr1->vars[varID].opt_grib_int_keyword[i] ) { if ( vlistptr1->vars[varID].opt_grib_int_keyword[i] ) {
vlistptr2->vars[varID].opt_grib_int_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_int_keyword[i]); vlistptr2->vars[varID].opt_grib_int_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_int_keyword[i]);
vlistptr2->vars[varID].opt_grib_int_val[i] = vlistptr1->vars[varID].opt_grib_int_val[i]; vlistptr2->vars[varID].opt_grib_int_val[i] = vlistptr1->vars[varID].opt_grib_int_val[i];
vlistptr2->vars[varID].opt_grib_int_update[i] = TRUE;
} }
} }
vlistptr2->vars[varID].opt_grib_dbl_nentries = vlistptr1->vars[varID].opt_grib_dbl_nentries; vlistptr2->vars[varID].opt_grib_dbl_nentries = vlistptr1->vars[varID].opt_grib_dbl_nentries;
...@@ -347,6 +348,7 @@ void vlistCopy(int vlistID2, int vlistID1) ...@@ -347,6 +348,7 @@ void vlistCopy(int vlistID2, int vlistID1)
if ( vlistptr1->vars[varID].opt_grib_dbl_keyword[i] ) { if ( vlistptr1->vars[varID].opt_grib_dbl_keyword[i] ) {
vlistptr2->vars[varID].opt_grib_dbl_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_dbl_keyword[i]); vlistptr2->vars[varID].opt_grib_dbl_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_dbl_keyword[i]);
vlistptr2->vars[varID].opt_grib_dbl_val[i] = vlistptr1->vars[varID].opt_grib_dbl_val[i]; vlistptr2->vars[varID].opt_grib_dbl_val[i] = vlistptr1->vars[varID].opt_grib_dbl_val[i];
vlistptr2->vars[varID].opt_grib_dbl_update[i] = TRUE;
} }
} }
#endif #endif
...@@ -595,6 +597,7 @@ void vlistCopyFlag(int vlistID2, int vlistID1) ...@@ -595,6 +597,7 @@ void vlistCopyFlag(int vlistID2, int vlistID1)
if ( vlistptr1->vars[varID].opt_grib_int_keyword[i] ) { if ( vlistptr1->vars[varID].opt_grib_int_keyword[i] ) {
vlistptr2->vars[varID2].opt_grib_int_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_int_keyword[i]); vlistptr2->vars[varID2].opt_grib_int_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_int_keyword[i]);
vlistptr2->vars[varID2].opt_grib_int_val[i] = vlistptr1->vars[varID].opt_grib_int_val[i]; vlistptr2->vars[varID2].opt_grib_int_val[i] = vlistptr1->vars[varID].opt_grib_int_val[i];
vlistptr2->vars[varID2].opt_grib_int_update[i] = TRUE;
} }
} }
vlistptr2->vars[varID2].opt_grib_dbl_nentries = vlistptr1->vars[varID].opt_grib_dbl_nentries; vlistptr2->vars[varID2].opt_grib_dbl_nentries = vlistptr1->vars[varID].opt_grib_dbl_nentries;
...@@ -602,6 +605,7 @@ void vlistCopyFlag(int vlistID2, int vlistID1) ...@@ -602,6 +605,7 @@ void vlistCopyFlag(int vlistID2, int vlistID1)
if ( vlistptr1->vars[varID].opt_grib_dbl_keyword[i] ) { if ( vlistptr1->vars[varID].opt_grib_dbl_keyword[i] ) {
vlistptr2->vars[varID2].opt_grib_dbl_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_dbl_keyword[i]); vlistptr2->vars[varID2].opt_grib_dbl_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_dbl_keyword[i]);
vlistptr2->vars[varID2].opt_grib_dbl_val[i] = vlistptr1->vars[varID].opt_grib_dbl_val[i]; vlistptr2->vars[varID2].opt_grib_dbl_val[i] = vlistptr1->vars[varID].opt_grib_dbl_val[i];
vlistptr2->vars[varID2].opt_grib_dbl_update[i] = TRUE;
} }
} }
#endif #endif
...@@ -821,6 +825,7 @@ void vlistCat(int vlistID2, int vlistID1) ...@@ -821,6 +825,7 @@ void vlistCat(int vlistID2, int vlistID1)
if ( vlistptr1->vars[varID].opt_grib_int_keyword[i] ) { if ( vlistptr1->vars[varID].opt_grib_int_keyword[i] ) {
vlistptr2->vars[varID2].opt_grib_int_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_int_keyword[i]); vlistptr2->vars[varID2].opt_grib_int_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_int_keyword[i]);
vlistptr2->vars[varID2].opt_grib_int_val[i] = vlistptr1->vars[varID].opt_grib_int_val[i]; vlistptr2->vars[varID2].opt_grib_int_val[i] = vlistptr1->vars[varID].opt_grib_int_val[i];
vlistptr2->vars[varID2].opt_grib_int_update[i] = TRUE;
} }
} }
vlistptr2->vars[varID2].opt_grib_dbl_nentries = vlistptr1->vars[varID].opt_grib_dbl_nentries; vlistptr2->vars[varID2].opt_grib_dbl_nentries = vlistptr1->vars[varID].opt_grib_dbl_nentries;
...@@ -828,6 +833,7 @@ void vlistCat(int vlistID2, int vlistID1) ...@@ -828,6 +833,7 @@ void vlistCat(int vlistID2, int vlistID1)
if ( vlistptr1->vars[varID].opt_grib_dbl_keyword[i] ) { if ( vlistptr1->vars[varID].opt_grib_dbl_keyword[i] ) {
vlistptr2->vars[varID2].opt_grib_dbl_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_dbl_keyword[i]); vlistptr2->vars[varID2].opt_grib_dbl_keyword[i] = strdupx(vlistptr1->vars[varID].opt_grib_dbl_keyword[i]);
vlistptr2->vars[varID2].opt_grib_dbl_val[i] = vlistptr1->vars[varID].opt_grib_dbl_val[i]; vlistptr2->vars[varID2].opt_grib_dbl_val[i] = vlistptr1->vars[varID].opt_grib_dbl_val[i];
vlistptr2->vars[varID2].opt_grib_dbl_update[i] = TRUE;
} }
} }
#endif #endif
......
...@@ -114,10 +114,12 @@ typedef struct ...@@ -114,10 +114,12 @@ typedef struct
/* (Optional) list of keyword/double value pairs */ /* (Optional) list of keyword/double value pairs */
int opt_grib_dbl_nentries; int opt_grib_dbl_nentries;
char* opt_grib_dbl_keyword[MAX_OPT_GRIB_ENTRIES]; char* opt_grib_dbl_keyword[MAX_OPT_GRIB_ENTRIES];
int opt_grib_dbl_update[MAX_OPT_GRIB_ENTRIES];
double opt_grib_dbl_val[MAX_OPT_GRIB_ENTRIES]; double opt_grib_dbl_val[MAX_OPT_GRIB_ENTRIES];
/* (Optional) list of keyword/integer value pairs */ /* (Optional) list of keyword/integer value pairs */
int opt_grib_int_nentries; int opt_grib_int_nentries;
char* opt_grib_int_keyword[MAX_OPT_GRIB_ENTRIES]; char* opt_grib_int_keyword[MAX_OPT_GRIB_ENTRIES];
int opt_grib_int_update[MAX_OPT_GRIB_ENTRIES];
int opt_grib_int_val[MAX_OPT_GRIB_ENTRIES]; int opt_grib_int_val[MAX_OPT_GRIB_ENTRIES];
#endif #endif
} }
......
...@@ -77,8 +77,10 @@ void vlistvarInitEntry(int vlistID, int varID) ...@@ -77,8 +77,10 @@ void vlistvarInitEntry(int vlistID, int varID)
vlistptr->vars[varID].opt_grib_int_nentries = 0; vlistptr->vars[varID].opt_grib_int_nentries = 0;
int i; int i;
for (i=0; i<MAX_OPT_GRIB_ENTRIES; i++) { for (i=0; i<MAX_OPT_GRIB_ENTRIES; i++) {
vlistptr->vars[varID].opt_grib_dbl_val[i] = 0.0;
vlistptr->vars[varID].opt_grib_int_val[i] = 0; vlistptr->vars[varID].opt_grib_int_val[i] = 0;
vlistptr->vars[varID].opt_grib_dbl_val[i] = 0.0;
vlistptr->vars[varID].opt_grib_int_update[i] = FALSE;
vlistptr->vars[varID].opt_grib_dbl_update[i] = FALSE;
vlistptr->vars[varID].opt_grib_int_keyword[i] = NULL; vlistptr->vars[varID].opt_grib_int_keyword[i] = NULL;
vlistptr->vars[varID].opt_grib_dbl_keyword[i] = NULL; vlistptr->vars[varID].opt_grib_dbl_keyword[i] = NULL;
} // for } // for
...@@ -1739,15 +1741,28 @@ void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value) ...@@ -1739,15 +1741,28 @@ void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value)
{ {
#if defined (HAVE_LIBGRIB_API) #if defined (HAVE_LIBGRIB_API)
vlist_t *vlistptr = vlist_to_pointer(vlistID); vlist_t *vlistptr = vlist_to_pointer(vlistID);
int idx;
int idx = vlistptr->vars[varID].opt_grib_int_nentries; for ( idx=0; idx<vlistptr->vars[varID].opt_grib_int_nentries; idx++)
vlistptr->vars[varID].opt_grib_int_nentries++; if ( strcmp(name, vlistptr->vars[varID].opt_grib_int_keyword[idx]) == 0 ) break;
if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/integer value pairs!");
vlistptr->vars[varID].opt_grib_int_val[idx] = value; if ( idx < vlistptr->vars[varID].opt_grib_int_nentries )
if ( name ) {
vlistptr->vars[varID].opt_grib_int_keyword[idx] = strdupx(name); vlistptr->vars[varID].opt_grib_int_val[idx] = value;
vlistptr->vars[varID].opt_grib_int_update[idx] = TRUE;
}
else else
Error("Internal error!"); {
idx = vlistptr->vars[varID].opt_grib_int_nentries;
vlistptr->vars[varID].opt_grib_int_nentries++;
if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/integer value pairs!");
vlistptr->vars[varID].opt_grib_int_val[idx] = value;
vlistptr->vars[varID].opt_grib_int_update[idx] = TRUE;
if ( name )
vlistptr->vars[varID].opt_grib_int_keyword[idx] = strdupx(name);
else
Error("Internal error, name undefined!");
}
#endif #endif
} }
...@@ -1756,15 +1771,28 @@ void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value) ...@@ -1756,15 +1771,28 @@ void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value)
{ {
#if defined (HAVE_LIBGRIB_API) #if defined (HAVE_LIBGRIB_API)
vlist_t *vlistptr = vlist_to_pointer(vlistID); vlist_t *vlistptr = vlist_to_pointer(vlistID);
int idx;
int idx = vlistptr->vars[varID].opt_grib_dbl_nentries; for ( idx=0; idx<vlistptr->vars[varID].opt_grib_dbl_nentries; idx++)
vlistptr->vars[varID].opt_grib_dbl_nentries++; if ( strcmp(name, vlistptr->vars[varID].opt_grib_dbl_keyword[idx]) == 0 ) break;
if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/double value pairs!");
vlistptr->vars[varID].opt_grib_dbl_val[idx] = value; if ( idx < vlistptr->vars[varID].opt_grib_dbl_nentries )
if ( name ) {
vlistptr->vars[varID].opt_grib_dbl_keyword[idx] = strdupx(name); vlistptr->vars[varID].opt_grib_dbl_val[idx] = value;
vlistptr->vars[varID].opt_grib_dbl_update[idx] = TRUE;
}
else else
Error("Internal error!"); {
idx = vlistptr->vars[varID].opt_grib_dbl_nentries;
vlistptr->vars[varID].opt_grib_dbl_nentries++;
if ( idx >= MAX_OPT_GRIB_ENTRIES ) Error("Too many optional keyword/double value pairs!");
vlistptr->vars[varID].opt_grib_dbl_val[idx] = value;
vlistptr->vars[varID].opt_grib_dbl_update[idx] = TRUE;
if ( name )
vlistptr->vars[varID].opt_grib_dbl_keyword[idx] = strdupx(name);
else
Error("Internal error, name undefined!");
}
#endif #endif
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment