]> Pileus Git - ~andy/rsl/commitdiff
Pass pointers instead of copying all the ray data
authorAndy Spencer <andy753421@gmail.com>
Thu, 3 Feb 2011 07:21:01 +0000 (07:21 +0000)
committerAndy Spencer <andy753421@gmail.com>
Thu, 3 Feb 2011 07:21:01 +0000 (07:21 +0000)
wsr88d_m31.c

index 5902cd4c46b0e09d255ac15695d4c9135d28717a..015b1cc09271d5a4f81d860eb9a16a4f57038aab 100644 (file)
@@ -317,14 +317,14 @@ int read_wsr88d_ray_m31(Wsr88d_file *wf, int msg_size,
 }
 
 
-void wsr88d_load_ray_hdr(Wsr88d_ray_m31 wsr88d_ray, Ray *ray)
+void wsr88d_load_ray_hdr(Wsr88d_ray_m31 *wsr88d_ray, Ray *ray)
 {
     int month, day, year, hour, minute, sec;
     float fsec;
     Wsr88d_ray m1_ray;
     Ray_header_m31 ray_hdr;
 
-    ray_hdr = wsr88d_ray.ray_hdr;
+    ray_hdr = wsr88d_ray->ray_hdr;
     m1_ray.ray_date = ray_hdr.ray_date;
     m1_ray.ray_time = ray_hdr.ray_time;
 
@@ -340,8 +340,8 @@ void wsr88d_load_ray_hdr(Wsr88d_ray_m31 wsr88d_ray, Ray *ray)
     ray->h.ray_num = ray_hdr.azm_num;
     ray->h.elev = ray_hdr.elev;
     ray->h.elev_num = ray_hdr.elev_num;
-    ray->h.unam_rng = wsr88d_ray.unamb_rng;
-    ray->h.nyq_vel = wsr88d_ray.nyq_vel;
+    ray->h.unam_rng = wsr88d_ray->unamb_rng;
+    ray->h.nyq_vel = wsr88d_ray->nyq_vel;
     int elev_index;
     elev_index = ray_hdr.elev_num - 1;
     ray->h.azim_rate = vcp_data.azim_rate[elev_index];
@@ -356,7 +356,7 @@ void wsr88d_load_ray_hdr(Wsr88d_ray_m31 wsr88d_ray, Ray *ray)
      */
     m1_ray.vol_cpat = vcp_data.vcp;
     m1_ray.elev_num = ray_hdr.elev_num;
-    m1_ray.unam_rng = (short) (wsr88d_ray.unamb_rng * 10.);
+    m1_ray.unam_rng = (short) (wsr88d_ray->unamb_rng * 10.);
     /* Get values from message type 1 routines. */
     ray->h.frequency = wsr88d_get_frequency(&m1_ray);
     ray->h.pulse_width = wsr88d_get_pulse_width(&m1_ray);
@@ -384,16 +384,15 @@ int wsr88d_get_vol_index(char* dataname)
 #define MAXRAYS_M31 800
 #define MAXSWEEPS 20
 
-void wsr88d_load_ray(Wsr88d_ray_m31 wsr88d_ray, int data_ptr,
+void wsr88d_load_ray(Wsr88d_ray_m31 *wsr88d_ray,
+       Data_moment_hdr *hdr, void *data,
        int isweep, int iray, Radar *radar)
 {
     /* Load data into ray structure for this field or data moment. */
 
-    Data_moment_hdr data_hdr;
     int ngates;
     int i, hdr_size;
     float value, scale, offset;
-    void *data;
     Range (*invf)(float x);
     float (*f)(Range x);
     Ray *ray;
@@ -403,16 +402,10 @@ void wsr88d_load_ray(Wsr88d_ray_m31 wsr88d_ray, int data_ptr,
     enum waveforms {surveillance=1, doppler_w_amb_res, doppler_no_amb_res,
        batch};
 
-    /* Get data moment header. */
-    hdr_size = sizeof(data_hdr);
-    memcpy(&data_hdr, &wsr88d_ray.data[data_ptr], hdr_size);
-    data_ptr += hdr_size;
-    if (little_endian()) wsr88d_swap_data_hdr(&data_hdr);
-
-    vol_index = wsr88d_get_vol_index(data_hdr.dataname);
+    vol_index = wsr88d_get_vol_index(hdr->dataname);
     if (vol_index < 0) {
        fprintf(stderr,"wsr88d_load_ray: Unknown dataname %s.  isweep = %d, "
-               "iray = %d.\n", data_hdr.dataname, isweep, iray);
+               "iray = %d.\n", hdr->dataname, isweep, iray);
        return;
     }
     switch (vol_index) {
@@ -446,7 +439,7 @@ void wsr88d_load_ray(Wsr88d_ray_m31 wsr88d_ray, int data_ptr,
            radar->v[vol_index]->sweep[isweep]->h.f = f;
            radar->v[vol_index]->sweep[isweep]->h.invf = invf;
        }
-       ngates = data_hdr.ngates;
+       ngates = hdr->ngates;
        ray = RSL_new_ray(ngates);
 
        /* Convert data to float, then use range function to store in ray.
@@ -454,17 +447,16 @@ void wsr88d_load_ray(Wsr88d_ray_m31 wsr88d_ray, int data_ptr,
         * means range folded.
         */
 
-       offset = data_hdr.offset;
-       scale = data_hdr.scale;
-       if (data_hdr.scale == 0) scale = 1.0; 
-       data = &wsr88d_ray.data[data_ptr];
+       offset = hdr->offset;
+       scale = hdr->scale;
+       if (hdr->scale == 0) scale = 1.0;
        for (i = 0; i < ngates; i++) {
            unsigned short datan = 0;
-           switch (data_hdr.datasize_bits) {
+           switch (hdr->datasize_bits) {
                case 8:  datan = ((unsigned char  *)data)[i]; break;
                case 16: datan = ((unsigned short *)data)[i]; break;
            }
-           if (little_endian() && data_hdr.datasize_bits == 16)
+           if (little_endian() && hdr->datasize_bits == 16)
                swap_2_bytes(&datan);
 
            if (datan > 1)
@@ -476,8 +468,8 @@ void wsr88d_load_ray(Wsr88d_ray_m31 wsr88d_ray, int data_ptr,
            ray->h.invf = invf;
        }
        wsr88d_load_ray_hdr(wsr88d_ray, ray);
-       ray->h.range_bin1 = data_hdr.range_first_gate;
-       ray->h.gate_size = data_hdr.range_samp_interval;
+       ray->h.range_bin1 = hdr->range_first_gate;
+       ray->h.gate_size = hdr->range_samp_interval;
        ray->h.nbins = ngates;
        radar->v[vol_index]->sweep[isweep]->ray[iray] = ray;
        radar->v[vol_index]->sweep[isweep]->h.nrays = iray+1;
@@ -485,19 +477,20 @@ void wsr88d_load_ray(Wsr88d_ray_m31 wsr88d_ray, int data_ptr,
 }
 
 
-void wsr88d_load_ray_into_radar(Wsr88d_ray_m31 wsr88d_ray, int isweep, int iray,
-       Radar *radar)
+void wsr88d_load_ray_into_radar(Wsr88d_ray_m31 *wsr88d_ray,
+       int isweep, int iray, Radar *radar)
 {
-    int *data_ptr, hdr_size;
-    int i, ndatablocks, nconstblocks = 3;
-
-    hdr_size = sizeof(wsr88d_ray.ray_hdr);
-     
-    ndatablocks = wsr88d_ray.ray_hdr.data_block_count;
-    data_ptr = (int *) &wsr88d_ray.ray_hdr.dbptr_ref;
-    for (i=0; i < ndatablocks-nconstblocks; i++) {
-       wsr88d_load_ray(wsr88d_ray, *data_ptr-hdr_size, isweep, iray, radar);
-       data_ptr++;
+    int i, *offsets;
+    Data_moment_hdr *hdr;
+
+    offsets = (int *)&wsr88d_ray->ray_hdr.dbptr_vol_const;
+
+    /* skip constant data blocks */
+    for (i = 3; i < wsr88d_ray->ray_hdr.data_block_count; i++) {
+       hdr = (Data_moment_hdr*)&wsr88d_ray->data[offsets[i]-sizeof(Ray_header_m31)];
+       if (little_endian())
+           wsr88d_swap_data_hdr(hdr);
+       wsr88d_load_ray(wsr88d_ray, hdr, hdr+1, isweep, iray, radar);
     }
 }
 
@@ -583,7 +576,7 @@ Radar *load_wsr88d_m31_into_radar(Wsr88d_file *wf)
            }
 
            /* Load ray into radar structure. */
-           wsr88d_load_ray_into_radar(wsr88d_ray, isweep, iray, radar);
+           wsr88d_load_ray_into_radar(&wsr88d_ray, isweep, iray, radar);
            iray++;
            if (iray >= MAXRAYS_M31) {
                fprintf(stderr,"Error: iray = %d, equals or exceeds MAXRAYS_M31"