/* CDI C header file This is the only file that must be included to use the CDI library from C. */ #ifndef CDI_H_ #define CDI_H_ #include #include #ifdef __cplusplus extern "C" { #endif #define CDI_MAX_NAME 256 /* max length of a name */ #define CDI_UNDEFID -1 #define CDI_GLOBAL -1 /* Global var ID for vlist */ /* Byte order */ #define CDI_BIGENDIAN 0 /* Byte order BIGENDIAN */ #define CDI_LITTLEENDIAN 1 /* Byte order LITTLEENDIAN */ #define CDI_PDPENDIAN 2 #define CDI_REAL 1 /* Real numbers */ #define CDI_COMP 2 /* Complex numbers */ #define CDI_BOTH 3 /* Both numbers */ /* Error identifier */ #define CDI_NOERR 0 /* No Error */ #define CDI_EEOF -1 /* The end of file was encountered */ #define CDI_ESYSTEM -10 /* Operating system error */ #define CDI_EINVAL -20 /* Invalid argument */ #define CDI_EUFTYPE -21 /* Unsupported file type */ #define CDI_ELIBNAVAIL -22 /* xxx library not available */ #define CDI_EUFSTRUCT -23 /* Unsupported file structure */ #define CDI_EUNC4 -24 /* Unsupported netCDF4 structure */ #define CDI_ELIMIT -99 /* Internal limits exceeded */ /* File types */ #define FILETYPE_UNDEF -1 /* Unknown/not yet defined file type */ #define FILETYPE_GRB 1 /* File type GRIB */ #define FILETYPE_GRB2 2 /* File type GRIB version 2 */ #define FILETYPE_NC 3 /* File type netCDF */ #define FILETYPE_NC2 4 /* File type netCDF version 2 (64-bit) */ #define FILETYPE_NC4 5 /* File type netCDF version 4 */ #define FILETYPE_NC4C 6 /* File type netCDF version 4 (classic) */ #define FILETYPE_SRV 7 /* File type SERVICE */ #define FILETYPE_EXT 8 /* File type EXTRA */ #define FILETYPE_IEG 9 /* File type IEG */ /* Compress types */ #define COMPRESS_NONE 0 #define COMPRESS_SZIP 1 #define COMPRESS_GZIP 2 #define COMPRESS_BZIP2 3 #define COMPRESS_ZIP 4 #define COMPRESS_JPEG 5 /* external data types */ #define DATATYPE_PACK 0 #define DATATYPE_PACK1 1 #define DATATYPE_PACK2 2 #define DATATYPE_PACK3 3 #define DATATYPE_PACK4 4 #define DATATYPE_PACK5 5 #define DATATYPE_PACK6 6 #define DATATYPE_PACK7 7 #define DATATYPE_PACK8 8 #define DATATYPE_PACK9 9 #define DATATYPE_PACK10 10 #define DATATYPE_PACK11 11 #define DATATYPE_PACK12 12 #define DATATYPE_PACK13 13 #define DATATYPE_PACK14 14 #define DATATYPE_PACK15 15 #define DATATYPE_PACK16 16 #define DATATYPE_PACK17 17 #define DATATYPE_PACK18 18 #define DATATYPE_PACK19 19 #define DATATYPE_PACK20 20 #define DATATYPE_PACK21 21 #define DATATYPE_PACK22 22 #define DATATYPE_PACK23 23 #define DATATYPE_PACK24 24 #define DATATYPE_PACK25 25 #define DATATYPE_PACK26 26 #define DATATYPE_PACK27 27 #define DATATYPE_PACK28 28 #define DATATYPE_PACK29 29 #define DATATYPE_PACK30 30 #define DATATYPE_PACK31 31 #define DATATYPE_PACK32 32 #define DATATYPE_CPX32 64 #define DATATYPE_CPX64 128 #define DATATYPE_FLT32 132 #define DATATYPE_FLT64 164 #define DATATYPE_INT8 208 #define DATATYPE_INT16 216 #define DATATYPE_INT32 232 #define DATATYPE_UINT8 308 #define DATATYPE_UINT16 316 #define DATATYPE_UINT32 332 /* internal data types */ #define DATATYPE_INT 251 #define DATATYPE_FLT 252 #define DATATYPE_TXT 253 #define DATATYPE_CPX 254 #define DATATYPE_UCHAR 255 #define DATATYPE_LONG 256 /* Chunks */ #define CHUNK_AUTO 1 /* use default chunk size */ #define CHUNK_GRID 2 #define CHUNK_LINES 3 /* GRID types */ #define GRID_GENERIC 1 /* Generic grid */ #define GRID_GAUSSIAN 2 /* Regular Gaussian lon/lat grid */ #define GRID_GAUSSIAN_REDUCED 3 /* Reduced Gaussian lon/lat grid */ #define GRID_LONLAT 4 /* Regular longitude/latitude grid */ #define GRID_SPECTRAL 5 /* Spherical harmonic coefficients */ #define GRID_FOURIER 6 /* Fourier coefficients */ #define GRID_GME 7 /* Icosahedral-hexagonal GME grid */ #define GRID_TRAJECTORY 8 /* Trajectory */ #define GRID_UNSTRUCTURED 9 /* General unstructured grid */ #define GRID_CURVILINEAR 10 /* Curvilinear grid */ #define GRID_LCC 11 /* Lambert Conformal Conic (GRIB) */ #define GRID_LCC2 12 /* Lambert Conformal Conic (PROJ) */ #define GRID_LAEA 13 /* Lambert Azimuthal Equal Area */ #define GRID_SINUSOIDAL 14 /* Sinusoidal */ #define GRID_PROJECTION 15 /* Projected coordiantes */ /* ZAXIS types */ #define ZAXIS_SURFACE 0 /* Surface level */ #define ZAXIS_GENERIC 1 /* Generic level */ #define ZAXIS_HYBRID 2 /* Hybrid level */ #define ZAXIS_HYBRID_HALF 3 /* Hybrid half level */ #define ZAXIS_PRESSURE 4 /* Isobaric pressure level in Pascal */ #define ZAXIS_HEIGHT 5 /* Height above ground */ #define ZAXIS_DEPTH_BELOW_SEA 6 /* Depth below sea level in meters */ #define ZAXIS_DEPTH_BELOW_LAND 7 /* Depth below land surface in centimeters */ #define ZAXIS_ISENTROPIC 8 /* Isentropic */ #define ZAXIS_TRAJECTORY 9 /* Trajectory */ #define ZAXIS_ALTITUDE 10 /* Altitude above mean sea level in meters */ #define ZAXIS_SIGMA 11 /* Sigma level */ #define ZAXIS_MEANSEA 12 /* Mean sea level */ #define ZAXIS_TOA 13 /* Norminal top of atmosphere */ #define ZAXIS_SEA_BOTTOM 14 /* Sea bottom */ #define ZAXIS_ATMOSPHERE 15 /* Entire atmosphere */ #define ZAXIS_CLOUD_BASE 16 /* Cloud base level */ #define ZAXIS_CLOUD_TOP 17 /* Level of cloud tops */ #define ZAXIS_ISOTHERM_ZERO 18 /* Level of 0o C isotherm */ #define ZAXIS_SNOW 19 /* Snow level */ #define ZAXIS_LAKE_BOTTOM 20 /* Lake or River Bottom */ #define ZAXIS_SEDIMENT_BOTTOM 21 /* Bottom Of Sediment Layer */ #define ZAXIS_SEDIMENT_BOTTOM_TA 22 /* Bottom Of Thermally Active Sediment Layer */ #define ZAXIS_SEDIMENT_BOTTOM_TW 23 /* Bottom Of Sediment Layer Penetrated By Thermal Wave */ #define ZAXIS_MIX_LAYER 24 /* Mixing Layer */ #define ZAXIS_REFERENCE 25 /* zaxis reference number */ /* SUBTYPE types */ enum { SUBTYPE_TILES = 0 /* Tiles variable */ }; #define MAX_KV_PAIRS_MATCH 10 /* Data structure defining a key-value search, possibly with multiple key-value pairs in combination. Currently, only multiple pairs combined by AND are supported. */ typedef struct { int nAND; /* no. of key-value pairs that have to match */ int key_value_pairs[2][MAX_KV_PAIRS_MATCH]; /* key-value pairs */ } subtype_query_t; /* TIME types */ #define TIME_CONSTANT 0 /* obsolate, use TSTEP_CONSTANT */ #define TIME_VARIABLE 1 /* obsolate, use TSTEP_INSTANT */ /* TSTEP types */ #define TSTEP_CONSTANT 0 /* Constant */ #define TSTEP_INSTANT 1 /* Instant */ #define TSTEP_AVG 2 /* Average */ #define TSTEP_ACCUM 3 /* Accumulation */ #define TSTEP_MAX 4 /* Maximum */ #define TSTEP_MIN 5 /* Minimum */ #define TSTEP_DIFF 6 /* Difference */ #define TSTEP_RMS 7 /* Root mean square */ #define TSTEP_SD 8 /* Standard deviation */ #define TSTEP_COV 9 /* Covariance */ #define TSTEP_RATIO 10 /* Ratio */ #define TSTEP_RANGE 11 #define TSTEP_INSTANT2 12 #define TSTEP_INSTANT3 13 /* TAXIS types */ #define TAXIS_ABSOLUTE 1 #define TAXIS_RELATIVE 2 #define TAXIS_FORECAST 3 /* TUNIT types */ #define TUNIT_SECOND 1 #define TUNIT_MINUTE 2 #define TUNIT_QUARTER 3 #define TUNIT_30MINUTES 4 #define TUNIT_HOUR 5 #define TUNIT_3HOURS 6 #define TUNIT_6HOURS 7 #define TUNIT_12HOURS 8 #define TUNIT_DAY 9 #define TUNIT_MONTH 10 #define TUNIT_YEAR 11 /* CALENDAR types */ #define CALENDAR_STANDARD 0 /* don't change this value (used also in cgribexlib)! */ #define CALENDAR_PROLEPTIC 1 #define CALENDAR_360DAYS 2 #define CALENDAR_365DAYS 3 #define CALENDAR_366DAYS 4 #define CALENDAR_NONE 5 /* number of unsigned char needed to store UUID */ #define CDI_UUID_SIZE 16 /* Structs that are used to return data to the user */ typedef struct CdiParam { int discipline; int category; int number; } CdiParam; /* Opaque types */ typedef struct CdiIterator CdiIterator; typedef struct CdiGribIterator CdiGribIterator; /* CDI control routines */ void cdiReset(void); const char *cdiStringError(int cdiErrno); void cdiDebug(int debug); const char *cdiLibraryVersion(void); void cdiPrintVersion(void); int cdiHaveFiletype(int filetype); void cdiDefMissval(double missval); double cdiInqMissval(void); void cdiDefGlobal(const char *string, int val); int namespaceNew(void); void namespaceSetActive(int namespaceID); int namespaceGetActive(void); void namespaceDelete(int namespaceID); /* CDI converter routines */ /* parameter */ void cdiParamToString(int param, char *paramstr, int maxlen); void cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis); int cdiEncodeParam(int pnum, int pcat, int pdis); /* date format: YYYYMMDD */ /* time format: hhmmss */ void cdiDecodeDate(int date, int *year, int *month, int *day); int cdiEncodeDate(int year, int month, int day); void cdiDecodeTime(int time, int *hour, int *minute, int *second); int cdiEncodeTime(int hour, int minute, int second); /* STREAM control routines */ int cdiGetFiletype(const char *path, int *byteorder); /* streamOpenRead: Open a dataset for reading */ int streamOpenRead(const char *path); /* streamOpenWrite: Create a new dataset */ int streamOpenWrite(const char *path, int filetype); int streamOpenAppend(const char *path); /* streamClose: Close an open dataset */ void streamClose(int streamID); /* streamSync: Synchronize an Open Dataset to Disk */ void streamSync(int streamID); /* streamDefVlist: Define the Vlist for a stream */ void streamDefVlist(int streamID, int vlistID); /* streamInqVlist: Get the Vlist of a stream */ int streamInqVlist(int streamID); /* streamInqFiletype: Get the filetype */ int streamInqFiletype(int streamID); /* streamDefByteorder: Define the byteorder */ void streamDefByteorder(int streamID, int byteorder); /* streamInqByteorder: Get the byteorder */ int streamInqByteorder(int streamID); /* streamDefCompType: Define compression type */ void streamDefCompType(int streamID, int comptype); /* streamInqCompType: Get compression type */ int streamInqCompType(int streamID); /* streamDefCompLevel: Define compression level */ void streamDefCompLevel(int streamID, int complevel); /* streamInqCompLevel: Get compression level */ int streamInqCompLevel(int streamID); /* streamDefTimestep: Define time step */ int streamDefTimestep(int streamID, int tsID); /* streamInqTimestep: Get time step */ int streamInqTimestep(int streamID, int tsID); /* PIO: query currently set timestep id */ int streamInqCurTimestepID(int streamID); const char *streamFilename(int streamID); const char *streamFilesuffix(int filetype); off_t streamNvals(int streamID); int streamInqNvars ( int streamID ); /* STREAM var I/O routines */ /* streamWriteVar: Write a variable */ void streamWriteVar(int streamID, int varID, const double data[], int nmiss); void streamWriteVarF(int streamID, int varID, const float data[], int nmiss); /* streamReadVar: Read a variable */ void streamReadVar(int streamID, int varID, double data[], int *nmiss); void streamReadVarF(int streamID, int varID, float data[], int *nmiss); /* streamWriteVarSlice: Write a horizontal slice of a variable */ void streamWriteVarSlice(int streamID, int varID, int levelID, const double data[], int nmiss); void streamWriteVarSliceF(int streamID, int varID, int levelID, const float data[], int nmiss); /* streamReadVarSlice: Read a horizontal slice of a variable */ void streamReadVarSlice(int streamID, int varID, int levelID, double data[], int *nmiss); void streamReadVarSliceF(int streamID, int varID, int levelID, float data[], int *nmiss); void streamWriteVarChunk(int streamID, int varID, const int rect[3][2], const double data[], int nmiss); /* STREAM record I/O routines */ void streamDefRecord(int streamID, int varID, int levelID); void streamInqRecord(int streamID, int *varID, int *levelID); void streamWriteRecord(int streamID, const double data[], int nmiss); void streamWriteRecordF(int streamID, const float data[], int nmiss); void streamReadRecord(int streamID, double data[], int *nmiss); void streamReadRecordF(int streamID, float data[], int *nmiss); void streamCopyRecord(int streamIDdest, int streamIDsrc); void streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum); /* File driven I/O (may yield better performance than using the streamXXX functions) */ //Creation & Destruction CdiIterator *cdiIterator_new(const char *path); //Requires a subsequent call to cdiIteratorNextField() to point the iterator at the first field. CdiIterator *cdiIterator_clone(CdiIterator *me); char *cdiIterator_serialize(CdiIterator *me); //Returns a malloc'ed string. CdiIterator *cdiIterator_deserialize(const char *description); //description is a string that was returned by cdiIteratorSerialize(). Returns a copy of the original iterator. void cdiIterator_print(CdiIterator *me, FILE *stream); void cdiIterator_delete(CdiIterator *me); //Advancing an iterator int cdiIterator_nextField(CdiIterator *me); //Points the iterator at the next field, returns CDI_EEOF if there are no more fields in the file. //Introspecting metadata //All outXXX arguments to these functions may be NULL. char *cdiIterator_inqStartTime(CdiIterator *me); //Returns the (start) time as an ISO-8601 coded string. The caller is responsible to Free() the returned string. char *cdiIterator_inqEndTime(CdiIterator *me); //Returns the end time of an integration period as an ISO-8601 coded string, or NULL if there is no end time. The caller is responsible to Free() the returned string. char *cdiIterator_inqVTime(CdiIterator *me); //Returns the validity date as an ISO-8601 coded string. The caller is responsible to Free() the returned string. int cdiIterator_inqLevelType(CdiIterator *me, int levelSelector, char **outName_optional, char **outLongName_optional, char **outStdName_optional, char **outUnit_optional); //callers are responsible to Free() strings that they request int cdiIterator_inqLevel(CdiIterator *me, int levelSelector, double *outValue1_optional, double *outValue2_optional); //outValue2 is only written to if the level is a hybrid level int cdiIterator_inqLevelUuid(CdiIterator *me, int *outVgridNumber_optional, int *outLevelCount_optional, unsigned char outUuid_optional[CDI_UUID_SIZE]); //outUuid must point to a buffer of 16 bytes, returns an error code if no generalized zaxis is used. int cdiIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); //Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileIndex and *outTileAttribute will be set to -1 in this case. int cdiIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); //outTileAttributeCount is the count for the tile associated with the current field, a total attribute count cannot be inquired. Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileCount and *outTileAttributeCount will be set to 0 in this case. CdiParam cdiIterator_inqParam(CdiIterator *me); int cdiIterator_inqDatatype(CdiIterator *me); int cdiIterator_inqTsteptype(CdiIterator *me); char *cdiIterator_inqVariableName(CdiIterator *me); //The caller is responsible to Free() the returned buffer. int cdiIterator_inqGridId(CdiIterator *me); //The returned id is only valid until the next call to cdiIteratorNextField(). //Reading data void cdiIterator_readField(CdiIterator *me, double data[], size_t *nmiss_optional); void cdiIterator_readFieldF(CdiIterator *me, float data[], size_t *nmiss_optional); //TODO[NH]: Add functions to read partial fields. //Direct access to grib fields CdiGribIterator *cdiGribIterator_clone(CdiIterator *me); //Returns NULL if the associated file is not a GRIB file. void cdiGribIterator_delete(CdiGribIterator *me); //Callthroughs to GRIB-API int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *value); //Same semantics as grib_get_long(). int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *value); //Same semantics as grib_get_double(). int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *value); //Same semantics as grib_get_length(). int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *value, size_t *length); //Same semantics as grib_get_string(). int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *value); //Same semantics as grib_get_size(). int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *value, size_t *array_size); //Same semantics as grib_get_long_array(). int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *value, size_t *array_size); //Same semantics as grib_get_double_array(). //Convenience functions for accessing GRIB-API keys int cdiGribIterator_inqEdition(CdiGribIterator *me); long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key); //Aborts on failure to fetch the given key. long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue); //Returns the default value if the given key is not present. double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key); //Aborts on failure to fetch the given key. double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue); //Returns the default value if the given key is not present. char *cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key); //Returns a malloc'ed string. /* VLIST routines */ /* vlistCreate: Create a variable list */ int vlistCreate(void); /* vlistDestroy: Destroy a variable list */ void vlistDestroy(int vlistID); /* vlistDuplicate: Duplicate a variable list */ int vlistDuplicate(int vlistID); /* vlistCopy: Copy a variable list */ void vlistCopy(int vlistID2, int vlistID1); /* vlistCopyFlag: Copy some entries of a variable list */ void vlistCopyFlag(int vlistID2, int vlistID1); void vlistClearFlag(int vlistID); /* vlistCat: Concatenate two variable lists */ void vlistCat(int vlistID2, int vlistID1); /* vlistMerge: Merge two variable lists */ void vlistMerge(int vlistID2, int vlistID1); void vlistPrint(int vlistID); /* vlistNumber: Number type in a variable list */ int vlistNumber(int vlistID); /* vlistNvars: Number of variables in a variable list */ int vlistNvars(int vlistID); /* vlistNgrids: Number of grids in a variable list */ int vlistNgrids(int vlistID); /* vlistNzaxis: Number of zaxis in a variable list */ int vlistNzaxis(int vlistID); /* vlistNsubtypes: Number of subtypes in a variable list */ int vlistNsubtypes(int vlistID); void vlistDefNtsteps(int vlistID, int nts); int vlistNtsteps(int vlistID); int vlistGridsizeMax(int vlistID); int vlistGrid(int vlistID, int index); int vlistGridIndex(int vlistID, int gridID); void vlistChangeGridIndex(int vlistID, int index, int gridID); void vlistChangeGrid(int vlistID, int gridID1, int gridID2); int vlistZaxis(int vlistID, int index); int vlistZaxisIndex(int vlistID, int zaxisID); void vlistChangeZaxisIndex(int vlistID, int index, int zaxisID); void vlistChangeZaxis(int vlistID, int zaxisID1, int zaxisID2); int vlistNrecs(int vlistID); int vlistSubtype(int vlistID, int index); int vlistSubtypeIndex(int vlistID, int subtypeID); /* vlistDefTaxis: Define the time axis of a variable list */ void vlistDefTaxis(int vlistID, int taxisID); /* vlistInqTaxis: Get the time axis of a variable list */ int vlistInqTaxis(int vlistID); void vlistDefTable(int vlistID, int tableID); int vlistInqTable(int vlistID); void vlistDefInstitut(int vlistID, int instID); int vlistInqInstitut(int vlistID); void vlistDefModel(int vlistID, int modelID); int vlistInqModel(int vlistID); /* VLIST VAR routines */ /* vlistDefVarTiles: Create a new tile-based variable */ int vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int tsteptype, int tilesetID); /* vlistDefVar: Create a new variable */ int vlistDefVar(int vlistID, int gridID, int zaxisID, int tsteptype); void vlistChangeVarGrid(int vlistID, int varID, int gridID); void vlistChangeVarZaxis(int vlistID, int varID, int zaxisID); void vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *tsteptype); int vlistInqVarGrid(int vlistID, int varID); int vlistInqVarZaxis(int vlistID, int varID); /* used in MPIOM */ int vlistInqVarID(int vlistID, int code); void vlistDefVarTsteptype(int vlistID, int varID, int tsteptype); int vlistInqVarTsteptype(int vlistID, int varID); void vlistDefVarCompType(int vlistID, int varID, int comptype); int vlistInqVarCompType(int vlistID, int varID); void vlistDefVarCompLevel(int vlistID, int varID, int complevel); int vlistInqVarCompLevel(int vlistID, int varID); /* vlistDefVarParam: Define the parameter number of a Variable */ void vlistDefVarParam(int vlistID, int varID, int param); /* vlistInqVarParam: Get the parameter number of a Variable */ int vlistInqVarParam(int vlistID, int varID); /* vlistDefVarCode: Define the code number of a Variable */ void vlistDefVarCode(int vlistID, int varID, int code); /* vlistInqVarCode: Get the code number of a Variable */ int vlistInqVarCode(int vlistID, int varID); /* vlistDefVarDatatype: Define the data type of a Variable */ void vlistDefVarDatatype(int vlistID, int varID, int datatype); /* vlistInqVarDatatype: Get the data type of a Variable */ int vlistInqVarDatatype(int vlistID, int varID); void vlistDefVarChunkType(int vlistID, int varID, int chunktype); int vlistInqVarChunkType(int vlistID, int varID); void vlistDefVarXYZ(int vlistID, int varID, int xyz); int vlistInqVarXYZ(int vlistID, int varID); int vlistInqVarNumber(int vlistID, int varID); void vlistDefVarInstitut(int vlistID, int varID, int instID); int vlistInqVarInstitut(int vlistID, int varID); void vlistDefVarModel(int vlistID, int varID, int modelID); int vlistInqVarModel(int vlistID, int varID); void vlistDefVarTable(int vlistID, int varID, int tableID); int vlistInqVarTable(int vlistID, int varID); /* vlistDefVarName: Define the name of a Variable */ void vlistDefVarName(int vlistID, int varID, const char *name); /* vlistInqVarName: Get the name of a Variable */ void vlistInqVarName(int vlistID, int varID, char *name); /* vlistCopyVarName: Safe and convenient version of vlistInqVarName */ char *vlistCopyVarName(int vlistId, int varId); /* vlistDefVarStdname: Define the standard name of a Variable */ void vlistDefVarStdname(int vlistID, int varID, const char *stdname); /* vlistInqVarStdname: Get the standard name of a Variable */ void vlistInqVarStdname(int vlistID, int varID, char *stdname); /* vlistDefVarLongname: Define the long name of a Variable */ void vlistDefVarLongname(int vlistID, int varID, const char *longname); /* vlistInqVarLongname: Get the long name of a Variable */ void vlistInqVarLongname(int vlistID, int varID, char *longname); /* vlistDefVarUnits: Define the units of a Variable */ void vlistDefVarUnits(int vlistID, int varID, const char *units); /* vlistInqVarUnits: Get the units of a Variable */ void vlistInqVarUnits(int vlistID, int varID, char *units); /* vlistDefVarMissval: Define the missing value of a Variable */ void vlistDefVarMissval(int vlistID, int varID, double missval); /* vlistInqVarMissval: Get the missing value of a Variable */ double vlistInqVarMissval(int vlistID, int varID); /* vlistDefVarExtra: Define extra information of a Variable */ void vlistDefVarExtra(int vlistID, int varID, const char *extra); /* vlistInqVarExtra: Get extra information of a Variable */ void vlistInqVarExtra(int vlistID, int varID, char *extra); void vlistDefVarScalefactor(int vlistID, int varID, double scalefactor); double vlistInqVarScalefactor(int vlistID, int varID); void vlistDefVarAddoffset(int vlistID, int varID, double addoffset); double vlistInqVarAddoffset(int vlistID, int varID); void vlistDefVarTimave(int vlistID, int varID, int timave); int vlistInqVarTimave(int vlistID, int varID); void vlistDefVarTimaccu(int vlistID, int varID, int timaccu); int vlistInqVarTimaccu(int vlistID, int varID); void vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess); int vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID); void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate); int vlistInqVarProductDefinitionTemplate(int vlistID, int varID); int vlistInqVarSize(int vlistID, int varID); void vlistDefIndex(int vlistID, int varID, int levID, int index); int vlistInqIndex(int vlistID, int varID, int levID); void vlistDefFlag(int vlistID, int varID, int levID, int flag); int vlistInqFlag(int vlistID, int varID, int levID); int vlistFindVar(int vlistID, int fvarID); int vlistFindLevel(int vlistID, int fvarID, int flevelID); int vlistMergedVar(int vlistID, int varID); int vlistMergedLevel(int vlistID, int varID, int levelID); /* Ensemble info routines */ void vlistDefVarEnsemble(int vlistID, int varID, int ensID, int ensCount, int forecast_type); int vlistInqVarEnsemble(int vlistID, int varID, int *ensID, int *ensCount, int *forecast_type); /* cdiClearAdditionalKeys: Clear the list of additional GRIB keys. */ void cdiClearAdditionalKeys(void); /* cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened. */ void cdiDefAdditionalKey(const char *string); /* vlistDefVarIntKey: Set an arbitrary keyword/integer value pair for GRIB API */ void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value); /* vlistDefVarDblKey: Set an arbitrary keyword/double value pair for GRIB API */ void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value); /* vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise. */ int vlistHasVarKey(int vlistID, int varID, const char *name); /* vlistInqVarDblKey: raw access to GRIB meta-data */ double vlistInqVarDblKey(int vlistID, int varID, const char *name); /* vlistInqVarIntKey: raw access to GRIB meta-data */ int vlistInqVarIntKey(int vlistID, int varID, const char *name); /* needed only for CDO operator after */ const char *vlistInqVarNamePtr(int vlistID, int varID); const char *vlistInqVarLongnamePtr(int vlistID, int varID); const char *vlistInqVarUnitsPtr(int vlistID, int varID); /* VLIST attributes */ /* vlistInqNatts: Get number of variable attributes assigned to this variable */ int vlistInqNatts(int vlistID, int varID, int *nattsp); /* vlistInqAtt: Get information about an attribute */ int vlistInqAtt(int vlistID, int varID, int attrnum, char *name, int *typep, int *lenp); int vlistDelAtt(int vlistID, int varID, const char *name); /* vlistDefAttInt: Define an integer attribute */ int vlistDefAttInt(int vlistID, int varID, const char *name, int type, int len, const int ip[]); /* vlistDefAttFlt: Define a floating point attribute */ int vlistDefAttFlt(int vlistID, int varID, const char *name, int type, int len, const double dp[]); /* vlistDefAttTxt: Define a text attribute */ int vlistDefAttTxt(int vlistID, int varID, const char *name, int len, const char *tp_cbuf); /* vlistInqAttInt: Get the value(s) of an integer attribute */ int vlistInqAttInt(int vlistID, int varID, const char *name, int mlen, int ip[]); /* vlistInqAttFlt: Get the value(s) of a floating point attribute */ int vlistInqAttFlt(int vlistID, int varID, const char *name, int mlen, double dp[]); /* vlistInqAttTxt: Get the value(s) of a text attribute */ int vlistInqAttTxt(int vlistID, int varID, const char *name, int mlen, char *tp_cbuf); /* GRID routines */ void gridName(int gridtype, char *gridname); const char *gridNamePtr(int gridtype); void gridCompress(int gridID); void gridDefMaskGME(int gridID, const int mask[]); int gridInqMaskGME(int gridID, int mask[]); void gridDefMask(int gridID, const int mask[]); int gridInqMask(int gridID, int mask[]); void gridPrint(int gridID, int index, int opt); /* gridCreate: Create a horizontal Grid */ int gridCreate(int gridtype, int size); /* gridDestroy: Destroy a horizontal Grid */ void gridDestroy(int gridID); /* gridDuplicate: Duplicate a Grid */ int gridDuplicate(int gridID); /* gridInqType: Get the type of a Grid */ int gridInqType(int gridID); /* gridInqSize: Get the size of a Grid */ int gridInqSize(int gridID); /* gridDefXsize: Define the size of a X-axis */ void gridDefXsize(int gridID, int xsize); /* gridInqXsize: Get the size of a X-axis */ int gridInqXsize(int gridID); /* gridDefYsize: Define the size of a Y-axis */ void gridDefYsize(int gridID, int ysize); /* gridInqYsize: Get the size of a Y-axis */ int gridInqYsize(int gridID); /* gridDefNP: Define the number of parallels between a pole and the equator */ void gridDefNP(int gridID, int np); /* gridInqNP: Get the number of parallels between a pole and the equator */ int gridInqNP(int gridID); /* gridDefXvals: Define the values of a X-axis */ void gridDefXvals(int gridID, const double xvals[]); /* gridInqXvals: Get all values of a X-axis */ int gridInqXvals(int gridID, double xvals[]); /* gridDefYvals: Define the values of a Y-axis */ void gridDefYvals(int gridID, const double yvals[]); /* gridInqYvals: Get all values of a Y-axis */ int gridInqYvals(int gridID, double yvals[]); /* gridDefXname: Define the name of a X-axis */ void gridDefXname(int gridID, const char *xname); /* gridInqXname: Get the name of a X-axis */ void gridInqXname(int gridID, char *xname); /* gridDefXlongname: Define the longname of a X-axis */ void gridDefXlongname(int gridID, const char *xlongname); /* gridInqXlongname: Get the longname of a X-axis */ void gridInqXlongname(int gridID, char *xlongname); /* gridDefXunits: Define the units of a X-axis */ void gridDefXunits(int gridID, const char *xunits); /* gridInqXunits: Get the units of a X-axis */ void gridInqXunits(int gridID, char *xunits); /* gridDefYname: Define the name of a Y-axis */ void gridDefYname(int gridID, const char *yname); /* gridInqYname: Get the name of a Y-axis */ void gridInqYname(int gridID, char *yname); /* gridDefYlongname: Define the longname of a Y-axis */ void gridDefYlongname(int gridID, const char *ylongname); /* gridInqYlongname: Get the longname of a Y-axis */ void gridInqYlongname(int gridID, char *ylongname); /* gridDefYunits: Define the units of a Y-axis */ void gridDefYunits(int gridID, const char *yunits); /* gridInqYunits: Get the units of a Y-axis */ void gridInqYunits(int gridID, char *yunits); /* gridInqXstdname: Get the standard name of a X-axis */ void gridInqXstdname(int gridID, char *xstdname); /* gridInqYstdname: Get the standard name of a Y-axis */ void gridInqYstdname(int gridID, char *ystdname); /* gridDefPrec: Define the precision of a Grid */ void gridDefPrec(int gridID, int prec); /* gridInqPrec: Get the precision of a Grid */ int gridInqPrec(int gridID); /* gridInqXval: Get one value of a X-axis */ double gridInqXval(int gridID, int index); /* gridInqYval: Get one value of a Y-axis */ double gridInqYval(int gridID, int index); double gridInqXinc(int gridID); double gridInqYinc(int gridID); int gridIsCircular(int gridID); int gridIsRotated(int gridID); void gridDefXpole(int gridID, double xpole); double gridInqXpole(int gridID); void gridDefYpole(int gridID, double ypole); double gridInqYpole(int gridID); void gridDefAngle(int gridID, double angle); double gridInqAngle(int gridID); int gridInqTrunc(int gridID); void gridDefTrunc(int gridID, int trunc); /* Hexagonal GME grid */ void gridDefGMEnd(int gridID, int nd); int gridInqGMEnd(int gridID); void gridDefGMEni(int gridID, int ni); int gridInqGMEni(int gridID); void gridDefGMEni2(int gridID, int ni2); int gridInqGMEni2(int gridID); void gridDefGMEni3(int gridID, int ni3); int gridInqGMEni3(int gridID); /* Reference of an unstructured grid */ /* gridDefNumber: Define the reference number for an unstructured grid */ void gridDefNumber(int gridID, int number); /* gridInqNumber: Get the reference number to an unstructured grid */ int gridInqNumber(int gridID); /* gridDefPosition: Define the position of grid in the reference file */ void gridDefPosition(int gridID, int position); /* gridInqPosition: Get the position of grid in the reference file */ int gridInqPosition(int gridID); /* gridDefReference: Define the reference URI for an unstructured grid */ void gridDefReference(int gridID, const char *reference); /* gridInqReference: Get the reference URI to an unstructured grid */ int gridInqReference(int gridID, char *reference); /* gridDefUUID: Define the UUID of an unstructured grid */ #ifdef __cplusplus void gridDefUUID(int gridID, const unsigned char *uuid); #else void gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE]); #endif /* gridInqUUID: Get the UUID of an unstructured grid */ #ifdef __cplusplus void gridInqUUID(int gridID, unsigned char *uuid); #else void gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE]); #endif /* Lambert Conformal Conic grid (GRIB version) */ void gridDefLCC(int gridID, double originLon, double originLat, double lonParY, double lat1, double lat2, double xinc, double yinc, int projflag, int scanflag); void gridInqLCC(int gridID, double *originLon, double *originLat, double *lonParY, double *lat1, double *lat2, double *xinc, double *yinc, int *projflag, int *scanflag); /* Lambert Conformal Conic 2 grid (PROJ version) */ void gridDefLcc2(int gridID, double earth_radius, double lon_0, double lat_0, double lat_1, double lat_2); void gridInqLcc2(int gridID, double *earth_radius, double *lon_0, double *lat_0, double *lat_1, double *lat_2); /* Lambert Azimuthal Equal Area grid */ void gridDefLaea(int gridID, double earth_radius, double lon_0, double lat_0); void gridInqLaea(int gridID, double *earth_radius, double *lon_0, double *lat_0); void gridDefArea(int gridID, const double area[]); void gridInqArea(int gridID, double area[]); int gridHasArea(int gridID); /* gridDefNvertex: Define the number of vertex of a Gridbox */ void gridDefNvertex(int gridID, int nvertex); /* gridInqNvertex: Get the number of vertex of a Gridbox */ int gridInqNvertex(int gridID); /* gridDefXbounds: Define the bounds of a X-axis */ void gridDefXbounds(int gridID, const double xbounds[]); /* gridInqXbounds: Get the bounds of a X-axis */ int gridInqXbounds(int gridID, double xbounds[]); /* gridDefYbounds: Define the bounds of a Y-axis */ void gridDefYbounds(int gridID, const double ybounds[]); /* gridInqYbounds: Get the bounds of a Y-axis */ int gridInqYbounds(int gridID, double ybounds[]); void gridDefRowlon(int gridID, int nrowlon, const int rowlon[]); void gridInqRowlon(int gridID, int rowlon[]); void gridChangeType(int gridID, int gridtype); void gridDefComplexPacking(int gridID, int lpack); int gridInqComplexPacking(int gridID); /* ZAXIS routines */ void zaxisName(int zaxistype, char *zaxisname); /* zaxisCreate: Create a vertical Z-axis */ int zaxisCreate(int zaxistype, int size); /* zaxisDestroy: Destroy a vertical Z-axis */ void zaxisDestroy(int zaxisID); /* zaxisInqType: Get the type of a Z-axis */ int zaxisInqType(int zaxisID); /* zaxisInqSize: Get the size of a Z-axis */ int zaxisInqSize(int zaxisID); /* zaxisDuplicate: Duplicate a Z-axis */ int zaxisDuplicate(int zaxisID); void zaxisResize(int zaxisID, int size); void zaxisPrint(int zaxisID, int index); /* zaxisDefLevels: Define the levels of a Z-axis */ void zaxisDefLevels(int zaxisID, const double levels[]); /* zaxisInqLevels: Get all levels of a Z-axis */ void zaxisInqLevels(int zaxisID, double levels[]); /* zaxisDefLevel: Define one level of a Z-axis */ void zaxisDefLevel(int zaxisID, int levelID, double levels); /* zaxisInqLevel: Get one level of a Z-axis */ double zaxisInqLevel(int zaxisID, int levelID); /* zaxisDefNlevRef: Define the number of half levels of a generalized Z-axis */ void zaxisDefNlevRef(int gridID, int nhlev); /* zaxisInqNlevRef: Get the number of half levels of a generalized Z-axis */ int zaxisInqNlevRef(int gridID); /* zaxisDefNumber: Define the reference number for a generalized Z-axis */ void zaxisDefNumber(int gridID, int number); /* zaxisInqNumber: Get the reference number to a generalized Z-axis */ int zaxisInqNumber(int gridID); /* zaxisDefUUID: Define the UUID of a generalized Z-axis */ void zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]); /* zaxisInqUUID: Get the UUID of a generalized Z-axis */ void zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]); /* zaxisDefName: Define the name of a Z-axis */ void zaxisDefName(int zaxisID, const char *name_optional); /* zaxisInqName: Get the name of a Z-axis */ void zaxisInqName(int zaxisID, char *name); /* zaxisDefLongname: Define the longname of a Z-axis */ void zaxisDefLongname(int zaxisID, const char *longname_optional); /* zaxisInqLongname: Get the longname of a Z-axis */ void zaxisInqLongname(int zaxisID, char *longname); /* zaxisDefUnits: Define the units of a Z-axis */ void zaxisDefUnits(int zaxisID, const char *units_optional); /* zaxisInqUnits: Get the units of a Z-axis */ void zaxisInqUnits(int zaxisID, char *units); /* zaxisInqStdname: Get the standard name of a Z-axis */ void zaxisInqStdname(int zaxisID, char *stdname); /* zaxisDefPsName: Define the name of the surface pressure variable of a hybrid sigma pressure Z-axis */ void zaxisDefPsName(int zaxisID, const char *psname_optional); /* zaxisInqPsName: Get the name of the surface pressure variable of a hybrid sigma pressure Z-axis */ void zaxisInqPsName(int zaxisID, char *psname); void zaxisDefPrec(int zaxisID, int prec); int zaxisInqPrec(int zaxisID); void zaxisDefPositive(int zaxisID, int positive); int zaxisInqPositive(int zaxisID); void zaxisDefScalar(int zaxisID); int zaxisInqScalar(int zaxisID); void zaxisDefLtype(int zaxisID, int ltype); int zaxisInqLtype(int zaxisID); const double *zaxisInqLevelsPtr(int zaxisID); void zaxisDefVct(int zaxisID, int size, const double vct[]); void zaxisInqVct(int zaxisID, double vct[]); int zaxisInqVctSize(int zaxisID); const double *zaxisInqVctPtr(int zaxisID); void zaxisDefLbounds(int zaxisID, const double lbounds[]); int zaxisInqLbounds(int zaxisID, double lbounds_optional[]); double zaxisInqLbound(int zaxisID, int index); void zaxisDefUbounds(int zaxisID, const double ubounds[]); int zaxisInqUbounds(int zaxisID, double ubounds_optional[]); double zaxisInqUbound(int zaxisID, int index); void zaxisDefWeights(int zaxisID, const double weights[]); int zaxisInqWeights(int zaxisID, double weights_optional[]); void zaxisChangeType(int zaxisID, int zaxistype); /* TAXIS routines */ /* taxisCreate: Create a Time axis */ int taxisCreate(int timetype); /* taxisDestroy: Destroy a Time axis */ void taxisDestroy(int taxisID); int taxisDuplicate(int taxisID); void taxisCopyTimestep(int taxisIDdes, int taxisIDsrc); void taxisDefType(int taxisID, int type); /* taxisDefVdate: Define the verification date */ void taxisDefVdate(int taxisID, int date); /* taxisDefVtime: Define the verification time */ void taxisDefVtime(int taxisID, int time); /* taxisInqVdate: Get the verification date */ int taxisInqVdate(int taxisID); /* taxisInqVtime: Get the verification time */ int taxisInqVtime(int taxisID); /* taxisDefRdate: Define the reference date */ void taxisDefRdate(int taxisID, int date); /* taxisDefRtime: Define the reference time */ void taxisDefRtime(int taxisID, int time); /* taxisInqRdate: Get the reference date */ int taxisInqRdate(int taxisID); /* taxisInqRtime: Get the reference time */ int taxisInqRtime(int taxisID); /* taxisDefFdate: Define the forecast reference date */ void taxisDefFdate(int taxisID, int date); /* taxisDefFtime: Define the forecast reference time */ void taxisDefFtime(int taxisID, int time); /* taxisInqFdate: Get the forecast reference date */ int taxisInqFdate(int taxisID); /* taxisInqFtime: Get the forecast reference time */ int taxisInqFtime(int taxisID); int taxisHasBounds(int taxisID); void taxisDeleteBounds(int taxisID); void taxisDefVdateBounds(int taxisID, int vdate_lb, int vdate_ub); void taxisDefVtimeBounds(int taxisID, int vtime_lb, int vtime_ub); void taxisInqVdateBounds(int taxisID, int *vdate_lb, int *vdate_ub); void taxisInqVtimeBounds(int taxisID, int *vtime_lb, int *vtime_ub); /* taxisDefCalendar: Define the calendar */ void taxisDefCalendar(int taxisID, int calendar); /* taxisInqCalendar: Get the calendar */ int taxisInqCalendar(int taxisID); void taxisDefTunit(int taxisID, int tunit); int taxisInqTunit(int taxisID); void taxisDefForecastTunit(int taxisID, int tunit); int taxisInqForecastTunit(int taxisID); void taxisDefForecastPeriod(int taxisID, double fc_period); double taxisInqForecastPeriod(int taxisID); void taxisDefNumavg(int taxisID, int numavg); int taxisInqType(int taxisID); int taxisInqNumavg(int taxisID); const char *tunitNamePtr(int tunitID); /* Institut routines */ int institutDef(int center, int subcenter, const char *name, const char *longname); int institutInq(int center, int subcenter, const char *name, const char *longname); int institutInqNumber(void); int institutInqCenter(int instID); int institutInqSubcenter(int instID); const char *institutInqNamePtr(int instID); const char *institutInqLongnamePtr(int instID); /* Model routines */ int modelDef(int instID, int modelgribID, const char *name); int modelInq(int instID, int modelgribID, const char *name); int modelInqInstitut(int modelID) ; int modelInqGribID(int modelID); const char *modelInqNamePtr(int modelID); /* Table routines */ /* tableWriteC: write table of parameters to file in C language format */ void tableWriteC(const char *filename, int tableID); /* tableFWriteC: write table of parameters to FILE* in C language format */ void tableFWriteC(FILE *ptfp, int tableID); /* tableWrite: write table of parameters to file in tabular format */ void tableWrite(const char *filename, int tableID); /* tableRead: read table of parameters from file in tabular format */ int tableRead(const char *tablefile); int tableDef(int modelID, int tablenum, const char *tablename); const char *tableInqNamePtr(int tableID); void tableDefEntry(int tableID, int code, const char *name, const char *longname, const char *units); int tableInq(int modelID, int tablenum, const char *tablename); int tableInqNumber(void); int tableInqNum(int tableID); int tableInqModel(int tableID); void tableInqPar(int tableID, int code, char *name, char *longname, char *units); int tableInqParCode(int tableID, char *name, int *code); int tableInqParName(int tableID, int code, char *name); int tableInqParLongname(int tableID, int code, char *longname); int tableInqParUnits(int tableID, int code, char *units); /* needed only for CDO operator after */ const char *tableInqParNamePtr(int tableID, int parID); const char *tableInqParLongnamePtr(int tableID, int parID); const char *tableInqParUnitsPtr(int tableID, int parID); /* History routines */ void streamDefHistory(int streamID, int size, const char *history); int streamInqHistorySize(int streamID); void streamInqHistoryString(int streamID, char *history); /* Subtype routines */ /* subtypeCreate: Create a variable subtype */ int subtypeCreate(int subtype); /* Gives a textual summary of the variable subtype */ void subtypePrint(int subtypeID); /* Compares two subtype data structures. */ int subtypeCompare(int subtypeID1, int subtypeID2); /* subtypeInqSize: Get the size of a subtype (e.g. no. of tiles). */ int subtypeInqSize(int subtypeID); /* subtypeInqActiveIndex: Get the currently active index of a subtype (e.g. current tile index). */ int subtypeInqActiveIndex(int subtypeID); /* subtypeDefActiveIndex: Set the currently active index of a subtype (e.g. current tile index). */ void subtypeDefActiveIndex(int subtypeID, int index); /* Generate a "query object" out of a key-value pair. */ subtype_query_t keyValuePair(const char *key, int value); /* Generate an AND-combined "query object" out of two previous query objects. */ subtype_query_t matchAND(subtype_query_t q1, subtype_query_t q2); /* subtypeInqSubEntry: Returns subtype entry ID for a given criterion. */ int subtypeInqSubEntry(int subtypeID, subtype_query_t criterion); /* subtypeInqTile: Specialized version of subtypeInqSubEntry looking for tile/attribute pair. */ int subtypeInqTile(int subtypeID, int tileindex, int attribute); /* subtypeInqAttribute: Inquire the value of a subtype attribute. Returns CDI_EINVAL if the attribute does not exist.*/ int subtypeInqAttribute(int subtypeID, int index, const char *key, int *outValue); /* vlistInqVarSubtype: Return subtype ID for a given variable. */ int vlistInqVarSubtype(int vlistID, int varID); void gribapiLibraryVersion(int *major_version, int *minor_version, int *revision_version); #if defined (__cplusplus) } #endif #endif /* CDI_H_ */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */