diff --git a/ChangeLog b/ChangeLog index 4d67335fe18ef71716ef1a66e84c5ca4805b31e6..839e9e81880c6b3ed5fe3ae5a581079fa359565b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,10 @@ * Version 2.0.0 released +2021-04-16 Uwe Schulzweida + + * Replaced gridDefDatatype()/gridInqDatatype() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_DATATYPE + 2021-04-15 Uwe Schulzweida * gribapiDefLevel: added support for GRIB1_LTYPE_LANDDEPTH_LAYER diff --git a/Obsolete_functions b/Obsolete_functions index 4754ddf4a8aa04fa5342b127f4fae793eedaf692..b3ef7e237728b5b98ba55a478ae4c2e4a6886c29 100644 --- a/Obsolete_functions +++ b/Obsolete_functions @@ -22,14 +22,16 @@ gridInqYlongname(gridID, ylongname) -> cdiInqKeyString(gridID, CDI_YAXIS, CDI_ gridInqYunits(gridID, yunits) -> cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, yunits, &length) gridInqYstdname(gridID, ylongname) -> cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, ystdname, &length) -gridDefNumber(zaxisID, number) -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number) -gridInqNumber(zaxisID) -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number) -gridDefPosition(zaxisID, position) > cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position) -gridInqPosition(zaxisID) -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position) -gridDefUUID(zaxisID, uuidOfHGrid) -> cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, length) -gridInqUUID(zaxisID) -> cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, &length) -gridDefReference(zaxisID, reference) -> cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference) -gridInqReference(zaxisID) -> cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference, &length) +gridDefDatatype(gridID, datatype) -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype) +gridInqDatatype(gridID) -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype) +gridDefNumber(gridID, number) -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number) +gridInqNumber(gridID) -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number) +gridDefPosition(gridID, position) -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position) +gridInqPosition(gridID) -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position) +gridDefUUID(gridID, uuidOfHGrid) -> cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, length) +gridInqUUID(gridID) -> cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, &length) +gridDefReference(gridID, reference) -> cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference) +gridInqReference(gridID) -> cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference, &length) zaxisDefName(zaxisID, name) -> cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name) zaxisDefLongname(zaxisID, longname) -> cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname) diff --git a/doc/tex/c_quick_ref.tex b/doc/tex/c_quick_ref.tex index 38de0eb26e95dbe73893df7d0f25f3737e40a908..87eac29911ffb25accab3c4fab827523408cd6c4 100644 --- a/doc/tex/c_quick_ref.tex +++ b/doc/tex/c_quick_ref.tex @@ -161,15 +161,6 @@ Get number of attributes assigned to this variable. Create a horizontal Grid. -\section*{\tt \htmlref{gridDefDatatype}{gridDefDatatype}} - -\begin{verbatim} - void gridDefDatatype (int gridID, int prec); -\end{verbatim} - -Define the data type of a Grid. - - \section*{\tt \htmlref{gridDefNP}{gridDefNP}} \begin{verbatim} @@ -359,15 +350,6 @@ Destroy a horizontal Grid. Duplicate a Grid. -\section*{\tt \htmlref{gridInqDatatype}{gridInqDatatype}} - -\begin{verbatim} - int gridInqDatatype (int gridID); -\end{verbatim} - -Get the data type of a Grid. - - \section*{\tt \htmlref{gridInqNP}{gridInqNP}} \begin{verbatim} diff --git a/doc/tex/f_quick_ref.tex b/doc/tex/f_quick_ref.tex index f6995f6c5ae0666337496fd0f33acb532619ac26..b44741069d603cdec19e356a0db7954428afa7be 100644 --- a/doc/tex/f_quick_ref.tex +++ b/doc/tex/f_quick_ref.tex @@ -169,15 +169,6 @@ Get number of attributes assigned to this variable. Create a horizontal Grid. -\section*{\tt \htmlref{gridDefDatatype}{gridDefDatatype}} - -\begin{verbatim} - SUBROUTINE gridDefDatatype (INTEGER gridID, INTEGER prec) -\end{verbatim} - -Define the data type of a Grid. - - \section*{\tt \htmlref{gridDefNP}{gridDefNP}} \begin{verbatim} @@ -367,15 +358,6 @@ Destroy a horizontal Grid. Duplicate a Grid. -\section*{\tt \htmlref{gridInqDatatype}{gridInqDatatype}} - -\begin{verbatim} - INTEGER FUNCTION gridInqDatatype (INTEGER gridID) -\end{verbatim} - -Get the data type of a Grid. - - \section*{\tt \htmlref{gridInqNP}{gridInqNP}} \begin{verbatim} diff --git a/src/cdi.h b/src/cdi.h index b96069f96a47aaa6449ddead784c8a57ef97a405..c1a7ef1fce1392bde00855278fce18aca014216a 100644 --- a/src/cdi.h +++ b/src/cdi.h @@ -914,10 +914,7 @@ void gridDefYunits(int gridID, const char *yunits); // gridInqYunits: Get the units of a Y-axis void gridInqYunits(int gridID, char *yunits); -// gridDefDatatype: Define the data type of a Grid void gridDefDatatype(int gridID, int prec); - -// gridInqDatatype: Get the data type of a Grid int gridInqDatatype(int gridID); // gridInqXval: Get one value of a X-axis diff --git a/src/cdi.inc b/src/cdi.inc index 6fafd09de9769920568634b90912638ea367c6f7..9558cfe5339fbbc83171273bcfee5b868b42e715 100644 --- a/src/cdi.inc +++ b/src/cdi.inc @@ -4,7 +4,7 @@ ! ! Author: ! ------- -! Uwe Schulzweida, MPI-MET, Hamburg, March 2021 +! Uwe Schulzweida, MPI-MET, Hamburg, April 2021 ! INTEGER CDI_MAX_NAME diff --git a/src/gribapi_utilities.c b/src/gribapi_utilities.c index f58a2f020854187e7e730bd12bf60ae937ee44c4..7c94f737eb8bbe671e071b03408d9af9ed8cc970 100644 --- a/src/gribapi_utilities.c +++ b/src/gribapi_utilities.c @@ -445,7 +445,7 @@ int gribapiGetTsteptype(grib_handle *gh) int gribGetDatatype(grib_handle* gribHandle) { int datatype; - if(gribEditionNumber(gribHandle) > 1 && gribCheckString(gribHandle, "packingType", "grid_ieee")) + if (gribEditionNumber(gribHandle) > 1 && gribCheckString(gribHandle, "packingType", "grid_ieee")) { datatype = gribCheckLong(gribHandle, "precision", 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; } @@ -470,8 +470,8 @@ int gribapiGetParam(grib_handle *gh) else { FAIL_ON_GRIB_ERROR(grib_get_long, gh, "discipline", &pdis); - if(grib_get_long(gh, "parameterCategory", &pcat)) pcat = 0; - if(grib_get_long(gh, "parameterNumber", &pnum)) pnum = 0; + if (grib_get_long(gh, "parameterCategory", &pcat)) pcat = 0; + if (grib_get_long(gh, "parameterNumber", &pnum)) pnum = 0; } return cdiEncodeParam((int)pnum, (int)pcat, (int)pdis); } diff --git a/src/grid.c b/src/grid.c index 7f03d2c93b8283c29a080e5eef1c1169a6574f7a..aed192f4a48f8a015685d8361e13353f4377ca10 100644 --- a/src/grid.c +++ b/src/grid.c @@ -92,7 +92,7 @@ bool cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int { bool status = true; - if ( atttype == CDI_DATATYPE_INT32 ) + if (atttype == CDI_DATATYPE_INT32) { int attint; int *pattint = attlen > 1 ? (int*) malloc(attlen*sizeof(int)) : &attint; @@ -100,7 +100,7 @@ bool cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int for ( int i = 0; i < attlen; ++i ) attflt[i] = (double)pattint[i]; if (attlen > 1) free(pattint); } - else if ( atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64 ) + else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { cdiInqAttFlt(gridID, CDI_GLOBAL, attname, attlen, attflt); } @@ -153,7 +153,6 @@ void grid_init(grid_t *gridptr) gridptr->trunc = 0; gridptr->nvertex = 0; - gridptr->datatype = CDI_DATATYPE_FLT64; gridptr->np = 0; gridptr->isCyclic = CDI_UNDEFID; @@ -161,10 +160,12 @@ void grid_init(grid_t *gridptr) gridptr->hasdims = true; gridptr->name = NULL; gridptr->vtable = &cdiGridVtable; + cdiInitKeys(&gridptr->keys); gridptr->atts.nalloc = MAX_ATTRIBUTES; gridptr->atts.nelems = 0; + cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_SCANNINGMODE, 64); } @@ -860,7 +861,7 @@ void gridDefProj(int gridID, int projID) grid_t *gridptr = grid_to_pointer(gridID); gridptr->proj = projID; - if ( gridptr->type == GRID_CURVILINEAR ) + if (gridptr->type == GRID_CURVILINEAR) { grid_t *projptr = grid_to_pointer(projID); const char *xdimname = cdiInqVarKeyStringPtr(&gridptr->x.keys, CDI_KEY_DIMNAME); @@ -883,19 +884,19 @@ int gridInqProjType(int gridID) grid_t *gridptr = grid_to_pointer(gridID); int projtype = gridptr->projtype; - if ( projtype == -1 ) + if (projtype == -1) { char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); - if ( gmapname[0] ) + if (gmapname[0]) { // clang-format off - if ( strIsEqual(gmapname, "rotated_latitude_longitude") ) projtype = CDI_PROJ_RLL; - else if ( strIsEqual(gmapname, "lambert_azimuthal_equal_area") ) projtype = CDI_PROJ_LAEA; - else if ( strIsEqual(gmapname, "lambert_conformal_conic") ) projtype = CDI_PROJ_LCC; - else if ( strIsEqual(gmapname, "sinusoidal") ) projtype = CDI_PROJ_SINU; - else if ( strIsEqual(gmapname, "polar_stereographic") ) projtype = CDI_PROJ_STERE; + if (strIsEqual(gmapname, "rotated_latitude_longitude")) projtype = CDI_PROJ_RLL; + else if (strIsEqual(gmapname, "lambert_azimuthal_equal_area")) projtype = CDI_PROJ_LAEA; + else if (strIsEqual(gmapname, "lambert_conformal_conic")) projtype = CDI_PROJ_LCC; + else if (strIsEqual(gmapname, "sinusoidal")) projtype = CDI_PROJ_SINU; + else if (strIsEqual(gmapname, "polar_stereographic")) projtype = CDI_PROJ_STERE; // clang-format on gridptr->projtype = projtype; } @@ -910,14 +911,14 @@ void gridVerifyProj(int gridID) grid_t *gridptr = grid_to_pointer(gridID); const int projtype = gridInqProjType(gridID); - if ( projtype == CDI_PROJ_RLL ) + if (projtype == CDI_PROJ_RLL) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees"); } - else if ( projtype == CDI_PROJ_LCC ) + else if (projtype == CDI_PROJ_LCC) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]); @@ -1073,40 +1074,16 @@ void gridDefXsize(int gridID, size_t xsize) } } -/* -@Function -@Title - -@Prototype -@Parameter - @Item Grid identifier - -@EndFunction -*/ void gridDefDatatype(int gridID, int datatype) { - grid_t *gridptr = grid_to_pointer(gridID); - if (gridptr->datatype != datatype) - { - gridMark4Update(gridID); - gridptr->datatype = datatype; - } + cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype); } -/* -@Function -@Title - -@Prototype -@Parameter - @Item Grid identifier - -@EndFunction -*/ int gridInqDatatype(int gridID) { - grid_t *gridptr = grid_to_pointer(gridID); - return gridptr->datatype; + int datatype = 0; + cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); + return datatype; } /* @@ -2582,7 +2559,8 @@ static void gridComplete(grid_t *grid) { const int gridID = grid->self; - gridDefDatatype(gridID, grid->datatype); + + cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, grid->datatype); const int gridtype = grid->type; switch (gridtype) @@ -2639,14 +2617,14 @@ void gridComplete(grid_t *grid) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]); } - if ( gridtype == GRID_UNSTRUCTURED ) + if (gridtype == GRID_UNSTRUCTURED) { int number = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED); - if ( number > 0 ) + if (number > 0) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number); int position = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE); - if ( position > 0 ) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position); + if (position > 0) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position); } } @@ -3349,12 +3327,13 @@ void gridPrintKernel(int gridID, int opt, FILE *fp) size_t nxvals = gridInqXvals(gridID, NULL); size_t nyvals = gridInqYvals(gridID, NULL); - int type = gridInqType(gridID); + int type = gridInqType(gridID); size_t gridsize = gridInqSize(gridID); - size_t xsize = gridInqXsize(gridID); - size_t ysize = gridInqYsize(gridID); + size_t xsize = gridInqXsize(gridID); + size_t ysize = gridInqYsize(gridID); int nvertex = gridInqNvertex(gridID); - int datatype = gridInqDatatype(gridID); + int datatype; + cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7; diff --git a/src/stream_cdf_o.c b/src/stream_cdf_o.c index 24ee141afd2a777d6dd8d8dafd929ad836463938..e88ccd7f447b7e4ccff755bae2fab94bb822ff83 100644 --- a/src/stream_cdf_o.c +++ b/src/stream_cdf_o.c @@ -266,10 +266,18 @@ void cdfPutGridStdAtts(int fileID, int ncvarid, int gridID, int dimtype) cdf_put_att_text(fileID, ncvarid, "units", len, units); } +static int +grid_inq_xtype(int gridID) +{ + int datatype = CDI_UNDEFID; + cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); + return (datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE; +} + static void cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridindex, const struct cdfDefGridAxisInqs *inqs, int dimtype) { - const nc_type xtype = (gridInqDatatype(gridID) == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE; + const nc_type xtype = grid_inq_xtype(gridID); ncgrid_t *ncgrid = streamptr->ncgrid; const size_t dimlen = inqs->axisSize(gridID); @@ -423,7 +431,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridindex, int ndims, bool int dimID = CDI_UNDEFID; const int fileID = streamptr->fileID; const size_t dimlen = gridAxisInq->axisSize(gridID); - const nc_type xtype = (gridInqDatatype(gridID) == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE; + const nc_type xtype = grid_inq_xtype(gridID); ncgrid_t *ncgrid = streamptr->ncgrid; @@ -630,7 +638,7 @@ cdfDefIrregularGridCommon(stream_t *streamptr, int gridID, size_t nvertex, const char *vdimname_default, bool setVdimname) { - const nc_type xtype = (gridInqDatatype(gridID) == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE; + const nc_type xtype = grid_inq_xtype(gridID); int xdimID = CDI_UNDEFID; int ydimID = CDI_UNDEFID; int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID;