3 *---------------------------------------------------------------------
4 * v1.44 Released 11/21/2013
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.
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
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
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
76 *---------------------------------------------------------------------
77 * v1.41 Released 6/22/2011
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,
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
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
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.
120 *---------------------------------------------------------------------
121 * v1.38 Released 11/29/2007
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.
126 *---------------------------------------------------------------------
127 * v1.37 Released 06/19/2007 (Severity: low)
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.
137 *---------------------------------------------------------------------
138 * v1.36 Released 08/29/2006 (Severity: low)
140 * 1. Forgot to put the modified wsr88d_locations.dat file into previous
143 *---------------------------------------------------------------------
144 * v1.35 Released 08/28/2006 (Severity: low)
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.
155 *---------------------------------------------------------------------
156 * v1.34 Released 02/15/2006 (Severity: low)
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
166 * 3. Added Huntsville site to wsr88d_locations.dat.
168 *---------------------------------------------------------------------
169 * v1.33 Began 02/25/2004. Released 08/27/2004 (Severity: low)
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.
176 *---------------------------------------------------------------------
177 * v1.32 Began 11/05/2003. Released 02/13/2004 (Severity: low)
179 * 1. Changed computation of sweep seconds in nsig_to_radar.c to eliminate
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.
187 *---------------------------------------------------------------------
188 * v1.31 Began 04/30/2003. Released 09/03/2003 (Severity: low)
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
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.
197 *---------------------------------------------------------------------
198 * v1.30 Began 07/30/2001. Released 03/13/2003 (Severity: low)
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
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.
221 *---------------------------------------------------------------------
222 * v1.29 Began 09/19/2000. Released 4/3/2001 (Severity: low)
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
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
240 *---------------------------------------------------------------------
241 * v1.28 Began 03/23/2000. Released: 7/24/2000 (Severity: low)
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
253 *---------------------------------------------------------------------
255 * v1.27 Began 01/11/2000. Released: 2/17/2000 (Severity: low)
257 * 1. Modified files radar_to_hdf_1.c and radar_to_hdf_2.c
258 * to accomodate random ray lengths, eg, Berrimah data.
260 *----------------------------------------------------------------------
261 * v1.26 Began 12/11/1999. Released: 12/21/1999 (Severity: low)
263 * 1. Configuration change for rapic.l and rapic.y.
264 * 2. Changed dependency for rsl.h and wsr88d.h
266 *----------------------------------------------------------------------
267 * v1.25 Began 11/30/1999. Released: 12/10/1999 (Severity: medium)
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:
274 * configure --prefix=/some/dir/to/install
277 *----------------------------------------------------------------------
278 * v1.24.1 Began 8/1/1999. Released: 11/30/1999 (Severity: new features)
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
293 *----------------------------------------------------------------------
294 * v1.24 Began 6/25/1999. Released: 6/28/1999 (Severity: bug fix)
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.
300 *----------------------------------------------------------------------
301 * v1.23 Began 3/31/1999. Released: 4/2/1999 (Severity: upgrade)
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.
307 *----------------------------------------------------------------------
308 * v1.22 Began 3/4/1999. Released: 3/4/1999 (Severity: bux fix)
310 * 1. Forgot to set the global 'rsl_kdp_wavelen' in nsig_to_radar.c.
312 *----------------------------------------------------------------------
313 * v1.21 Began 02/16/1999. Released: 3/4/1999 (Severity: minor bux fix)
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.
320 *----------------------------------------------------------------------
321 * v1.20 Began 11/12/98. Released: 01/25/1999 (Severity: bug fix/upgrade)
323 * 1. Fixed RADTEC ingest. Does RHI too, but,
324 * RSL doesn't have any good RHI image routines.
326 * 2. Added: RSL_set_color_table
327 * RSL_get_color_table
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)
334 * 1. Modified file volume.c . New INV_F, _F routines for diff refl.
336 * 2. Created examples/images to hold a base-line set of images
337 * to compare when running 'run_tests'. Modified run_tests
340 *----------------------------------------------------------------------
341 * v1.18 Began 4/28/98. Released: 8/13/98 (Severity: upgrade)
344 * RSL_radtec_to_radar -- in radtec_to_radar.c
345 * RSL_fix_time -- in volume.c
352 * 3. Modified image generation. Images are produced out to 'range'
353 * specified. Each image pixels is no longer 1km, but radius/range.
355 * 4. any_to_gif can now accept range and image size arguments.
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.
362 * Contact PKWARE at 414-354-8699.
364 * 6. Modified radar_to_hdf_1.c. Removed ZDR data from 1C-51 HDF.
366 * 7. Moved HDF_FILE_VERSION definition from toolkit_1BC-51_appl.h
367 * into the application level_1.c
369 *----------------------------------------------------------------------
370 * v1.17 Began 4/23/98. Released: 4/28/98 (Severity: upgrade)
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.
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.
381 * WTD : lassen_to_radar.c - check the ZDR conversion, if any. Do
385 *----------------------------------------------------------------------
386 * v1.16 Began 3/6/98. Released: 4/21/98 (Severity: bug fix/upgrade)
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.
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.
399 * 3. README explains how to apply patches.
401 * 4. Eliminated the reduce/reduce conflict in rapic.y
403 * 5. Year 2000 compliant.
405 * 6. I forgot the format in sprintf. See rapic.y.
407 *----------------------------------------------------------------------
408 * v1.15 Began 2/20/98. Released: 3/4/98 (Severity: bug fix/upgrade)
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
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.
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.
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)
440 * 1. Added calibration for Gunn Point radar. Assumes that
441 * the radar name will be 'Gunn_Pt'.
443 *----------------------------------------------------------------------
444 * v1.13 Began 1/16/98. Released: 1/26/98 (Severity: minor bug fix)
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'.
453 *----------------------------------------------------------------------
454 * v1.12 Began 1/12/98. Released: 1/12/98 (Severity: minor bug fix)
456 * 1. Changed HDF metadata item for empty granules.
458 *----------------------------------------------------------------------
459 * v1.11 Began 12/17/97. Released: 12/17/97 (Severity: minor bug fix)
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.
465 *----------------------------------------------------------------------
466 * v1.10 Began 8/27/97. Released: 10/21/97 (Severity: minor upgrade)
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,
481 *----------------------------------------------------------------------
482 * v1.9 Began 8/18/97. Released: 8/18/97 (Severity: bug fix)
484 * 1. Mofified radar_to_hdf_1.c : Metadata mods for TSDIS.
486 *----------------------------------------------------------------------
487 * v1.8 Began 7/30/97. Released: 8/05/97 (Severity: upgrade)
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
499 * mcgill -done. BUT, apparently, mcgill ingest is broken!!!
500 * When did this happen?
502 * 2. Added RSL_load_zdr_color_table();
503 * Includes color tables for this field. See colors/
505 * 3. More HDF mods; more warning messages.
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.
511 * Toolkit 4.5r1.1 is an unofficial release; the TRMM office will
512 * pass this out upon request.
514 *----------------------------------------------------------------------
515 * v1.7 Began 7/23/97. Released: 7/25/97 (Severity: bug fix)
517 * 1. Handles corrupt SIGMET files more gracefully.
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.
526 * 3. Minor changes to HDF component of RSL.
527 *----------------------------------------------------------------------
528 * v1.6 Began 5/02/97. Released: 7/23/97 (Severity: bug fix)
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,
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.
538 * 3. Fixed a time problem in nsig_to_radar.c. Daylight savings time.
540 * 4. Saves lat/lon on each ray for UF.
542 *--------------------
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
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)
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
565 * Files: radar_to_hdf.c, hdf_to_radar.c
566 * Moved QC parameters out of the metadata string into VOS comments
569 * Files: rsl.h, anyformat_to_radar.c
570 * Moved enum File_type definition from anyformat_to_radar.c into
572 *--------------------------
573 * Date: 17 Mar 97 kolander
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
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
596 * Modified functions:
597 * RSL_new_carpi, RSL_find_rng_azm, RSL_cappi_to_carpi
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
605 *----------------------------------------------------------------------
606 * v1.4 Began 12/24/96. Released: 3/7/97 (Severity: bug fix)
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.
616 * I've seen this status number(28) occur, rarely, in the
617 * WSR88D data. See wsr88d.c.
619 * 2. Removed kwaj component. - Mike.
621 * 3. Installs toolkit_1BC-51_appl.h in INCDIR. This file is needed
622 * only if you plan to use the HDF component.
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.
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)
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.
639 * What exactly are the RSL 'LR' and 'DR' fields??
642 * For consistency of field nomenclature:
644 * Renamed 'CR' to 'CD'. (corrected ZDR for 1C-51)
645 * 'MR' to 'MD'. (1C-51 mask for ZDR)
648 * CD_INVF returns ZD_INVF
650 * 2. Sort by time forgot to compare the hour field. Minor fix.
652 * 3. Fix z_to_r to return proper value.
654 * 4. Lassen ingest: fix the sign of deg/min/sec so they match.
655 * Trusting that the sign of the deg is correct.
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", ...
667 * kwaj not applicable as it only has DZ.
669 * mcgill not applicable as it only has DZ.
670 * toga not done. If you want to do this, feel free.
672 * 6. Uses 'gzip -1'. This cuts the time for making UF files in half.
674 * 7. Renamed 'makefile' to 'Makefile'
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.
681 * 9. Pruning of sweeps and rays now sets moved object pointers to
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
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)
691 * 1. Eliminated zero sized arrays in lassen.h. SGI 'cc' can't
692 * handle zero sized arrays. This brings back the -pedantic
695 * 2. Implemented popen and pclose (called rsl_popen and rsl_pclose)
696 * to eliminate the annoying message 'Broken pipe.' on SGI and HP
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.
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.
707 * 5. Copyrighted the software.
709 * 6. 'anyformat_to_radar' can recognize HDF files.
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
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
720 * THIS BUG IS IN V1.0 ONLY.
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.
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.
732 * Configuration instructions are changed so that you must edit
733 * rsl.h to use one byte precision.
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.
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.
747 * Usage is conditional by defining USE_RSL_VARS before including
749 * #define USE_RSL_VARS
752 * Normally, you shouldn't worry about this.
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)
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
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:
782 * RSL_nsig_to_radar(char *infile);
783 * RSL_nsig2_to_radar(char *infile);
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.
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:
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.
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)
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
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)
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
842 * 2. Nsig ingest is severly broken. It always was. Work in
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
847 *----------------------------------------------------------------------
848 * v0.44 Began 03/19/96. Froze: 03/19/96.
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
855 *----------------------------------------------------------------------
856 * v0.43 Began 03/01/96. Froze: 03/05/96.
858 * 1. farea.c -- nbins fix.
859 * 2. On UF output, checks for NOECHO.
861 *----------------------------------------------------------------------
862 * v0.42 Began 11/27/95. Froze: 02/16/96.
864 * 1. Removed '#include <strings.h>'.
865 * 2. Added a couple of missing prototypes in rsl.h.template.
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);
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.
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.
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?
916 * Version 0.39 was short lived. :-)
917 *----------------------------------------------------------------------
918 * v0.39 Began 7/1/95. Froze: 10/24/95.
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
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
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.
962 *----------------------------------------------------------------------
963 * v0.38 Began 6/1/95. Froze 6/29/95.
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
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
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
991 * 14. Bug fix in rebin_velocity_sweep. New velocity color tables.
992 * 'examples/qlook.c' added. Yet another image generation program;
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.
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.
1008 * ray->h.f(ray->range[i]) instead of F(ray->range[i])
1010 * ray->h.invf(x) instead of INVF(x).
1012 *----------------------------------------------------------------------
1013 * v0.37 Began 5/24/95. Froze 5/29/95.
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.
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.
1038 *----------------------------------------------------------------------
1039 * v0.35 Began 5/18/95. Froze 5/18/95.
1041 * 1. Checks iazim validity in ray_indexes.c. Bad angles use to cause
1043 * 2. wsr88d_to_radar can handle bogus filenames and callid's.
1045 *----------------------------------------------------------------------
1046 * v0.34 Began 5/17/95. Froze 5/18/95.
1048 * 1. Modified the bscan interface.
1050 * 2. Fixed a minor nrays bookkeeping bug in radar_to_uf.
1052 * 3. Updated Sweep searching routines.
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.
1058 *----------------------------------------------------------------------
1059 * v0.33 Began 5/12/95. Froze 5/16/95.
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.
1065 * 2. Added 'RSL_mcgill_to_radar'. Link with -lmcgill.
1067 * 3. Bug fix in cube.c, cappi.c, and carpi.c.
1068 *----------------------------------------------------------------------
1070 * v0.32 Began 5/5/95. Froze 5/12/95.
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.
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.
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.
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.
1096 * 4. Added two routines: RSL_get_closest_ray_from_sweep and
1097 * RSL_get_next_closest_ray_from_sweep.
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.
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...
1113 *-------------------------------------------------------------------------
1114 * v0.30 Began 4/20/95. Froze 4/27/95
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.
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
1128 * 6. Added beam_width to the ray structure.
1129 *-------------------------------------------------------------------------
1130 * v0.29.1 Began 4/18/95. Froze 4/18/95.
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 ??/??/??
1139 * 0. Thanks to Dennis Flanigan for helping with this release.
1141 * 1. Modified sort_rays.c. By Dennis Flanigan, Jr.
1142 * a. Added h.sorted_flag to Volume and Sweep header structures.
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)
1152 * c. Routines that sort data structures now set the
1153 * number of structures in the parent data structure.
1155 * d. Fixed: nsweeps was not being set correctly by
1156 * RSL_sort_sweeps_in_volume.
1158 * 2. Removed sort calls in the ingest routines: (whatever)_to_radar.
1160 * 3. Removed the auxillary trig tables in image_gen.c. It's just a
1163 * 4. Changed the extension of the tar archives to .tgz. This
1164 * allows netscape to ftp the file rather than displaying it :-)
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.
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.
1183 * RSL_sort..??? really???
1185 * RSL_{write,read}_radar
1189 * RSL_sweep_struct.html
1193 * 8. Added CHECK_LIST.
1195 * 9. Changed the name from radar-v0.?? to rsl-v0.??.
1198 *-------------------------------------------------------------------------
1199 * v0.28 Began 7/23/94. Froze 2/16/95
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.
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).
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.
1233 * 3. Added RSL_ prefix to all documentation. This renamed the HTML files
1234 * to begin with RSL_, also.
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.
1239 *-------------------------------------------------------------------------
1240 * v0.27 Began 7/23/94. Froze 9/13/94.
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.
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.
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.
1273 * 3. Add the following to the ray header:
1275 * - offset for azim, range, elev (for moving radar)
1276 * - lat/lon (for moving radar)
1278 * 4. Bilinear interpolation.
1279 * 6. Modify get_ray_above to return a good ray so that QC doesn't zap points
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.
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.
1293 *-------------------------------------------------------------------------
1294 * v0.26 Began 7/23/94.
1296 * 1. Adding cappi_to_carpi.
1297 * 2. Enhanced the Cappi structure; not the same as a sweep anymore.
1299 *-------------------------------------------------------------------------
1300 * v0.26 Began 7/13/94. Froze 7/20/93.
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
1309 * 1. Modifications to makefile to add portibility to building on
1310 * other systems w/o gcc. Change to CFLAGS.
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
1317 *-------------------------------------------------------------------------
1318 * v0.24 Began 6/29/94. Froze 6/29/94
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.
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
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
1339 *-------------------------------------------------------------------------
1340 * v0.22 Began 6/24/94. Froze 6/24/94
1342 * 1. radar_to_uf/uf_to_radar PRF/PRT calculation corrected.
1344 *-------------------------------------------------------------------------
1345 * v0.21 Began 6/24/94. Froze 6/24/94
1347 * 1. radar_to_uf: prf now in microseconds.
1348 * 2. uf_to_radar: prf now converted from microseconds to seconds.
1350 *-------------------------------------------------------------------------
1353 * Need to determine the changes.
1354 *-------------------------------------------------------------------------
1355 * v0.19 Began 6/17/94. Froze: 6/17/94.
1357 * 1. Fixed NULL access in write_radar subroutine.
1359 *-------------------------------------------------------------------------
1360 * v0.19 Began 6/15/94. Froze: 6/15/94.
1362 * 1. Check for NULL in Vget_ray_from_sweep fixes a segmentation fault on
1364 *-------------------------------------------------------------------------
1365 * v0.18 Began 6/11/94. Froze: 6/12/94 2pm.
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.
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).
1387 * 1. Rework Vget_value_from_sweep to do a better search for the value.
1389 *-------------------------------------------------------------------------
1390 * v0.17 Began 6/10/94. Froze 6/10/94 3:30pm.
1392 * 1. Corrected the pulse width calculation in uf_to_radar and in
1394 *-------------------------------------------------------------------------
1395 * v0.16 Began 6/10/94. Froze 6/10/94 12:30pm.
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.
1401 *-------------------------------------------------------------------------
1402 * v0.15 Began 6/7/94. Froze 6/7/94 1pm.
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].
1407 *-------------------------------------------------------------------------
1408 * v0.14 Began 6/2/94. Froze 6/2/94 1pm.
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'
1415 *-------------------------------------------------------------------------
1416 * v0.13 Began 6/2/94. Froze 6/2/94 11am.
1418 * 1. Modified radar_to_uf.c to undo the faking of the headers. This is
1421 *-------------------------------------------------------------------------
1422 * v0.12 Began 5/31/94. Froze 5/31/94 7pm.
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.
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.
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);
1442 *-------------------------------------------------------------------------
1443 * v0.10 Began 5/26/94. Froze 5/27/94 9am.
1445 * 1. Modified the names of the INDEX and MASK variables.
1447 * ZT Total Reflectivity (dBZ) ZT_INDEX
1448 * May be uncommon, but important
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
1460 * DR Differential reflectivity DR_INDEX
1461 * DR and LR are for dual-polarization
1462 * radars only. Unitless or in dB.
1464 * LR Another form of differential ref LR_INDEX
1465 * called LDR, not sure of units
1467 * CZ QC Reflectivity (dBZ), contains
1468 * post-processed QC'd data CZ_INDEX
1470 * VR Radial Velocity (m/s) VR_INDEX
1472 * SW Spectral Width (m2/s2) SW_INDEX
1474 * 2. Fixed some MAX_RADAR_VOLUMES references in the wsr88d_to_radar code.
1476 *-------------------------------------------------------------------------
1477 * v0.9 Began 5/25/94. Froze: 5/26/94, 10am.
1479 * 1. Added lassen_to_radar.c
1482 *-------------------------------------------------------------------------
1483 * v0.8 Began 5/23/94. Froze: 5/24/94, 10am.
1485 * 1. F and INVF handle APFLAG.
1486 * 2. Image generation creates unsigned char images.
1487 * 3. 255-val for negative dBz (val < 0).
1489 *-------------------------------------------------------------------------
1490 * v0.7 Began 4/30/94. Froze: 5/20/94.
1494 * 1. Uses char storage for data values, to reduce RAM allocation.
1496 * 2. F(x) ((x-2)/2. - 64.)
1497 * 0 is for BADVAL. Bad value.
1498 * 1 is for RFVAL. Range folded.
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);
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.
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.
1518 * 6. Made some slight modifications to the Radar header and Volume header.
1520 *-------------------------------------------------------------------------
1521 * v0.6 Began 4/16/94. Froze: 4/30/94.
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:
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);
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 */
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);
1549 * 4. Added 4/3Re calculation to Vget_slantr_and_elev and Vget_groundr...
1550 * 5. Checked for null in the Vclear routines.
1552 *-------------------------------------------------------------------------
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.
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:
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);
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);
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);
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);
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.
1597 * o I have to do something about MAX_RADAR_VOLUMES. We really should
1598 * rely on radar->h.nvolumes;
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)
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
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.
1627 * 2. Added the following functions:
1628 * Volume *Vget_volume(Radar *r, int itype);
1629 * itype = REFLECTIVITY, VELOCITY, or SPECTRUM_WIDTH, etc.
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);
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);
1643 * Radar *QC_radar (Radar *radar);
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).
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.
1664 * 5. Added CAPPI at h. Routine in cappi.c. Cappi type is syntatically
1665 * identical to the Sweep type.
1667 * Cappi *cappi_at_h(Volume *v, float h);
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.
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.
1676 * 8. Improvments to radar.ez and volume.ez.
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)
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).
1693 *-------------------------------------------------------------------------
1694 * v0.3 Began 3/22/94 Froze 3/23/94.
1697 * 1. Implimented the Radar structure. The heart of it is an array of
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
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.
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.
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.
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.
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
1746 *-------------------------------------------------------------------------