1 #ifndef VLIST_H
2 #define VLIST_H
3
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
7
8 #ifndef ERROR_H
9 #include "error.h"
10 #endif
11
12 #include <stddef.h> /* size_t */
13
14 #ifndef CDI_LIMITS_H
15 #include "cdi_limits.h"
16 #endif
17
18 #define VALIDMISS 1.e+303
19
20 #include "cdi_key.h"
21 #include "cdi_att.h"
22 #include "grid.h"
23
24 typedef struct
25 {
26 bool flag;
27 int index;
28 int mlevelID;
29 int flevelID;
30 }
31 levinfo_t;
32
33 #define DEFAULT_LEVINFO(levID) \
34 (levinfo_t){ 0, -1, levID, levID}
35 /*
36 #define DEFAULT_LEVINFO(levID) \
37 (levinfo_t){ .flag = 0, .index = -1, .flevelID = levID, .mlevelID = levID}
38 */
39 typedef struct
40 {
41 int ens_index;
42 int ens_count;
43 int forecast_init_type;
44 }
45 ensinfo_t;
46
47
48
49 typedef struct
50 {
51 bool isUsed;
52 bool flag;
53 int mvarID;
54 int fvarID;
55 int param;
56 int gridID;
57 int zaxisID;
58 int timetype; // TIME_*
59 int tsteptype; // TSTEP_*
60 int datatype; // CDI_DATATYPE_PACKX for GRIB data, else CDI_DATATYPE_FLT32 or CDI_DATATYPE_FLT64
61 int instID;
62 int modelID;
63 int tableID;
64 int timave;
65 int chunktype;
66 int xyz;
67 bool missvalused; // true if missval is defined
68 bool lvalidrange;
69 char *extra;
70 double missval;
71 double scalefactor;
72 double addoffset;
73 double validrange[2];
74 levinfo_t *levinfo;
75 int comptype; // compression type
76 int complevel; // compression level
77 cdi_keys_t keys;
78 cdi_atts_t atts;
79 int iorank;
80
81 int subtypeID; // subtype ID for tile-related meta-data, currently for GRIB-API only.
82
83 int opt_grib_nentries; // current no. key-value pairs
84 int opt_grib_kvpair_size; // current allocated size
85 opt_key_val_pair_t *opt_grib_kvpair; // (optional) list of keyword/value pairs
86 }
87 var_t;
88
89
90 typedef struct
91 {
92 //set when a vlist is passed to streamDefVlist() to safeguard against modifications of the wrong vlist object
93 bool immutable;
94 //set if this vlist has been created by CDI itself, and must not be destroyed by the user, consequently
95 bool internal;
96 int self;
97 int nvars; /* number of variables */
98 int ngrids;
99 int nzaxis;
100 int nsubtypes; /* no. of variable subtypes (e.g. sets of tiles) */
101 long ntsteps;
102 int taxisID;
103 int tableID;
104 int instID;
105 int modelID;
106 int varsAllocated;
107 int gridIDs[MAX_GRIDS_PS];
108 int zaxisIDs[MAX_ZAXES_PS];
109 int subtypeIDs[MAX_SUBTYPES_PS];
110 var_t *vars;
111 cdi_keys_t keys;
112 cdi_atts_t atts;
113 }
114 vlist_t;
115
116
117 vlist_t *vlist_to_pointer(int vlistID);
118 void cdiVlistMakeInternal(int vlistID);
119 void cdiVlistMakeImmutable(int vlistID);
120 void vlistCheckVarID(const char *caller, int vlistID, int varID);
121 void cdiVlistDestroy_(int vlistID);
122 int vlistInqVarMissvalUsed(int vlistID, int varID);
123 int vlistHasTime(int vlistID);
124
125 void vlistUnpack(char * buffer, int bufferSize, int * pos,
126 int originNamespace, void *context, int force_id);
127
128 /* vlistDefVarValidrange: Define the valid range of a Variable */
129 void vlistDefVarValidrange(int vlistID, int varID, const double *validrange);
130
131 /* vlistInqVarValidrange: Get the valid range of a Variable */
132 int vlistInqVarValidrange(int vlistID, int varID, double *validrange);
133
134 void vlistInqVarDimorder(int vlistID, int varID, int (*outDimorder)[3]);
135
136 void resize_opt_grib_entries(var_t *var, int nentries);
137
138
139
140 static inline
vlistAdd2GridIDs(vlist_t * vlistptr,int gridID)141 void vlistAdd2GridIDs(vlist_t *vlistptr, int gridID)
142 {
143 int index, ngrids = vlistptr->ngrids;
144 for ( index = 0; index < ngrids; index++ )
145 {
146 if ( vlistptr->gridIDs[index] == gridID ) break;
147 // if ( gridIsEqual(vlistptr->gridIDs[index], gridID) ) break;
148 }
149
150 if ( index == ngrids )
151 {
152 if ( ngrids >= MAX_GRIDS_PS )
153 Error("Internal limit exceeded: more than %d grids.", MAX_GRIDS_PS);
154 vlistptr->gridIDs[ngrids] = gridID;
155 ++(vlistptr->ngrids);
156 }
157 }
158
159 static inline
vlistAdd2ZaxisIDs(vlist_t * vlistptr,int zaxisID)160 void vlistAdd2ZaxisIDs(vlist_t *vlistptr, int zaxisID)
161 {
162 int index, nzaxis = vlistptr->nzaxis;
163 for ( index = 0; index < nzaxis; index++ )
164 if ( zaxisID == vlistptr->zaxisIDs[index] ) break;
165
166 if ( index == nzaxis )
167 {
168 if ( nzaxis >= MAX_ZAXES_PS )
169 Error("Internal limit exceeded: more than %d zaxis.", MAX_ZAXES_PS);
170 vlistptr->zaxisIDs[nzaxis] = zaxisID;
171 ++(vlistptr->nzaxis);
172 }
173 }
174
175 static inline
vlistAdd2SubtypeIDs(vlist_t * vlistptr,int subtypeID)176 void vlistAdd2SubtypeIDs(vlist_t *vlistptr, int subtypeID)
177 {
178 if ( subtypeID == CDI_UNDEFID ) return;
179
180 int index, nsubs = vlistptr->nsubtypes;
181 for ( index = 0; index < nsubs; index++ )
182 if ( vlistptr->subtypeIDs[index] == subtypeID ) break;
183
184 if ( index == nsubs )
185 {
186 if ( nsubs >= MAX_SUBTYPES_PS )
187 Error("Internal limit exceeded: more than %d subs.", MAX_SUBTYPES_PS);
188 vlistptr->subtypeIDs[nsubs] = subtypeID;
189 ++(vlistptr->nsubtypes);
190 }
191 }
192
193
194
195 #ifdef HAVE_LIBGRIB_API
196 extern int cdiNAdditionalGRIBKeys;
197 extern char* cdiAdditionalGRIBKeys[];
198 #endif
199
200 extern
201 #ifndef __cplusplus
202 const
203 #endif
204 resOps vlistOps;
205
206 #endif /* VLIST_H */
207 /*
208 * Local Variables:
209 * c-file-style: "Java"
210 * c-basic-offset: 2
211 * indent-tabs-mode: nil
212 * show-trailing-whitespace: t
213 * require-trailing-newline: t
214 * End:
215 */
216