]> Pileus Git - ~andy/rsl/blobdiff - rsl.h
RSL v1.44
[~andy/rsl] / rsl.h
diff --git a/rsl.h b/rsl.h
index 358072cfbf8198ac4cce705b2ba583b0edd191c9..41cb299f3348ec337ad48b87daa34b6776f6b4e8 100644 (file)
--- a/rsl.h
+++ b/rsl.h
@@ -27,7 +27,7 @@
 #include "config.h"
 #endif
 
-#define RSL_VERSION_STR "v1.40"
+#define RSL_VERSION_STR "v1.44"
 
 /**********************************************************************/
 /* Configure: Define USE_TWO_BYTE_PRECISION to have RSL store internal*/
@@ -46,7 +46,7 @@
 /*            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. */
@@ -103,9 +103,9 @@ enum Rsl_magic_num {
 
 /* 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.
@@ -134,12 +134,11 @@ typedef struct {
   int   minute;/* Date for this ray; minute (0-59).*/
   float sec;   /* Date for this ray; second + fraction of second. */
   float unam_rng;  /* Unambiguous range. (KM). */
-  float azimuth;   /* Azimuth angle. (degrees). Must be positive
-                                       * 0=North, 90=east, -90/270=west.
+  float azimuth;   /* Azimuth angle (degrees). Must be positive.
+                    * 0=North, 90=east, -90/270=west.
                     * This angle is the mean azimuth for the whole ray.
-                                       * Eg. for NSIG the beginning and end azimuths are
-                                       *     averaged.
-                                       */
+                    * E.g. for NSIG the beginning and end azimuths are averaged.
+                    */
   int   ray_num;    /* Ray no. within elevation scan. */
   float elev;       /* Elevation angle. (degrees). */
   int   elev_num;   /* Elevation no. within volume scan. */
@@ -151,6 +150,7 @@ typedef struct {
   float sweep_rate; /* Sweep rate. Full sweeps/min. */
   
   int prf;          /* Pulse repetition frequency, in Hz. */
+  int prf2;         /* Second PRF, for Sigmet dual PRF */
   float azim_rate;  /* Sweep rate in degrees/sec. */
   float fix_angle;  /* Elevation angle for the sweep. (degrees). */
   float pitch;      /* Pitch angle. */
@@ -163,9 +163,9 @@ typedef struct {
   float lon;          /* Longitude (degrees) */
   int   alt;          /* Altitude (m) */
   float rvc;          /* Radial velocity correction (m/sec) */
-  float vel_east;     /* Platform velocity to the east  (m/sec) */
-  float vel_north;    /* Platform velocity to the north (m/sec) */
-  float vel_up;       /* Platform velocity toward up    (m/sec) */
+  float vel_east;     /* Platform velocity to the east (negative for west) (m/sec) */
+  float vel_north;    /* Platform velocity to the north (negative south) (m/sec) */
+  float vel_up;       /* Platform velocity toward up (negative down) (m/sec) */
   int   pulse_count; /* Pulses used in a single dwell time. */
   float pulse_width; /* Pulse width (micro-sec). */
   float beam_width;  /* Beamwidth in degrees. */
@@ -189,7 +189,7 @@ typedef struct {
 
 
 typedef struct _azimuth_hash {
-  Ray *ray;    
+  Ray *ray; 
   struct _azimuth_hash *next, *ray_high, *ray_low;
 } Azimuth_hash;
 
@@ -202,7 +202,9 @@ typedef struct {
 typedef struct {
   int sweep_num;   /* Integer sweep number.  This may be redundant, since
                     * this will be the same as the Volume.sweep array index.*/
-  float elev;      /* Elevation angle (mean) for the sweep. */
+  float elev;      /* Elevation angle (mean) for the sweep. Value is -999 for
+                    * RHI. */
+  float azimuth;   /* Azimuth for the sweep (RHI). Value is -999 for PPI. */
   float beam_width;  /* This is in the ray header too. */
   float vert_half_bw;  /* Vertical beam width divided by 2 */
   float horz_half_bw;  /* Horizontal beam width divided by 2 */
@@ -213,7 +215,7 @@ typedef struct {
 } Sweep_header;
 
 typedef struct {           
-  Sweep_header h;      
+  Sweep_header h;   
   Ray **ray;               /* ray[0..nrays-1]. */
 } Sweep;
 
@@ -226,9 +228,9 @@ typedef struct {
 } 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;
 
 
@@ -295,21 +297,21 @@ typedef Range Slice_value;
 
 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 {
@@ -321,20 +323,21 @@ typedef struct {
   int *data;
 } Histogram;
 
+enum scan_mode {PPI, RHI};
+
 typedef struct {
   int month, day, year;
   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;
@@ -355,6 +358,7 @@ typedef struct {
   int height; /* height of site in meters above sea level*/
   int spulse; /* length of short pulse (ns)*/
   int lpulse; /* length of long pulse (ns) */
+  int scan_mode; /* 0 = PPI, 1 = RHI */
   int vcp;    /* Volume Coverage Pattern (for WSR-88D only) */
 } Radar_header;
 
@@ -374,7 +378,7 @@ typedef struct {
                       * 9 = RH_INDEX = RhoHV: Horz-Vert power corr coeff
                       *10 = PH_INDEX = PhiDP: Differential phase angle
                       *11 = XZ_INDEX = X-band reflectivity.
-                      *12 = CR_INDEX = Corrected DR.
+                      *12 = CD_INDEX = Corrected DR.
                       *13 = MZ_INDEX = DZ mask for 1C-51 HDF.
                       *14 = MR_INDEX = DR mask for 1C-51 HDF.
                       *15 = ZE_INDEX = Edited reflectivity.
@@ -387,7 +391,20 @@ typedef struct {
                       *22 = CV_INDEX
                       *23 = AV_INDEX
                       *24 = SQ_INDEX = Signal Quality Index (Sigmet)
-                               */
+                      *25 = VS_INDEX = Radial Velocity Combined  (DORADE)
+                      *26 = VL_INDEX = Radial Velocity Combined  (DORADE)
+                      *27 = VG_INDEX = Radial Velocity Combined  (DORADE)
+                      *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.
+                      *42 = ET_INDEX = Total Power Enhanced (Sigmet)
+                      *43 = EZ_INDEX = Clutter Corr. Reflectivity Enhanced (Sigmet)
+                */
 
 } Radar;
 
@@ -447,19 +464,41 @@ typedef struct {
  * VE     Edited Velocity.                         VE_INDEX
  *
  * KD     KDP (deg/km) Differencial Phase          KD_INDEX
- *            [Sigmet, Lassen]
+ *            (Sigmet, Lassen)
  *
  * TI     TIME (unknown)  for MCTEX data.          TI_INDEX
- * SQ     SQI: Signal Quality Index. [Sigmet]      SQ_INDEX
+ *
+ * SQ     SQI: Signal Quality Index. (Sigmet)      SQ_INDEX
  *        Decimal fraction from 0 to 1, where 0
  *        is noise, 1 is noiseless.
+ *
+ * VS     Radial Velocity, Short PRT (m/s) (DORADE)   VS_INDEX
+ *
+ * VL     Radial Velocity, Long PRT (m/s)  (DORADE)   VL_INDEX
+ *
+ * VG     Radial Velocity, combined (m/s)  (DORADE)   VG_INDEX
+ *
+ * VT     Radial Velocity, combined (m/s)  (DORADE)   VT_INDEX
+ *
+ * NP     Normalized Coherent Power.       (DORADE)   NP_INDEX
+ *
+ * HC     HydroClass: enumerated class.    (Sigmet)   HC_INDEX
+ *
+ * VC     Radial Velocity corrected for    (Sigmet)   VC_INDEX
+ *        Nyquist unfolding. 
  */
 
 /*
  * The number of *_INDEX must never exceed MAX_RADAR_VOLUMES.
- *  Increase MAX_RADAR_VOLUMES appropriately, for new ingest formats.
+ * Increase MAX_RADAR_VOLUMES appropriately, for new ingest formats.
+ *
+ * Also, when adding new *_INDEXes, you must update the following three arrays
+ * located near the end of this file: RSL_ftype, RSL_f_list, and  RSL_invf_list.
+ * You also need to modify volume.c, updating the initialization of array
+ * rsl_qfield by adding a '1' for each new volume index.
  */
-#define MAX_RADAR_VOLUMES 25
+
+#define MAX_RADAR_VOLUMES 44
 
 #define DZ_INDEX 0
 #define VR_INDEX 1
@@ -486,6 +525,25 @@ typedef struct {
 #define CV_INDEX 22
 #define AV_INDEX 23
 #define SQ_INDEX 24
+#define VS_INDEX 25
+#define VL_INDEX 26
+#define VG_INDEX 27
+#define VT_INDEX 28
+#define NP_INDEX 29
+#define HC_INDEX 30
+#define VC_INDEX 31
+#define V2_INDEX 32
+#define S2_INDEX 33
+#define V3_INDEX 34
+#define S3_INDEX 35
+#define CR_INDEX 36
+#define CC_INDEX 37
+#define PR_INDEX 38
+#define SD_INDEX 39
+#define ZZ_INDEX 40
+#define RD_INDEX 41
+#define ET_INDEX 42
+#define EZ_INDEX 43
 
 
 /* Prototypes for functions. */
@@ -495,7 +553,6 @@ typedef struct {
 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);
@@ -594,7 +651,7 @@ int RSL_write_radar_gzip(Radar *radar, char *outfile);
 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);
@@ -631,7 +688,7 @@ void RSL_load_red_table(char *infile);
 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_radar_to_uf(Radar *r, char *outfile);
 void RSL_radar_to_uf_gzip(Radar *r, char *outfile);
@@ -645,7 +702,7 @@ void RSL_rebin_zdr_ray(Ray *r);
 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);
@@ -657,7 +714,7 @@ void RSL_volume_to_pgm(Volume *v, char *basename, int xdim, int ydim, float rang
 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,
@@ -665,22 +722,21 @@ 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);
@@ -688,14 +744,14 @@ 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);
@@ -704,18 +760,18 @@ FILE *compress_pipe (FILE *fp);
 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.
@@ -745,6 +801,14 @@ float AH_F(Range x);
 float CV_F(Range x);
 float AV_F(Range x);
 float SQ_F(Range x);
+float VS_F(Range x);
+float VL_F(Range x);
+float VG_F(Range x);
+float VT_F(Range x);
+float NP_F(Range x);
+float HC_F(Range x);
+float VC_F(Range x);
+float SD_F(Range x);
 
 Range DZ_INVF(float x);
 Range VR_INVF(float x);
@@ -771,6 +835,14 @@ Range AH_INVF(float x);
 Range CV_INVF(float x);
 Range AV_INVF(float x);
 Range SQ_INVF(float x);
+Range VS_INVF(float x);
+Range VL_INVF(float x);
+Range VG_INVF(float x);
+Range VT_INVF(float x);
+Range NP_INVF(float x);
+Range HC_INVF(float x);
+Range VC_INVF(float x);
+Range SD_INVF(float x);
 
 
 /* If you like these variables, you can use them in your application
@@ -778,23 +850,32 @@ Range SQ_INVF(float x);
  */
 #ifdef USE_RSL_VARS
 static char *RSL_ftype[] = {"DZ", "VR", "SW", "CZ", "ZT", "DR", 
-                           "LR", "ZD", "DM", "RH", "PH", "XZ", 
-                           "CD", "MZ", "MD", "ZE", "VE", "KD", 
-                           "TI", "DX", "CH", "AH", "CV", "AV",
-                            "SQ"};
+                            "LR", "ZD", "DM", "RH", "PH", "XZ", 
+                            "CD", "MZ", "MD", "ZE", "VE", "KD", 
+                            "TI", "DX", "CH", "AH", "CV", "AV",
+                            "SQ", "VS", "VL", "VG", "VT", "NP",
+                            "HC", "VC", "V2", "S2", "V3", "S3",
+                            "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,
-                                         CD_F, MZ_F, MD_F, ZE_F, VE_F, KD_F,
-                                         TI_F, DX_F, CH_F, AH_F, CV_F, AV_F,
-                                         SQ_F};
+                                          LR_F, ZD_F, DM_F, RH_F, PH_F, XZ_F,
+                                          CD_F, MZ_F, MD_F, ZE_F, VE_F, KD_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,
+                                          ZT_F, DZ_F};
 
 static  Range (*RSL_invf_list[])(float x)
-        = {DZ_INVF, VR_INVF, SW_INVF, CZ_INVF, ZT_INVF, DR_INVF, 
-           LR_INVF, ZD_INVF, DM_INVF, RH_INVF, PH_INVF, XZ_INVF, 
-           CD_INVF, MZ_INVF, MD_INVF, ZE_INVF, VE_INVF, KD_INVF,
-           TI_INVF, DX_INVF, CH_INVF, AH_INVF, CV_INVF, AV_INVF,
-           SQ_INVF};
+         = {DZ_INVF, VR_INVF, SW_INVF, CZ_INVF, ZT_INVF, DR_INVF, 
+            LR_INVF, ZD_INVF, DM_INVF, RH_INVF, PH_INVF, XZ_INVF, 
+            CD_INVF, MZ_INVF, MD_INVF, ZE_INVF, VE_INVF, KD_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,
+            ZT_INVF, DZ_INVF};
 #endif
 /* Secret routines that are quite useful and useful to developers. */
 void radar_load_date_time(Radar *radar);
@@ -809,6 +890,13 @@ Hash_table *construct_sweep_hash_table(Sweep *s);
 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);