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