]> Pileus Git - ~andy/rsl/blob - examples/print_hash_table.c
Merge branch 'master' into aweather
[~andy/rsl] / examples / print_hash_table.c
1 /*
2  * Ingest NEXRAD (wsr88d) data and print the azimuth hash table created.
3  *
4  * This example is the most minimum of coding that you need to do
5  * to achieve good results from using the RSL code.
6  *
7  * This is short and sweet to demonstrate the simplicity of use for
8  * the RSL.
9  *
10  */
11
12 #include <stdlib.h>
13 #include "rsl.h"
14
15 void print_link_list(Azimuth_hash *list)
16 {
17   if (list == NULL) {
18         printf("\n");
19         return;
20   }
21   printf("ray# %d azim %f, hi# %d lo# %d|", list->ray->h.ray_num, list->ray->h.azimuth, list->ray_high->ray->h.ray_num, list->ray_low->ray->h.ray_num);
22   print_link_list(list->next);
23 }
24   
25
26 /*
27  * Cannot compile if the hash table is static in volume.c.  For
28  * testing we make it globally known.
29  */
30
31 typedef struct {
32   Sweep *s_addr;
33   Hash_table *hash;
34 } Sweep_list;
35
36 extern int RSL_max_sweeps; /* Initial allocation for sweep_list.
37                                                         * RSL_new_sweep will allocate the space first
38                                                         * time around.
39                                                         */
40 extern int RSL_nsweep_addr; /* A count of sweeps in the table. */
41 extern Sweep_list *RSL_sweep_list;
42 extern int RSL_nextents;
43
44 void print_hash_table (Sweep *s)
45 {
46   int i;
47   int sweep_index;
48   Azimuth_hash *index;
49   float azim;
50   float res;
51   int SWEEP_INDEX(Sweep *s); // From Volume.c
52
53   if (s == NULL) return;
54   sweep_index = SWEEP_INDEX(s);
55   res = 360.0/RSL_sweep_list[sweep_index].hash->nindexes;
56   printf("Azimuth resolution = %f for %d bins.\n", res, RSL_sweep_list[sweep_index].hash->nindexes);
57   for (i=0; i<RSL_sweep_list[sweep_index].hash->nindexes; i++) {
58         index = RSL_sweep_list[sweep_index].hash->indexes[i];
59         azim = i/res;
60         printf("RSL_sweep_list[%d].hash->indexes[%d] = ", sweep_index, i);
61         
62         if (index == NULL) 
63           printf("IS NULL\n");
64         else 
65           print_link_list(index);
66   }
67 }
68
69 void poke_about_sweep(Sweep *s)
70 {
71   /* This routine demonstrates that the azimuth we want is the azimuth
72    * we get.
73    */
74   float azim, res;
75   Ray *ray;
76
77   ray = RSL_get_first_ray_of_sweep(s);
78   res = 360.0/s->h.nrays;
79   for (azim=0; azim<360; azim+=res) {
80         ray = RSL_get_ray_from_sweep(s, azim);
81         if (ray)
82           printf("Azimuth %f matched in ray # %d, h.azimuth= %f, diff=%f\n",
83                          azim, ray->h.ray_num, ray->h.azimuth,
84                          ray->h.azimuth-azim);
85         else
86           printf("Azimuth %f NOT FOUND within 1/2 beamwidth; 1/2beam=%f\n",
87                          azim, s->h.horz_half_bw);
88   }
89 }
90
91
92 int main(int argc, char **argv)
93 {
94   Radar *radar;
95   Sweep *sweep;
96
97   if (argc != 3) {fprintf(stderr, "Usage: %s infile callid_or_firstfile\n", argv[0]); exit(-1);}
98   RSL_radar_verbose_on();
99   radar = RSL_wsr88d_to_radar(argv[1], argv[2]);
100   if (radar == NULL) exit(-1);
101 /***********************************************************************/
102 /*                                                                     */
103 /*            You now have a pointer to Radar.                         */
104 /*            Now use *radar all you like.                             */
105 /*                                                                     */
106 /***********************************************************************/
107
108 /* Use radar->v[DZ_INDEX] for REFELECTIVITY
109  *     radar->v[VR_INDEX] for VELOCITY
110  *     radar->v[SW_INDEX] for SPECTRUM_WIDTH
111  */
112
113   sweep = RSL_get_first_sweep_of_volume(radar->v[DZ_INDEX]);
114   print_hash_table(sweep);
115
116   poke_about_sweep(sweep);
117
118   exit(0);
119
120 }
121
122
123