]> Pileus Git - ~andy/rsl/blobdiff - wsr88d_merge_split_cuts.c
RSL v1.44
[~andy/rsl] / wsr88d_merge_split_cuts.c
diff --git a/wsr88d_merge_split_cuts.c b/wsr88d_merge_split_cuts.c
new file mode 100644 (file)
index 0000000..fe8f1d8
--- /dev/null
@@ -0,0 +1,129 @@
+#include <math.h>
+#ifndef _rsl_h
+#include "rsl.h"
+#endif
+
+static int merge_split_cuts = 1;
+
+void RSL_wsr88d_merge_split_cuts_on()
+{
+    merge_split_cuts = 1;
+}
+
+void RSL_wsr88d_merge_split_cuts_off()
+{
+    merge_split_cuts = 0;
+}
+
+void RSL_wsr88d_keep_short_refl()
+{
+    RSL_wsr88d_merge_split_cuts_off();
+}
+
+int wsr88d_merge_split_cuts_is_set()
+{
+    return merge_split_cuts;
+}
+
+void wsr88d_remove_extra_refl(Radar *radar)
+{
+    /* This function removes any extra reflectivity for an elevation angle.
+     * I.e., only keep reflectivity from the surveillance sweep of a split cut.
+     */
+
+    int i;
+    float prev_elev;
+
+    prev_elev = radar->v[DZ_INDEX]->sweep[0]->h.elev;
+
+    for (i=1; i < radar->v[DZ_INDEX]->h.nsweeps; i++) {
+        if (radar->v[DZ_INDEX]->sweep[i]) {
+            if (fabsf(radar->v[DZ_INDEX]->sweep[i]->h.elev - prev_elev) < .2) {
+                RSL_free_sweep(radar->v[DZ_INDEX]->sweep[i]);
+                radar->v[DZ_INDEX]->sweep[i] = NULL;
+            }
+            else prev_elev = radar->v[DZ_INDEX]->sweep[i]->h.elev;
+        }
+    }
+}
+
+void wsr88d_move_vcp121_extra_velsweeps(Radar *radar)
+{
+    /* Move the extra velocity and spectrum-width sweeps in VCP 121 split cuts
+     * to other volume indexes.  We do this in order to allow all data moments
+     * at a particular split cut elevation to later be moved to the same sweep
+     * level in the radar structure.
+     */
+
+    int iswp;
+
+    if (radar->v[VR_INDEX] != NULL) {
+        if (radar->v[V2_INDEX] == NULL) {
+            radar->v[V2_INDEX] = RSL_new_volume(radar->v[VR_INDEX]->h.nsweeps);
+            radar->v[V2_INDEX]->h.type_str = "Velocity 2";
+            radar->v[V2_INDEX]->h.f = VR_F;
+            radar->v[V2_INDEX]->h.invf = VR_INVF;
+        }
+        if (radar->v[V3_INDEX] == NULL) {
+            radar->v[V3_INDEX] = RSL_new_volume(radar->v[VR_INDEX]->h.nsweeps);
+            radar->v[V3_INDEX]->h.type_str = "Velocity 3";
+            radar->v[V3_INDEX]->h.f = VR_F;
+            radar->v[V3_INDEX]->h.invf = VR_INVF;
+        }
+    }
+    if (radar->v[SW_INDEX] != NULL) {
+        if (radar->v[S2_INDEX] == NULL) {
+            radar->v[S2_INDEX] = RSL_new_volume(radar->v[SW_INDEX]->h.nsweeps);
+            radar->v[S2_INDEX]->h.type_str = "Spectrum width 2";
+            radar->v[S2_INDEX]->h.f = SW_F;
+            radar->v[S2_INDEX]->h.invf = SW_INVF;
+        }
+        if (radar->v[S3_INDEX] == NULL) {
+            radar->v[S3_INDEX] = RSL_new_volume(radar->v[SW_INDEX]->h.nsweeps);
+            radar->v[S3_INDEX]->h.type_str = "Spectrum width 3";
+            radar->v[S3_INDEX]->h.f = SW_F;
+            radar->v[S3_INDEX]->h.invf = SW_INVF;
+        }
+    }
+
+    for (iswp=2; iswp < 16; iswp++) {
+        switch (iswp) {
+        case 2: case 6: case 9: case 12: case 15:
+            if (radar->v[VR_INDEX] == NULL) break;
+            if (radar->v[VR_INDEX]->sweep[iswp] == NULL) break;
+            radar->v[V2_INDEX]->sweep[iswp] = radar->v[VR_INDEX]->sweep[iswp];
+            radar->v[VR_INDEX]->sweep[iswp] = NULL;
+            if (radar->v[SW_INDEX] == NULL) break;
+            if (radar->v[SW_INDEX]->sweep[iswp] == NULL) break;
+            radar->v[S2_INDEX]->sweep[iswp] = radar->v[SW_INDEX]->sweep[iswp];
+            radar->v[SW_INDEX]->sweep[iswp] = NULL;
+            break;
+        case 3: case 7: case 10: case 13:
+            if (radar->v[VR_INDEX] == NULL) break;
+            if (radar->v[VR_INDEX]->sweep[iswp] == NULL) break;
+            radar->v[V3_INDEX]->sweep[iswp] = radar->v[VR_INDEX]->sweep[iswp];
+            radar->v[VR_INDEX]->sweep[iswp] = NULL;
+            if (radar->v[SW_INDEX] == NULL) break;
+            if (radar->v[SW_INDEX]->sweep[iswp] == NULL) break;
+            radar->v[S3_INDEX]->sweep[iswp] = radar->v[SW_INDEX]->sweep[iswp];
+            radar->v[SW_INDEX]->sweep[iswp] = NULL;
+            break;
+        }
+    }
+}
+
+
+Radar *wsr88d_merge_split_cuts(Radar *radar)
+{
+    /* Move the split-cut sweeps so that all sweeps of an elevation angle
+     * are at the same sweep index in the Radar structure.
+     */
+
+    if (!wsr88d_merge_split_cuts_is_set()) RSL_wsr88d_merge_split_cuts_on();
+
+    wsr88d_remove_extra_refl(radar);
+    if (radar->h.vcp == 121) wsr88d_move_vcp121_extra_velsweeps(radar);
+    radar = RSL_prune_radar(radar);
+
+    return radar;
+}