]> Pileus Git - ~andy/rsl/blob - wsr88d_merge_split_cuts.c
RSL v1.44
[~andy/rsl] / wsr88d_merge_split_cuts.c
1 #include <math.h>
2 #ifndef _rsl_h
3 #include "rsl.h"
4 #endif
5
6 static int merge_split_cuts = 1;
7
8 void RSL_wsr88d_merge_split_cuts_on()
9 {
10     merge_split_cuts = 1;
11 }
12
13 void RSL_wsr88d_merge_split_cuts_off()
14 {
15     merge_split_cuts = 0;
16 }
17
18 void RSL_wsr88d_keep_short_refl()
19 {
20     RSL_wsr88d_merge_split_cuts_off();
21 }
22
23 int wsr88d_merge_split_cuts_is_set()
24 {
25     return merge_split_cuts;
26 }
27
28 void wsr88d_remove_extra_refl(Radar *radar)
29 {
30     /* This function removes any extra reflectivity for an elevation angle.
31      * I.e., only keep reflectivity from the surveillance sweep of a split cut.
32      */
33
34     int i;
35     float prev_elev;
36
37     prev_elev = radar->v[DZ_INDEX]->sweep[0]->h.elev;
38
39     for (i=1; i < radar->v[DZ_INDEX]->h.nsweeps; i++) {
40         if (radar->v[DZ_INDEX]->sweep[i]) {
41             if (fabsf(radar->v[DZ_INDEX]->sweep[i]->h.elev - prev_elev) < .2) {
42                 RSL_free_sweep(radar->v[DZ_INDEX]->sweep[i]);
43                 radar->v[DZ_INDEX]->sweep[i] = NULL;
44             }
45             else prev_elev = radar->v[DZ_INDEX]->sweep[i]->h.elev;
46         }
47     }
48 }
49
50 void wsr88d_move_vcp121_extra_velsweeps(Radar *radar)
51 {
52     /* Move the extra velocity and spectrum-width sweeps in VCP 121 split cuts
53      * to other volume indexes.  We do this in order to allow all data moments
54      * at a particular split cut elevation to later be moved to the same sweep
55      * level in the radar structure.
56      */
57
58     int iswp;
59
60     if (radar->v[VR_INDEX] != NULL) {
61         if (radar->v[V2_INDEX] == NULL) {
62             radar->v[V2_INDEX] = RSL_new_volume(radar->v[VR_INDEX]->h.nsweeps);
63             radar->v[V2_INDEX]->h.type_str = "Velocity 2";
64             radar->v[V2_INDEX]->h.f = VR_F;
65             radar->v[V2_INDEX]->h.invf = VR_INVF;
66         }
67         if (radar->v[V3_INDEX] == NULL) {
68             radar->v[V3_INDEX] = RSL_new_volume(radar->v[VR_INDEX]->h.nsweeps);
69             radar->v[V3_INDEX]->h.type_str = "Velocity 3";
70             radar->v[V3_INDEX]->h.f = VR_F;
71             radar->v[V3_INDEX]->h.invf = VR_INVF;
72         }
73     }
74     if (radar->v[SW_INDEX] != NULL) {
75         if (radar->v[S2_INDEX] == NULL) {
76             radar->v[S2_INDEX] = RSL_new_volume(radar->v[SW_INDEX]->h.nsweeps);
77             radar->v[S2_INDEX]->h.type_str = "Spectrum width 2";
78             radar->v[S2_INDEX]->h.f = SW_F;
79             radar->v[S2_INDEX]->h.invf = SW_INVF;
80         }
81         if (radar->v[S3_INDEX] == NULL) {
82             radar->v[S3_INDEX] = RSL_new_volume(radar->v[SW_INDEX]->h.nsweeps);
83             radar->v[S3_INDEX]->h.type_str = "Spectrum width 3";
84             radar->v[S3_INDEX]->h.f = SW_F;
85             radar->v[S3_INDEX]->h.invf = SW_INVF;
86         }
87     }
88
89     for (iswp=2; iswp < 16; iswp++) {
90         switch (iswp) {
91         case 2: case 6: case 9: case 12: case 15:
92             if (radar->v[VR_INDEX] == NULL) break;
93             if (radar->v[VR_INDEX]->sweep[iswp] == NULL) break;
94             radar->v[V2_INDEX]->sweep[iswp] = radar->v[VR_INDEX]->sweep[iswp];
95             radar->v[VR_INDEX]->sweep[iswp] = NULL;
96             if (radar->v[SW_INDEX] == NULL) break;
97             if (radar->v[SW_INDEX]->sweep[iswp] == NULL) break;
98             radar->v[S2_INDEX]->sweep[iswp] = radar->v[SW_INDEX]->sweep[iswp];
99             radar->v[SW_INDEX]->sweep[iswp] = NULL;
100             break;
101         case 3: case 7: case 10: case 13:
102             if (radar->v[VR_INDEX] == NULL) break;
103             if (radar->v[VR_INDEX]->sweep[iswp] == NULL) break;
104             radar->v[V3_INDEX]->sweep[iswp] = radar->v[VR_INDEX]->sweep[iswp];
105             radar->v[VR_INDEX]->sweep[iswp] = NULL;
106             if (radar->v[SW_INDEX] == NULL) break;
107             if (radar->v[SW_INDEX]->sweep[iswp] == NULL) break;
108             radar->v[S3_INDEX]->sweep[iswp] = radar->v[SW_INDEX]->sweep[iswp];
109             radar->v[SW_INDEX]->sweep[iswp] = NULL;
110             break;
111         }
112     }
113 }
114
115
116 Radar *wsr88d_merge_split_cuts(Radar *radar)
117 {
118     /* Move the split-cut sweeps so that all sweeps of an elevation angle
119      * are at the same sweep index in the Radar structure.
120      */
121
122     if (!wsr88d_merge_split_cuts_is_set()) RSL_wsr88d_merge_split_cuts_on();
123
124     wsr88d_remove_extra_refl(radar);
125     if (radar->h.vcp == 121) wsr88d_move_vcp121_extra_velsweeps(radar);
126     radar = RSL_prune_radar(radar);
127
128     return radar;
129 }