Philippe 02/05/2016: moved all LIBTOOLS files in LIBTOOLS directory
[MNH-git_open_source-lfs.git] / LIBTOOLS / lib / vis5d / src / v5d.h
1
2 /* Vis5D version 5.1 */
3
4 /*
5 Vis5D system for visualizing five dimensional gridded data sets
6 Copyright (C) 1990 - 1996 Bill Hibbard, Brian Paul, Dave Santek,
7 and Andre Battaiola.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 1, or (at your option)
12 any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24
25
26 #ifndef V5D_H
27 #define V5D_H
28
29
30 /*
31  * A numeric version number which we can test for in utility programs which
32  * use the v5d functions.  For example, we can do tests like this:
33  * #if V5D_VERSION > 42
34  *      do something
35  * #else
36  *      do something else
37  * #endif
38  *
39  * If V5D_VERSION is not defined, then its value is considered to be zero.
40  */
41
42 #define V5D_VERSION 42
43
44
45 /*
46  * Define our own 1 and 2-byte data types.  We use these names to avoid
47  * collisions with types defined by the OS include files.
48  */
49 typedef unsigned char V5Dubyte;     /* Must be 1 byte, except for cray */
50 typedef unsigned short V5Dushort;   /* Must be 2 byte, except for cray */
51
52
53
54 #define MISSING 1.0e35
55 #define IS_MISSING(X)  ( (X) >= 1.0e30 )
56
57
58 /* Limits on 5-D grid size:  (must match those in v5df.h!!!) */
59 #define MAXVARS     100
60 #define MAXTIMES    400
61 #define MAXROWS     800
62 #define MAXCOLUMNS  800 
63 #define MAXLEVELS   100
64
65
66 #ifdef VPP
67 #define FLOAT double
68 #else
69 #define FLOAT float
70 #endif
71
72 /************************************************************************/
73 /***                                                                  ***/
74 /*** Functions for writing v5d files.  See README file for details.   ***/
75 /*** These are the functions user's will want for writing file        ***/
76 /*** converters, etc.                                                 ***/
77 /***                                                                  ***/
78 /************************************************************************/
79
80 extern int v5dCreateSimple( const char *name,
81                             int numtimes, int numvars,
82                             int nr, int nc, int nl,
83                             const char varname[MAXVARS][10],
84                             const int timestamp[],
85                             const int datestamp[],
86                             float northlat, float latinc,
87                             float westlon, float loninc,
88                             float bottomhgt, float hgtinc );
89
90
91 extern int v5dCreate( const char *name,
92                       int numtimes, int numvars,
93                       int nr, int nc, const int nl[],
94                       const char varname[MAXVARS][10],
95                       const int timestamp[],
96                       const int datestamp[],
97                       int compressmode,
98                       int projection,
99                       const FLOAT proj_args[],
100                       int vertical,
101                       const FLOAT vert_args[] );
102
103
104 extern int v5dWrite( int time, int var, const FLOAT data[] );
105
106 extern int v5dClose( void );
107
108
109 extern int v5dSetLowLev( int lowlev[] );
110
111 extern int v5dSetUnits( int var, const char *units );
112
113
114
115 /************************************************************************/
116 /***                                                                  ***/
117 /*** Definition of v5d struct and function prototypes.                ***/
118 /*** These functions are used by vis5d and advanced v5d utilities.    ***/
119 /***                                                                  ***/
120 /************************************************************************/
121
122 #define MAXPROJARGS 100
123 #define MAXVERTARGS (MAXLEVELS+1)
124
125 /*
126  * This struct describes the structure of a .v5d file.
127  */
128 typedef struct {
129     /* PUBLIC (user can freely read, sometimes write, these fields) */
130         int NumTimes;                   /* Number of time steps */
131         int NumVars;                    /* Number of variables */
132         int Nr;                         /* Number of rows */
133         int Nc;                         /* Number of columns */
134         int Nl[MAXVARS];                /* Number of levels per variable */
135         int LowLev[MAXVARS];            /* Lowest level per variable */
136         char VarName[MAXVARS][10];      /* 9-character variable names */
137         char Units[MAXVARS][20];        /* 19-character units for variables */
138         int TimeStamp[MAXTIMES];        /* Time in HHMMSS format */
139         int DateStamp[MAXTIMES];        /* Date in YYDDD format */
140         float MinVal[MAXVARS];          /* Minimum variable data values */
141         float MaxVal[MAXVARS];          /* Maximum variable data values */
142
143         /* This info is used for external function computation */
144         short McFile[MAXTIMES][MAXVARS];/* McIDAS file number in 1..9999 */
145         short McGrid[MAXTIMES][MAXVARS];/* McIDAS grid number in 1..? */
146
147         int VerticalSystem;             /* Which vertical coordinate system */
148         float VertArgs[MAXVERTARGS];    /* Vert. Coord. Sys. arguments... */
149
150         /*
151         IF VerticalSystem==0 THEN
152                 -- Linear scale, equally-spaced levels in generic units
153                 VertArgs[0] = Height of bottom-most grid level in generic units
154                 VertArgs[1] = Increment between levels in generic units
155         ELSE IF VerticalSystem==1 THEN
156                 -- Linear scale, equally-spaced levels in km
157                 VertArgs[0] = Height of bottom grid level in km
158                 VertArgs[1] = Increment between levels in km
159         ELSE IF VerticalSystem==2 THEN
160                 -- Linear scale, Unequally spaced levels in km
161                 VertArgs[0] = Height of grid level 0 (bottom) in km
162                 ...                ...
163                 VertArgs[n] = Height of grid level n in km
164         ELSE IF VerticalSystem==3 THEN
165                 -- Linear scale, Unequally spaced levels in mb
166                 VertArgs[0] = Pressure of grid level 0 (bottom) in mb
167                 ...             ...
168                 VertArgs[n] = Pressure of grid level n in mb
169         ENDIF
170         */
171
172         int Projection;                     /* Which map projection */
173         float ProjArgs[MAXPROJARGS];        /* Map projection arguments... */
174
175         /*
176         IF Projection==0 THEN
177                 -- Rectilinear grid, generic units
178                 ProjArgs[0] = North bound, Y coordinate of grid row 0
179                 ProjArgs[1] = West bound, X coordiante of grid column 0
180                 ProjArgs[2] = Increment between rows
181                 ProjArgs[3] = Increment between colums
182                 NOTES: X coordinates increase to the right, Y increase upward.
183                 NOTES: Coordinate system is right-handed.
184         ELSE IF Projection==1 THEN
185                 -- Cylindrical equidistant (Old VIS-5D)
186                 -- Rectilinear grid in lat/lon
187                 ProjArgs[0] = Latitude of grid row 0, north bound, in degrees
188                 ProjArgs[1] = Longitude of grid column 0, west bound, in deg.
189                 ProjArgs[2] = Increment between rows in degrees
190                 ProjArgs[3] = Increment between rows in degrees
191                 NOTES: Coordinates (degrees) increase to the left and upward.
192         ELSE IF Projection==2 THEN
193                 -- Lambert conformal
194                 ProjArgs[0] = Standared Latitude 1 of conic projection
195                 ProjArgs[1] = Standared Latitude 2 of conic projection
196                 ProjArgs[2] = Row of North/South pole
197                 ProjArgs[3] = Column of North/South pole
198                 ProjArgs[4] = Longitude which is parallel to columns
199                 ProjArgs[5] = Increment between grid columns in km
200         ELSE IF Projection==3 THEN
201                 -- Polar Stereographic
202                 ProjArgs[0] = Latitude of center of projection
203                 ProjArgs[1] = Longitude of center of projection
204                 ProjArgs[2] = Grid row of center of projection
205                 ProjArgs[3] = Grid column of center of projection
206                 ProjArgs[4] = Increment between grid columns at center in km
207         ELSE IF Projection==4 THEN
208                 -- Rotated
209                 ProjArgs[0] = Latitude on rotated globe of grid row 0
210                 ProjArgs[1] = Longitude on rotated globe of grid column 0
211                 ProjArgs[2] = Degrees of latitude on rotated globe between
212                                 grid rows
213                 ProjArgs[3] = Degrees of longitude on rotated globe between
214                                 grid columns
215                 ProjArgs[4] = Earth latitude of (0, 0) on rotated globe
216                 ProjArgs[5] = Earth longitude of (0, 0) on rotated globe
217                 ProjArgs[6] = Clockwise rotation of rotated globe in degrees
218         ENDIF
219         */
220
221         int CompressMode;        /* 1, 2 or 4 = # bytes per grid point */
222         char FileVersion[10];    /* 9-character version number */
223
224     /* PRIVATE (not to be touched by user code) */
225         unsigned int FileFormat; /* COMP5D file version or 0 if .v5d */
226         int FileDesc;            /* Unix file descriptor */
227         char Mode;               /* 'r' = read, 'w' = write */
228         int CurPos;              /* current position of file pointer */
229         int FirstGridPos;        /* position of first grid in file */
230         int GridSize[MAXVARS];   /* size of each grid */
231         int SumGridSizes;        /* sum of GridSize[0..NumVars-1] */
232 } v5dstruct;
233
234
235
236 extern float pressure_to_height( float pressure);
237
238 extern float height_to_pressure( float height );
239
240
241
242
243 extern int v5dYYDDDtoDays( int yyddd );
244
245 extern int v5dHHMMSStoSeconds( int hhmmss );
246
247 extern int v5dDaysToYYDDD( int days );
248
249 extern int v5dSecondsToHHMMSS( int seconds );
250
251
252 extern void v5dPrintStruct( const v5dstruct *v );
253
254
255 extern v5dstruct *v5dNewStruct( void );
256
257 extern void v5dFreeStruct( v5dstruct* v );
258
259 extern void v5dInitStruct( v5dstruct *v );
260
261 extern int v5dVerifyStruct( const v5dstruct *v );
262
263
264 extern void v5dCompressGrid( int nr, int nc, int nl, int compressmode,
265                              const float data[], void *compdata,
266                              float ga[], float gb[],
267                              float *minval, float *maxval );
268
269
270 extern void v5dDecompressGrid( int nr, int nc, int nl, int compressmode,
271                                void *compdata,
272                                float ga[], float gb[],
273                                float data[] );
274
275
276 extern int v5dSizeofGrid( const v5dstruct *v, int time, int var );
277
278
279 extern v5dstruct *v5dOpenFile( const char *filename, v5dstruct *v );
280
281
282 extern int v5dCreateFile( const char *filename, v5dstruct *v );
283
284
285 extern v5dstruct *v5dUpdateFile( const char *filename, v5dstruct *v );
286
287
288 extern int v5dCloseFile( v5dstruct *v );
289
290
291 extern int v5dReadCompressedGrid( v5dstruct *v,
292                                   int time, int var,
293                                   float *ga, float *gb,
294                                   void *compdata );
295
296
297 extern int v5dReadGrid( v5dstruct *v, int time, int var, float data[] );
298
299
300 extern int v5dWriteCompressedGrid( const v5dstruct *v,
301                                    int time, int var,
302                                    const float *ga, const float *gb,
303                                    const void *compdata );
304
305
306 extern int v5dWriteGrid( v5dstruct *v, int time, int var, const float data[] );
307
308
309
310 #endif