1
#if defined (HAVE_CONFIG_H)
9
#include "stream_int.h"
13
static void vlistvarInitEntry(int vlistID, int varID)
17
vlistptr = vlist_to_pointer(vlistID);
19
vlistptr->vars[varID].fvarID = varID;
20
vlistptr->vars[varID].mvarID = varID;
21
vlistptr->vars[varID].flag = 0;
22
vlistptr->vars[varID].param = 0;
23
vlistptr->vars[varID].timeID = CDI_UNDEFID;
24
vlistptr->vars[varID].datatype = CDI_UNDEFID;
25
vlistptr->vars[varID].tsteptype = TSTEP_INSTANT;
26
vlistptr->vars[varID].timave = 0;
27
vlistptr->vars[varID].timaccu = 0;
28
vlistptr->vars[varID].gridID = CDI_UNDEFID;
29
vlistptr->vars[varID].zaxisID = CDI_UNDEFID;
30
vlistptr->vars[varID].instID = CDI_UNDEFID;
31
vlistptr->vars[varID].modelID = CDI_UNDEFID;
32
vlistptr->vars[varID].tableID = CDI_UNDEFID;
33
vlistptr->vars[varID].missvalused = FALSE;
34
vlistptr->vars[varID].missval = cdiDefaultMissval;
35
vlistptr->vars[varID].addoffset = 0.0;
36
vlistptr->vars[varID].scalefactor = 1.0;
37
vlistptr->vars[varID].name = NULL;
38
vlistptr->vars[varID].longname = NULL;
39
vlistptr->vars[varID].stdname = NULL;
40
vlistptr->vars[varID].units = NULL;
41
vlistptr->vars[varID].nlevs = 0;
42
vlistptr->vars[varID].levinfo = NULL;
43
vlistptr->vars[varID].ztype = COMPRESS_NONE;
44
vlistptr->vars[varID].zlevel = 1;
45
vlistptr->vars[varID].atts.nalloc = MAX_ATTRIBUTES;
46
vlistptr->vars[varID].atts.nelems = 0;
49
static int vlistvarNewEntry(int vlistID)
51
static const char *func = "vlistvarNewEntry";
57
vlistptr = vlist_to_pointer(vlistID);
59
vlistvarSize = vlistptr->varsAllocated;
60
vlistvar = vlistptr->vars;
62
Look for a free slot in vlistvar.
63
(Create the table the first time through).
70
vlistvar = (var_t *) malloc(vlistvarSize*sizeof(var_t));
71
if ( vlistvar == NULL )
73
Message(func, "vlistvarSize = %d", vlistvarSize);
74
SysError(func, "Allocation of var_t failed");
77
for ( i = 0; i < vlistvarSize; i++ )
78
vlistvar[i].isUsed = FALSE;
82
while ( varID < vlistvarSize )
84
if ( ! vlistvar[varID].isUsed ) break;
89
If the table overflows, double its size.
91
if ( varID == vlistvarSize )
95
vlistvarSize = 2*vlistvarSize;
96
vlistvar = (var_t *) realloc(vlistvar, vlistvarSize*sizeof(var_t));
97
if ( vlistvar == NULL )
99
Message(func, "vlistvarSize = %d", vlistvarSize);
100
SysError(func, "Reallocation of var_t failed");
102
varID = vlistvarSize/2;
104
for ( i = varID; i < vlistvarSize; i++ )
105
vlistvar[i].isUsed = FALSE;
108
vlistptr->varsAllocated = vlistvarSize;
109
vlistptr->vars = vlistvar;
111
vlistvarInitEntry(vlistID, varID);
113
vlistptr->vars[varID].isUsed = TRUE;
118
void vlistCheckVarID(const char *func, int vlistID, int varID)
122
vlistptr = vlist_to_pointer(vlistID);
124
if ( vlistptr == NULL )
125
Error(func, "vlist undefined!");
127
if ( varID < 0 || varID >= vlistptr->nvars )
128
Error(func, "varID %d undefined!", varID);
130
if ( ! vlistptr->vars[varID].isUsed )
131
Error(func, "varID %d undefined!", varID);
136
@Function vlistDefVar
137
@Title Define a Variable
139
@Prototype int vlistDefVar(int vlistID, int gridID, int zaxisID, int timeID)
141
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
142
@Item gridID Grid ID, from a previous call to @fref{gridCreate}
143
@Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}
144
@Item timeID One of the set of predefined CDI time identifiers.
145
The valid CDI time identifiers are @func{TIME_CONSTANT} and @func{TIME_VARIABLE}.
148
The function @func{vlistDefVar} adds a new variable to vlistID.
151
@func{vlistDefVar} returns an identifier to the new variable.
154
Here is an example using @func{vlistCreate} to create a variable list
155
and add a variable with @func{vlistDefVar}.
162
vlistID = vlistCreate();
163
varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE);
165
streamDefVlist(streamID, vlistID);
167
vlistDestroy(vlistID);
172
int vlistDefVar(int vlistID, int gridID, int zaxisID, int timeID)
174
static const char *func = "vlistDefVar";
181
vlistptr = vlist_to_pointer(vlistID);
184
Message(func, "gridID = %d zaxisID = %d timeID = %d", gridID, zaxisID, timeID);
186
varID = vlistvarNewEntry(vlistID);
190
vlistptr->vars[varID].gridID = gridID;
191
vlistptr->vars[varID].zaxisID = zaxisID;
192
vlistptr->vars[varID].timeID = timeID;
194
if ( timeID != TIME_VARIABLE && timeID != TIME_CONSTANT )
196
Message(func, "unexpected timeID %d. Set to TIME_VARIABLE", timeID);
197
vlistptr->vars[varID].timeID = TIME_VARIABLE;
200
nlevs = zaxisInqSize(zaxisID);
202
vlistptr->vars[varID].levinfo = (levinfo_t *) malloc(nlevs*sizeof(levinfo_t));
204
for ( levID = 0; levID < nlevs; levID++ )
206
vlistptr->vars[varID].levinfo[levID].flag = 0;
207
vlistptr->vars[varID].levinfo[levID].index = -1;
208
vlistptr->vars[varID].levinfo[levID].flevelID = levID;
209
vlistptr->vars[varID].levinfo[levID].mlevelID = levID;
212
vlistptr->vars[varID].nlevs = nlevs;
214
for ( index = 0; index < vlistptr->ngrids; index++ )
215
if ( gridID == vlistptr->gridIDs[index] ) break;
217
if ( index == vlistptr->ngrids )
219
if ( vlistptr->ngrids + 1 >= MAX_GRIDS_PS )
220
Error(func, "Maximum of %d grids reached", MAX_GRIDS_PS);
222
vlistptr->gridIDs[vlistptr->ngrids] = gridID;
226
for ( index = 0; index < vlistptr->nzaxis; index++ )
227
if ( zaxisID == vlistptr->zaxisIDs[index] ) break;
229
if ( index == vlistptr->nzaxis )
231
if ( vlistptr->nzaxis + 1 >= MAX_ZAXES_PS )
232
Error(func, "Maximum of %d zaxis reached", MAX_ZAXES_PS);
234
vlistptr->zaxisIDs[vlistptr->nzaxis] = zaxisID;
238
vlistptr->vars[varID].param = cdiEncodeParam(-(varID + 1), 255, 255);
245
@Function vlistDefVarParam
246
@Title Define the parameter number of a Variable
248
@Prototype void vlistDefVarParam(int vlistID, int varID, int param)
250
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
251
@Item varID Variable identifier
252
@Item param Parameter number
255
The function @func{vlistDefVarParam} defines the parameter number of a variable.
259
void vlistDefVarParam(int vlistID, int varID, int param)
261
static const char *func = "vlistDefVarParam";
264
vlistptr = vlist_to_pointer(vlistID);
266
vlistCheckVarID(func, vlistID, varID);
268
vlistptr->vars[varID].param = param;
273
@Function vlistDefVarCode
274
@Title Define the code number of a Variable
276
@Prototype void vlistDefVarCode(int vlistID, int varID, int code)
278
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
279
@Item varID Variable identifier
280
@Item code Code number
283
The function @func{vlistDefVarCode} defines the code number of a variable.
287
void vlistDefVarCode(int vlistID, int varID, int code)
289
static const char *func = "vlistDefVarCode";
291
int param, pnum, pcat, pdis;
293
vlistptr = vlist_to_pointer(vlistID);
295
vlistCheckVarID(func, vlistID, varID);
297
param = vlistptr->vars[varID].param;
299
cdiDecodeParam(param, &pnum, &pcat, &pdis);
301
vlistptr->vars[varID].param = cdiEncodeParam(code, pcat, pdis);
305
void vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *timeID)
307
static const char *func = "vlistInqVar";
310
vlistptr = vlist_to_pointer(vlistID);
312
vlistCheckVarID(func, vlistID, varID);
314
*gridID = vlistptr->vars[varID].gridID;
315
*zaxisID = vlistptr->vars[varID].zaxisID;
316
*timeID = vlistptr->vars[varID].timeID;
323
@Function vlistInqVarGrid
324
@Title Get the Grid ID of a Variable
326
@Prototype int vlistInqVarGrid(int vlistID, int varID)
328
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
329
@Item varID Variable identifier
332
The function @func{vlistInqVarGrid} returns the grid ID of a variable.
335
@func{vlistInqVarGrid} returns the grid ID of the variable.
339
int vlistInqVarGrid(int vlistID, int varID)
341
static const char *func = "vlistInqVarGrid";
344
vlistptr = vlist_to_pointer(vlistID);
346
vlistCheckVarID(func, vlistID, varID);
348
return (vlistptr->vars[varID].gridID);
353
@Function vlistInqVarZaxis
354
@Title Get the Zaxis ID of a Variable
356
@Prototype int vlistInqVarZaxis(int vlistID, int varID)
358
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
359
@Item varID Variable identifier
362
The function @func{vlistInqVarZaxis} returns the zaxis ID of a variable.
365
@func{vlistInqVarZaxis} returns the zaxis ID of the variable.
369
int vlistInqVarZaxis(int vlistID, int varID)
371
static const char *func = "vlistInqVarZaxis";
374
vlistptr = vlist_to_pointer(vlistID);
376
vlistCheckVarID(func, vlistID, varID);
378
return (vlistptr->vars[varID].zaxisID);
381
int vlistInqVarTime(int vlistID, int varID)
383
static const char *func = "vlistInqVarTime";
386
vlistptr = vlist_to_pointer(vlistID);
388
vlistCheckVarID(func, vlistID, varID);
390
return (vlistptr->vars[varID].timeID);
395
@Function vlistInqVarParam
396
@Title Get the parameter number of a Variable
398
@Prototype int vlistInqVarParam(int vlistID, int varID)
400
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
401
@Item varID Variable identifier
404
The function @func{vlistInqVarParam} returns the parameter number of a variable.
407
@func{vlistInqVarParam} returns the parameter number of the variable.
411
int vlistInqVarParam(int vlistID, int varID)
413
static const char *func = "vlistInqVarParam";
417
vlistptr = vlist_to_pointer(vlistID);
419
vlistCheckVarID(func, vlistID, varID);
421
param = vlistptr->vars[varID].param;
428
@Function vlistInqVarCode
429
@Title Get the Code number of a Variable
431
@Prototype int vlistInqVarCode(int vlistID, int varID)
433
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
434
@Item varID Variable identifier
437
The function @func{vlistInqVarCode} returns the code number of a variable.
440
@func{vlistInqVarCode} returns the code number of the variable.
444
int vlistInqVarCode(int vlistID, int varID)
446
static const char *func = "vlistInqVarCode";
449
int pdis, pcat, pnum;
451
vlistptr = vlist_to_pointer(vlistID);
453
vlistCheckVarID(func, vlistID, varID);
455
param = vlistptr->vars[varID].param;
456
cdiDecodeParam(param, &pnum, &pcat, &pdis);
459
if ( code < 0 && vlistptr->vars[varID].tableID != -1 && vlistptr->vars[varID].name != NULL )
461
tableInqParCode(vlistptr->vars[varID].tableID, vlistptr->vars[varID].name, &code);
468
char *vlistInqVarNamePtr(int vlistID, int varID)
470
static const char *func = "vlistInqVarNamePtr";
473
vlistptr = vlist_to_pointer(vlistID);
475
vlistCheckVarID(func, vlistID, varID);
477
return (vlistptr->vars[varID].name);
480
char *vlistInqVarLongnamePtr(int vlistID, int varID)
482
static const char *func = "vlistInqVarLongnamePtr";
485
vlistptr = vlist_to_pointer(vlistID);
487
vlistCheckVarID(func, vlistID, varID);
489
return (vlistptr->vars[varID].longname);
492
char *vlistInqVarStdnamePtr(int vlistID, int varID)
494
static const char *func = "vlistInqVarStdnamePtr";
497
vlistptr = vlist_to_pointer(vlistID);
499
vlistCheckVarID(func, vlistID, varID);
501
return (vlistptr->vars[varID].stdname);
504
char *vlistInqVarUnitsPtr(int vlistID, int varID)
506
static const char *func = "vlistInqVarUnitsPtr";
509
vlistptr = vlist_to_pointer(vlistID);
511
vlistCheckVarID(func, vlistID, varID);
513
return (vlistptr->vars[varID].units);
518
@Function vlistInqVarName
519
@Title Get the name of a Variable
521
@Prototype void vlistInqVarName(int vlistID, int varID, char *name)
523
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
524
@Item varID Variable identifier
525
@Item name Variable name
528
The function @func{vlistInqVarName} returns the name of a variable.
531
@func{vlistInqVarName} returns the name of the variable to the parameter name.
535
void vlistInqVarName(int vlistID, int varID, char *name)
537
static const char *func = "vlistInqVarName";
540
int pdis, pcat, pnum;
543
vlistptr = vlist_to_pointer(vlistID);
545
vlistCheckVarID(func, vlistID, varID);
547
if ( vlistptr->vars[varID].name == NULL )
549
param = vlistptr->vars[varID].param;
550
cdiDecodeParam(param, &pnum, &pcat, &pdis);
552
tableID = vlistptr->vars[varID].tableID;
553
if ( tableInqParName(tableID, code, name) != 0 )
554
sprintf(name, "var%d", code);
557
strcpy(name, vlistptr->vars[varID].name);
564
@Function vlistInqVarLongname
565
@Title Get the longname of a Variable
567
@Prototype void vlistInqVarLongname(int vlistID, int varID, char *longname)
569
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
570
@Item varID Variable identifier
571
@Item longname Variable description
574
The function @func{vlistInqVarLongname} returns the longname of a variable.
577
@func{vlistInqVaeLongname} returns the longname of the variable to the parameter longname.
581
void vlistInqVarLongname(int vlistID, int varID, char *longname)
583
static const char *func = "vlistInqVarLongname";
586
int pdis, pcat, pnum;
589
vlistptr = vlist_to_pointer(vlistID);
591
vlistCheckVarID(func, vlistID, varID);
593
if ( vlistptr->vars[varID].longname == NULL )
595
param = vlistptr->vars[varID].param;
596
cdiDecodeParam(param, &pnum, &pcat, &pdis);
598
tableID = vlistptr->vars[varID].tableID;
599
if ( tableInqParLongname(tableID, code, longname) != 0 )
603
strcpy(longname, vlistptr->vars[varID].longname);
610
@Function vlistInqVarStdname
611
@Title Get the standard name of a Variable
613
@Prototype void vlistInqVarStdname(int vlistID, int varID, char *stdname)
615
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
616
@Item varID Variable identifier
617
@Item stdname Variable standard name
620
The function @func{vlistInqVarStdname} returns the standard name of a variable.
623
@func{vlistInqVarName} returns the standard name of the variable to the parameter stdname.
627
void vlistInqVarStdname(int vlistID, int varID, char *stdname)
629
static const char *func = "vlistInqVarStdname";
632
vlistptr = vlist_to_pointer(vlistID);
634
vlistCheckVarID(func, vlistID, varID);
636
if ( vlistptr->vars[varID].stdname == NULL )
641
strcpy(stdname, vlistptr->vars[varID].stdname);
648
@Function vlistInqVarUnits
649
@Title Get the units of a Variable
651
@Prototype void vlistInqVarUnits(int vlistID, int varID, char *units)
653
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
654
@Item varID Variable identifier
655
@Item units Variable units
658
The function @func{vlistInqVarUnits} returns the units of a variable.
661
@func{vlistInqVarUnits} returns the units of the variable to the parameter units.
665
void vlistInqVarUnits(int vlistID, int varID, char *units)
667
static const char *func = "vlistInqVarUnits";
670
int pdis, pcat, pnum;
673
vlistptr = vlist_to_pointer(vlistID);
675
vlistCheckVarID(func, vlistID, varID);
677
if ( vlistptr->vars[varID].units == NULL )
679
param = vlistptr->vars[varID].param;
680
cdiDecodeParam(param, &pnum, &pcat, &pdis);
682
tableID = vlistptr->vars[varID].tableID;
683
if ( tableInqParUnits(tableID, code, units) != 0 )
687
strcpy(units, vlistptr->vars[varID].units);
693
int vlistInqVarID(int vlistID, int code)
697
int param, pdis, pcat, pnum;
699
vlistptr = vlist_to_pointer(vlistID);
701
for ( varID = 0; varID < vlistptr->nvars; varID++ )
703
param = vlistptr->vars[varID].param;
704
cdiDecodeParam(param, &pnum, &pcat, &pdis);
705
if ( pnum == code ) break;
708
if ( varID == vlistptr->nvars )
711
Warning(func, "varID not found for param %d\n", param);
720
int vlistInqVarSize(int vlistID, int varID)
722
static const char *func = "vlistInqVarSize";
729
vlistptr = vlist_to_pointer(vlistID);
731
vlistCheckVarID(func, vlistID, varID);
733
vlistInqVar(vlistID, varID, &gridID, &zaxisID, &timeID);
735
nlevs = zaxisInqSize(zaxisID);
737
gridsize = gridInqSize(gridID);
739
size = gridsize*nlevs;
746
@Function vlistInqVarDatatype
747
@Title Get the data type of a Variable
749
@Prototype int vlistInqVarDatatype(int vlistID, int varID)
751
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
752
@Item varID Variable identifier
755
The function @func{vlistInqVarDatatype} returns the data type of a variable.
758
@func{vlistInqVarDatatype} returns an identifier to the data type of the variable.
759
The valid CDI data types are @func{DATATYPE_PACK8}, @func{DATATYPE_PACK16}, @func{DATATYPE_PACK24},
760
@func{DATATYPE_FLT32} and @func{DATATYPE_FLT64}.
764
int vlistInqVarDatatype(int vlistID, int varID)
766
static const char *func = "vlistInqVarDatatype";
769
vlistptr = vlist_to_pointer(vlistID);
771
vlistCheckVarID(func, vlistID, varID);
773
return (vlistptr->vars[varID].datatype);
777
int vlistInqVarNumber(int vlistID, int varID)
779
static const char *func = "vlistInqVarNumber";
781
int number = CDI_REAL;
783
vlistptr = vlist_to_pointer(vlistID);
785
vlistCheckVarID(func, vlistID, varID);
787
if ( vlistptr->vars[varID].datatype == DATATYPE_CPX32 || vlistptr->vars[varID].datatype == DATATYPE_CPX64 )
795
@Function vlistDefVarDatatype
796
@Title Define the data type of a Variable
798
@Prototype void vlistDefVarDatatype(int vlistID, int varID, int datatype)
800
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
801
@Item varID Variable identifier
802
@Item datatype The data type identifier.
803
The valid CDI data types are @func{DATATYPE_PACK8}, @func{DATATYPE_PACK16},
804
@func{DATATYPE_PACK24}, @func{DATATYPE_FLT32} and @func{DATATYPE_FLT64}.
808
The function @func{vlistDefVarDatatype} defines the data type of a variable.
812
void vlistDefVarDatatype(int vlistID, int varID, int datatype)
814
static const char *func = "vlistDefVarDatatype";
817
vlistptr = vlist_to_pointer(vlistID);
819
vlistCheckVarID(func, vlistID, varID);
821
vlistptr->vars[varID].datatype = datatype;
823
if ( vlistptr->vars[varID].missvalused == FALSE )
828
vlistptr->vars[varID].missval = SCHAR_MIN;
831
vlistptr->vars[varID].missval = UCHAR_MAX;
834
vlistptr->vars[varID].missval = SHRT_MIN;
836
case DATATYPE_UINT16:
837
vlistptr->vars[varID].missval = USHRT_MAX;
840
vlistptr->vars[varID].missval = INT_MIN;
842
case DATATYPE_UINT32:
843
vlistptr->vars[varID].missval = UINT_MAX;
850
void vlistDefVarInstitut(int vlistID, int varID, int instID)
854
vlistptr = vlist_to_pointer(vlistID);
856
vlistptr->vars[varID].instID = instID;
860
int vlistInqVarInstitut(int vlistID, int varID)
864
vlistptr = vlist_to_pointer(vlistID);
866
return (vlistptr->vars[varID].instID);
870
void vlistDefVarModel(int vlistID, int varID, int modelID)
874
vlistptr = vlist_to_pointer(vlistID);
876
vlistptr->vars[varID].modelID = modelID;
880
int vlistInqVarModel(int vlistID, int varID)
884
vlistptr = vlist_to_pointer(vlistID);
886
return (vlistptr->vars[varID].modelID);
890
void vlistDefVarTable(int vlistID, int varID, int tableID)
894
vlistptr = vlist_to_pointer(vlistID);
896
vlistptr->vars[varID].tableID = tableID;
899
int param, pnum, pcat, pdis;
901
tablenum = tableInqNum(tableID);
903
param = vlistptr->vars[varID].param;
905
cdiDecodeParam(param, &pnum, &pcat, &pdis);
907
vlistptr->vars[varID].param = cdiEncodeParam(pnum, tablenum, pdis);
912
int vlistInqVarTable(int vlistID, int varID)
917
vlistptr = vlist_to_pointer(vlistID);
919
tableID = vlistptr->vars[varID].tableID;
926
@Function vlistDefVarName
927
@Title Define the name of a Variable
929
@Prototype void vlistDefVarName(int vlistID, int varID, const char *name)
931
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
932
@Item varID Variable identifier
933
@Item name Name of the variable
936
The function @func{vlistDefVarName} defines the name of a variable.
940
void vlistDefVarName(int vlistID, int varID, const char *name)
942
static const char *func = "vlistDefVarName";
945
vlistptr = vlist_to_pointer(vlistID);
947
vlistCheckVarID(func, vlistID, varID);
949
if ( vlistptr->vars[varID].name )
951
free(vlistptr->vars[varID].name);
952
vlistptr->vars[varID].name = 0;
955
if ( name ) vlistptr->vars[varID].name = strdupx(name);
960
@Function vlistDefVarLongname
961
@Title Define the long name of a Variable
963
@Prototype void vlistDefVarLongname(int vlistID, int varID, const char *longname)
965
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
966
@Item varID Variable identifier
967
@Item longname Long name of the variable
970
The function @func{vlistDefVarLongname} defines the long name of a variable.
974
void vlistDefVarLongname(int vlistID, int varID, const char *longname)
976
static const char *func = "vlistDefVarLongname";
979
vlistptr = vlist_to_pointer(vlistID);
981
vlistCheckVarID(func, vlistID, varID);
983
if ( vlistptr->vars[varID].longname )
985
free(vlistptr->vars[varID].longname);
986
vlistptr->vars[varID].longname = 0;
989
if ( longname ) vlistptr->vars[varID].longname = strdupx(longname);
994
@Function vlistDefVarStdname
995
@Title Define the standard name of a Variable
997
@Prototype void vlistDefVarStdname(int vlistID, int varID, const char *stdname)
999
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
1000
@Item varID Variable identifier
1001
@Item stdname Standard name of the variable
1004
The function @func{vlistDefVarStdname} defines the standard name of a variable.
1008
void vlistDefVarStdname(int vlistID, int varID, const char *stdname)
1010
static const char *func = "vlistDefVarStdname";
1013
vlistptr = vlist_to_pointer(vlistID);
1015
vlistCheckVarID(func, vlistID, varID);
1017
if ( vlistptr->vars[varID].stdname )
1019
free(vlistptr->vars[varID].stdname);
1020
vlistptr->vars[varID].stdname = 0;
1023
if ( stdname ) vlistptr->vars[varID].stdname = strdupx(stdname);
1028
@Function vlistDefVarUnits
1029
@Title Define the units of a Variable
1031
@Prototype void vlistDefVarUnits(int vlistID, int varID, const char *units)
1033
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
1034
@Item varID Variable identifier
1035
@Item units Units of the variable
1038
The function @func{vlistDefVarUnits} defines the units of a variable.
1042
void vlistDefVarUnits(int vlistID, int varID, const char *units)
1044
static const char *func = "vlistDefVarUnits";
1047
vlistptr = vlist_to_pointer(vlistID);
1049
vlistCheckVarID(func, vlistID, varID);
1051
if ( vlistptr->vars[varID].units )
1053
free(vlistptr->vars[varID].units);
1054
vlistptr->vars[varID].units = 0;
1057
if ( units ) vlistptr->vars[varID].units = strdupx(units);
1062
@Function vlistInqVarMissval
1063
@Title Get the missing value of a Variable
1065
@Prototype double vlistInqVarMissval(int vlistID, int varID)
1067
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
1068
@Item varID Variable identifier
1071
The function @func{vlistInqVarMissval} returns the missing value of a variable.
1074
@func{vlistInqVarMissval} returns the missing value of the variable.
1078
double vlistInqVarMissval(int vlistID, int varID)
1080
static const char *func = "vlistInqVarMissval";
1083
vlistptr = vlist_to_pointer(vlistID);
1085
vlistCheckVarID(func, vlistID, varID);
1087
return (vlistptr->vars[varID].missval);
1091
double vlistInqVarScalefactor(int vlistID, int varID)
1093
static const char *func = "vlistInqVarScalefactor";
1096
vlistptr = vlist_to_pointer(vlistID);
1098
vlistCheckVarID(func, vlistID, varID);
1100
return (vlistptr->vars[varID].scalefactor);
1103
double vlistInqVarAddoffset(int vlistID, int varID)
1105
static const char *func = "vlistInqVarAddoffset";
1108
vlistptr = vlist_to_pointer(vlistID);
1110
vlistCheckVarID(func, vlistID, varID);
1112
return (vlistptr->vars[varID].addoffset);
1117
@Function vlistDefVarMissval
1118
@Title Define the missing value of a Variable
1120
@Prototype void vlistDefVarMissval(int vlistID, int varID, double missval)
1122
@Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}
1123
@Item varID Variable identifier
1124
@Item missval Missing value
1127
The function @func{vlistDefVarMissval} defines the missing value of a variable.
1131
void vlistDefVarMissval(int vlistID, int varID, double missval)
1133
static const char *func = "vlistDefVarMissval";
1136
vlistptr = vlist_to_pointer(vlistID);
1138
vlistCheckVarID(func, vlistID, varID);
1140
vlistptr->vars[varID].missval = missval;
1141
vlistptr->vars[varID].missvalused = TRUE;
1145
void vlistDefVarScalefactor(int vlistID, int varID, double scalefactor)
1147
static const char *func = "vlistDefVarScalefactor";
1150
vlistptr = vlist_to_pointer(vlistID);
1152
vlistCheckVarID(func, vlistID, varID);
1154
vlistptr->vars[varID].scalefactor = scalefactor;
1158
void vlistDefVarAddoffset(int vlistID, int varID, double addoffset)
1160
static const char *func = "vlistDefVarAddoffset";
1163
vlistptr = vlist_to_pointer(vlistID);
1165
vlistCheckVarID(func, vlistID, varID);
1167
vlistptr->vars[varID].addoffset = addoffset;
1171
void vlistDefVarTsteptype(int vlistID, int varID, int tsteptype)
1175
vlistptr = vlist_to_pointer(vlistID);
1177
vlistptr->vars[varID].tsteptype = tsteptype;
1181
int vlistInqVarTsteptype(int vlistID, int varID)
1185
vlistptr = vlist_to_pointer(vlistID);
1187
return (vlistptr->vars[varID].tsteptype);
1191
void vlistDefVarTimave(int vlistID, int varID, int timave)
1195
vlistptr = vlist_to_pointer(vlistID);
1197
vlistptr->vars[varID].timave = timave;
1201
int vlistInqVarTimave(int vlistID, int varID)
1205
vlistptr = vlist_to_pointer(vlistID);
1207
return (vlistptr->vars[varID].timave);
1211
void vlistDefVarTimaccu(int vlistID, int varID, int timaccu)
1215
vlistptr = vlist_to_pointer(vlistID);
1217
vlistptr->vars[varID].timaccu = timaccu;
1221
int vlistInqVarTimaccu(int vlistID, int varID)
1225
vlistptr = vlist_to_pointer(vlistID);
1227
return (vlistptr->vars[varID].timaccu);
1231
void vlistDestroyVarName(int vlistID, int varID)
1233
static const char *func = "vlistDestroyVarName";
1236
vlistptr = vlist_to_pointer(vlistID);
1238
if ( vlistptr->vars[varID].name )
1240
free(vlistptr->vars[varID].name);
1241
vlistptr->vars[varID].name = NULL;
1246
void vlistDestroyVarLongname(int vlistID, int varID)
1248
static const char *func = "vlistDestroyVarLongname";
1251
vlistptr = vlist_to_pointer(vlistID);
1253
if ( vlistptr->vars[varID].longname )
1255
free(vlistptr->vars[varID].longname);
1256
vlistptr->vars[varID].longname = NULL;
1261
void vlistDestroyVarStdname(int vlistID, int varID)
1263
static const char *func = "vlistDestroyVarStdname";
1266
vlistptr = vlist_to_pointer(vlistID);
1268
if ( vlistptr->vars[varID].stdname )
1270
free(vlistptr->vars[varID].stdname);
1271
vlistptr->vars[varID].stdname = NULL;
1276
void vlistDestroyVarUnits(int vlistID, int varID)
1278
static const char *func = "vlistDestroyVarUnits";
1281
vlistptr = vlist_to_pointer(vlistID);
1283
if ( vlistptr->vars[varID].units )
1285
free(vlistptr->vars[varID].units);
1286
vlistptr->vars[varID].units = NULL;
1291
void vlistDefVarTime(int vlistID, int varID, int timeID)
1295
vlistptr = vlist_to_pointer(vlistID);
1297
vlistptr->vars[varID].timeID = timeID;
1301
int vlistInqVarMissvalUsed(int vlistID, int varID)
1305
vlistptr = vlist_to_pointer(vlistID);
1307
return (vlistptr->vars[varID].missvalused);
1311
void vlistDefFlag(int vlistID, int varID, int levID, int flag)
1315
vlistptr = vlist_to_pointer(vlistID);
1317
vlistptr->vars[varID].flag = flag;
1318
vlistptr->vars[varID].levinfo[levID].flag = flag;
1322
int vlistInqFlag(int vlistID, int varID, int levID)
1326
vlistptr = vlist_to_pointer(vlistID);
1328
return (vlistptr->vars[varID].levinfo[levID].flag);
1332
int vlistFindVar(int vlistID, int fvarID)
1334
static const char *func = "vlistFindVar";
1338
vlistptr = vlist_to_pointer(vlistID);
1340
for ( varID = 0; varID < vlistptr->nvars; varID++ )
1342
if ( vlistptr->vars[varID].fvarID == fvarID ) break;
1345
if ( varID == vlistptr->nvars )
1348
Message(func, "varID not found for fvarID %d in vlistID %d!", fvarID, vlistID);
1355
int vlistFindLevel(int vlistID, int fvarID, int flevelID)
1357
static const char *func = "vlistFindLevel";
1362
vlistptr = vlist_to_pointer(vlistID);
1364
varID = vlistFindVar(vlistID, fvarID);
1368
for ( levelID = 0; levelID < vlistptr->vars[varID].nlevs; levelID++ )
1370
if ( vlistptr->vars[varID].levinfo[levelID].flevelID == flevelID ) break;
1373
if ( levelID == vlistptr->vars[varID].nlevs )
1376
Message(func, "levelID not found for fvarID %d and levelID %d in vlistID %d!",
1377
fvarID, flevelID, vlistID);
1385
int vlistMergedVar(int vlistID, int varID)
1389
vlistptr = vlist_to_pointer(vlistID);
1391
return (vlistptr->vars[varID].mvarID);
1395
int vlistMergedLevel(int vlistID, int varID, int levelID)
1399
vlistptr = vlist_to_pointer(vlistID);
1401
return (vlistptr->vars[varID].levinfo[levelID].mlevelID);
1405
void vlistDefIndex(int vlistID, int varID, int levelID, int index)
1409
vlistptr = vlist_to_pointer(vlistID);
1411
vlistptr->vars[varID].levinfo[levelID].index = index;
1415
int vlistInqIndex(int vlistID, int varID, int levelID)
1419
vlistptr = vlist_to_pointer(vlistID);
1421
return (vlistptr->vars[varID].levinfo[levelID].index);
1425
void vlistChangeVarZaxis(int vlistID, int varID, int zaxisID)
1427
static const char *func = "vlistChangeVarZaxis";
1432
vlistptr = vlist_to_pointer(vlistID);
1434
vlistCheckVarID(func, vlistID, varID);
1436
nlevs1 = zaxisInqSize(vlistptr->vars[varID].zaxisID);
1437
nlevs2 = zaxisInqSize(zaxisID);
1439
if ( nlevs1 != nlevs2 ) Error(func, "Number of levels must not change!");
1441
nvars = vlistptr->nvars;
1442
for ( index = 0; index < nvars; index++ )
1443
if ( index != varID )
1444
if ( vlistptr->vars[index].zaxisID == vlistptr->vars[varID].zaxisID ) break;
1446
if ( index == nvars )
1448
for ( index = 0; index < vlistptr->nzaxis; index++ )
1449
if ( vlistptr->zaxisIDs[index] == vlistptr->vars[varID].zaxisID )
1450
vlistptr->zaxisIDs[index] = zaxisID;
1454
for ( index = 0; index < vlistptr->nzaxis; index++ )
1455
if ( vlistptr->zaxisIDs[index] == zaxisID ) break;
1457
if ( index == vlistptr->nzaxis )
1459
if ( vlistptr->nzaxis + 1 >= MAX_ZAXES_PS )
1460
Error(func, "Maximum of %d zaxis reached", MAX_ZAXES_PS);
1462
vlistptr->zaxisIDs[vlistptr->nzaxis] = zaxisID;
1467
vlistptr->vars[varID].zaxisID = zaxisID;
1471
void vlistChangeVarGrid(int vlistID, int varID, int gridID)
1473
static const char *func = "vlistChangeVarGrid";
1477
vlistptr = vlist_to_pointer(vlistID);
1479
vlistCheckVarID(func, vlistID, varID);
1481
nvars = vlistptr->nvars;
1482
for ( index = 0; index < nvars; index++ )
1483
if ( index != varID )
1484
if ( vlistptr->vars[index].gridID == vlistptr->vars[varID].gridID ) break;
1486
if ( index == nvars )
1488
for ( index = 0; index < vlistptr->ngrids; index++ )
1489
if ( vlistptr->gridIDs[index] == vlistptr->vars[varID].gridID )
1490
vlistptr->gridIDs[index] = gridID;
1494
for ( index = 0; index < vlistptr->ngrids; index++ )
1495
if ( vlistptr->gridIDs[index] == gridID ) break;
1497
if ( index == vlistptr->ngrids )
1499
if ( vlistptr->ngrids + 1 >= MAX_GRIDS_PS )
1500
Error(func, "Maximum of %d grids reached", MAX_GRIDS_PS);
1502
vlistptr->gridIDs[vlistptr->ngrids] = gridID;
1507
vlistptr->vars[varID].gridID = gridID;
1511
void vlistDefVarZtype(int vlistID, int varID, int ztype)
1513
static const char *func = "vlistDefVarZtype";
1517
vlistptr = vlist_to_pointer(vlistID);
1519
vlistCheckVarID(func, vlistID, varID);
1521
vlistptr->vars[varID].ztype = ztype;
1525
int vlistInqVarZtype(int vlistID, int varID)
1527
static const char *func = "vlistInqVarZtype";
1531
vlistptr = vlist_to_pointer(vlistID);
1533
vlistCheckVarID(func, vlistID, varID);
1535
return (vlistptr->vars[varID].ztype);
1539
void vlistDefVarZlevel(int vlistID, int varID, int zlevel)
1541
static const char *func = "vlistDefVarZlevel";
1545
vlistptr = vlist_to_pointer(vlistID);
1547
vlistCheckVarID(func, vlistID, varID);
1549
vlistptr->vars[varID].zlevel = zlevel;
1553
int vlistInqVarZlevel(int vlistID, int varID)
1555
static const char *func = "vlistInqVarZlevel";
1559
vlistptr = vlist_to_pointer(vlistID);
1561
vlistCheckVarID(func, vlistID, varID);
1563
return (vlistptr->vars[varID].zlevel);