cdi.h 52.5 KB
Newer Older
1
2
3
4
5
6
/*
  CDI C header file

  This is the only file that must be included to use the CDI library from C.
*/

7
8
#ifndef  CDI_H_
#define  CDI_H_
Uwe Schulzweida's avatar
Uwe Schulzweida committed
9

10
#include <stdio.h>
Uwe Schulzweida's avatar
Uwe Schulzweida committed
11
#include <sys/types.h>
12

13
#ifdef __cplusplus
Uwe Schulzweida's avatar
Uwe Schulzweida committed
14
15
extern "C" {
#endif
16
17


Deike Kleberg's avatar
Deike Kleberg committed
18
19
#define  CDI_MAX_NAME           256   /* max length of a name                 */

Uwe Schulzweida's avatar
Uwe Schulzweida committed
20
#define  CDI_UNDEFID             -1
21
#define  CDI_GLOBAL              -1   /* Global var ID for vlist              */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
22

23
24
/* Byte order */

25
26
#define  CDI_BIGENDIAN            0   /* Byte order BIGENDIAN                 */
#define  CDI_LITTLEENDIAN         1   /* Byte order LITTLEENDIAN              */
27
#define  CDI_PDPENDIAN            2
28

29
30
31
#define  CDI_REAL                 1   /* Real numbers                         */
#define  CDI_COMP                 2   /* Complex numbers                      */
#define  CDI_BOTH                 3   /* Both numbers                         */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
32

Uwe Schulzweida's avatar
Uwe Schulzweida committed
33
34
/* Error identifier */

35
#define	 CDI_NOERR        	  0   /* No Error                             */
36
#define  CDI_EEOF                -1   /* The end of file was encountered      */
37
38
39
40
41
#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           */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
42
#define  CDI_EUNC4              -24   /* Unsupported NetCDF4 structure        */
43
#define  CDI_ELIMIT             -99   /* Internal limits exceeded             */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
44
45
46

/* File types */

47
#define  FILETYPE_UNDEF          -1   /* Unknown/not yet defined file type */
48
#define  FILETYPE_GRB             1   /* File type GRIB                       */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
49
#define  FILETYPE_GRB2            2   /* File type GRIB version 2             */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
50
51
52
53
#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) */
Deike Kleberg's avatar
Deike Kleberg committed
54
55
56
#define  FILETYPE_SRV             7   /* File type SERVICE                    */
#define  FILETYPE_EXT             8   /* File type EXTRA                      */
#define  FILETYPE_IEG             9   /* File type IEG                        */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
57

58
59
/* Compress types */

60
61
62
63
64
65
#define  CDI_COMPRESS_NONE          0
#define  CDI_COMPRESS_SZIP          1
#define  CDI_COMPRESS_GZIP          2
#define  CDI_COMPRESS_BZIP2         3
#define  CDI_COMPRESS_ZIP           4
#define  CDI_COMPRESS_JPEG          5
66

67
/* external data types */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
68
69
70
71
72

#define  DATATYPE_PACK            0
#define  DATATYPE_PACK1           1
#define  DATATYPE_PACK2           2
#define  DATATYPE_PACK3           3
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#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
102
103
#define  DATATYPE_CPX32          64
#define  DATATYPE_CPX64         128
104
105
106
107
108
#define  DATATYPE_FLT32         132
#define  DATATYPE_FLT64         164
#define  DATATYPE_INT8          208
#define  DATATYPE_INT16         216
#define  DATATYPE_INT32         232
Uwe Schulzweida's avatar
Uwe Schulzweida committed
109
#define  DATATYPE_UINT8         308
110
111
#define  DATATYPE_UINT16        316
#define  DATATYPE_UINT32        332
Uwe Schulzweida's avatar
Uwe Schulzweida committed
112

113
114
115
116
/* internal data types */
#define  DATATYPE_INT           251
#define  DATATYPE_FLT           252
#define  DATATYPE_TXT           253
117
#define  DATATYPE_CPX           254
118
#define  DATATYPE_UCHAR         255
119
#define  DATATYPE_LONG          256
120

121
122
/* Chunks */

123
124
125
#define  CDI_CHUNK_AUTO             1  /* use default chunk size                                */
#define  CDI_CHUNK_GRID             2
#define  CDI_CHUNK_LINES            3
126

Uwe Schulzweida's avatar
Uwe Schulzweida committed
127
128
/* GRID types */

129
130
131
132
133
134
135
136
137
138
139
140
141
142
#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                                            */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
143
#define  GRID_PROJECTION           15  /* Projected coordinates                                 */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
144

145
146
147
#define  CDI_PROJ_RLL              21  /* Rotated Latitude Longitude                            */
#define  CDI_PROJ_LCC              22  /* Lambert Conformal Conic                               */
#define  CDI_PROJ_LAEA             23  /* Lambert Azimuthal Equal Area                          */
148
#define  CDI_PROJ_SINU             24  /* Sinusoidal                                            */
149

Uwe Schulzweida's avatar
Uwe Schulzweida committed
150
151
/* ZAXIS types */

152
153
154
155
156
#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                     */
157
#define  ZAXIS_HEIGHT               5  /* Height above ground                                   */
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#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                                */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
178

179
180
181
182
/* SUBTYPE types */

enum {
  SUBTYPE_TILES                         = 0  /* Tiles variable                                  */
183
};
184
185
186
187

#define MAX_KV_PAIRS_MATCH 10

/* Data structure defining a key-value search, possibly with multiple
188
   key-value pairs in combination.
189
190
191
192
193
194
195
196
197
198

   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;



199
200
/* TIME types */

201
202
#define  TIME_CONSTANT              0  /* obsolate, use TSTEP_CONSTANT                          */
#define  TIME_VARIABLE              1  /* obsolate, use TSTEP_INSTANT                           */
203
204
205

/* TSTEP types */

Uwe Schulzweida's avatar
Uwe Schulzweida committed
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#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
220

Uwe Schulzweida's avatar
Uwe Schulzweida committed
221
222
223
224
/* TAXIS types */

#define  TAXIS_ABSOLUTE           1
#define  TAXIS_RELATIVE           2
225
#define  TAXIS_FORECAST           3
Uwe Schulzweida's avatar
Uwe Schulzweida committed
226
227
228
229
230

/* TUNIT types */

#define  TUNIT_SECOND             1
#define  TUNIT_MINUTE             2
231
232
233
234
235
236
237
238
239
#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
Uwe Schulzweida's avatar
Uwe Schulzweida committed
240
241
242

/* CALENDAR types */

243
#define  CALENDAR_STANDARD        0  /* don't change this value (used also in cgribexlib)! */
244
#define  CALENDAR_PROLEPTIC       1
Uwe Schulzweida's avatar
Uwe Schulzweida committed
245
246
247
#define  CALENDAR_360DAYS         2
#define  CALENDAR_365DAYS         3
#define  CALENDAR_366DAYS         4
248
#define  CALENDAR_NONE            5
Uwe Schulzweida's avatar
Uwe Schulzweida committed
249

250
251
/* number of unsigned char needed to store UUID */
#define  CDI_UUID_SIZE           16
252

253
254
/* Structs that are used to return data to the user */

255
typedef struct CdiParam { int discipline; int category; int number; } CdiParam;
256
257
258
259
260
261


/* Opaque types */
typedef struct CdiIterator CdiIterator;
typedef struct CdiGribIterator CdiGribIterator;

262
263
264
/* CDI control routines */

void    cdiReset(void);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
265

266
const char *cdiStringError(int cdiErrno);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
267
268
269

void    cdiDebug(int debug);

270
const char *cdiLibraryVersion(void);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
271
272
void    cdiPrintVersion(void);

273
274
int     cdiHaveFiletype(int filetype);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
275
276
void    cdiDefMissval(double missval);
double  cdiInqMissval(void);
277
void    cdiDefGlobal(const char *string, int val);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
278

279
int     namespaceNew(void);
280
void    namespaceSetActive(int namespaceID);
281
int     namespaceGetActive(void);
282
283
284
void    namespaceDelete(int namespaceID);


Uwe Schulzweida's avatar
Uwe Schulzweida committed
285
286
/* CDI converter routines */

287
288
289
/* parameter */

void    cdiParamToString(int param, char *paramstr, int maxlen);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
290

Uwe Schulzweida's avatar
Uwe Schulzweida committed
291
292
void    cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis);
int     cdiEncodeParam(int pnum, int pcat, int pdis);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
293
294

/* date format:  YYYYMMDD */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
295
/* time format:    hhmmss */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
296
297
298
299
300
301
302
303

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);


Uwe Schulzweida's avatar
Uwe Schulzweida committed
304
305
/* STREAM control routines */

306
307
int     cdiGetFiletype(const char *path, int *byteorder);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
308
309
/*      streamOpenRead: Open a dataset for reading */
int     streamOpenRead(const char *path);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
310

Uwe Schulzweida's avatar
Uwe Schulzweida committed
311
312
/*      streamOpenWrite: Create a new dataset */
int     streamOpenWrite(const char *path, int filetype);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
313

Uwe Schulzweida's avatar
Uwe Schulzweida committed
314
int     streamOpenAppend(const char *path);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
315

Uwe Schulzweida's avatar
Uwe Schulzweida committed
316
/*      streamClose: Close an open dataset */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
317
318
void    streamClose(int streamID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
319
320
321
/*      streamSync: Synchronize an Open Dataset to Disk */
void    streamSync(int streamID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
322
323
324
325
326
327
/*      streamDefVlist: Define the Vlist for a stream */
void    streamDefVlist(int streamID, int vlistID);

/*      streamInqVlist: Get the Vlist of a stream */
int     streamInqVlist(int streamID);

328
/*      streamInqFiletype: Get the filetype */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
329
int     streamInqFiletype(int streamID);
330

331
/*      streamDefByteorder: Define the byteorder */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
332
void    streamDefByteorder(int streamID, int byteorder);
333
334

/*      streamInqByteorder: Get the byteorder */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
335
336
int     streamInqByteorder(int streamID);

Deike Kleberg's avatar
Deike Kleberg committed
337
338
/*      streamDefCompType: Define compression type */
void    streamDefCompType(int streamID, int comptype);
339

Deike Kleberg's avatar
Deike Kleberg committed
340
341
/*      streamInqCompType: Get compression type */
int     streamInqCompType(int streamID);
342

Uwe Schulzweida's avatar
Uwe Schulzweida committed
343
344
345
/*      streamDefCompLevel: Define compression level */
void    streamDefCompLevel(int streamID, int complevel);

Deike Kleberg's avatar
Deike Kleberg committed
346
347
/*      streamInqCompLevel: Get compression level */
int     streamInqCompLevel(int streamID);
348

349
/*      streamDefTimestep: Define time step */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
350
int     streamDefTimestep(int streamID, int tsID);
351
352

/*      streamInqTimestep: Get time step */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
353
354
int     streamInqTimestep(int streamID, int tsID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
355
356
357
/*      PIO: query currently set timestep id  */
int     streamInqCurTimestepID(int streamID);

358
359
const char *streamFilename(int streamID);
const char *streamFilesuffix(int filetype);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
360

Uwe Schulzweida's avatar
Uwe Schulzweida committed
361
off_t   streamNvals(int streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
362

Deike Kleberg's avatar
Deike Kleberg committed
363
int     streamInqNvars ( int streamID );
Uwe Schulzweida's avatar
Uwe Schulzweida committed
364
365
366
367

/* STREAM var I/O routines */

/*      streamWriteVar: Write a variable */
368
369
void    streamWriteVar(int streamID, int varID, const double data[], int nmiss);
void    streamWriteVarF(int streamID, int varID, const float data[], int nmiss);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
370

Uwe Schulzweida's avatar
Uwe Schulzweida committed
371
/*      streamReadVar: Read a variable */
372
373
void    streamReadVar(int streamID, int varID, double data[], int *nmiss);
void    streamReadVarF(int streamID, int varID, float data[], int *nmiss);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
374
375

/*      streamWriteVarSlice: Write a horizontal slice of a variable */
376
377
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);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
378

Uwe Schulzweida's avatar
Uwe Schulzweida committed
379
/*      streamReadVarSlice: Read a horizontal slice of a variable */
380
381
void    streamReadVarSlice(int streamID, int varID, int levelID, double data[], int *nmiss);
void    streamReadVarSliceF(int streamID, int varID, int levelID, float data[], int *nmiss);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
382

383
void    streamWriteVarChunk(int streamID, int varID, const int rect[3][2], const double data[], int nmiss);
384

Uwe Schulzweida's avatar
Uwe Schulzweida committed
385
386
387
388

/* STREAM record I/O routines */

void    streamDefRecord(int streamID, int  varID, int  levelID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
389
void    streamInqRecord(int streamID, int *varID, int *levelID);
390
391
392
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);
393
void    streamReadRecordF(int streamID, float data[], int *nmiss);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
394
395
void    streamCopyRecord(int streamIDdest, int streamIDsrc);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
396
void    streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
397

398
399
400
401

/* File driven I/O (may yield better performance than using the streamXXX functions) */

//Creation & Destruction
402
403
404
405
406
407
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);
408
409

//Advancing an iterator
410
int cdiIterator_nextField(CdiIterator *me);      //Points the iterator at the next field, returns CDI_EEOF if there are no more fields in the file.
411
412
413

//Introspecting metadata
//All outXXX arguments to these functions may be NULL.
414
415
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.
416
char *cdiIterator_inqRTime(CdiIterator *me);      //Returns the reference date as an ISO-8601 coded string. The caller is responsible to Free() the returned string.
417
418
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
419
420
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.
421
422
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.
423
CdiParam cdiIterator_inqParam(CdiIterator *me);
424
void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber);	//Some FORTRAN compilers produce wrong code for the cdiIterator_inqParam()-wrapper, rendering it unusable from FORTRAN. This function is the workaround.
425
426
int cdiIterator_inqDatatype(CdiIterator *me);
int cdiIterator_inqTsteptype(CdiIterator *me);
427
char *cdiIterator_inqVariableName(CdiIterator *me);        //The caller is responsible to Free() the returned buffer.
428
int cdiIterator_inqGridId(CdiIterator *me);         //The returned id is only valid until the next call to cdiIteratorNextField().
429
430

//Reading data
431
432
void cdiIterator_readField(CdiIterator *me, double data[], size_t *nmiss_optional);
void cdiIterator_readFieldF(CdiIterator *me, float data[], size_t *nmiss_optional);
433
434
435
436
//TODO[NH]: Add functions to read partial fields.


//Direct access to grib fields
437
438
CdiGribIterator *cdiGribIterator_clone(CdiIterator *me);  //Returns NULL if the associated file is not a GRIB file.
void cdiGribIterator_delete(CdiGribIterator *me);
439
440

//Callthroughs to GRIB-API
441
442
443
444
445
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().
446
int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *value, size_t *array_size);       //Same semantics as grib_get_long_array().
447
int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *value, size_t *array_size);       //Same semantics as grib_get_double_array().
448
449

//Convenience functions for accessing GRIB-API keys
450
451
452
453
454
455
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.
456

Uwe Schulzweida's avatar
Uwe Schulzweida committed
457
458
/* VLIST routines */

459
460
/*      vlistCreate: Create a variable list */
int     vlistCreate(void);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
461

462
/*      vlistDestroy: Destroy a variable list */
463
void    vlistDestroy(int vlistID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483

/*      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);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
484
485
486
/*      vlistNumber: Number type in a variable list */
int     vlistNumber(int vlistID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
487
488
489
490
491
492
493
494
495
/*      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);

496
497
498
/*      vlistNsubtypes: Number of subtypes in a variable list */
int     vlistNsubtypes(int vlistID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
499
500
501
502
503
504
505
506
507
508
509
510
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);
511
512
int     vlistSubtype(int vlistID, int index);
int     vlistSubtypeIndex(int vlistID, int subtypeID);
513
514

/*      vlistDefTaxis: Define the time axis of a variable list */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
515
void    vlistDefTaxis(int vlistID, int taxisID);
516
517

/*      vlistInqTaxis: Get the time axis of a variable list */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
518
int     vlistInqTaxis(int vlistID);
519

Uwe Schulzweida's avatar
Uwe Schulzweida committed
520
521
522
523
524
525
526
527
528
529
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 */

530
/*      vlistDefVarTiles: Create a new tile-based variable */
531
532
533
int     vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int tsteptype, int tilesetID);

/*      vlistDefVar: Create a new variable */
534
int     vlistDefVar(int vlistID, int gridID, int zaxisID, int tsteptype);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
535

536
void    vlistChangeVarGrid(int vlistID, int varID, int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
537
538
void    vlistChangeVarZaxis(int vlistID, int varID, int zaxisID);

539
void    vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *tsteptype);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
540
541
int     vlistInqVarGrid(int vlistID, int varID);
int     vlistInqVarZaxis(int vlistID, int varID);
542
543
544
545
546

/* used in MPIOM */
int     vlistInqVarID(int vlistID, int code);

void    vlistDefVarTsteptype(int vlistID, int varID, int tsteptype);
547
548

/*      vlistInqVarTsteptype: Get the timestep type of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
549
int     vlistInqVarTsteptype(int vlistID, int varID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
550

Deike Kleberg's avatar
Deike Kleberg committed
551
552
553
554
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);
555

556
557
558
559
560
561
/*      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);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
562
/*      vlistDefVarCode: Define the code number of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
563
564
void    vlistDefVarCode(int vlistID, int varID, int code);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
565
/*      vlistInqVarCode: Get the code number of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
566
567
int     vlistInqVarCode(int vlistID, int varID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
568
/*      vlistDefVarDatatype: Define the data type of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
569
570
void    vlistDefVarDatatype(int vlistID, int varID, int datatype);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
571
/*      vlistInqVarDatatype: Get the data type of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
572
573
int     vlistInqVarDatatype(int vlistID, int varID);

574
575
576
void    vlistDefVarChunkType(int vlistID, int varID, int chunktype);
int     vlistInqVarChunkType(int vlistID, int varID);

577
578
579
void    vlistDefVarXYZ(int vlistID, int varID, int xyz);
int     vlistInqVarXYZ(int vlistID, int varID);

580
581
int     vlistInqVarNumber(int vlistID, int varID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
582
583
584
585
586
587
588
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);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
589
/*      vlistDefVarName: Define the name of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
590
591
void    vlistDefVarName(int vlistID, int varID, const char *name);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
592
/*      vlistInqVarName: Get the name of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
593
594
void    vlistInqVarName(int vlistID, int varID, char *name);

595
/*      vlistCopyVarName: Safe and convenient version of vlistInqVarName */
596
char   *vlistCopyVarName(int vlistId, int varId);
597

Uwe Schulzweida's avatar
Uwe Schulzweida committed
598
599
600
601
602
603
/*      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);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
604
/*      vlistDefVarLongname: Define the long name of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
605
606
void    vlistDefVarLongname(int vlistID, int varID, const char *longname);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
607
/*      vlistInqVarLongname: Get the long name of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
608
void    vlistInqVarLongname(int vlistID, int varID, char *longname);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
609

Uwe Schulzweida's avatar
Uwe Schulzweida committed
610
/*      vlistDefVarUnits: Define the units of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
611
612
void    vlistDefVarUnits(int vlistID, int varID, const char *units);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
613
/*      vlistInqVarUnits: Get the units of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
614
615
void    vlistInqVarUnits(int vlistID, int varID, char *units);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
616
/*      vlistDefVarMissval: Define the missing value of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
617
618
void    vlistDefVarMissval(int vlistID, int varID, double missval);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
619
/*      vlistInqVarMissval: Get the missing value of a Variable */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
620
621
double  vlistInqVarMissval(int vlistID, int varID);

622
623
624
625
626
627
/*      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);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
628
629
630
631
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);
632

633
634
635
636
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);
637

638
639
640
void    vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess);
int     vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID);

641
642
643
void    vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate);
int     vlistInqVarProductDefinitionTemplate(int vlistID, int varID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
644
645
646
647
648
649
650
651
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);
652
653
int     vlistMergedVar(int vlistID, int varID);
int     vlistMergedLevel(int vlistID, int varID, int levelID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
654

655
656
657
/*     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);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
658

659
/* cdiClearAdditionalKeys: Clear the list of additional GRIB keys. */
Thomas Jahns's avatar
Thomas Jahns committed
660
void    cdiClearAdditionalKeys(void);
661
662
/* cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened. */
void    cdiDefAdditionalKey(const char *string);
663
664
665
666
667
668

/* 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);

669
/* vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise. */
670
int     vlistHasVarKey(int vlistID, int varID, const char *name);
671
/* vlistInqVarDblKey: raw access to GRIB meta-data */
672
double  vlistInqVarDblKey(int vlistID, int varID, const char *name);
673
/* vlistInqVarIntKey: raw access to GRIB meta-data */
674
int     vlistInqVarIntKey(int vlistID, int varID, const char *name);
675

676
677
678
679
/* 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);
680

681
682
/* VLIST attributes */

Uwe Schulzweida's avatar
Uwe Schulzweida committed
683
/*      vlistInqNatts: Get number of attributes assigned to this variable */
684
int     vlistInqNatts(int vlistID, int varID, int *nattsp);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
685
/*      vlistInqAtt: Get information about an attribute */
686
687
int     vlistInqAtt(int vlistID, int varID, int attrnum, char *name, int *typep, int *lenp);
int     vlistDelAtt(int vlistID, int varID, const char *name);
688

Uwe Schulzweida's avatar
Uwe Schulzweida committed
689
/*      vlistDefAttInt: Define an integer attribute */
690
int     vlistDefAttInt(int vlistID, int varID, const char *name, int type, int len, const int ip[]);
691
/*      vlistDefAttFlt: Define a floating point attribute */
692
int     vlistDefAttFlt(int vlistID, int varID, const char *name, int type, int len, const double dp[]);
693
/*      vlistDefAttTxt: Define a text attribute */
694
int     vlistDefAttTxt(int vlistID, int varID, const char *name, int len, const char *tp_cbuf);
695

Uwe Schulzweida's avatar
Uwe Schulzweida committed
696
/*      vlistInqAttInt: Get the value(s) of an integer attribute */
697
int     vlistInqAttInt(int vlistID, int varID, const char *name, int mlen, int ip[]);
698
/*      vlistInqAttFlt: Get the value(s) of a floating point attribute */
699
int     vlistInqAttFlt(int vlistID, int varID, const char *name, int mlen, double dp[]);
700
/*      vlistInqAttTxt: Get the value(s) of a text attribute */
701
int     vlistInqAttTxt(int vlistID, int varID, const char *name, int mlen, char *tp_cbuf);
702
703


Uwe Schulzweida's avatar
Uwe Schulzweida committed
704
705
706
/* GRID routines */

void    gridName(int gridtype, char *gridname);
707
const char *gridNamePtr(int gridtype);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
708

Uwe Schulzweida's avatar
Uwe Schulzweida committed
709
710
void    gridCompress(int gridID);

711
712
void    gridDefMaskGME(int gridID, const int mask[]);
int     gridInqMaskGME(int gridID, int mask[]);
713

714
715
void    gridDefMask(int gridID, const int mask[]);
int     gridInqMask(int gridID, int mask[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
716

717
void    gridPrint(int gridID, int index, int opt);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
718

719
/*      gridCreate: Create a horizontal Grid */
720
int     gridCreate(int gridtype, int size);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
721

722
723
724
/*      gridDestroy: Destroy a horizontal Grid */
void    gridDestroy(int gridID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
725
726
727
/*      gridDuplicate: Duplicate a Grid */
int     gridDuplicate(int gridID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
728
729
730
/*      gridDefProj: Define the projection ID of a Grid */
void    gridDefProj(int gridID, int projID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
731
732
733
/*      gridInqProj: Get the projection ID of a Grid */
int     gridInqProj(int gridID);

734
735
736
/*      gridDefProjType: Define the projection type */
void    gridDefProjType(int gridID, int projtype);

737
738
739
/*      gridInqProjType: Get the projection type */
int     gridInqProjType(int gridID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
/*      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);

758
759
760
761
762
763
/*      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);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
764
/*      gridDefXvals: Define the values of a X-axis */
765
void    gridDefXvals(int gridID, const double xvals[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
766
767

/*      gridInqXvals: Get all values of a X-axis */
768
int     gridInqXvals(int gridID, double xvals[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
769
770

/*      gridDefYvals: Define the values of a Y-axis */
771
void    gridDefYvals(int gridID, const double yvals[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
772
773

/*      gridInqYvals: Get all values of a Y-axis */
774
int     gridInqYvals(int gridID, double yvals[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
775

776
/* CDI grid string key values */
777
778
779
780
781
782
783
784
785
#define  CDI_KEY_XNAME      901  // X-axis name
#define  CDI_KEY_YNAME      902  // Y-axis name
#define  CDI_KEY_XDIMNAME   903  // X-axis dimension name
#define  CDI_KEY_YDIMNAME   904  // Y-axis dimension name
#define  CDI_KEY_VDIMNAME   905  // Vertex dimension name
#define  CDI_KEY_XLONGNAME  906  // X-axis longname
#define  CDI_KEY_YLONGNAME  907  // Y-axis longname
#define  CDI_KEY_XUNITS     908  // X-axis units
#define  CDI_KEY_YUNITS     909  // Y-axis units
Uwe Schulzweida's avatar
Uwe Schulzweida committed
786
787
#define  CDI_KEY_MAPNAME    920  // Grid mapping var name
#define  CDI_KEY_MAPPING    921  // Grid mapping name
788

789
790
//      cdiGridDefKeyStr: Define a CDI grid string value from a key
int     cdiGridDefKeyStr(int gridID, int key, int size, const char *mesg);
791

792
793
//      cdiGridInqKeyStr: Get a CDI grid string value from a key
int     cdiGridInqKeyStr(int gridID, int key, int size, char *mesg);
794

Uwe Schulzweida's avatar
Uwe Schulzweida committed
795
/*      gridDefXname: Define the name of a X-axis */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
796
void    gridDefXname(int gridID, const char *xname);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
797

Uwe Schulzweida's avatar
Uwe Schulzweida committed
798
799
800
/*      gridInqXname: Get the name of a X-axis */
void    gridInqXname(int gridID, char *xname);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
801
/*      gridDefXlongname: Define the longname of a X-axis  */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
802
void    gridDefXlongname(int gridID, const char *xlongname);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
803

Uwe Schulzweida's avatar
Uwe Schulzweida committed
804
805
806
/*      gridInqXlongname: Get the longname of a X-axis */
void    gridInqXlongname(int gridID, char *xlongname);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
807
/*      gridDefXunits: Define the units of a X-axis */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
808
void    gridDefXunits(int gridID, const char *xunits);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
809

Uwe Schulzweida's avatar
Uwe Schulzweida committed
810
811
812
/*      gridInqXunits: Get the units of a X-axis */
void    gridInqXunits(int gridID, char *xunits);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
813
/*      gridDefYname: Define the name of a Y-axis */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
814
void    gridDefYname(int gridID, const char *yname);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
815

Uwe Schulzweida's avatar
Uwe Schulzweida committed
816
817
818
/*      gridInqYname: Get the name of a Y-axis */
void    gridInqYname(int gridID, char *yname);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
819
/*      gridDefYlongname: Define the longname of a Y-axis */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
820
void    gridDefYlongname(int gridID, const char *ylongname);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
821

Uwe Schulzweida's avatar
Uwe Schulzweida committed
822
823
824
/*      gridInqYlongname: Get the longname of a Y-axis */
void    gridInqYlongname(int gridID, char *ylongname);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
825
/*      gridDefYunits: Define the units of a Y-axis */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
826
void    gridDefYunits(int gridID, const char *yunits);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
827

Uwe Schulzweida's avatar
Uwe Schulzweida committed
828
829
/*      gridInqYunits: Get the units of a Y-axis */
void    gridInqYunits(int gridID, char *yunits);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850

/*      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);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
851

852
int     gridIsCircular(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
853
int     gridIsRotated(int gridID);
854
855

void    gridInqProjParamRLL(int gridID, double *xpole, double *ypole, double *angle);
856
void    gridDefProjParamRLL(int gridID, double xpole, double ypole, double angle);
857

Uwe Schulzweida's avatar
Uwe Schulzweida committed
858
void    gridDefXpole(int gridID, double xpole);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
859
double  gridInqXpole(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
860
void    gridDefYpole(int gridID, double ypole);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
861
double  gridInqYpole(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
862
void    gridDefAngle(int gridID, double angle);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
863
double  gridInqAngle(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
864
int     gridInqTrunc(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
865
void    gridDefTrunc(int gridID, int trunc);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
866
867
/* Hexagonal GME grid */
void    gridDefGMEnd(int gridID, int nd);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
868
int     gridInqGMEnd(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
869
void    gridDefGMEni(int gridID, int ni);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
870
int     gridInqGMEni(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
871
void    gridDefGMEni2(int gridID, int ni2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
872
int     gridInqGMEni2(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
873
void    gridDefGMEni3(int gridID, int ni3);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
874
int     gridInqGMEni3(int gridID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
875

876
877
878
/* Reference of an unstructured grid */

/*      gridDefNumber: Define the reference number for an unstructured grid */
879
void    gridDefNumber(int gridID, int number);
880
881
882
883
884

/*      gridInqNumber: Get the reference number to an unstructured grid */
int     gridInqNumber(int gridID);

/*      gridDefPosition: Define the position of grid in the reference file */
885
void    gridDefPosition(int gridID, int position);
886
887
888
889
890

/*      gridInqPosition: Get the position of grid in the reference file */
int     gridInqPosition(int gridID);

/*      gridDefReference: Define the reference URI for an unstructured grid */
891
void    gridDefReference(int gridID, const char *reference);
892
893
894
895
896

/*      gridInqReference: Get the reference URI to an unstructured grid */
int     gridInqReference(int gridID, char *reference);

/*      gridDefUUID: Define the UUID of an unstructured grid */
897
#ifdef __cplusplus
898
void    gridDefUUID(int gridID, const unsigned char *uuid);
899
900
901
#else
void    gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE]);
#endif
902

903
/*      gridInqUUID: Get the UUID of an unstructured grid */
Thomas Jahns's avatar
Thomas Jahns committed
904
#ifdef __cplusplus
905
void    gridInqUUID(int gridID, unsigned char *uuid);
Thomas Jahns's avatar
Thomas Jahns committed
906
907
908
#else
void    gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE]);
#endif
909

910
/* Lambert Conformal Conic grid (GRIB version) */
911
912
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);
913

914
915
916
917
/* 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);

918
919
920
921
922
/* 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);


923
924
void    gridDefArea(int gridID, const double area[]);
void    gridInqArea(int gridID, double area[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
925
926
927
928
929
930
931
932
933
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 */
934
void    gridDefXbounds(int gridID, const double xbounds[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
935
936

/*      gridInqXbounds: Get the bounds of a X-axis */
937
int     gridInqXbounds(int gridID, double xbounds[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
938
939

/*      gridDefYbounds: Define the bounds of a Y-axis */
940
void    gridDefYbounds(int gridID, const double ybounds[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
941
942

/*      gridInqYbounds: Get the bounds of a Y-axis */
943
int     gridInqYbounds(int gridID, double ybounds[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
944

945
946
void    gridDefRowlon(int gridID, int nrowlon, const int rowlon[]);
void    gridInqRowlon(int gridID, int rowlon[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
947
948
void    gridChangeType(int gridID, int gridtype);

949
950
951
void    gridDefComplexPacking(int gridID, int lpack);
int     gridInqComplexPacking(int gridID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
952
953
/* ZAXIS routines */

954
void    zaxisName(int zaxistype, char *zaxisname);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
955

956
/*      zaxisCreate: Create a vertical Z-axis */
957
int     zaxisCreate(int zaxistype, int size);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
958

959
960
961
/*      zaxisDestroy: Destroy a vertical Z-axis */
void    zaxisDestroy(int zaxisID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
962
963
964
965
966
967
968
969
970
971
972
/*      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);

973
void    zaxisPrint(int zaxisID, int index);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
974
975

/*      zaxisDefLevels: Define the levels of a Z-axis */
976
void    zaxisDefLevels(int zaxisID, const double levels[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
977
978

/*      zaxisInqLevels: Get all levels of a Z-axis */
979
void    zaxisInqLevels(int zaxisID, double levels[]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
980
981
982
983
984
985
986

/*      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);

987
988
989
990
991
992
/*      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);

993
/*      zaxisDefNumber: Define the reference number for a generalized Z-axis */
994
void    zaxisDefNumber(int gridID, int number);
995

996
/*      zaxisInqNumber: Get the reference number to a generalized Z-axis */
997
int     zaxisInqNumber(int gridID);
998

999
/*      zaxisDefUUID: Define the UUID of a generalized Z-axis */
1000
void    zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]);
1001

1002
/*      zaxisInqUUID: Get the UUID of a generalized Z-axis */
1003
void    zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]);
1004

1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
/* CDI zaxis string key values */
#define  CDI_ZAXIS_NAME      801  // Z-axis name
#define  CDI_ZAXIS_DIMNAME   802  // Z-axis dimension name
#define  CDI_ZAXIS_VDIMNAME  803  // Vertex dimension name
#define  CDI_ZAXIS_LONGNAME  804  // Z-axis longname
#define  CDI_ZAXIS_UNITS     805  // Z-axis units

//      cdiZaxisDefString: Define a CDI Z-axis string value from a key
int     cdiZaxisDefString(int zaxisID, int key, int size, const char *mesg);

//      cdiZaxisInqString: Get a CDI Z-axis string value from a key
int     cdiZaxisInqString(int zaxisID, int key, int size, char *mesg);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
1018
/*      zaxisDefName: Define the name of a Z-axis */
1019
void    zaxisDefName(int zaxisID, const char *name_optional);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
1020
1021
1022
1023

/*      zaxisInqName: Get the name of a Z-axis */
void    zaxisInqName(int zaxisID, char *name);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
1024
/*      zaxisDefLongname: Define the longname of a Z-axis */
1025
void    zaxisDefLongname(int zaxisID, const char *longname_optional);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
1026

Uwe Schulzweida's avatar
Uwe Schulzweida committed
1027
1028
1029
/*      zaxisInqLongname: Get the longname of a Z-axis */
void    zaxisInqLongname(int zaxisID, char *longname);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
1030
/*      zaxisDefUnits: Define the units of a Z-axis */
1031
void    zaxisDefUnits(int zaxisID, const char *units_optional);
Deike Kleberg's avatar
Deike Kleberg committed
1032

Uwe Schulzweida's avatar
Uwe Schulzweida committed
1033
1034
1035
/*      zaxisInqUnits: Get the units of a Z-axis */
void    zaxisInqUnits(int zaxisID, char *units);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
1036
1037
1038
/*      zaxisInqStdname: Get the standard name of a Z-axis */
void    zaxisInqStdname(int zaxisID, char *stdname);

1039
1040
1041
1042
1043
1044
/*      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);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
1045
1046
void    zaxisDefPrec(int zaxisID, int prec);
int     zaxisInqPrec(int zaxisID);
1047

1048
void    zaxisDefPositive(int zaxisID, int positive);
Deike Kleberg's avatar
Deike Kleberg committed
1049
1050
int     zaxisInqPositive(int zaxisID);

1051
1052
1053
void    zaxisDefScalar(int zaxisID);
int     zaxisInqScalar(int zaxisID);