]> Pileus Git - ~andy/rsl/blob - CHANGES
RSL v1.44
[~andy/rsl] / CHANGES
1 /* Changes for RSL
2  *
3  *---------------------------------------------------------------------
4  * v1.44 Released 11/21/2013
5  *
6  * 1. wsr88d_m31.c: Changed the criteria for discarding reflectivity belonging
7  *    to a split-cut velocity sweep.  Previously checked for elev < 6 degrees
8  *    to identify split cuts; now check waveform for "Contiguous Doppler".  The
9  *    elev test was inadequate for VCP 31, which has non-split cuts below 6
10  *    degrees.  Thanks to Chris Theisen for the bug report.
11  *    Also added code to handle field selection.
12  * 2. New routines:
13  *    RSL_wsr88d_keep_short_refl:
14  *      Calling this function instructs the WSR-88D Level II ingest to keep
15  *      short-range reflectivity collected in the velocity portion of a split
16  *      cut.  Normally this short-range reflectivity is discarded.
17  *      Calling this function also changes how split cuts are handled in the
18  *      Radar structure and when writing to UF.  Split cut surveillance and
19  *      Dopper sweeps are normally placed in the same sweep index in the Radar
20  *      structure, as though they were taken in a single sweep, so that
21  *      reflectivity (long-range), radial velocity, and spectrum width are at
22  *      the same sweep index.  If RSL_wsr88d_keep_short_refl() is called, each
23  *      individual sweep of a split cut is stored at a separate index, so for
24  *      example, the first sweep contains only long-range reflectivity (and
25  *      dual-pol fields if present), and the second sweep contains short-range
26  *      reflectivity, radial velocity, and spectrum width.  This pattern is
27  *      repeated with the remaining split cuts.  If a UF is produced, the
28  *      split cuts are written in like manner.
29  *    wsr88d_align_splitcut_rays:
30  *      This is called by RSL_radar_to_uf when writing WSR-88D data to UF.  It
31  *      reorders rays in the velocity sweep of a split-cut to match those in
32  *      the reflectivity sweep by azimuth.
33  *    wsr88d_merge_split_cuts:
34  *      Moves the surveillance (long-range reflectivity) and Doppler (radial
35  *      velocity) sweeps in a WSR-88D split cut to a single sweep index in the
36  *      Radar structure.  It also takes care of the multiple velocity sweeps in
37  *      each VCP 121 split cut by assigning them unique field names.
38  * 3. radar_to_uf.c: Added code to handle WSR-88D split cuts. Also Changed
39  *    optional header to use time from radar header instead of first ray.
40  *    This was done because some radar data is apparently sorted by azimuth,
41  *    which results in the first ray not being the chronological first ray.
42  * 4. gzip.c (uncompress_pipe): Implemented the fix for the "too many open
43  *    files" problem, sent independently by Yu Zhang and Lee Burchett.
44  * 5. Restored EDGE routines for backward compatibility.
45  * 6. nsig_to_radar.c: Fixed bug where string exceeded size of variable into
46  *    which it was written (radar->h.state).  This caused a buffer overflow
47  *    error on Ubuntu systems.  Thanks to Jonathan Helmus for finding this one.
48  * 7. volume.c (DM_F, DM_INVF): Thanks to David Kingsmill for providing improved
49  *    conversion functions for Returned Power (DM).
50  *    volume.c (RH_F, RH_INVF, PH_F, PH_INVF): These conversion functions were
51  *    specific to Sigmet raw data.  Made them more general.
52  * 8. Thanks to Mark Parncutt for updated wsr88d_locations.dat.
53  *---------------------------------------------------------------------
54  * v1.43 Released 4/30/2012
55  *
56  * 1. nsig_to_radar.c: Added antenna scan mode to radar header.
57  *    Added azimuth to sweep header for RHI.
58  *    Fixed a bug that caused incorrect elevation in ray headers for RHI.
59  * 2. nsig.c (nsig_read_sweep): Bug fix: Removed static qualifier from 
60  *    ingest structure definitions, which caused problems if multiple radars
61  *    are ingested.  Also turned off debug print accidently left on
62  *    in previous release.  Thanks to James Ward for the bug report.
63  * 3. wsr88d.c, wsr88d_to_radar.c:  Fixed problem that occurred in the rare
64  *    case in which a non-data message appears among data messages.
65  *    wsr88d_to_radar.c: Bug fix: Initialize sweep elevation.
66  *    Thanks to Dan Sheldon for the bug reports and fixes.
67  * 4. configure.in: Changed default directory to /usr/local/trmm/.
68  * 5. Removed references to EDGE.  Thanks to Andy Spencer for the patch.
69  *---------------------------------------------------------------------
70  * v1.42 Released 7/12/2011
71  *
72  * 1. radar_to_uf.c (RSL_radar_to_uf_fp): Changed scale_factor used for storing
73  *    differential phase (PH) in UF from 100 to 10.  The usual scale factor
74  *    of 100 caused values over 327.67 to become negative when converted to
75  *    short integer.
76  *---------------------------------------------------------------------
77  * v1.41 Released 6/22/2011
78  *
79  * 1. wsr88d_m31.c: Simplified the WSR-88D ray structure and supporting code.
80  *    Added support for dual-polarization data fields.
81  *    Thanks go to Andy Spencer for code contributions.
82  *    wsr88d_to_radar.c, wsr88d_m31.c: Renamed load_wsr88d_m31_into_radar to
83  *    wsr88d_load_m31_into_radar, to be consistent with naming convention.
84  * 2. Added support for Sigmet 2-byte data types, as well as HydroClass 1 and 2
85  *    byte types.  Files involved: nsig_to_radar.c, nsig.c, nsig.h, volume.c.
86  *    Modified nsig_to_radar.c and rsl.h to handle Sigmet dual PRF.
87  *    Thanks to Fabio Sato and Cesar Beneti for the dual PRF code.
88  * 3. Completed DORADE ingest.  Files involved: dorade_to_radar.c, dorade.c,
89  *    volume.c.
90  * 4. rsl.h, radar.c, radar_to_uf.c, uf_to_radar.c, volume.c: modified for RHI. 
91  *    nsig_to_radar.c: Thanks go to Scott Collis for a bug fix involving RHI.
92  * 5. anyformat_to_radar.c: Thanks to Thiago Biscaro for fixing a pipe problem
93  *    that caused processes to remain open.
94  * 6. gzip.c: Thanks to Dan Sheldon for fix for a file descriptor leak.
95  *---------------------------------------------------------------------
96  * v1.40 Released 10/10/2008
97  *
98  * 1. wsr88d_m31.c (load_wsr88d_m31_into_radar): Corrected a potential problem
99  *    in which the end of sweep or volume might occur at a point in the program
100  *    that was isolated from the code that handles that condition.
101  *    Store vcp in radar header.
102  * 2. rsl.h: Added vcp to radar header structure for WSR-88D.
103  * 3. nsig_to_radar.c: Corrected a problem involving Extended Header, which
104  *    when present, caused elevation in ray header to be set to 0.
105  * 4. wsr88d_m31.c (wsr88d_load_ray_into_radar): Changed the way we determine
106  *    whether or not to keep the reflectivity field (we don't want it from
107  *    Doppler split cuts).  The previous method was inadequate for VCP 121.
108  * 5. read_write.c (RSL_write_radar_fp, RSL_write_volume, RSL_write_sweep)
109  *    (RSL_write_ray): Initialize header_buf to zero to avoid junk in output
110  *    files.  This provides clean outputs for comparing in test situations.
111  *---------------------------------------------------------------------
112  * v1.39 Released 07/24/2008
113  *
114  * 1. Added wsr88d_m31.c.  It contains routines to handle new Message Type 31
115  *    in WSR-88D Level II Build 10.
116  * 2. wsr88d_to_radar.c: Modified to call message 31 routine.
117  * 3. wsr88d.c: Added code for VCPs 211, 212, 213.
118  * 4. lassen_to_radar.c: Added a fix for PhiDP provided by Scott Collis of BMRC.
119  *
120  *---------------------------------------------------------------------
121  * v1.38 Released 11/29/2007
122  *
123  * 1. wsr88d.c (wsr88d_read_sweep): Modified to handle unusual message packets
124  *    at start of WSR-88D files from some future GPM sites.
125  *
126  *---------------------------------------------------------------------
127  * v1.37 Released 06/19/2007 (Severity: low)
128  *
129  * 1. radar_to_uf.c, uf_to_radar.c: Modified to use Local Use Header to store
130  *    and retrieve WSR-88D VR azimuth.  This is necessary because WSR-88D runs
131  *    separate scans for DZ and VR at lower elevations, which means that they
132  *    have different azimuths for a given ray.  Thanks go to Pat Kennedy of CSU
133  *    for discovering this problem and for bringing it to our attention.
134  * 2. lassen_load_sweep in lassen_to_radar.c: Removed 1.4 dB correction for
135  *    reflectivity--BMRC version no longer uses it.
136  *
137  *---------------------------------------------------------------------
138  * v1.36 Released 08/29/2006 (Severity: low)
139  *
140  * 1. Forgot to put the modified wsr88d_locations.dat file into previous
141  *    release.
142  *
143  *---------------------------------------------------------------------
144  * v1.35 Released 08/28/2006 (Severity: low)
145  *
146  * 1. lassen_to_radar.c: fixed a bug in lassen_load_sweep where sweep index
147  *    was being used for sweep number in headers.
148  * 2. radar.c: Modified RSL_get_volume to return volume for any field type.
149  *    It had been limited to velocity, spectrum width and reflectivity types.
150  * 3. Added SQ_INDEX for Signal Quality Index field.  Files modified: rsl.h,
151  *    volume.c, nsig_to_radar.c, nsig.h, uf_to_radar.c, radar_to_uf.c.
152  * 4. wsr88d_locations.dat modified to change height units from feet to meters.
153  *    Thanks go to Dave Makofski for finding and fixing that one.
154  *
155  *---------------------------------------------------------------------
156  * v1.34 Released 02/15/2006 (Severity: low)
157  *
158  * 1. wsr88d.c: Fixed a bug in checking msg_type.  The problem occurred while
159  *    processing data from Houston, which recently switched over to the new
160  *    Open RDA (ORDA) being implemented by NEXRAD.  Msg_type is in the
161  *    righthand byte of a two-byte word, the left containing Channel ID,
162  *    but the full two-byte value was being used to check msg_type.  This
163  *    became a problem when ORDA used a non-zero value for Channel ID.
164  * 2. wsr88d.c and wsr88d_to_radar.c: Added information for new VCPs 12 and
165  *    121.
166  * 3. Added Huntsville site to wsr88d_locations.dat.
167  *
168  *---------------------------------------------------------------------
169  * v1.33 Began 02/25/2004.  Released 08/27/2004 (Severity: low)
170  *
171  * 1. Modified wsr88d_to_radar.c and anyformat_to_radar.c to handle change in
172  *    WSR-88D header record for Level II Build 5 data format.
173  * 2. Fixed a bug in wsr88d.c, wsr88d_read_sweep, which caused the last ray
174  *    of sweep to be deleted along with empty rays in second tilt and above.
175  *
176  *---------------------------------------------------------------------
177  * v1.32 Began 11/05/2003.  Released 02/13/2004 (Severity: low)
178  *
179  * 1. Changed computation of sweep seconds in nsig_to_radar.c to eliminate
180  *    rounding error.
181  * 2. wsr88d_to_radar.c: removed call to wsr88d_get_wavelength, which computed
182  *    the WSR-88D wavelength when parameters were available, or returned a
183  *    constant otherwise.  Replaced with constant wavelength of 10 cm. Thanks to
184  *    Joe Holmes of SIGMET for noticing differing wavelengths between fields.
185  * 3. Added ingest for Rainbow format.  Only handles DZ.
186  *
187  *---------------------------------------------------------------------
188  * v1.31 Began 04/30/2003.  Released 09/03/2003 (Severity: low)
189  *
190  * 1. nsig_to_radar.c: removed unused #define, made some cosmetic changes in
191  *    code and comment alignment.
192  * 2. Makefile.am: Added line to install include-directory under target
193  *    install-exec-hook.
194  * 3. Added code to configure.in to fix yywrap unresolved reference that
195  *    occurred when installing rsl when the TSDIS toolkit was not installed.
196  *
197  *---------------------------------------------------------------------
198  * v1.30 Began 07/30/2001.  Released 03/13/2003 (Severity: low)
199  *
200  * 1. Increased the size of parameter arrays in nsig.c as recommended by
201  *    Paul Kucera, to accommodate NPOL polarimetric parameters.
202  * 2. Fixed a bug in nsig_endianess in nsig.c. 
203  * 3. Modified uf_to_radar to compute unambiguous range using PRF.  Reduced
204  *    UF record length by removing extra byte at end of record.  Made to handle
205  *    4-digit years (previously assumed 2-digit, as declared in UF documention).
206  * 4. Modified hdf_to_radar to use more accurate value for sweep.h.nrays.
207  * 5. Corrected computation in function wsr88d_get_azimuth_rate in wsr88d.c.
208  * 6. Fixed bug in sweep rate computation in wsr88d.c
209  * 7. Changed wsr88d_ray_to_float in wsr88d.c to use field data pointers
210  *    provided in the data, instead of computing offsets.  The latter method is
211  *    incorrect according to NOAA Radar Operations Center.
212  * 8. Modified radar_to_uf to get fixed angle for mandatory header from value
213  *    stored in ray.  Previously used average elevation of sweep.
214  * 9. Added examples/adjust_gate_size.c, and added enhanced version of qlook.c
215  *    which uses it.
216  *10. Fixed problem in which rsl libraries could not be built if a library
217  *    didn't already exist in the target directory.  Brought configure.in up to
218  *    date with autoconf version 2.53 standards.  Removed acconfig.h.
219  *11. Removed outdated email addresses found in comments.
220  *
221  *---------------------------------------------------------------------
222  * v1.29 Began 09/19/2000.  Released 4/3/2001 (Severity: low)
223  *
224  * 1. Modified radar_to_hdf_1.c maskBuild() to build MZ mask differently:
225  *    maskBuild was checking where CZ and DZ volumes were equal 
226  *    to build MZ volume (mask).  Now, maskBuild just checks where 
227  *    CZ volume == BADVAL, for runtime speed, and because the comparison between
228  *    CZ and DZ volumes was corrupted by the addition of qcParm[ZCAL] to
229  *    each CZ range bin in level_1_qc.c qualityControl().  This change is
230  *    compatible with Danny Rosenfeld's algorithm by which CZ range bins
231  *    are set to BADVAL.
232  * 2. Included Stacy Brodzik's modifications for storing calibration constants 
233  *    in UF (radar_to_uf.c, uf_to_radar.c).
234  * 3. Corrected version string and units for sweep rate written to UF mandatory
235  *    header in radar_to_uf.c, thanks to Joseph Holmes of Sigmet for catching
236  *    the inaccuracies.  Corrected rounding error in latitude/longitude for UF
237  *    mandatory header in same program.  Modified assignments of sweep rate
238  *    and/or azimuth rate in uf_to_radar.c and hdf_to_radar.c
239  *
240  *---------------------------------------------------------------------
241  * v1.28 Began 03/23/2000. Released: 7/24/2000 (Severity: low)
242  *
243  * 1. Added 3 functions to volume.c :
244  *    RSL_add_dbz_offset_to_volume() , RSL_add_dbz_offset_to_sweep(),
245  *    RSL_add_dbz_offset_to_ray()
246  * 2. Modified nsig.h , nsig_to_radar.c , volume.c to handle sigmet's
247  *    RhoHV and PhiDP fields.
248  * 3. Modified volume.c to fix problem with subsequent calls to
249  *    read_these_sweeps()
250  * 4. Modified uf_to_radar.c to compute unambiguous range for
251  *    Radar structure.
252  *
253  *---------------------------------------------------------------------
254  *
255  * v1.27 Began 01/11/2000.  Released: 2/17/2000 (Severity: low)
256  *
257  * 1. Modified files radar_to_hdf_1.c and radar_to_hdf_2.c
258  *    to accomodate random ray lengths, eg, Berrimah data.
259  *
260  *----------------------------------------------------------------------
261  * v1.26 Began 12/11/1999.  Released: 12/21/1999 (Severity: low)
262  *
263  * 1. Configuration change for rapic.l and rapic.y.
264  * 2. Changed dependency for rsl.h and wsr88d.h
265  *
266  *----------------------------------------------------------------------
267  * v1.25 Began 11/30/1999.  Released: 12/10/1999 (Severity: medium)
268  *
269  * 1. Merged branch v1.24.1.
270  * 2. Added configure/configure.in/Makefile.in.
271  * 3. Added Makefile.am (automake) and other related files.
272  * 4. Configuration is a snap:
273  *
274  *       configure --prefix=/some/dir/to/install
275  *       make install
276  *
277  *----------------------------------------------------------------------
278  * v1.24.1 Began 8/1/1999.  Released: 11/30/1999 (Severity: new features)
279  *
280  * 1. Introduced radar->h.project[24] -- project name.
281  * 2. Added dorade ingest -- RSL_dorade_to_radar.
282  * 3. Added examples/kwaj_subtract_one_day.c  -- fix KWAJEX dates.
283  * 4. Removed rsl_popen/pclose routines from gzip.c.  I found
284  *    a way to eliminate the 'Broken pipe' message, the message
285  *    reappeared in linux 2.2.* series, by flushing the
286  *    stream when looking at the magic numbers in anyformat_to_radar.c.
287  * 5. HDF ROUTINES ARE REMOVED.  I have moved them to gvs for level_1.
288  *    See gvs/src/gvslib/.  That's where they live now.  The interface
289  *    RSL_hdf_to_radar and RSL_radar_to_hdf remain as hooks.  If
290  *    you have libgvs, then you can specify -DHAVE_TSDIS_TOOLKIT in 
291  *    the Makefile.
292  *
293  *----------------------------------------------------------------------
294  * v1.24 Began 6/25/1999.  Released: 6/28/1999 (Severity: bug fix)
295  *
296  * 1. UF ingest improperly set the Fixed angle.
297  * 2. Removed max_reasonable_dbz (60) from gts.c.  The app must decide
298  *    what a max allowable dbz is.
299  *
300  *----------------------------------------------------------------------
301  * v1.23 Began 3/31/1999.  Released: 4/2/1999 (Severity: upgrade)
302  *
303  * 1. Added EDGE format ingest.  This requires the library ETOR
304  *    which is obtained from Enterprise Electronics.
305  *    To build this component, set -DHAVE_EDGE in Makefile.
306  *
307  *----------------------------------------------------------------------
308  * v1.22 Began 3/4/1999.  Released: 3/4/1999 (Severity: bux fix)
309  *
310  * 1. Forgot to set the global 'rsl_kdp_wavelen' in nsig_to_radar.c.
311  *
312  *----------------------------------------------------------------------
313  * v1.21 Began 02/16/1999.  Released: 3/4/1999 (Severity: minor bux fix)
314  *
315  * 1. UF code didn't recognize VE, now it does.
316  * 2. RSL_SPEED_OF_LIGHT unifies c throughout the library.
317  * 3. Modification to KDP processing for Sigmet.  New
318  *    F and INVF functions.
319  *
320  *----------------------------------------------------------------------
321  * v1.20 Began 11/12/98.  Released: 01/25/1999 (Severity: bug fix/upgrade)
322  *
323  * 1. Fixed RADTEC ingest. Does RHI too, but,
324  *    RSL doesn't have any good RHI image routines.
325  *
326  * 2. Added: RSL_set_color_table
327  *           RSL_get_color_table
328  *
329  * 3. Added: '-b x' option to any_to_gif.  This makes images black below
330  *    x dbz.  This is a simple noise filter.
331  *----------------------------------------------------------------------
332  * v1.19 Began 9/15/98.  Released: 9/23/98 (Severity: bug fix)
333  *
334  * 1. Modified file volume.c . New INV_F, _F routines for diff refl.
335  *
336  * 2. Created examples/images to hold a base-line set of images
337  *    to compare when running 'run_tests'.  Modified run_tests
338  *    to compare images.
339  *
340  *----------------------------------------------------------------------
341  * v1.18 Began 4/28/98.  Released: 8/13/98 (Severity: upgrade)
342  *
343  * 1. Added routines: 
344  *      RSL_radtec_to_radar   -- in radtec_to_radar.c
345  *      RSL_fix_time          -- in volume.c
346  *
347  * 2. Added files:
348  *      radtec.c
349  *      radtec.h
350  *      radtec_to_radar.c
351  *
352  * 3. Modified image generation.  Images are produced out to 'range'
353  *    specified.  Each image pixels is no longer 1km, but radius/range.
354  *
355  * 4. any_to_gif can now accept range and image size arguments.
356  *
357  * 5. RADTEC requires PKWARE routines explode and crc32.
358  *    RADTEC is built into RSL, if you specify -DHAVE_PKWARE in 
359  *    the Makefile.  When using RADTEC, you must link your application
360  *    staticly; with -static.
361  *
362  *    Contact PKWARE at 414-354-8699.  
363  *
364  * 6. Modified radar_to_hdf_1.c. Removed ZDR data from 1C-51 HDF.
365  *
366  * 7. Moved HDF_FILE_VERSION definition from toolkit_1BC-51_appl.h
367  *    into the application level_1.c
368  *
369  *----------------------------------------------------------------------
370  * v1.17 Began 4/23/98.  Released: 4/28/98 (Severity: upgrade)
371  *
372  * 1. Finally received info regarding KDP (KD_INDEX) for SIGMET.
373  *    Assumming the units are similar for LASSEN.  Boosted nsig_to_radar
374  *    to recognize KDP.  It is really KDP * wavelength.  
375  *    The units are deg*cm/km.  You must divide out the wavelength,
376  *    if that is desired.
377  *
378  * 2. BADVAL/NOECHO mod for nsig_to_radar.c.  This should affect
379  *    the values that may be stored in any possible UF output.
380  *
381  * WTD : lassen_to_radar.c  - check the ZDR conversion, if any.  Do
382  *       we need this?
383  * WTD : RHI
384  *
385  *----------------------------------------------------------------------
386  * v1.16 Began 3/6/98.  Released: 4/21/98 (Severity: bug fix/upgrade)
387  *
388  * 1. Changed how any_to_gif output's filenames produced.  Now, they
389  *    are written to stdout.  -v (verbose) and -V (all volume) options
390  *    are added.  Changed image_gen.c (RSL_volume_to_gif) to output
391  *    filenames to stdout.
392  *
393  * 2. You really do need 'bison' (GNU yacc), 'flex' (GNU lex) and
394  *    make (GNU make) to build this library.  This has been true
395  *    since v1.15 when I introduced the rapic format.  These programs
396  *    are superior to those on your stock Unix system, so take the
397  *    time to install them.
398  *
399  * 3. README explains how to apply patches.
400  *
401  * 4. Eliminated the reduce/reduce conflict in rapic.y
402  *
403  * 5. Year 2000 compliant.
404  *
405  * 6. I forgot the format in sprintf.  See rapic.y.
406  *
407  *----------------------------------------------------------------------
408  * v1.15 Began 2/20/98.  Released: 3/4/98 (Severity: bug fix/upgrade)
409  *
410  * 1. Michael Whimpey from BMRC, Australia changed code, for the
411  *    different callibrations, between, Pre_mctex, mctex, Gunn_Pt
412  *    periods. Please see code where there is m.whimpey.  See
413  *    lassen_to_radar.c
414  *
415  * 2. Added RAPIC format ingest.  RSL_rapic_to_radar.
416  *    I used GNU Bison (YACC) and GNU Flex (LEX) to code the RAPIC ingest.
417  *    This format is used by the Berrimah radar.  See rapic_to_radar.c,
418  *    rapic_routines.c, rapic.y, and rapic.l.
419  *    Not tested w/ older YACC and LEX found on older Unix systems.
420  *
421  * 3. Fixed a bug regarding the reading of stdin streams.  Now
422  *    you can read compressed or uncompressed files from stdin.
423  *    Previously, you couldn't specify NULL as a filename and
424  *    have it work reliably in all cases for any file format.
425  *    This bug was found by accident and it is nothing you should
426  *    be worried about in earlier RSL releases.  The reason you need
427  *    not worry about it is because 'RSL_anyformat_to_radar' cannot
428  *    accept NULL as a filename.  For you to notice this, you must
429  *    have called the specific ingest routine for the format
430  *    being read: RSL_lassen_to_radar, for example.
431  *
432  * 4. Bug in the UF ingest.  The scale_factor needs to be float.
433  *    When it was 'int', round off errors (truncation) were
434  *    happening.  This affected the Velocity data, only.  The reflectivity
435  *    data seemed unaffected, because, the magnitude of the values
436  *    was high enough to avoid truncation.
437  *----------------------------------------------------------------------
438  * v1.14 Began 2/2/98.  Released: 2/3/98 (Severity: upgrade)
439  *
440  * 1. Added calibration for Gunn Point radar.   Assumes that
441  *    the radar name will be 'Gunn_Pt'.
442  *
443  *----------------------------------------------------------------------
444  * v1.13 Began 1/16/98.  Released: 1/26/98 (Severity: minor bug fix)
445  *
446  * 01/16/98
447  *
448  * 1. radar_to_hdf_1.c: Changed decision algorithm regarding
449  *    whether or not to write a VOS into a 1C-51 HDF file.
450  *    1C-51 HDF VOS time_slot status is encoded within the
451  *    metaData field 'TK_GEN_DATE_INPUT_FILES'.
452  *
453  *----------------------------------------------------------------------
454  * v1.12 Began 1/12/98.  Released: 1/12/98 (Severity: minor bug fix)
455  *
456  * 1. Changed HDF metadata item for empty granules.
457  *
458  *----------------------------------------------------------------------
459  * v1.11 Began 12/17/97.  Released: 12/17/97 (Severity: minor bug fix)
460  * 
461  * 1. Increased the size of pipecmd in RSL_write_gif and TK_MAX_FILENAME to 256.* 2. Modified image_gen.c to increase the data range of Zdr values.
462  * 3. Bug fix in radar_to_hdf_1.c: No longer dumps core for "tiny" sweeps
463             having fewer than 5 rays.
464  *
465  *----------------------------------------------------------------------
466  * v1.10 Began 8/27/97.  Released: 10/21/97 (Severity: minor upgrade)
467  * 
468  * 1. Modified ZDR image generation: rsl.h, image_gen.c, ZDR color tables.
469  * 2. Added South Africa data format ingest.  Not possible to 
470  *    interface in RSL_anyformat_to_radar, at this time.  The format
471  *    is primitive and I need to convert RVPC to dBZ.
472  * 3. Modified HDF component to maintain integrity of anomalous_condition
473  *    flags. (RFVAL, APFLAG, NOECHO, BADVAL)
474  *    Files: toolkit_1BC-51_appl.h, hdf_to_radar.c, radar_to_hdf_2.c
475  * 4. Modified radar_to_hdf_1.c for TSDIS/DAAC metadata requirements.
476  * 5. Modified any_to_gif.c to output site and date/time for image filenames.
477  * 6. Added QC algorithm parameter. Modified files:
478  *    toolkit_1BC-51_appl.h, radar_to_hdf_1.c, radar_to_hdf_2.c,
479  *    hdf_to_radar.c
480  *
481  *----------------------------------------------------------------------
482  * v1.9 Began 8/18/97.  Released: 8/18/97 (Severity: bug fix)
483  *
484  * 1. Mofified radar_to_hdf_1.c : Metadata mods for TSDIS.
485  *
486  *----------------------------------------------------------------------
487  * v1.8 Began 7/30/97.  Released: 8/05/97 (Severity: upgrade)
488  *
489  * 1. Added RSL_read_these_sweeps.  Specify specific sweep numbers for
490  *    ingest. This drastically speeds up ingest, if you're only interested
491  *    in the first or first couple of sweeps.  For example, making 
492  *    base scan images.
493  *          wsr88d -done
494  *          UF     -done
495  *          sigmet -done
496  *          lassen -done
497  *          HDF    -done
498  *          toga   -done
499  *          mcgill -done.  BUT, apparently, mcgill ingest is broken!!!
500  *                         When did this happen?
501  *
502  * 2. Added RSL_load_zdr_color_table();
503  *    Includes color tables for this field.  See colors/
504  *
505  * 3. More HDF mods; more warning messages.  
506  *
507  * 4. The TRMM Office has fixed several bugs in the TSDIS toolkit.
508  *    For proper HDF creation, that conform to TSDIS HDF specifications,
509  *    you will need toolkit 4.5r1.1.
510  *
511  *    Toolkit 4.5r1.1 is an unofficial release; the TRMM office will
512  *    pass this out upon request.
513  *
514  *----------------------------------------------------------------------
515  * v1.7 Began 7/23/97.  Released: 7/25/97 (Severity: bug fix)
516  *
517  * 1. Handles corrupt SIGMET files more gracefully.
518  *
519  * 2. All lat/lon (degree,minute,second) triplets have the same sign.
520  *    Except, if UF, then what ever the file tells me and if they're
521  *    not all the same sign, then you'll have
522  *    to correct the UF w/ an RSL application.  In other words, UF
523  *    stores the lat/lon as deg/min/sec and they have their own signs;
524  *    Strict UF have deg/min/sec all w/ the same sign, anyway.
525  *
526  * 3. Minor changes to HDF component of RSL.
527  *----------------------------------------------------------------------
528  * v1.6 Began 5/02/97.  Released: 7/23/97 (Severity: bug fix)
529  *
530  * 1. wsr88d_to_radar.c -- Was too permissive. No longer defaults to KMLB.
531  *    If unable to establish a valid site based on callID or first_file,
532  *    returns NULL.
533  *
534  * 2. 18 Jul 97 Kolander
535  *    Modified radar_to_uf.c & uf_to_radar.c : Fixed some incorrect and
536  *    missing sweep and ray header values. Salvaged some numerical precision.
537  *
538  * 3. Fixed a time problem in nsig_to_radar.c.  Daylight savings time.
539  *
540  * 4. Saves lat/lon on each ray for UF.
541  *
542  *--------------------
543  * 16 Jun 97 Kolander
544  *
545  * Modifications to radar parameter calulations in:
546  * wsr88d_to_radar.c, wsr88d.h, wsr88d.c, nsig_to_radar.c,
547  * lassen_to_radar.c, rsl.h
548  *
549  *  Modified HDF-related files:
550  *    hdf_to_radar.c toolkit_1BC-51_appl.h
551  *  and  split file 'radar_to_hdf.c' into two files:
552  *    radar_to_hdf_1.c and radar_to_hdf_2.c
553  *  Can handle oddly sized and/or corrupt VOSs.
554  *----------------------------------------------------------------------
555  * v1.5 Began 3/17/97.  Released: 4/30/97 (Severity: minor upgrade)
556  *  
557  * 1. Additional error checking in wsr88d.c to warn when number of gates
558  *    expected is exceeded.
559  * 2. Changes by Mike Kolander affect the HDF component of RSL.  This
560  *    version of RSL works with the TSDIS toolkit 4.0.
561  * 3. Changes to carpi and cube functions, see below.
562  *-------------------------
563  * Date: 26 Mar 97  kolander
564  *
565  * Files: radar_to_hdf.c, hdf_to_radar.c
566  *   Moved QC parameters out of the metadata string into VOS comments
567  *   field.
568  *
569  * Files: rsl.h, anyformat_to_radar.c
570  *   Moved enum File_type definition from anyformat_to_radar.c into
571  *   rsl.h
572  *--------------------------
573  * Date: 17 Mar 97  kolander
574  *
575  * File: rsl.h
576  *   Changed carpi structure:
577  *     Added f, invf fields.
578  *     (Carpi_value **)data is now a doubly indexed array 'data[nrow][ncol]'
579  *   Changed slice structure:
580  *     Added f, invf fields.
581  *     (Slice_value **)data is now a doubly indexed array 'data[nrow][ncol]'
582  *   Added function prototypes for:
583  *      RSL_free_carpi, RSL_free_cube, RSL_free_slice, RSL_new_cube,
584  *      RSL_new_slice, RSL_carpi_to_cart, RSL_carpi_to_gif,
585  *      RSL_carpi_to_pict, RSL_carpi_to_ppm, RSL_carpi_to_pgm
586  *
587  * File: cube.c
588  *   Added functions:
589  *     RSL_free_slice, RSL_new_slice, RSL_new_cube, RSL_free_cube
590  *   Modified functions:
591  *     RSL_volume_to_cube, RSL_get_slice_from_cube
592  *
593  * File: carpi.c
594  *   Added functions:
595  *      RSL_free_carpi 
596  *   Modified functions:
597  *      RSL_new_carpi, RSL_find_rng_azm, RSL_cappi_to_carpi
598  *
599  * File: image_gen.c
600  *   Added functions: 
601  *     (These are modified clones of the sweep image_gen functions.)
602  *     RSL_carpi_to_cart, RSL_carpi_to_gif, RSL_carpi_to_pict,,
603  *     RSL_carpi_to_ppm, RSL_carpi_to_pgm
604  *
605  *----------------------------------------------------------------------
606  * v1.4 Began 12/24/96.  Released: 3/7/97 (Severity: bug fix)
607  *
608  * 1. Some WSR88D files have a 'radial status' of 28.  This is un-
609  *    documented.  I assume it means some catastrophic reset has occured.
610  *    Therefore, the code that counts the number of rays is modified
611  *    to rely on the 'ray_num' reported upon reading the file.
612  *    Also, I assume that when the status tells me that I'm reading
613  *    the 'start of a new elevation' (status == 0) that all subsequent
614  *    records will overwrite previously stored rays.
615  *
616  *    I've seen this status number(28) occur, rarely, in the
617  *    WSR88D data.  See wsr88d.c.
618  *
619  * 2. Removed kwaj component.  - Mike.
620  *
621  * 3. Installs toolkit_1BC-51_appl.h in INCDIR.  This file is needed
622  *    only if you plan to use the HDF component.
623  *
624  * 4. Fixes a freeing bug in nsig.c.  Added member nparams to the 
625  *    NSIG_Sweep structure to track this for the free routine.
626  *
627  * 5. Ray indexing bug fixed in wsr88d_to_radar.c which produced an
628  *    invalid time when the first wsr88d ray was null.  Basically, using
629  *    'i' instead of 'iray'.
630  *----------------------------------------------------------------------
631  * v1.3 Began 08/26/96.  Released: 12/17/96 (Severity: upgrade)
632  * 
633  * 1. Lassen field 'Zdr' loaded into RSL 'ZD' field, not the RSL 'DR' 
634  *    field, as originally envisioned within HDF functions. Henceforth, 
635  *    'ZD' represents (linear) reflectivity depolarization ratio:
636  *      ZD = 10log(Z_horiz/Z_vert) in units dB
637  *    as opposed to the circular depolarization ratio.
638  *    
639  *    What exactly are the RSL 'LR' and 'DR' fields??
640  *    
641  *    
642  *    For consistency of field nomenclature:
643  *    
644  *    Renamed 'CR' to 'CD'.  (corrected ZDR for 1C-51)
645  *            'MR' to 'MD'.   (1C-51 mask for ZDR)
646  *    
647  *    CD_F returns ZD_F
648  *    CD_INVF returns ZD_INVF
649  *    
650  * 2. Sort by time forgot to compare the hour field.  Minor fix.
651  *
652  * 3. Fix z_to_r to return proper value.   
653  *
654  * 4. Lassen ingest: fix the sign of deg/min/sec so they match.
655  *    Trusting that the sign of the deg is correct.
656  *
657  * 5. Added RSL_select_fields.  This reduces memory requirements
658  *    upon ingest.  You can select, "all" (default), "none" (just to
659  *    get header info) or "dz", "vr", ...
660  *
661  *    WHAT?    STATUS?
662  *    lassen   done
663  *    wsr88d   done
664  *    UF       done
665  *    nsig     done
666  *    nsig2    done
667  *    kwaj     not applicable as it only has DZ.
668  *    hdf      done
669  *    mcgill   not applicable as it only has DZ.
670  *    toga     not done.  If you want to do this, feel free.
671  *
672  * 6. Uses 'gzip -1'.  This cuts the time for making UF files in half.
673  *
674  * 7. Renamed 'makefile' to 'Makefile'
675  *
676  * 8. The HDF component has changed drastically and is not compatable
677  *    with previous versions.  It may change again, contingent upon
678  *    the TSDIS toolkit 3.5.2.1 (as of 12/17/96).  Expect minor changes
679  *    to the HDF component in the future.
680  *
681  * 9. Pruning of sweeps and rays now sets moved object pointers to
682  *    NULL.  See prune.c
683  *
684  *10. Updated nsig_to_radar.c to check for ant_scan_mode.  If mode is
685  *    RHI, then return NULL because RSL can't handle RHIs. --Paul
686  *
687  *11. Split memory management routines for hdf processing. --Mike K.
688  *----------------------------------------------------------------------
689  * v1.2 Began 08/26/96.  Released: 9/6/96 (Severity: minor bug-fix upgrade)
690  *
691  * 1. Eliminated zero sized arrays in lassen.h.  SGI 'cc' can't
692  *    handle zero sized arrays.  This brings back the -pedantic
693  *    compile flag.   
694  *
695  * 2. Implemented popen and pclose (called rsl_popen and rsl_pclose)
696  *    to eliminate the annoying message 'Broken pipe.' on SGI and HP
697  *    computers.
698  *
699  * 3. The HDF component is incompatable with earlier versions because
700  *    of the use of additional fields.  It now uses the MASK fields
701  *    and calibration information.  It should be considered that the 
702  *    HDF component is in a state of flux.
703  *
704  * 4. Minor bug in nsig.c wherein when rays are missing (0 sized)
705  *    that not all rays present will be ingested.  This is fixed.
706  *
707  * 5. Copyrighted the software.
708  *
709  * 6. 'anyformat_to_radar' can recognize HDF files.
710  *
711  *----------------------------------------------------------------------
712  * v1.1 Began 08/21/96.  Released: 08/22/96 (Severity: SERIOUS bug fix)
713  *      If you have already upgraded to RSL v1.0.1, then this is a minor
714  *      upgrade.
715  *
716  * 1. I should have left well enough alone.  But, getting rid
717  *    of rsl.h.template in favor of only having rsl.h has revealed
718  *    a serious bug.
719  *
720  *    THIS BUG IS IN V1.0 ONLY.
721  *
722  *    The type for 'Range' could be built into
723  *    the RSL differently than how your application is built.
724  *    For instance, if RSL is built with USE_TWO_BYTE_PRECISION, then
725  *    your application will think 'Range' is a one byte storage class,
726  *    because the default RSL configuration is to use one byte storage.
727  *
728  *    This bug slipped through all the tests that I perform and was 
729  *    discovered only when using the radar_to_hdf component of RSL.
730  *    Thanks to Mike Kolander for finding this one. 
731  *
732  *    Configuration instructions are changed so that you must edit
733  *    rsl.h to use one byte precision.
734  *
735  * 2. All MCTEX fields are recognized and loaded into Radar.
736  *    h.f and h.invf are modeled after LASSEN conversion functions.
737  * 3. Added radar_to_hdf.o to makefile.
738  * 4. In examples/any_to_gif.c, outputs all fields.
739  * 5. Three convience arrays are defined in rsl.h.
740  *    a. RSL_ftype[];
741  *    b. RSL_f_list[];
742  *    c. RSL_invf_list[];
743  *    Each array is MAX_RADAR_VOLUMES long and contain: strings 
744  *    representing the field type, a pointer
745  *    to the F function, and a pointer to the INVF function.
746  *
747  *    Usage is conditional by defining USE_RSL_VARS before including
748  *    rsl.h.  Use:
749  *       #define USE_RSL_VARS
750  *       #include "rsl.h"
751  *
752  *    Normally, you shouldn't worry about this.
753  *
754  * 6. Removed -pedantic compile flag because LASSEN code has a 0
755  *    sized array -- no warnings.
756  *----------------------------------------------------------------------
757  * v1.0 Began 04/19/96.  Released: 8/18/96 (Severity: minor upgrade)
758  *
759  * 1. Ignore SIGPIPE when making images.
760  * 2. Can read UF files of MCTEX data.  This UF file contains
761  *    RH and PH fields.  This is LASSEN data that has been converted
762  *    to UF via a sun program.  It is the LASSEN II format.
763  * 3. Fixed date/time == 0 when calling uf_to_radar multiple times.
764  *    The second and subsequent calls produced 0 for the
765  *    radar->h.year/month/day and radar->h.hour/min/second.
766  * 4. Always allocate MAX_RADAR_VOLUMES for new radars during ingest.
767  *    This will allow one to test any volume index for presence.
768  * 5. Set the default functions to DZ_F.  This sets CZ_F correctly.
769  *    It is unclear if the other conversion fuctions are properly
770  *    defined.
771  * 6. Pure UF file ingest bug fixes.
772  * 7. Added RSL_hdf_to_radar - Mike Kolander.
773  * 8. Added RSL_radar_to_hdf - Mike Kolander.
774  * 9. New field type: XZ for X-band Reflectivity.
775  * 10. Working version of nsig_to_radar. - Paul Kucera.
776  *     This version works on both big endian and little endian (Linux),
777  *     and, for both version 1 and version 2 formats.  Version 2
778  *     files are generated on big-endian machines (so far, SGI Iris 
779  *     computers), whereas, Version 1 files were written on
780  *     little-endian DEC computers.  Two routines are provided:
781  *
782  *     RSL_nsig_to_radar(char *infile);
783  *     RSL_nsig2_to_radar(char *infile);
784  *
785  *     Nsig ingest can handle nsig files/tapes that were
786  *     written on a DEC (little endian) or an SGI (big endian).
787  *     It is handled automatically by examination of the 'magic' bytes.
788  *     You will note that the byte-ordering in the file is dependant
789  *     on which machine wrote the tape or file.  The New-SIGMET 
790  *     documentation does not specify which byte-ordering is to be used
791  *     when the file is written.
792  *
793  *     Re-wrote nsig.c and beefed up nsig.h.  Now, there is an 
794  *     interface to read an entire nsig sweep.  You can loop through
795  *     the returned sweep and pick your values, and load RSL.
796  *     This re-write was done to make reading version 2 files easier.
797  *     Additionally, all NSIG code for version 1 and version 2 files
798  *     is centrally located in:
799  *           nsig.h
800  *           nsig.c
801  *           nsig_to_radar.c
802  *     To have both versions supported in the same files, I use #ifdef
803  *     and the C preprocessor.  'nsig.h' is saturated with #ifdef NSIG_VER2
804  *     constructs.  Thus, only one source is maintained for both NSIG versions.
805  *
806  * 11. Added RSL_print_version();
807  * 12. Added docs for users guide, hdf.
808  * 13. Added html 'grouping by functionality' page.
809  * 14. Restores stdin and stdout when creating pipes.
810  *     The pipe readers need to loop until no data available, because
811  *     'read/fread' will not get all the data in one call.
812  * 15. Added moving platform headers to Ray structure:
813  *      float pitch;       Pitch angle.
814  *      float roll;        Roll  angle.
815  *      float heading;     Heading.
816  *      float pitch_rate;  (angle/sec)
817  *      float roll_rate;   (angle/sec)
818  *      float heading_rate;  (angle/sec)
819  *      float lat;           Latitude (degrees)
820  *      float lon;           Longitude (degrees)
821  *      int   alt;           Altitude (m)
822  *      int   rvc;           Radial velocity correction (units of velocity)
823  *
824  *     This information typically comes from NSIG.  For other formats
825  *     the values are all zero.
826  * 16. Read version 1.3 and 1.4 of LASSEN data.  RSL_lassen_to_radar.
827  *     This means that RSL can read MCTEX data.
828  * 17. Users manual.  Walk a novice through a simple example and explain
829  *     what header information is important.  Teach how to take advantage
830  *     of the library.
831  * 18. Eliminated the #ifeq in makefile.  Thus, rsl.h.template is removed
832  *     and rsl.h is resurrected.
833  *----------------------------------------------------------------------
834  * v0.45 Began 03/26/96.  Froze: 03/27/96  (Severity: minor)
835  *
836  * 1. Fixed broken pipe problem on HP and SGI.  Cause unknown.
837  *    All I did was to remove the pclose in any_format_to_radar.c
838  *    It seems that if there is any data left in the pipe that a 
839  *    SIGPIPE is sent when trying to close the pipe.
840  *    On SGI's this causes a core dump.  This bug is difficult to
841  *    reproduce.
842  * 2. Nsig ingest is severly broken.  It always was.  Work in
843  *    progress.
844  * 3. It is important that TSDIS get this version to run on their SGI
845  *    as it prevents a core dump.  Normally, this shouldn't affect 
846  *    anyone.
847  *----------------------------------------------------------------------
848  * v0.44 Began 03/19/96.  Froze: 03/19/96.
849  *
850  * 1. In prune.c, pointers that are pruned are now set to NULL.
851  *    This elimated core dumps associated with trying to free structues.
852  * 2. On gzip-ed UF output, stdout is flushed before the pipe is opened.
853  * 3. Added reverse.c -- Reverse the order of the sweep pointers in
854  *    a volume.
855  *----------------------------------------------------------------------
856  * v0.43 Began 03/01/96.  Froze: 03/05/96.
857  *
858  * 1. farea.c -- nbins fix.
859  * 2. On UF output, checks for NOECHO.
860  *
861  *----------------------------------------------------------------------
862  * v0.42 Began 11/27/95.  Froze: 02/16/96.
863  *
864  * 1. Removed '#include <strings.h>'.
865  * 2. Added a couple of missing prototypes in rsl.h.template.
866  * 3. Added:
867  *     Ray    *RSL_prune_ray   (Ray  *ray);
868  *     Sweep  *RSL_prune_sweep (Sweep  *s);
869  *     Volume *RSL_prune_volume(Volume *v);
870  *     Radar  *RSL_prune_radar (Radar  *r);
871  *
872  *     These routine remove dataless substructures.  Prompted by
873  *     poor NCAR ingest routines for UF files; it is wise to prune
874  *     a Radar prior to calling RSL_radar_to_uf.  Therefore, if 
875  *     software cannot read the UF files created by RSL, then try these
876  *     prune functions before outputting the UF file.  In either case,
877  *     RSL_radar_to_uf produces valid UF files.
878  * 4. Removed trigraph in mcgill.c.
879  * 5. Fixed lassen ingest problem on Linux.  I think XDR has a bug
880  *    where bit fields are not loaded properly.  This is a kludge fix.
881  * 6. Removed column.c.  Code not mature and takes way too much
882  *    RAM.  Included in the removal are the vertical structure routines.
883  *    The code has been moved to the application (qcwin).
884  * 7. RSL_get_first_ray_of_sweep now returns when the ray number is 1 or
885  *    0.  This drasitically speeds the routine.
886  * 8. Increased the UF buffer size from 4096 to 16384.
887  *----------------------------------------------------------------------
888  * v0.41 Began 11/01/95.  Froze: 11/20/95.
889  *
890  * 1. Minor doc changes.  More up to date with implementation.
891  * 2. Implemented 'radar_type' in the radar_header structure.  Values
892  *    are strings and are: "wsr88d", "lassen", "uf", "nsig", "mcgill",
893  *    "kwajalein", "toga".
894  * 3. Increased range of data (internal storage conversion functions)
895  *    when using 2 byte storage.  Some nsig data can have values below the 
896  *    default wsr88d function range.
897  * 4. 'farea.c' -- Volumes are used to compute the fractional area.
898  *                 This matches the latest specification of the function.
899  * 5. Automatically uncompress files.  Transparently sets up
900  *    a decompression pipe.  If the input is not stdin, then 'anyformat_to...'
901  *    can peek inside a compressed file and determine what ingest routine to
902  *    use.  Reading copmressed files from disk and internally uncompressing
903  *    them turns out to be the fastest form of ingesting wsr88d (only format
904  *    timed) data on my 486.  However, I get mixed results on the HP 755.
905  *    'anyformat_to...' uses 'gunzip' to peek inside compressed files.
906  * 6. Can make gzip-ed UF files.  The new routine is 'RSL_radar_to_uf_gzip'.
907  *    Also, RSL_radar_to_uf_fp takes a file pointer.  Thus, you can
908  *    define your own output filter.
909  * 7. Added RSL_write_radar_fp, RSL_write_radar_gzip.
910  *----------------------------------------------------------------------
911  * v0.40 Began 10/24/95.  Froze: 10/24/95.
912  *
913  * 1. Type cast for Sweep_header and Ray_header was removed so that
914  *    stock 'cc' on SGI could digest the code.  File: column.c. Why?
915  *
916  * Version 0.39 was short lived. :-)
917  *----------------------------------------------------------------------
918  * v0.39 Began 7/1/95.  Froze: 10/24/95.
919  *
920  * 1. Mcgill library is not separate.  Included in rsl in whole.
921  * 2. Interpolation routines added.
922  * 3. Added RSL_load_height_color_table  -- and the colors/*height.clr
923  * 4. Added RSL_load_rainfall_color_table  -- and the colors/*rainfall.clr
924  * 5. Removed RSL_print_{volume,sweep,ray}
925  * 6. Removed some unused routines.
926  * 7. Vertical_structure is its own type composed of Vertical_sweeps and
927  *    Vertical_rays (columns).
928  * 8. Added doc/internal_routines.html.
929  * 9. UF is exchangable between big and little endian.  Finally, this
930  *    has been fixed.  Now UF can be generated on little endian machines
931  *    and read on big endian (the UF generated is in big endian format even
932  *    on the little endian machine).  And, visa versa.
933  *10. New version of RSL_get_vertical_structure in column.c.  Doc's updated.
934  *11. Fixed bug in radar_to_uf.  When the number of actual sweeps (and perhaps
935  *    volumes) is less than the determined max of the entire radar structure,
936  *    then the pointers may be erroneous.  Paul caught this flounder.
937  *12. Added RSL_uf_to_radar_fp.  The FILE *fp version of the UF ingest.
938  *    Also, passing NULL to RSL_uf_to_radar means to read from stdin.
939  *13. Added NOECHO flag for f and invf.  Currently, defined for UF, NSIG and
940  *    Kwaj data.
941  *14. Included source for libraries: wsr88d, lassen, tg, nsig, mcgill,
942  *    and kwajlein. Now linking needs only: -lrsl -lm
943  *15. Simplified the configuration procedure.  All configuration
944  *    is specified from 'makefile'.  See README for new install instructions.
945  *16. Removed ray_status, sec_num, atm_att, min_dif, sys_cal from ray
946  *    header.  These are not used and specific for wsr88d.
947  *17. Summary of routine that handle NULL filenames as STDIN.
948  *        RSL_wsr88d_to_radar
949  *        RSL_uf_to_radar         -- calls --> RSL_uf_to_radar_fp
950  *        RSL_lassen_to_radar
951  *        RSL_nsig_to_radar
952  *        RSL_toga_to_radar
953  *        RSL_mcgill_to_radar
954  *18. Removed RSL_get_sweep_index_from_volume.
955  *19. Removed RSL_X_ray_indexes.  Actually, just renamed the routine
956  *    to 'construct_sweep_hash_table'.  The hash table retains the hi and
957  *    low ray pointers for closest ray comparison.  Angle diff's removed.
958  *20. Removed hash table implementation in the Sweep structure.  It
959  *    is now implemented internally in RSL.
960  *21. BADVAL valued depends on Range type.  Picked to be out of range.
961  *
962  *----------------------------------------------------------------------
963  * v0.38 Began 6/1/95.  Froze 6/29/95.
964  *
965  * 1. Makes 2's compliment, instead of 1's compliment, in sweep_to_cart.
966  * 2. Modifications to eth functions.
967  * 3. Added routine RSL_get_column. See column.c.
968  * 4. Added Column data structure.
969  * 5. Static pointer for image generation.  Free up image pointer and
970  *    reallocate.  Otherwise, we've got a memory leak when making many
971  *    images.
972  * 6. Added Paul's and Dennis's modifications of the cappi routines.
973  *    I modified the cappi structure so that Sweep is a substructure.
974  *    This makes image generation and get_value_from_cappi easy to implement.
975  * 7. Added a test program in examples/cappi_image.c to test cappi
976  *    generation.
977  * 8. Change doc/ for the cappi routines.  Routines added/modified are:
978  *      float RSL_get_value_from_cappi(Cappi *cappi, float rng, float azm);
979  *      int RSL_fill_cappi(Volume *v, Cappi *cap, int method);
980  *      void RSL_free_cappi(Cappi *c);
981  *      Cappi *RSL_new_cappi(Sweep *sweep, float height);
982  *      Cappi *RSL_cappi_at_h(Volume  *v, float height, float max_range);
983  *      Carpi *RSL_cappi_to_carpi(Cappi *cappi, float dx, float dy,
984  * 9. Carpi structure modified to be compatable with cappi routines.
985  * 10. Added RSL_get_gr_slantr_h.  -> range.c
986  * 11. RSL_uf_to_radar only recognizes UF files.
987  * 12. RSL_uf_to_radar handles TRUE UF, 2 and 4 byte record length delimeters.
988  * 13. Minor bug fix in ray_indexes.c to handle RHI input.  The number of
989  *     hash table entries is now a function of the beam_width and not the
990  *     number of rays.
991  * 14. Bug fix in rebin_velocity_sweep.  New velocity color tables.
992  *     'examples/qlook.c' added.  Yet another image generation program;
993  *     redundant.
994  * 15. RSL_uf_to_radar allocated additional space for sweeps, when the
995  *     initial allocation is not enough.
996  * 16. Added a programmers guide.  See programmers_guide.html.
997  * 17. Get_closest routines removed.
998  * 18. Added RSL_kwaj_to_radar.  -- Mike Kolander.
999  * 19. Added docs for RSL_kwaj_to_radar.
1000  *
1001  * Note: Since v0.37 we've been using h.f and h.invf for the storage
1002  * functions and, thus, the library is not compatable with earlier
1003  * versions.  All subsequent version are, however, compatable.
1004  * This means, code that used v0.36 and earlier will break (not
1005  * even link) with v0.37 or later.
1006  *
1007  * You must now use:
1008  *    ray->h.f(ray->range[i]) instead of F(ray->range[i])
1009  * and
1010  *    ray->h.invf(x) instead of INVF(x).
1011  *
1012  *----------------------------------------------------------------------
1013  * v0.37 Began 5/24/95.  Froze 5/29/95.
1014  *
1015  * 1. Removed RSL_float_to_char; too specific.
1016  * 2. Implemented seperate conversion functions for each field type.
1017  *    This added h.f and h.invf to Volume, Sweep and Ray headers.
1018  *    The ingest routines optionally define there own conversion function.
1019  *    Most of the time, though, I use the default: wsr88d conversions.
1020  *      Tested: wsr88d, lassen, mcgill, UF, rsl.
1021  *      Coded but not tested: toga, nsig.
1022  * 3. Added ETH routines:
1023  *      Sweep *RSL_get_eth_sweep(Volume *v,float et_point);
1024  *      float RSL_get_echo_top_height(Volume *v,float azim,float grange, float et_point);
1025  * 4. If using #define USE_TWO_BYTE_PRECISION, uses 100 as a storage
1026  *    factor.  Now, there is no loss of precision when converting between
1027  *    internal and float.  Before there was just a minor round off when
1028  *    using any data that used anything other than 1/2 dbz precision.
1029  *    Using 100 is more than enough.
1030  *----------------------------------------------------------------------
1031  * v0.36 Began 5/19/95. Froze 5/19/95.
1032  *
1033  * 1. Magic in anyformat_to_radar was slightly different than expected
1034  *    for lassen data.  Tested on lassen data.
1035  * 2. DEFAULT is to use 2 byte storage precision.  See rsl.h.
1036  * 3. Several changes to get_closest routines -- Flanigan.
1037  *
1038  *----------------------------------------------------------------------
1039  * v0.35 Began 5/18/95. Froze 5/18/95.
1040  *
1041  * 1. Checks iazim validity in ray_indexes.c.  Bad angles use to cause
1042  *    core dumps.
1043  * 2. wsr88d_to_radar can handle bogus filenames and callid's.
1044  *
1045  *----------------------------------------------------------------------
1046  * v0.34 Began 5/17/95. Froze 5/18/95.
1047  * 
1048  * 1. Modified the bscan interface.
1049  *
1050  * 2. Fixed a minor nrays bookkeeping bug in radar_to_uf.
1051  *
1052  * 3. Updated Sweep searching routines.
1053  *
1054  * 4. Added get_closest and get_next_closest ray searching routines.
1055  *    Updated RSL_get_ray_from_sweep so that it uses the 
1056  *    new_get_closest function.
1057  *
1058  *----------------------------------------------------------------------
1059  * v0.33 Began 5/12/95. Froze 5/16/95.
1060  *
1061  * 1. Configure for building using 2 byte precision instead of 1 byte.
1062  *    This should quell any accuracy problems associated with the
1063  *    functions F and INVF.
1064  *
1065  * 2. Added 'RSL_mcgill_to_radar'.  Link with -lmcgill.
1066  *
1067  * 3. Bug fix in cube.c, cappi.c, and carpi.c.
1068  *----------------------------------------------------------------------
1069  *
1070  * v0.32 Began 5/5/95. Froze 5/12/95.
1071  *
1072  *    1. Compiles with -Wall -ansi -pedantic.
1073  *    2. Minor bug fixes in get_win.c
1074  *    3. Compiles on SGI, 486, SUN, HP using gcc or stock cc.
1075  *----------------------------------------------------------------------
1076  * v0.31 Began 4/28/95. Froze 5/5/95.
1077  *
1078  *    1. Added ray_high and ray_low Azimuth_hash pointers
1079  *       to Azimuth_hash data structure and code in the
1080  *       the routine RSL_sweep_ray_indexes to set these
1081  *       pointers.  ray_low points to the Azimuth_hash
1082  *       with the next lowest ray_angle, with ray_high
1083  *       points to the next highest.
1084  *
1085  *    2. Created internal routine dir_angle_diff.  Returns
1086  *       negitive difference if the second angle in 
1087  *       the parameter list is counter-clockwise to the
1088  *       first angle.  Returns positive is second 
1089  *       angle is clockwise tk first angle.
1090  *    
1091  *    3. Added internal routine the_closest_hash.  This
1092  *       routine returns the an Azimuth_hash
1093  *       data structure that contains the closest
1094  *       ray to the requested angle.
1095  *
1096  *    4. Added two routines:  RSL_get_closest_ray_from_sweep and
1097  *       RSL_get_next_closest_ray_from_sweep.
1098  *
1099  *        5. Added routines: RSL_get_window_from_radar, 
1100  *       RSL_get_window_from_volume, RSL_get_window_from_sweep, and 
1101  *       RSL_get_window_from_ray.
1102  *    
1103  *    6. Modified farea.c.
1104  *    7. Isolated contruction of azimuth table linked list.
1105  *    8. Fixed get_sweep NULL sweep reference (See patch v0_29_3 also).
1106  *    9. Compiles on HP CC, SGI CC, GNU CC.  I had to #ifdef the
1107  *       varargs declaration in anyformat_to_radar.c.  Why?
1108  *   10. Added examples/killer_sweep.c.  This randomizes the azimuth
1109  *       values of each ray.  The output checks the sortedness of the
1110  *       hi and low links in the hash table.
1111  *   11. Added doc/...closest...   doc/...next_closest...
1112  *
1113  *-------------------------------------------------------------------------
1114  * v0.30 Began 4/20/95.  Froze 4/27/95
1115  *
1116  *    0. IMPORTANT: Renamed libradar.a to librsl.a.  Also, radar.h to rsl.h.
1117  *    1. Removed NOTFOUND_H reference in the get_ray function.
1118  *    2. Simplified get_sweep.
1119  *    3. Uses within 1/2 beam_width test in get_ray_from_sweep.
1120  *    4. Checks -1 and +1 bin in azimuth hash table to really find the
1121  *       closest ray that is within 1/2 beam_width of the target azim.
1122  *       Surprisingly, it shortened the get_value_from_sweep routine.
1123  *
1124  *    5. Added anyformat_to_radar.c.  Uses magic information to determine
1125  *       the file format.  Handles: UF, RSL, WSR88D, LASSEN.  Toga may
1126  *       be difficult.  Unknown, yet, for NSIG.  Alan will get me that
1127  *       information.
1128  *    6. Added beam_width to the ray structure.
1129  *-------------------------------------------------------------------------
1130  * v0.29.1 Began 4/18/95. Froze 4/18/95.
1131  *
1132  *  1. Bug fix in endian.c.  Needed to initialize the word.val to 0.
1133  *  2. Bug fix in radar_to_uf.c.  little_endian() call.
1134  *  3. Added Azumuth_hash to structure list in doc/.
1135  *  4. Other minor changes.
1136  *-------------------------------------------------------------------------
1137  * v0.29 Began 3/1/94. Froze ??/??/??
1138  *
1139  *  0. Thanks to Dennis Flanigan for helping with this release.
1140  *
1141  *  1. Modified sort_rays.c.  By Dennis Flanigan, Jr.
1142  *     a. Added h.sorted_flag to Volume and Sweep header structures.
1143  *
1144  *     b. Added routines:
1145  *        int     ray_sort_compare_by_time(Ray **r1,Ray **r2);
1146  *        int     sweep_sort_compare(Sweep **s1, Sweep **s2)
1147  *        Sweep  *RSL_sort_rays_by_time(Sweep *s);
1148  *        Volume *RSL_sort_sweeps_in_volume(Volume *v)
1149  *        Volume *RSL_sort_volume(Volume *v)
1150  *        Radar  *RSL_sort_radar(Radar *r)
1151  *
1152  *     c. Routines that sort data structures now set the 
1153  *        number of structures in the parent data structure.
1154  *
1155  *     d. Fixed: nsweeps was not being set correctly by
1156  *        RSL_sort_sweeps_in_volume.
1157  *
1158  *  2. Removed sort calls in the ingest routines:  (whatever)_to_radar.
1159  *
1160  *  3. Removed the auxillary trig tables in image_gen.c.  It's just a 
1161  *     memory hog.
1162  *
1163  *  4. Changed the extension of the tar archives to .tgz.  This
1164  *     allows netscape to ftp the file rather than displaying it :-)
1165  *
1166  *  5. Added variables in the sweep data structures to represent
1167  *     the half of the beam width angles.  These variables are 
1168  *     vert_half_bw and horz_half_bw.   Also added code to all
1169  *     RSL ingest routines (something_to_radar) to set these values.
1170  *     The half angle values are used in the volume.c searching routines.
1171  *
1172  *  6. Added h.indexes to Sweep structure.  This is a simple hash
1173  *     table for making azimuth lookup cake.  So far, I've only
1174  *     got the malloc part placed in the routines that create the
1175  *     radar structure.  Added the file 'ray_indexes.c'.  This changes
1176  *     RSL_get_value_from_ray.
1177  *
1178  *     Code affected: 
1179  *        Modify code:
1180  *           RSL_copy...
1181  *           RSL_free...
1182  *           RSL_clear...
1183  *           RSL_sort..??? really???
1184  *           RSL_get...
1185  *           RSL_{write,read}_radar
1186  *           RSL_get_ray???
1187  *
1188  *        Modify doc
1189  *           RSL_sweep_struct.html
1190  *
1191  *  7. Updated doc/.
1192  *
1193  *  8. Added CHECK_LIST.
1194  *
1195  *  9. Changed the name from radar-v0.?? to rsl-v0.??.
1196  * 
1197  *  
1198  *-------------------------------------------------------------------------
1199  * v0.28 Began 7/23/94.  Froze  2/16/95
1200  * Changes:
1201  *
1202  *  1. Support for little endian machines (*86 PC's using Linux).
1203  *     Includes 'endian.c' in 'uf_to_radar.c' and 'radar_to_uf'.  It is not
1204  *     needed in 'lassen.c' because that program uses xdr to transfer the
1205  *     data.  Nor is it required in 'wsr88d_to_radar.c', 'nsig_to_radar.c'
1206  *     nor 'toga_to_radar.c' because the support for little endian is in
1207  *     the respective libraries: libwsr88d.a, libnsig.a, libtg.a.
1208  *
1209  *     Requires:
1210  *         wsr88d_v1.12.taz
1211  *         lassen_v1.0.taz
1212  *         libnsig_v1.3.taz
1213  *         libtg_v1.1.taz
1214  *
1215  *     In order to make this library compatable with versions on either
1216  *     big endian or little endian machines, it will be adopted that all
1217  *     output will be in big endian format.  Little endian machines will
1218  *     have to do the extra work of swapping bytes upon input as well as
1219  *     swapping bytes on output.  I could adopt to use the xdr library,
1220  *     however, it seems too complicated for the simple task of always
1221  *     guarenteeing that the output is in big endian format.  After all,
1222  *     we only support one output format: UF.  (Well, we will make our own
1223  *     radar format output in big endian format too, but we keep that
1224  *     knowledge hush hush).
1225  * 
1226  *  2. Documentation in the seperate directory complete for all routines
1227  *     in the RSL.  Documentation froze at v0.27 and is in HTML format.
1228  *     The documentation version number will be updated to match the version
1229  *     number of the most current release of RSL.  Note: The live link is
1230  *     in /PUBLIC/httpd/htdocs/trmm_office/software/radar/quick_reference.
1231  *     It is a symbolic link to ~/proj/trmm/radar/doc/v0.xx.
1232  *
1233  *  3. Added RSL_ prefix to all documentation.  This renamed the HTML files
1234  *     to begin with RSL_, also.
1235  *
1236  *  4. Prefixed all routines with RSL_.  Status is that it builds.
1237  *  5. Combined radar.h, cube.h and volume.h into radar.h.
1238  *
1239  *-------------------------------------------------------------------------
1240  * v0.27 Began 7/23/94.  Froze 9/13/94.
1241  * Changes:
1242  *
1243  *  1. Beam width calculation in get_value_from_sweep is not 1/2 on either
1244  *     side.  No provision for best fit.  See WTD #2.
1245  *  2. Added sort_rays.c.  Sort rays in a sweeps and volumes.
1246  *  3. Added Vset_earth_radius.  Set global variable 'Re' (Default: 4/3R).
1247  *  4. Added trig modification of get_slantr_and_h.
1248  *  5. Added sort rays call to: toga_to_radar, wsr88d_to_radar,
1249  *     uf_to_radar, lassen_to_radar.
1250  *  6. Added cube.c.  By Mike Kolander.
1251  *  7. Added carpi.c
1252  *  8. Added toga_to_radar.c.  By Mike Kolander.
1253  *  9. Signed all source files.
1254  * 10. Quieted some image print statements.  See image_gen.c.
1255  * 11. Changed wsr88d_to_radar so it takes 'first_file' or the 4 character
1256  *     call sign (eg. KMLB).
1257  * 12. Fixed makefile so it removes libradar.a before building.  This prevents
1258  *     duplicate object files, only the long filenamed ones, from
1259  *     appearing in the archive file.
1260  * 13. Added gts.c.  By Dave Wolff.
1261  * 14. Fixed minor round off error in 'uf_to_radar' which caused a 0 dBZ spike.
1262  * 15. Added histogram.c.  By Dave Wolff.
1263  * 16. Added nsig_to_radar.c.  By Alan McConnell.
1264  * 
1265  * WTD:
1266  *
1267  *
1268  *   2. Vget_value_from_sweep.  When the beam width is increased we
1269  *      want to return the value that is the best fit for a ray and not
1270  *      just the first fit.  Currently when the beam width is really
1271  *      large then we will pick the wrong beam for the desired point.
1272  *
1273  *   3. Add the following to the ray header:
1274  *        - u,v for ray.
1275  *        - offset for azim, range, elev (for moving radar)
1276  *        - lat/lon (for moving radar)
1277  *
1278  *   4. Bilinear interpolation.
1279  *   6. Modify get_ray_above to return a good ray so that QC doesn't zap points
1280  *      near the radar.
1281  *   7. Optimize/Improve the get_value routine.
1282  *   8. Remove V prefix to routine names?
1283  *  10. Fix why there are bands of missing data when making images.
1284  *  11. Specify resolution when making images.
1285  *  14. Update: doc's (in HTML), README, etc.
1286  *  16. NEED *TESTING* suite of programs.
1287  *
1288  * Proposed changes for v0.28
1289  *  1. Add support for little endian machines (386, 486, etc.)
1290  *  2. F(x, DZ) or ray->f.dz(x).  I.e., object function conversion functions.
1291  *
1292  *
1293  *-------------------------------------------------------------------------
1294  * v0.26 Began 7/23/94.
1295  * Changes:
1296  *  1. Adding cappi_to_carpi.
1297  *  2. Enhanced the Cappi structure; not the same as a sweep anymore.
1298  *
1299  *-------------------------------------------------------------------------
1300  * v0.26 Began 7/13/94. Froze 7/20/93.
1301  * Changes:
1302  *  1. Units for wavelength, in radar_to_uf, changed from meters to cm;
1303  *     as they should be.
1304  *  2. Library runs quietly.  No noisy print statements.  Call
1305  *     radar_verbose_on() and radar_verbose_off() to control printing.
1306  *-------------------------------------------------------------------------
1307  * v0.25 Began 7/1/94.  Froze 7/1/94
1308  * Changes:
1309  *  1. Modifications to makefile to add portibility to building on 
1310  *     other systems w/o gcc.  Change to CFLAGS.
1311  *  2. Passes lint.
1312  *  3. Moved documents radar.ez and volume.ez to ../doc (../doc_RCS).
1313  *     This means that the version of the documentation will not be kept
1314  *     up to the version of the RSL library.  Only changes to the doc. will
1315  *     force a new version of the documentation.  I'll want to see if this
1316  *     is a good idea.
1317  *-------------------------------------------------------------------------
1318  * v0.24 Began 6/29/94.  Froze 6/29/94
1319  * Changes:
1320  *  1. radar_to_uf, uf_to_radar.  Fixed inconsistant use of BADVAL vs.
1321  *     UF_NO_DATA.  The latter is check and used.
1322  *  2. Added function:
1323  *       float get_nyquist_from_radar(Radar *radar);
1324  *     Useful, for loading non-velocity fields with PRF, PRT and NYQUIST.
1325  *  3. Made the makefile more general and added comments.
1326  *
1327  *  WTD:
1328  *  1. Modify wsr88d_to_radar to fill PRF, PRT and NYQUIST values in
1329  *     non-velocity rays.
1330  *-------------------------------------------------------------------------
1331  * v0.23 Began 6/27/94.  Froze 6/27/94
1332  * Changes:
1333  *  1. First distribution release.
1334  *  2. Added README w/ installation instructions.
1335  *  3. Made example_main and colors directories.
1336  *  4. Shortened lassen.h to be close to minimial.
1337  *  5. Modified makefile to only make libradar.a.  Example_main/ has it's
1338  *     own makefile.
1339  *-------------------------------------------------------------------------
1340  * v0.22 Began 6/24/94.  Froze 6/24/94
1341  * Changes:
1342  *  1. radar_to_uf/uf_to_radar PRF/PRT calculation corrected.
1343  *
1344  *-------------------------------------------------------------------------
1345  * v0.21 Began 6/24/94.  Froze 6/24/94
1346  * Changes:
1347  *  1. radar_to_uf: prf now in microseconds.
1348  *  2. uf_to_radar: prf now converted from microseconds to seconds.
1349  *
1350  *-------------------------------------------------------------------------
1351  * v0.20
1352  * Changes:
1353  *   Need to determine the changes.  
1354  *-------------------------------------------------------------------------
1355  * v0.19 Began 6/17/94.  Froze: 6/17/94.
1356  * Changes:
1357  *  1. Fixed NULL access in write_radar subroutine.
1358  *
1359  *-------------------------------------------------------------------------
1360  * v0.19 Began 6/15/94.  Froze: 6/15/94.
1361  * Changes:
1362  *  1. Check for NULL in Vget_ray_from_sweep fixes a segmentation fault on
1363  *     Sun.
1364  *-------------------------------------------------------------------------
1365  * v0.18 Began 6/11/94.  Froze: 6/12/94 2pm.
1366  * Changes:
1367  *  1. Minor changes in volume.c.  Vget_value_from_sweep now uses the
1368  *     beam_width for matching rays.  See Vget_sweep too.
1369  *  2. cappi.c sets the beam_width.
1370  *  3. Added radar types.  There is no sure fire way to set
1371  *     radar->h.radar_type to one of these values automatically, ie. from
1372  *     information in the input file.  It may have to be done by the
1373  *     application; a runtime parameter, option.
1374  *     Types are:
1375  *         TOGACOARE_TOGA_SIGMET
1376  *                 TOGACOARE_MIT_SIGMET
1377  *                 TRMM_DARWIN_LASSEN
1378  *                 DARWIN_TOGA_SIGMET
1379  *                 TRMM_MELBOURNE_WSR88D
1380  *                 TRMM_KWAJALEIN_SIGMET
1381  *                 TRMM_HOUSTON_WSR88D
1382  *  4. Added function:
1383  *         Sweep *Vget_first_sweep_of_volume(Volume *v);
1384  *  5. Placed the wsr88d code in wsr88d_to_radar.c (removed from radar.c).
1385  *
1386  * WORK TO DO:
1387  *  1. Rework Vget_value_from_sweep to do a better search for the value.
1388  *
1389  *-------------------------------------------------------------------------
1390  * v0.17 Began 6/10/94.  Froze 6/10/94 3:30pm.
1391  * Changes:
1392  *  1. Corrected the pulse width calculation in uf_to_radar and in
1393  *     radar_to_uf.
1394  *-------------------------------------------------------------------------
1395  * v0.16 Began 6/10/94.  Froze 6/10/94 12:30pm.
1396  * Changes:
1397  *  1. Minor changes to radar.c because v1.3 of the wsr88d library is
1398  *     now using WSR88D_DZ, WSR88D_VR, WSR88D_SW as the field type mask.
1399  *     REFLECTIVITY, VELOCITY and SPECTRUM_WIDTH are not used.
1400  *
1401  *-------------------------------------------------------------------------
1402  * v0.15 Began 6/7/94.  Froze 6/7/94 1pm.
1403  * Changes:
1404  *  1. Discovered that the range to bin1 calculation in radar_to_uf.c and
1405  *     uf_to_radar.c was incorrect.  See fh[2] and fh[3].
1406  *
1407  *-------------------------------------------------------------------------
1408  * v0.14 Began 6/2/94.  Froze 6/2/94 1pm.
1409  * Changes:
1410  *  1. Modified the date for the Radar structure for UF reading to reflect
1411  *     the time of the first ray.  It was the generation time of the radar
1412  *     structure, however, Dave Wolff insists that it reflect the time of
1413  *     the first ray.  Modification to 'uf_to_radar.c'
1414  *
1415  *-------------------------------------------------------------------------
1416  * v0.13 Began 6/2/94.  Froze 6/2/94 11am.
1417  * Changes:
1418  *  1. Modified radar_to_uf.c to undo the faking of the headers.  This is
1419  *     the correct way.
1420  *
1421  *-------------------------------------------------------------------------
1422  * v0.12 Began 5/31/94.  Froze 5/31/94 7pm.
1423  * Changes:
1424  *  1. Check for malloc errors in Vnew* routines.
1425  *  2. Fixed a nasty bug in radar_to_uf.  I was letting 'j' get to high
1426  *     for a particular ray in a sweep.  'j' is looping on the maximum
1427  *     rays possible.  I noticed this bug only after Vcopy_volume to 
1428  *     replace a radar->v[i].
1429  *-------------------------------------------------------------------------
1430  * v0.11 Began 5/27/94.  Froze 5/27/94 12:50pm.
1431  * Changes:
1432  *  1. Modified radar_to_uf.c to fake header information when fields do
1433  *     exist, eventually, but not in the current sweep.  This is to allow
1434  *     brain dead UF ingestors (Zeb, RDSS, etc.) to read the UF file; they
1435  *     assume that whatever fields exist in the first UF sweep is constant
1436  *     throughout the file.
1437  *
1438  *  2. Added functions to volume.c
1439  *       Ray *Vget_first_ray_of_sweep(Sweep *s);
1440  *       Ray *Vget_first_ray_of_volume(Volume *v);
1441  *
1442  *-------------------------------------------------------------------------
1443  * v0.10 Began 5/26/94.  Froze 5/27/94 9am.
1444  * Changes:
1445  *  1. Modified the names of the INDEX and MASK variables.
1446  *
1447  * ZT     Total Reflectivity (dBZ)               ZT_INDEX
1448  *        May be uncommon, but important
1449  *
1450  * DZ     Reflectivity (dBZ), may contain some   DZ_INDEX
1451  *        signal-processor level QC and/or      
1452  *        filters. This field would contain 
1453  *        Darwin's CZ, or WSR88D's standard 
1454  *        reflectivity. In other words, unless
1455  *        the field is described otherwise, it
1456  *        should always go here. In essence, this
1457  *        is the "cleanest" reflectivity field
1458  *        for a radar.
1459  *
1460  * DR     Differential reflectivity              DR_INDEX
1461  *        DR and LR are for dual-polarization
1462  *        radars only. Unitless or in dB.
1463  *
1464  * LR     Another form of differential ref       LR_INDEX
1465  *        called LDR, not sure of units
1466  *
1467  * CZ     QC Reflectivity (dBZ), contains
1468  *        post-processed QC'd data               CZ_INDEX
1469  *
1470  * VR     Radial Velocity (m/s)                  VR_INDEX
1471  *
1472  * SW     Spectral Width (m2/s2)                 SW_INDEX
1473  *
1474  *  2. Fixed some MAX_RADAR_VOLUMES references in the wsr88d_to_radar code.
1475  *
1476  *-------------------------------------------------------------------------
1477  * v0.9 Began 5/25/94.  Froze: 5/26/94, 10am.
1478  * Changes:
1479  *  1. Added lassen_to_radar.c
1480  *  2. Added lassen.h
1481  *
1482  *-------------------------------------------------------------------------
1483  * v0.8 Began 5/23/94. Froze: 5/24/94, 10am.
1484  * Changes:
1485  *  1. F and INVF handle APFLAG.
1486  *  2. Image generation creates unsigned char images.
1487  *  3. 255-val for negative dBz (val < 0).
1488  *
1489  *-------------------------------------------------------------------------
1490  * v0.7 Began 4/30/94. Froze: 5/20/94.
1491  *
1492  *  Changes:
1493  *
1494  *   1. Uses char storage for data values, to reduce RAM allocation.
1495  *
1496  *   2. F(x) ((x-2)/2. - 64.)
1497  *      0 is for BADVAL. Bad value.
1498  *      1 is for RFVAL.  Range folded.
1499  *
1500  *   3. Added functions:
1501  *        Vfloat_to_char(float *x, unsigned char *c, int n);
1502  *        float F(unsigned char c);
1503  *        unsigned char INVF(float x);   -- Inverse of F.
1504  *        Radar *uf_to_radar(char *infile);
1505  *        void radar_to_uf(Radar *radar, char *outfile);
1506  *
1507  *   4. Minor bug fix in wsr88d_to_radar routine.  It was setting the
1508  *      number of volumes to six even though we were only asking for 3.
1509  *
1510  *   5. Changed the value of BADVAL to 0500 (Octal 500).  This is
1511  *      a value higher than 255 (the maximum byte value) but small enough
1512  *      to that when a scale factor (typically 100) is applied, the result
1513  *      does not exceed the I*2 (short) magnitude.  I needed this for the
1514  *      UF programs.  I could have tested for BADVAL, RFVAL, etc., and not
1515  *      applied a scale factor when loading the UF buffer, however, changing
1516  *      BADVAL and scaling everything was more general. 
1517  *
1518  *   6. Made some slight modifications to the Radar header and Volume header.
1519  *
1520  *-------------------------------------------------------------------------
1521  * v0.6 Began 4/16/94.  Froze: 4/30/94.
1522  *
1523  *  Changes:
1524  *
1525  *   1. Azimuth angles range from -180,180 to 0,360.
1526  *   2. New color index binning function for velocity.  -nyquist,nyquist
1527  *      using 15 bin values.  See Vrebin_velocity_sweep.
1528  *   3. Added the following routines:
1529  *  
1530  *       Memory management.
1531  *         Ray    *Vcopy_ray(Ray    *r);
1532  *         Sweep  *Vcopy_sweep(Sweep  *s);
1533  *         Volume *Vcopy_volume(Volume *v);
1534  *         Radar  *clear_radar(Radar *r);
1535  *   void Vget_groundr_and_h(float slant_r, float elev, float *gr, float *h);
1536  *   void Vget_slantr_and_elev(float gr, float h, float *slant_r, float *elev);
1537  *   void Vget_slantr_and_h(float gr, float elev, float *slant_r, float *h);
1538  *
1539  *       Image generation preparation.
1540  *         void Vrebin_velocity_ray   (Ray    *r);  /* Modifies r */
1541  *         void Vrebin_velocity_sweep (Sweep  *s);  /* Modifies s */
1542  *         void Vrebin_velocity_volume(Volume *v);  /* Modifies v */
1543  *
1544  *       Color table functions.
1545  *         void load_red_table(char *infile);
1546  *         void load_green_table(char *infile);
1547  *         void load_blue_table(char *infile);
1548  *
1549  *   4. Added 4/3Re calculation to Vget_slantr_and_elev and Vget_groundr...
1550  *   5. Checked for null in the Vclear routines.
1551  *
1552  *-------------------------------------------------------------------------
1553  * v0.5 Began 4/7/94
1554  *
1555  *  Changes:
1556  *
1557  *   1. Color table functions taken out of the image routines.
1558  *      You must call load_refl_table(), load_vel_table(), load_sw_table()
1559  *      to load the appropriate color table before making color images.
1560  *      There are seperate color tables for R, V, S.  See volume.h.
1561  *
1562  *   2. Range is now used in Vsweep_to_cart.
1563  *   3. Gate size (pixel resolution in km) is now used.
1564  *   4. Added range to cappi_at_h function.  It is the effective range.
1565  *   5. Added the following routines:
1566  *
1567  *       Read radar from disk.
1568  *         Ray    *read_ray   (FILE *fp);
1569  *         Sweep  *read_sweep (FILE *fp);
1570  *         Volume *read_volume(FILE *fp);
1571  *         Radar  *read_radar (char *infile);
1572  *
1573  *       Write radar to disk
1574  *         int write_ray   (Ray    *r, FILE *fp);
1575  *         int write_sweep (Sweep  *s, FILE *fp);
1576  *         int write_volume(Volume *v, FILE *fp);
1577  *         int write_radar (Radar  *r, char *outfile);
1578  *
1579  *       Area calculations
1580  *         float Varea_of_ray(Ray *r, float lo, float hi, float range);
1581  *         float Vfractional_area_of_sweep(Sweep *s, float lo, float hi, float range);
1582  *
1583  *       Pixel fractions  
1584  *         Vfraction_of_ray(Ray *r, float lo, float hi, float range);
1585  *         Vfraction_of_sweep(Sweep *s, float lo, float hi, float range);
1586  *         Vfraction_of_volume(Volume *v, float lo, float hi, float range);
1587  *
1588  *
1589  *   6. radar.c calls wsr88d_get_site to get additional wsr88d information
1590  *      not included in the file.  Routines compliments of Dan Austin.
1591  *   7. Added RFVAL.  Range Folded value.  Any base data value of 0 is
1592  *      data below SNR thresholds set for that specific base data.  Any
1593  *      data value of 1 is data considered range ambiguous (folded).
1594  *      A color table entry needs to be picked to represent this value.
1595  *
1596  *   To do:
1597  *   o I have to do something about MAX_RADAR_VOLUMES.  We really should
1598  *     rely on radar->h.nvolumes;
1599  *
1600  *   o Add 4/3Rearth calculation to get value routines.
1601  *   o Incorporate nsig_to_radar.  Dennis Flanigan is writing that interface.
1602  *   o Add fraction of area function.
1603  *   o Add the following functions:  ??? really ???
1604  *      Sweep *Vget_closest_sweep(Volume *v, float elev);
1605  *      Ray   *Vget_closest_ray(Sweep *s, float azim);
1606  *      float  Vget_closest_value_in_beam(Ray *ray, float range);
1607  *      float  Vget_closest_value(Ray *ray, float range);
1608  *        (I'm not sure how this will be different than Vget_value)
1609  *       
1610  *   o Sort the rays so locating azimuth is trivial; instead of a search
1611  *     algorithm as it is now.  Hey, would a binary search be good enough or
1612  *     do we need some hashing function?  Is the lookup fast enough already?
1613  *   o Add CAPPI at h.  (Option for bilinear interpolation about h).
1614  *-------------------------------------------------------------------------
1615  * v0.4 Began 3/23/94  Froze: 4/7/94
1616  *
1617  *  Changes:
1618  *
1619  *   1. Made Sweep (sweep) and Ray (ray) members an array of pointers.
1620  *      This changes the syntax of the access to be
1621  *      v->sweep[is]->ray[ir]->range[ibin] instead of 
1622  *      v.sweep[is].ray[ir].range[ibin].  The benifit of this is to
1623  *      be able to dynamically specify the number of sweeps or rays,
1624  *      even volumes for the Radar structure, and not allocate a maximum.
1625  *      This makes Vnew_sweep and Vnew_ray useful.
1626  *
1627  *   2. Added the following functions:
1628  *       Volume *Vget_volume(Radar *r, int itype);
1629  *              itype = REFLECTIVITY, VELOCITY, or SPECTRUM_WIDTH, etc.
1630  *     
1631  *       Sweep *Vget_sweep(Volume *v, float theta);
1632  *       Ray   *Vget_ray  (Volume *v, float theta, float azimuth);
1633  *       float Vget_value(Volume *v, float theta, float azimuth, float range);
1634  *       Ray   *Vget_ray_from_sweep(Sweep *s, float azimuth, float range);
1635  *       float Vget_value_from_sweep(Sweep *s, float azimuth, float range);
1636  *       float Vget_value_from_ray(Ray *r, float range);
1637  *       float Vget_value_at_h(Volume *v, float azim, float grnd_r, float h);
1638  *
1639  *       Ray    *QC_ray   (Ray       *ray, int radar_type);
1640  *       Sweep  *QC_sweep (Sweep   *sweep, int radar_type);
1641  *       Volume *QC_volume(Volume *volume, int radar_type);
1642  *
1643  *       Radar  *QC_radar (Radar   *radar);
1644  *
1645  *       void write_gif(char *outfile, char *image, int xdim, int ydim, char c_table[256][3]);
1646  *       void write_pict(char *outfile, char *image, int xdim, int ydim, char c_table[256][3]);
1647  *       char *Vsweep_to_cart(Sweep *s, int xdim, int ydim, float range);
1648  *       void Vsweep_to_gif(Sweep *s, char *outfile, int xdim, int ydim, float range);
1649  *       void Vsweep_to_pict(Sweep *s, char *outfile, int xdim, int ydim, float range);
1650  *       void Vvolume_to_gif(Volume *v, char *basename, int xdim, int ydim, float range);
1651  *       char *Vsweep_to_cart(
1652  *   3. When a sweep does not have any rays with any bins, then NULL is
1653  *      assigned to that Sweep pointer.  This occurs for reflectivity for
1654  *      the 2-nd sweep index (as defined by the data) where the is no
1655  *      reflectivity data, only doppler and spectrum width.  Velocity and
1656  *      spectrum width data do not exist for sweep number 1 (index 0).
1657  *
1658  *   4. Speed ups in Vto_cart_sweep.  Math is precomputed and saved in
1659  *      arrays for faster lookup.  Still the ppmtogif is a snail and it
1660  *      overwhelms the runtime.  I only saw a 35 second improvment with
1661  *      these new arrays when outputting 20 gif images.  I think the -O
1662  *      compile flag is doing a good job.
1663  *
1664  *   5. Added CAPPI at h.  Routine in cappi.c.  Cappi type is syntatically
1665  *      identical to the Sweep type.
1666  *
1667  *       Cappi *cappi_at_h(Volume *v, float h);
1668  *
1669  *   6. Make builds libradar.a which contains radar.c, volume.c, cappi.c and
1670  *      image_gen.c.  Builds on SGI, SUN and HP.
1671  *
1672  *   7. Add QC routines.  See 2. above for the list.  Currently they are
1673  *      place holding functions with only QC_ray needing to be coded.
1674  *      Paul Kucera will take care of that.
1675  *
1676  *   8. Improvments to radar.ez and volume.ez.
1677  *
1678  *  To do:
1679  *   o Add the following functions:
1680  *      Sweep *Vget_closest_sweep(Volume *v, float elev);
1681  *      Ray   *Vget_closest_ray(Sweep *s, float azim);
1682  *      float  Vget_closest_value_in_beam(Ray *ray, float range);
1683  *      float  Vget_closest_value(Ray *ray, float range);
1684  *        (I'm not sure how this will be different than Vget_value)
1685  *       
1686  *   o Add range resolution to the image generation subroutines.
1687  *   o Add range resolution to all the 'get_value' routines.
1688  *   o Sort the rays so locating azimuth is trivial; instead of a search
1689  *     algorithm as it is now.  Hey, would a binary search be good enough or
1690  *     do we need some hashing function?  It the lookup fast enough already?
1691  *   o Add CAPPI at h.  (Option for bilinear interpolation about h).
1692  *
1693  *-------------------------------------------------------------------------
1694  * v0.3 Began 3/22/94 Froze 3/23/94.
1695  *  
1696  *  Changes:
1697  *  1. Implimented the Radar structure.  The heart of it is an array of
1698  *     Volume pointers.
1699  *  2. Using 'data_mask' which is a bitwise ( | operator in C ) of
1700  *     REFL_MASK, VEL_MASK, or SW_MASK, you can get any field type volume:
1701  *     reflectivity, doppler velocity, or spectrum width respectively.
1702  *  3. Load volume, sweep and ray header information.
1703  *  4. Added Radar header information; need a good definition of say date and
1704  *     time.
1705  *
1706  *  Work to do:
1707  *   - Improve carteasean image generation.
1708  *      Input: radar range, pix_width, pix_height.  No distortion.
1709  *       - Need to specify the output GIF filename as options.
1710  *       - Incorporate Vto_fraction (?? name ??) Dave's new function.
1711  *-------------------------------------------------------------------------
1712  * v0.2 Began 3/21/94  Froze 3/22/94.
1713  *
1714  *  I am freezing this here because both BSCAN and CARTESEAN image generation
1715  *  works.  You have to hand edit the source to restrict the number of 
1716  *  Sweeps that are converted to images, currently only sweep 0.  The inclusion
1717  *  of sweep/ray header information and the collection of doppler and spectrum
1718  *  width data requires substantial effort and will be in the next version.
1719  *  This version freeze is a check point.
1720  *  
1721  *  Changes:
1722  *  1. Name rsphere change to volume.
1723  *  2. File rsphere.c changed to volume.c.  (Moved the RCS file rsphere.c,v
1724  *     to the graveyard directory in RCS/
1725  *  3. Added color gif support.  Reads red.clr, green.clr, blue.clr files.
1726  *     This renamed the Vto_cart_pgm function to Vto_cart_gif.  It is likely
1727  *     that ppm support is not needed.  We'll see.
1728  *  4. Fixes minor glitches in output images where the tan is undefined.
1729  *  5. Added BSCAN production as GIF files.
1730  *  6. Output sweep.xx file names; sweep.00.gif, etc.  and bscan.00.gif too.
1731  *
1732  *  Work to do:
1733  *    - Add routines to get volumes for doppler and spectrum width. (Radar lib?)
1734  *    - Improve carteasean image generation.
1735  *        Input: radar range, pix_width, pix_height.  No distortion.
1736  *    - Add sweep header information.
1737  *      - Need to specify the output GIF filename as options.
1738  *      - Incorporate Vto_fraction (?? name ??) Dave's new function.
1739  *
1740  *-------------------------------------------------------------------------
1741  *v0.1 3/21/94 by John Merritt.
1742  *  1. First development version of the radar and rsphere library. 
1743  *     Includes test driver.  radar.ez and rsphere.ez document the
1744  *     functionality of the programs.  This version exists to check point
1745  *     the development.
1746  *-------------------------------------------------------------------------
1747  */