/* unfoldit -- do a very simple unfolding scheme --
 * 1) aircraft velocity is removed
 * 2) discontinuities greater than vinter/2 are unfolded
 * 3) each good data segment has vinter added to or subtracted
 *    from it until the mean is as close as possible to the
 *    wind component along the ray
 */
#include <stdio.h>
#include <math.h>

#define ACON (1.74532777e-2)       /* convert to radians from degrees */

unfoldit(badlim,vr,gates,vinter,el,az,ua,va,wa,u,v,w)
float badlim;                      /* bad data limit */
float *vr;                         /* radial velocity ray */
int gates;                         /* number of gates */
float vinter;                      /* unfolding interval */
float el,az;                       /* ray elevation and azimuth in degrees */
float ua,va,wa;                    /* aircraft velocity components */
float u,v,w;                       /* wind velocity components */
{
  int good,oldgood,i,j,start;
  float radel,radaz;
  float nx,ny,nz;
  float vaircraft,vwind;
  float vtemp,vmean;

/* compute components of aircraft and wind vel along ray */
  radel = el*ACON;
  radaz = az*ACON;
  nx = cos(radel)*sin(radaz);
  ny = cos(radel)*cos(radaz);
  nz = sin(radel);
  vaircraft = ua*nx + va*ny + wa*nz;
  vwind = u*nx + v*ny + w*nz;

/* for simplicity, make last velocity gate bad so end block is unfolded */
  vr[gates - 1] = badlim*1.01;

/* first, get rid of aircraft velocity */
  for (i = 0; i < gates; i++) {
    if (fabs(vr[i]) < badlim) {
      vr[i] += vaircraft;
    }
  }

/* next, scan through the data again for good data stretches */
  good = 0;
  start = 0;
  for (i = 0; i < gates; i++) {
    oldgood = good;
    good = (fabs(vr[i]) < badlim);

/* transition from bad to good -- mark point */
    if (good && !oldgood) {
      start = i;
    }

/* in good region -- unfolding if needed */
    if (good && oldgood) {
      while (vr[i] > vr[i - 1] + vinter/2.) {
        vr[i] -= vinter;
      }
      while (vr[i] < vr[i - 1] - vinter/2.) {
        vr[i] += vinter;
      }
    }

/* transition from good to bad -- bring block of good vr close to vwind */
    if (!good && oldgood) {

/* first compute mean in good block */
      vmean = 0.;
      for (j = start; j < i; j++) vmean += vr[j];
      vmean /= (float)(i - start);

/* find number of vinter intervals we have to move */
      vtemp = 0.;
      while (vmean > vwind + vinter/2.) {
        vmean -= vinter;
        vtemp -= vinter;
      }
      while (vmean < vwind - vinter/2.) {
        vmean += vinter;
        vtemp += vinter;
      }

/* apply the correction to the block of good data */
      for (j = start; j < i; j++) vr[j] += vtemp;
    }
  }
}
