#include "config.h"
#endif
-#define RSL_VERSION_STR "v1.42"
+#define RSL_VERSION_STR "v1.44"
/**********************************************************************/
/* Configure: Define USE_TWO_BYTE_PRECISION to have RSL store internal*/
/* so you shouldn't have to modify anything here. */
/**********************************************************************/
#ifndef COLORDIR
-#define COLORDIR "/usr/local/trmm/GVBOX/lib/colors"
+#define COLORDIR "/home/kelley/trmm/lib/colors"
#endif
/* These are the color table indexes. See RSL_set/get_color_table. */
/* File format types recognized by RSL. */
enum File_type {UNKNOWN, WSR88D_FILE, UF_FILE, LASSEN_FILE,
- TOGA_FILE, NSIG_FILE_V1, NSIG_FILE_V2,
- RSL_FILE, MCGILL_FILE, HDF_FILE, RAPIC_FILE,
- RADTEC_FILE, EDGE_FILE, DORADE_FILE, RAINBOW_FILE};
+ TOGA_FILE, NSIG_FILE_V1, NSIG_FILE_V2,
+ RSL_FILE, MCGILL_FILE, HDF_FILE, RAPIC_FILE,
+ RADTEC_FILE, DORADE_FILE, RAINBOW_FILE};
/* Pick a BADVAL that is out of range. That is, the range
* of the conversion cannot include these reserved values.
typedef struct _azimuth_hash {
- Ray *ray;
+ Ray *ray;
struct _azimuth_hash *next, *ray_high, *ray_low;
} Azimuth_hash;
} Sweep_header;
typedef struct {
- Sweep_header h;
+ Sweep_header h;
Ray **ray; /* ray[0..nrays-1]. */
} Sweep;
} Volume_header;
typedef struct {
- Volume_header h; /* Specific info for each elev. */
- /* Includes resolution: km/bin. */
- Sweep **sweep; /* sweep[0..nsweeps-1]. */
+ Volume_header h; /* Specific info for each elev. */
+ /* Includes resolution: km/bin. */
+ Sweep **sweep; /* sweep[0..nsweeps-1]. */
} Volume;
typedef struct
{
- float lat, lon;
- float dx, dy, dz;
- int nx, ny, nz;
- char *data_type;
- Carpi **carpi; /* Pointers to carpi[0] thru carpi[nz-1] */
+ float lat, lon;
+ float dx, dy, dz;
+ int nx, ny, nz;
+ char *data_type;
+ Carpi **carpi; /* Pointers to carpi[0] thru carpi[nz-1] */
} Cube;
typedef struct
{
- float dx, dy;
- int nx, ny;
- char *data_type;
+ float dx, dy;
+ int nx, ny;
+ char *data_type;
float (*f)(Slice_value x); /* Data conversion function. f(x). */
Slice_value (*invf)(float x); /* Data conversion function. invf(x). */
- Slice_value **data; /* data[ny][nx]. */
+ Slice_value **data; /* data[ny][nx]. */
} Slice;
typedef struct {
int hour, minute;
float sec; /* Second plus fractional part. */
char radar_type[50]; /* Type of radar. Use for QC-ing the data.
- * Supported types are:
+ * Supported types are:
* "wsr88d", "lassen", "uf",
* "nsig", "mcgill",
- * "kwajalein", "rsl", "toga",
+ * "kwajalein", "rsl", "toga",
* "rapic", (rapic is Berrimah Austrailia)
- * "radtec", (SPANDAR radar at Wallops Is, VA)
- * "EDGE",
- * "dorade",
- * "south_africa".
+ * "radtec", (SPANDAR radar at Wallops Is, VA)
+ * "dorade",
+ * "south_africa".
* Set by appropriate ingest routine.
*/
int nvolumes;
*28 = VT_INDEX = Radial Velocity Combined (DORADE)
*29 = NP_INDEX = Normalized Coherent Power (DORADE)
*30 = HC_INDEX = HydroClass (Sigmet)
- *31 = VC_INDEX = Radial Velocity Corrected (Sigmet)
- *32 = V2_INDEX = Radial Velocity for VCP 121 second Doppler cut.
- *33 = S2_INDEX = Spectrum Width for VCP 121 second Doppler cut.
- *34 = V3_INDEX = Radial Velocity for VCP 121 third Doppler cut.
- *35 = S3_INDEX = Spectrum Width for VCP 121 third Doppler cut.
+ *31 = VC_INDEX = Radial Velocity Corrected (Sigmet)
+ *32 = V2_INDEX = Radial Velocity for VCP 121 second Doppler cut.
+ *33 = S2_INDEX = Spectrum Width for VCP 121 second Doppler cut.
+ *34 = V3_INDEX = Radial Velocity for VCP 121 third Doppler cut.
+ *35 = S3_INDEX = Spectrum Width for VCP 121 third Doppler cut.
+ *42 = ET_INDEX = Total Power Enhanced (Sigmet)
+ *43 = EZ_INDEX = Clutter Corr. Reflectivity Enhanced (Sigmet)
*/
} Radar;
* rsl_qfield by adding a '1' for each new volume index.
*/
-#define MAX_RADAR_VOLUMES 42
+#define MAX_RADAR_VOLUMES 44
#define DZ_INDEX 0
#define VR_INDEX 1
#define SD_INDEX 39
#define ZZ_INDEX 40
#define RD_INDEX 41
+#define ET_INDEX 42
+#define EZ_INDEX 43
/* Prototypes for functions. */
Radar *RSL_africa_to_radar(char *infile);
Radar *RSL_anyformat_to_radar(char *infile, ...);
Radar *RSL_dorade_to_radar(char *infile);
-Radar *RSL_EDGE_to_radar(char *infile);
Radar *RSL_fix_radar_header(Radar *radar);
Radar *RSL_get_window_from_radar(Radar *r, float min_range, float max_range,float low_azim, float hi_azim);
Radar *RSL_hdf_to_radar(char *infile);
int RSL_write_volume(Volume *v, FILE *fp);
unsigned char *RSL_rhi_sweep_to_cart(Sweep *s, int xdim, int ydim, float range,
- int vert_scale);
+ int vert_scale);
unsigned char *RSL_sweep_to_cart(Sweep *s, int xdim, int ydim, float range);
void RSL_add_dbz_offset_to_ray(Ray *r, float dbz_offset);
void RSL_load_green_table(char *infile);
void RSL_load_blue_table(char *infile);
void RSL_print_histogram(Histogram *histogram, int min_range, int max_range,
- char *filename);
+ char *filename);
void RSL_print_version();
-void RSL_prune_radar_on();
-void RSL_prune_radar_off();
void RSL_radar_to_uf(Radar *r, char *outfile);
void RSL_radar_to_uf_gzip(Radar *r, char *outfile);
void RSL_radar_verbose_off(void);
void RSL_rebin_zdr_sweep(Sweep *s);
void RSL_rebin_zdr_volume(Volume *v);
void RSL_rhi_sweep_to_gif(Sweep *s, char *outfile, int xdim, int ydim, float range,
- int vert_scale);
+ int vert_scale);
void RSL_select_fields(char *field_type, ...);
void RSL_set_color_table(int icolor, char buffer[256], int ncolors);
void RSL_sweep_to_gif(Sweep *s, char *outfile, int xdim, int ydim, float range);
void RSL_volume_to_pict(Volume *v, char *basename, int xdim, int ydim, float range);
void RSL_volume_to_ppm(Volume *v, char *basename, int xdim, int ydim, float range);
void RSL_write_gif(char *outfile, unsigned char *image,
- int xdim, int ydim, char c_table[256][3]);
+ int xdim, int ydim, char c_table[256][3]);
void RSL_write_pgm(char *outfile, unsigned char *image,
int xdim, int ydim);
void RSL_write_pict(char *outfile, unsigned char *image,
void RSL_write_ppm(char *outfile, unsigned char *image,
int xdim, int ydim, char c_table[256][3]);
-
Cappi *RSL_new_cappi(Sweep *sweep, float height);
Cappi *RSL_cappi_at_h(Volume *v, float height, float max_range);
Carpi *RSL_cappi_to_carpi(Cappi *cappi, float dx, float dy,
- float lat, float lon,
- int nx, int ny, int radar_x, int radar_y);
+ float lat, float lon,
+ int nx, int ny, int radar_x, int radar_y);
Carpi *RSL_new_carpi(int nrows, int ncols);
Carpi *RSL_volume_to_carpi(Volume *v, float h, float grnd_r,
- float dx, float dy, int nx, int ny,
- int radar_x, int radar_y, float lat, float lon);
+ float dx, float dy, int nx, int ny,
+ int radar_x, int radar_y, float lat, float lon);
Cube *RSL_new_cube(int ncarpi);
Cube *RSL_volume_to_cube(Volume *v, float dx, float dy, float dz,
- int nx, int ny, int nz, float grnd_r,
- int radar_x, int radar_y, int radar_z);
+ int nx, int ny, int nz, float grnd_r,
+ int radar_x, int radar_y, int radar_z);
Slice *RSL_new_slice(int nrows, int ncols);
Slice *RSL_get_slice_from_cube(Cube *cube, int x, int y, int z);
Histogram *RSL_allocate_histogram(int low, int hi);
Histogram *RSL_get_histogram_from_ray(Ray *ray, Histogram *histogram,
- int low, int hi, int min_range,
- int max_range);
+ int low, int hi, int min_range,
+ int max_range);
Histogram *RSL_get_histogram_from_sweep(Sweep *sweep, Histogram *histogram,
- int low, int hi, int min_range,
- int max_range);
+ int low, int hi, int min_range,
+ int max_range);
Histogram *RSL_get_histogram_from_volume(Volume *volume, Histogram *histogram,
- int low, int hi, int min_range,
- int max_range);
+ int low, int hi, int min_range,
+ int max_range);
Histogram *RSL_read_histogram(char *infile);
int no_command (char *cmd);
int rsl_pclose(FILE *fp);
/* Carpi image generation functions. These are modified clones of the
- corresponding sweep image generation functions.
+ corresponding sweep image generation functions.
*/
unsigned char *RSL_carpi_to_cart(Carpi *carpi, int xdim, int ydim,
- float range);
+ float range);
void RSL_carpi_to_gif(Carpi *carpi, char *outfile, int xdim, int ydim,
- float range);
+ float range);
void RSL_carpi_to_pict(Carpi *carpi, char *outfile, int xdim, int ydim,
- float range);
+ float range);
void RSL_carpi_to_ppm(Carpi *carpi, char *outfile, int xdim, int ydim,
- float range);
+ float range);
void RSL_carpi_to_pgm(Carpi *carpi, char *outfile, int xdim, int ydim,
- float range);
+ float range);
/* Internal storage conversion functions. These may be any conversion and
* may be dynamically defined; based on the input data conversion.
"TI", "DX", "CH", "AH", "CV", "AV",
"SQ", "VS", "VL", "VG", "VT", "NP",
"HC", "VC", "V2", "S2", "V3", "S3",
- "CR", "CC", "PR", "SD", "ZZ", "RD"};
+ "CR", "CC", "PR", "SD", "ZZ", "RD",
+ "ET", "EZ"};
static float (*RSL_f_list[])(Range x) = {DZ_F, VR_F, SW_F, CZ_F, ZT_F, DR_F,
LR_F, ZD_F, DM_F, RH_F, PH_F, XZ_F,
TI_F, DX_F, CH_F, AH_F, CV_F, AV_F,
SQ_F, VS_F, VL_F, VG_F, VT_F, NP_F,
HC_F, VC_F, VR_F, SW_F, VR_F, SW_F,
- DZ_F, CZ_F, PH_F, SD_F, DZ_F, DZ_F};
+ DZ_F, CZ_F, PH_F, SD_F, DZ_F, DZ_F,
+ ZT_F, DZ_F};
static Range (*RSL_invf_list[])(float x)
= {DZ_INVF, VR_INVF, SW_INVF, CZ_INVF, ZT_INVF, DR_INVF,
TI_INVF, DX_INVF, CH_INVF, AH_INVF, CV_INVF, AV_INVF,
SQ_INVF, VS_INVF, VL_INVF, VG_INVF, VT_INVF, NP_INVF,
HC_INVF, VC_INVF, VR_INVF, SW_INVF, VR_INVF, SW_INVF,
- DZ_INVF, CZ_INVF, PH_INVF, SD_INVF, DZ_INVF, DZ_INVF};
+ DZ_INVF, CZ_INVF, PH_INVF, SD_INVF, DZ_INVF, DZ_INVF,
+ ZT_INVF, DZ_INVF};
#endif
/* Secret routines that are quite useful and useful to developers. */
void radar_load_date_time(Radar *radar);
double angle_diff(float x, float y);
int rsl_query_field(char *c_field);
+/* Functions for controlling handling of WSR-88D split cuts. */
+void RSL_wsr88d_merge_split_cuts_on();
+void RSL_wsr88d_merge_split_cuts_off();
+void RSL_wsr88d_keep_short_refl();
+int wsr88d_merge_split_cuts_is_set();
+
+Radar *wsr88d_merge_split_cuts(Radar *radar);
/* Debugging prototypes. */
void poke_around_volume(Volume *v);