X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fwsr88d_merge_split_cuts.c;fp=src%2Fwsr88d_merge_split_cuts.c;h=fe8f1d81ad6e5af73b4f3b58b28cac0c2dc8545c;hb=dd2c9b42e69e72e536a4176316ea1e825485a88f;hp=0000000000000000000000000000000000000000;hpb=5ef44003b45c7eb13fd3f7c86a933dba4c21a190;p=~andy%2Frsl diff --git a/src/wsr88d_merge_split_cuts.c b/src/wsr88d_merge_split_cuts.c new file mode 100644 index 0000000..fe8f1d8 --- /dev/null +++ b/src/wsr88d_merge_split_cuts.c @@ -0,0 +1,129 @@ +#include +#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; +}