+/* Load the radar into a Grits Volume */
+static void _cart_to_sphere(VolCoord *out, VolCoord *in)
+{
+ gdouble angle = in->x;
+ gdouble dist = in->y;
+ gdouble tilt = in->z;
+ gdouble lx = sin(angle);
+ gdouble ly = cos(angle);
+ gdouble lz = sin(tilt);
+ //out->x = (ly*dist)/20000;
+ //out->y = (lz*dist)/10000-0.5;
+ //out->z = (lx*dist)/20000-1.5;
+ out->x = (lx*dist);
+ out->y = (ly*dist);
+ out->z = (lz*dist);
+}
+
+static VolGrid *_load_grid(Volume *vol)
+{
+ g_debug("AWeatherLevel2: _load_grid");
+
+ Sweep *sweep = vol->sweep[0];
+ Ray *ray = sweep->ray[0];
+ gint nsweeps = vol->h.nsweeps;
+ gint nrays = sweep->h.nrays/(1/sweep->h.beam_width)+1;
+ gint nbins = ray->h.nbins /(1000/ray->h.gate_size);
+ nbins = MIN(nbins, 100);
+
+ VolGrid *grid = vol_grid_new(nrays, nbins, nsweeps);
+
+ gint rs, bs, val;
+ gint si=0, ri=0, bi=0;
+ for (si = 0; si < nsweeps; si++) {
+ sweep = vol->sweep[si];
+ rs = 1.0/sweep->h.beam_width;
+ for (ri = 0; ri < nrays; ri++) {
+ /* TODO: missing rays, pick ri based on azmith */
+ ray = sweep->ray[(ri*rs) % sweep->h.nrays];
+ bs = 1000/ray->h.gate_size;
+ for (bi = 0; bi < nbins; bi++) {
+ if (bi*bs >= ray->h.nbins)
+ break;
+ val = ray->h.f(ray->range[bi*bs]);
+ if (val == BADVAL || val == RFVAL ||
+ val == APFLAG || val == NOECHO ||
+ val == NOTFOUND_H || val == NOTFOUND_V ||
+ val > 80)
+ val = 0;
+ VolPoint *point = vol_grid_get(grid, ri, bi, si);
+ point->value = val;
+ point->c.x = deg2rad(ray->h.azimuth);
+ point->c.y = bi*bs*ray->h.gate_size + ray->h.range_bin1;
+ point->c.z = deg2rad(ray->h.elev);
+ } } }
+
+ for (si = 0; si < nsweeps; si++)
+ for (ri = 0; ri < nrays; ri++)
+ for (bi = 0; bi < nbins; bi++) {
+ VolPoint *point = vol_grid_get(grid, ri, bi, si);
+ if (point->c.y == 0)
+ point->value = nan("");
+ else
+ _cart_to_sphere(&point->c, &point->c);
+ }
+ return grid;
+}
+